C#上位机与欧姆龙PLC的通信09----开发专用的通讯工具软件(Winform版)

1、介绍

上节文章已经完成了通讯库的开发,可以看到库还是蛮厉害的,在项目中就可以直接拿来应用,这节要做的就是做一个工具软件,形成自己专业的通讯工具,也是对通讯库的直接利用,本节要写的工具软件是一个winform程序,因为控制台程序是单调的,不方便操作,不直观。

 2、开始干

1、添加窗体程序

2、引用通讯库文件.dll

将上节生成的dll文件复制到本项目中

 

 3、连接代码

using Omron.Communimcation.Fins.Omron;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OmronFinsFormApp
{
    public partial class Form1 : Form
    {

        /// <summary>
        /// finstcp对象
        /// </summary>
        FinsTcp finsTcp;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接Plc
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpen_Click(object sender, EventArgs e)
        {
            string ip = txtIPAddress.Text.Trim();
            string port = txtPort.Text.Trim();
            finsTcp = new FinsTcp(ip, Convert.ToInt32(port), (byte)10, (byte)04);// 创建连接 
            var result = finsTcp.Connect();// 开始连接PLC
            if (!result.IsSuccessed)
            {
                MessageBox.Show(result.Message);
                return;
            }
            lblMessage.Text = "PLC连接成功";
            SetTextDisable(true);
            this.btnOpen.Enabled = false;
            this.btnClose.Enabled = true;
        }

        private void SetTextDisable(bool v)
        {
            txtIPAddress.ReadOnly = v;
            txtPort.ReadOnly = v;
        }

    }
}

4、读取代码

  /// <summary>
  /// 读取数据
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void myread_Click(object sender, EventArgs e)
  { 
      //内存地址
      string plcAddr = txtMemoryAddr.Text.Trim( ); 
      //读取数量
      ushort readCount = ushort.Parse(txtRCount.Text.Trim( ));
      //数据类型
      string dataType = cbodatatype.Text.Trim();
      switch (dataType)
      {
          case "ushort":
              var datas= finsTcp.Read<ushort>(plcAddr, readCount);
              if (!datas.IsSuccessed)
              {
                  MessageBox.Show(datas.Message);
                  return;
              }
              txtReadDatas1.Text = string.Join(",", datas.Datas);
              break;
          case "short":
              var datas2 = finsTcp.Read<short>(plcAddr, readCount);
              if (!datas2.IsSuccessed)
              {
                  MessageBox.Show(datas2.Message);
                  return;
              }
              txtReadDatas2.Text = string.Join(",", datas2.Datas);
              break;
          case "float":
              var datas3 = finsTcp.Read<float>(plcAddr, readCount);
              if (!datas3.IsSuccessed)
              {
                  MessageBox.Show(datas3.Message);
                  return;
              }
              txtReadDatas3.Text = string.Join(",", datas3.Datas);
              break;
          case "bool":
              var datas4 = finsTcp.Read<bool>(plcAddr, readCount);
              if (!datas4.IsSuccessed)
              {
                  MessageBox.Show(datas4.Message);
                  return;
              }
              txtReadDatas4.Text = string.Join(",", datas4.Datas);
              break;
      }
  }

 

 

 通讯报文 

5、写入代码

  /// <summary>
  /// 写入数据
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnWrite_Click(object sender, EventArgs e)
  {
      //PLC地址
      string plcAddr = txtWPLCAddr.Text.Trim();
      //数据类型
      string dataType = cmddatatype2.Text.Trim();
      //实际数量
      string objWriteVals = "";
      switch (dataType)
      {
          case "ushort":
              objWriteVals = txtWriteDatas1.Text.Trim();
              break;
          case "short":
              objWriteVals = txtWriteDatas2.Text.Trim();
              break;
          case "float":
              objWriteVals = txtWriteDatas3.Text.Trim();
              break;
          case "bool":
              objWriteVals = txtWriteDatas4.Text.Trim();
              break;
      }
      //写入数量
      ushort writeCount = ushort.Parse(txtWPLCCount.Text.Trim());
      ushort objWCount = (ushort)objWriteVals.Split(',').Length;
      //实际数量与要求数量不一致,不允许操作
      if (writeCount != objWCount)
      {
          MessageBox.Show("写入值的数量不正确!");
          return;
      }
      List<string> vals = objWriteVals.Split(',').ToList();
      switch (dataType)
      {
          case "ushort":
              //实际数值转换成list集合ushort类型
              List<ushort> objushort = new List<ushort>();
              vals.ForEach((x) =>
              {
                  objushort.Add(ushort.Parse(x));
              });
              var finish1 = finsTcp.Write<ushort>(objushort, plcAddr);
              if (finish1.IsSuccessed)
              {
                  MessageBox.Show(finish1.Message);
              }
              break;
          case "short":
              //实际数值转换成list集合 short类型
              List<short> objshort = new List<short>();
              vals.ForEach((x) =>
              {
                  objshort.Add(short.Parse(x));
              });
              var finish2 = finsTcp.Write<short>(objshort, plcAddr);
              if (finish2.IsSuccessed)
              {
                  MessageBox.Show(finish2.Message);
              }
              break;
          case "float":
              //实际数值转换成list集合 float
              List<float> objfloat = new List<float>();
              vals.ForEach((x) =>
              {
                  objfloat.Add(float.Parse(x));
              });
              var finish3 = finsTcp.Write<float>(objfloat, plcAddr);
              if (finish3.IsSuccessed)
              {
                  MessageBox.Show(finish3.Message);
              }
              break;
          case "bool":
              //实际数值转换成list集合bool
              List<bool> objbool = new List<bool>();
              vals.ForEach((x) =>
              {
                  if (x == "1")
                  {
                      objbool.Add(true);
                  }
                  else
                  {
                      objbool.Add(false);
                  }
              });
              var finish4 = finsTcp.Write<bool>(objbool, plcAddr);
              if (finish4.IsSuccessed)
              {
                  MessageBox.Show(finish4.Message);
              }
              break;
      }
  }

 

 

 

 

 

最后看下报文

3、小结

通讯库100%正确,实现了bool,ushort,short,float类型数据的读取和写入,可以看到封装得超爽,有这个工具,到项目开发中就可以用得上这个工具软件,用来调试测试PLC程序,打通与电气工程师的通讯数据,超强啊。

写作不易,图文不易,思路不易,打字不易,分享不易,多多点赞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/295239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一节内容&#xff1a;游戏公告功能的逆向分析与测试-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;63e04cc40f649d10ba2f4f…

线性代数_对称矩阵

对称矩阵是线性代数中一种非常重要的矩阵结构&#xff0c;它具有许多独特的性质和应用。下面是对称矩阵的详细描述&#xff1a; ### 定义 对称矩阵&#xff0c;即对称方阵&#xff0c;是指一个n阶方阵A&#xff0c;其转置矩阵等于其本身&#xff0c;即A^T A。这意味着方阵A中的…

CarRacing DQN: 深度 Q 学习训练自驾车

OpenAI GYM CarRacing DQN: 深度 Q 学习训练自驾车 引言DQN 算法原理Q 值和 Bellman 方程DQN 结构 训练过程设计经验回放&#xff08;Experience Replay&#xff09;目标网络&#xff08;Target Network&#xff09;训练循环 训练结果和模型演变400 轮训练后500 轮训练后600 轮…

快递物流怎么寄最便宜?你一定要知道的5个方法 !

家人们&#xff0c;临近年关&#xff0c;大家的钱包是不是鼓鼓的了&#xff0c;难免的亲戚朋友之间会相互寄送一些东西&#xff0c;所以最近因为需要经常寄快递物流&#xff0c;小编所以特地整理了5个我们平时个人寄快递便宜的方法攻略&#xff0c;推荐第五个&#xff0c;实用干…

IP代理测试:关于Ping测试你需要知道的一切干货

您在访问互联网时是否遇到过持续滞后或花费很长时间等待网站加载的情况&#xff1f;为了避免这种情况&#xff0c;您可以测试 ping 以查看连接速度。如果您使用代理&#xff0c;此 ping 测试还会显示代理服务器的响应速度。 ping 测试是一个很有价值的工具&#xff0c;可以帮助…

WPF美化ItemsControl1:不同颜色间隔

首先我们有的是一个绑定好数据的ItemsControl <ItemsControl ItemsSource"{Binding Starts}"> </ItemsControl> 运行后呢是朴素的将数据竖着排列 如果想要数据之间有间距&#xff0c;可以使用数据模板&#xff0c;将数据放到TextBlock中显示&#xff0…

AWTK 开源串口屏开发(5) - MCU端 SDK 用法

AWTK 开源智能串口屏&#xff0c;不但开放了串口屏端全部源码&#xff0c;还提供了MCU 端 SDK&#xff0c;大大加快 MCU 软件的开发。本介绍一下 MCU 端 SDK 在不同平台上的用法。 完整示例可以参考下面的几个例子&#xff1a; 普通嵌入式系统 mcu/stm32/hmi_app/hmi_app.c 低…

23 导航栏

效果演示 实现了一个响应式的导航栏&#xff0c;当鼠标悬停在导航栏上的某个选项上时&#xff0c;对应的横条会从左到右地移动&#xff0c;从而实现了导航栏的动态效果。 Code <div class"flex"><ul><li>1</li><li>2</li><l…

04 supervised learning

Summary: unspervised learning clustering&#xff08;聚类算法&#xff09;Anomaly detection&#xff08;异常检测&#xff09; Recommender Systems&#xff08;推荐系统&#xff09;Reinforcement Learning&#xff08;强化学习&#xff09; 一 、 K-means算法 1.Notio…

Visual studio 2010的安装与使用

一、下载及安装 1、下载软件。 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/115RibV7dOI_y8LUGW-94cA?pwd4hrs 提取码&#xff1a;4hrs 2、右键解压下载好的文件。 3、找到cn_visual_2010_……/Setup.hta&#xff0c;双击运行。 4、选择第三个“ Visual…

Spring学习之——AOP(面向切面)

AOP 概念 AOP&#xff1a;全称是Aspect Oriented Programming即&#xff1a;面向切面编程。 简单的说它就是把我们程序重复的代码抽取出来&#xff0c;在需要执行的时候&#xff0c;使用动态代理的技术&#xff0c;在不修改源码的基础上&#xff0c;对程序进行增强&#xff…

Mac上安装 Node.js 的版本管理工具 n,以及 n 使用,的使用

安装 最近刚更换 Mac 本进行项目的开发&#xff0c;刚上手 Mac 本还不是很熟练&#xff0c;需要安装 Node.js 的包管理工具 在 Windows 上我是实用的 nvm 来管理的 Node 版本&#xff0c;但是我尝试下载 Nvm &#xff0c;发现下载安装后的 Nvm 无法使用&#xff0c;提示 “Th…

基于web3.js和ganache实现智能合约调用

目的&#xff1a;智能合约发布到本地以太坊模拟软件ganache并完成交互 准备工作&#xff1a; web3.jsganache模拟软件 ganache参数配置 从ganache获取一个url&#xff0c;和一个账号的地址&#xff0c; url直接使用图中的rpc server位置的数据即可 账号address从下列0x开头…

解决报错Exception encountered during context initialization

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读报错解决 报错 今天在测试一个类时&#xff0c;突然间报了以下错误。 juni…

【电路笔记】-电感器

电感器 文章目录 电感器1、概述2、电感器的时间常数3、电感器示例1 电感器是一种由线圈组成的无源电气元件&#xff0c;其设计目的是利用电流通过线圈而产生的磁力和电力之间的关系。 1、概述 在本中&#xff0c;我们将看到电感器是一种电子元件&#xff0c;用于将电感引入到电…

qiankun 公共依赖

1、提取公共依赖的目的 减少相同资源的重复加载资源版本不同步打包文件庞大2、如何提取公共依赖 基本思路&#xff1a;1、相同依赖 采用 CDN 的方式加载&#xff0c;并把 所有依赖的 CDN 链接 统一放到一个文件中进行管理 2、把存放 CDN 链接的文件&#xff0c;引入到 vue.conf…

【mysql】报错1349 - View‘s SELECT contains a subquery in the FROM clause

操作 创建视图的sql语句中有不支持子查询 mysql创建视图 select * from (select name,age from table_name where 11 and namea ) tb where 11 and type1问题 报错1349 - View’s SELECT contains a subquery in the FROM clause 原因 原因创建视图的sql语句中有不支持子查…

2024最新阿里云服务器地域(城市)对照表

2024年阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

在mybatis中编写SQL时,提示表名和字段名的设置方法

一、在设置中搜索SQL Dialects 二、将Global SQL Dialect和Project SQL Dialect设置为MySQL 三、添加Path&#xff0c;选择当前项目&#xff0c;完成后应用 四、连接要使用的数据库&#xff0c;连接到具体要使用的数据库 五、连接完成后&#xff0c;在xml中编写sql语句就会有…

鸡目标检测数据集VOC格式500张

鸡&#xff0c;一种家禽&#xff0c;是人类的重要食物来源之一&#xff0c;也是农业生产中的重要组成部分。 鸡的外观相对较为简单&#xff0c;身体呈圆锥形&#xff0c;羽毛密集&#xff0c;双翅短小&#xff0c;无法飞行。鸡的头部较小&#xff0c;嘴巴尖锐&#xff0c;方便…
最新文章