上一篇我们对FINS-TCP读写PLC的地址进行封装,链接如下:

C#使用欧姆龙PLC的Fins协议读写PLC地址(基本封装)_ylq1045的专栏-CSDN博客

我们使用WInform界面来进行测试:

新建winform应用程序OmronFinsDemo,框架.net framework4.5.

将默认的Form1重命名为FormOmronFinsTcp。

窗体FormOmronFinsTcp的设计器如图:

窗体主要程序如下(忽略设计器自动生成的代码):

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 OmronFinsDemo
{public partial class FormOmronFinsTcp : Form{FinsTcpUtil finsTcpUtil = new FinsTcpUtil();public FormOmronFinsTcp(){InitializeComponent();cboReadType.SelectedIndex = 0;cboWriteType.SelectedIndex = 0;List<OmronAddressType> omronAddressTypeCollection = new List<OmronAddressType>(){OmronAddressType.AR,OmronAddressType.CIO,OmronAddressType.CNT,OmronAddressType.DM,OmronAddressType.HR,OmronAddressType.TIM,OmronAddressType.WR};this.ddlDataAddressTypeRead.DataSource = omronAddressTypeCollection;this.ddlDataAddressTypeWrite.DataSource = omronAddressTypeCollection;this.ddlDataAddressTypeLong.DataSource = omronAddressTypeCollection;ddlDataAddressTypeRead.SelectedIndex = 3;ddlDataAddressTypeWrite.SelectedIndex = 3;ddlDataAddressTypeLong.SelectedIndex = 3;}/// <summary>/// 显示文本框的消息/// </summary>/// <param name="message"></param>private void DisplayInfo(RichTextBox rtxbResult, string message){this.BeginInvoke(new Action(() =>{if (rtxbResult.TextLength >= 20480){rtxbResult.Clear();}rtxbResult.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} --> {message}\n");rtxbResult.ScrollToCaret();}));}private async void btnConnect_Click(object sender, EventArgs e){bool result = false;Task<bool> task = Task.Factory.StartNew<bool>(() =>{try{result = finsTcpUtil.ConnectPlc(txtIP.Text, int.Parse(txtPort.Text), 1);}catch (Exception ex){DisplayInfo(rtxtMessageRead, $"连接欧姆龙PLC失败:{ex.Message}");//MessageBox.Show($"连接欧姆龙PLC失败:{ex.Message}");}return result;});await task;finsTcpUtil.RecordDataEvent -= FinsTcp_RecordDataEvent;finsTcpUtil.RecordDataEvent += FinsTcp_RecordDataEvent;DisplayInfo(rtxtMessageRead, $"连接欧姆龙PLC结果:{result}");MessageBox.Show($"连接欧姆龙PLC结果:{result}");}/// <summary>/// 记录数据包事件/// </summary>/// <param name="sendBuffer"></param>/// <param name="receiveBuffer"></param>/// <param name="spendTime"></param>private void FinsTcp_RecordDataEvent(byte[] sendBuffer, byte[] receiveBuffer, double spendTime){DisplayInfo(rtxtMessageRead,$"发送命令【{string.Join(" ", sendBuffer.Select(element => element.ToString("X2")))}】\n接收命令【{string.Join(" ", receiveBuffer.Select(element => element.ToString("X2")))}】\n通信耗时【{spendTime}】ms");}private void btnDisconnect_Click(object sender, EventArgs e){//解除事件绑定finsTcpUtil.RecordDataEvent -= FinsTcp_RecordDataEvent;finsTcpUtil.Disconnect();DisplayInfo(rtxtMessageRead, $"连接已断开,当前连接状态:{finsTcpUtil.IsConnected}");}private void btnReadBasic_Click(object sender, EventArgs e){Button button = sender as Button;if (button == null){return;}int result = -99;try{int startAddress = int.Parse(txtReadAddr.Text);OmronAddressType omronAddressType;Enum.TryParse(Convert.ToString(ddlDataAddressTypeRead.SelectedValue), true, out omronAddressType);string msg = string.Empty;switch (button.Name){case "btnReadBasic":object resultBasic = ReadBasicValue(omronAddressType, cboReadType.Text, startAddress, out result, out msg);txtReadValBasic.Text = Convert.ToString(resultBasic);break;case "btnReadString":string barcode;result = finsTcpUtil.ReadLongString(omronAddressType, startAddress, int.Parse(txtReadStringLength.Text), out barcode, out msg);txtReadValString.Text = barcode;break;case "btnReadArray":byte[] buffer;result = finsTcpUtil.ReadValue(omronAddressType, startAddress, int.Parse(txtReadArrayLength.Text), out buffer, out msg);rtxtReadValArray.Text = string.Join(" ", buffer.Select(element => element.ToString("X2")));break;}DisplayInfo(rtxtMessageRead, $"读取地址【MW{txtReadAddr.Text}】的操作结果:错误号【{result}】{msg}");}catch (Exception ex){DisplayInfo(rtxtMessageRead, $"读取地址【MW{txtReadAddr.Text}】的操作出现异常:{ex.Message}");}}/// <summary>/// 读取基本数据类型/// </summary>/// <param name="typeName"></param>/// <param name="startAddress"></param>/// <param name="operateResult"></param>/// <returns></returns>private object ReadBasicValue(OmronAddressType omronAddressType, string typeName, int startAddress, out int operateResult, out string msg){operateResult = -1;msg = string.Empty;object result = 0;switch (typeName){case "short":short valShort;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valShort, out msg);result = valShort;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valShort))}】");break;case "ushort":ushort valUshort;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valUshort, out msg);result = valUshort;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valUshort))}】");break;case "int":int valInt;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valInt, out msg);result = valInt;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valInt))}】");break;case "uint":uint valUint;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valUint, out msg);result = valUint;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valUint))}】");break;case "long":long valLong;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valLong, out msg);result = valLong;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valLong))}】");break;case "ulong":ulong valUlong;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valUlong, out msg);result = valUlong;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valUlong))}】");break;case "float":float valFloat;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valFloat, out msg);result = valFloat;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valFloat))}】");break;case "double":double valDouble;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valDouble, out msg);result = valDouble;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valDouble))}】");break;case "byte":byte valByte;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valByte, out msg);result = valByte;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", valByte)}】");break;case "sbyte":sbyte valSbyte;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valSbyte, out msg);result = valSbyte;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", (byte)valSbyte)}】");break;case "bool":bool valBool;operateResult = finsTcpUtil.ReadValue(omronAddressType, startAddress, out valBool, out msg);result = valBool;DisplayInfo(rtxtMessageRead, $"对应字节【{string.Join(",", BitConverter.GetBytes(valBool))}】");break;}return result;}private void btnWriteBasic_Click(object sender, EventArgs e){Button button = sender as Button;if (button == null){return;}int result = -99;try{int startAddress = int.Parse(txtWriteAddr.Text);OmronAddressType omronAddressType;Enum.TryParse(Convert.ToString(ddlDataAddressTypeWrite.SelectedValue), true, out omronAddressType);string msg = string.Empty;switch (button.Name){case "btnWriteBasic":WriteBasicValue(omronAddressType, cboWriteType.Text, startAddress, txtWriteValBasic.Text, out result, out msg);DisplayInfo(rtxtMessageWrite, $"向地址【{startAddress}】写入值【{txtWriteValBasic.Text}】的结果:错误号【{result}】{msg}");break;case "btnWriteString":result = finsTcpUtil.WriteString(omronAddressType, startAddress, int.Parse(txtWriteStringLength.Text), txtWriteValString.Text, out msg);DisplayInfo(rtxtMessageWrite, $"向地址【{startAddress}】写入值【{txtWriteValString.Text}】的结果:错误号【{result}】{msg}");break;case "btnWriteArray":byte[] buffer = rtxtWriteValArray.Text.Trim().Split(' ').Select(str => Convert.ToByte(str, 16)).ToArray();result = finsTcpUtil.WriteValue(omronAddressType, startAddress, buffer, out msg);DisplayInfo(rtxtMessageWrite, $"向地址【{startAddress}】写入值【{rtxtWriteValArray.Text}】的结果:错误号【{result}】{msg}");break;}}catch (Exception ex){DisplayInfo(rtxtMessageWrite, $"写入地址【MW{txtWriteAddr.Text}】的操作出现异常:{ex.Message}");}}/// <summary>/// 写基本数据类型/// </summary>/// <param name="typeName"></param>/// <param name="startAddress"></param>/// <param name="writeValue"></param>/// <param name="operateResult"></param>private void WriteBasicValue(OmronAddressType omronAddressType, string typeName, int startAddress, object writeValue, out int operateResult, out string msg){msg = string.Empty;operateResult = -99;switch (typeName){case "short":short valShort = Convert.ToInt16(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valShort, out msg);break;case "ushort":ushort valUshort = Convert.ToUInt16(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valUshort, out msg);break;case "int":int valInt = Convert.ToInt32(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valInt, out msg);break;case "uint":uint valUint = Convert.ToUInt32(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valUint, out msg);break;case "long":long valLong = Convert.ToInt64(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valLong, out msg);break;case "ulong":ulong valUlong = Convert.ToUInt64(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valUlong, out msg);break;case "float":float valFloat = Convert.ToSingle(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valFloat, out msg);break;case "double":double valDouble = Convert.ToDouble(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valDouble, out msg);break;case "byte":byte valByte = Convert.ToByte(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valByte, out msg);break;case "sbyte":sbyte valSbyte = Convert.ToSByte(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valSbyte, out msg);break;case "bool":bool valBool = Convert.ToBoolean(writeValue);operateResult = finsTcpUtil.WriteValue(omronAddressType, startAddress, valBool, out msg);break;}}private void btnWriteLongString_Click(object sender, EventArgs e){string msg = "";int startAddress = int.Parse(txtLongStrAddr.Text);OmronAddressType omronAddressType;Enum.TryParse(Convert.ToString(ddlDataAddressTypeLong.SelectedValue), true, out omronAddressType);int result = finsTcpUtil.WriteLongString(omronAddressType, startAddress, rtxtLongString.Text, out msg);DisplayInfo(rtxtMessageWrite, $"写入地址【MW{startAddress}】的操作结果:错误号【{result}】{msg}");}private void btnReadLongString_Click(object sender, EventArgs e){string barcode;string msg = "";int startAddress = int.Parse(txtLongStrAddr.Text);OmronAddressType omronAddressType;Enum.TryParse(Convert.ToString(ddlDataAddressTypeLong.SelectedValue), true, out omronAddressType);int result = finsTcpUtil.ReadLongString(omronAddressType, startAddress, int.Parse(txtLongLength.Text), out barcode, out msg);rtxtLongString.Text = barcode;DisplayInfo(rtxtMessageRead, $"读取地址【MW{startAddress}】的操作结果:错误号【{result}】{msg}");}private void FormOmronFinsTcp_FormClosing(object sender, FormClosingEventArgs e){DialogResult dialogResult = MessageBox.Show("确定要关闭吗?", "提示", MessageBoxButtons.YesNo);if (dialogResult != DialogResult.Yes){e.Cancel = true;return;}btnDisconnect_Click(null, e);Application.Exit();}}
}

程序运行如图:

C#使用欧姆龙PLC的Fins协议读写PLC地址(示例调用)相关推荐

  1. C#使用西门子S7 协议读写PLC DB块

    教大家使用C#如何方便快速的读写西门子DB块的值,实现上位机跟plc进行通讯的流程 使用的西门子PLC型号,S7 1200 1.Nuget 安装s7 驱动包 2.西门子plc定义一个db块,这个是我们 ...

  2. C#使用Modbus协议读写汇川PLC的M区寄存器(基本接口封装)

    C#使用Modbus-TCP协议读取汇川PLC,Modbus读写是按照MW地址来处理的 [寄存器单位是字WORD,占用两个字节,类似于C#中的ushort(UInt16)],实际测试发现字符串是按照字 ...

  3. C#使用Modbus协议读写汇川PLC的M区寄存器(测试示例),接上篇

    对汇川PLC采用Modbus-TCP进行读写寄存器测试示例 新建WinForms应用程序InovancePlcDemo,.net framework 4.5. 重命名窗体名为FormInovanceP ...

  4. ppi协议源码 c语言,S7-200 PLC的PPI协议及其开发实例

    通过硬件和软件侦听的方法,分析PLC内部固有的PPI通讯协议,然后上位机采用VB编程,遵循PPI通讯协议,读写PLC数据,实现人机操作任务.这种通讯方法,与一般的自由通讯协议相比,省略了PLC的通讯程 ...

  5. 如何使用HTTP协议,读写PLC点位状态(含欧姆龙、三菱、西门子、施耐德、松下等PLC)

    前言 现代工业产线,与以往的技术方向发生了很大变化,更多的互联网元素(REST,HTTP,H5,WEB),更多的编程语言(JAVASCRIPT,PYTHON,GO,Node.js)融入了工业生成的应用 ...

  6. PLC通讯实现-C#实现欧姆龙以太网通讯FINS(二)

    PLC通讯实现-C#实现欧姆龙以太网通讯FINS(二) 背景 抽象设计 欧姆龙以太网通讯实现FINS 背景 本人近十年的工作都与工业软件相关.其中工控系统开发过程中有一个必要环节就是跟各大厂商的PLC ...

  7. 晨控CK-GW208-EC与欧姆龙PLC工业EtherCAT协议通讯指南

    晨控CK-GW208-EC与欧姆龙PLC工业EtherCAT协议通讯指南 EtherCAT 是一种实时以太网络通讯协议,旨在解决传统现场总线系统在数据传输速率和复杂性方面的限制.相比传统现场总线,Et ...

  8. 2022-02-21 WPF上位机 121-三菱PLC协议读写代码的封装

    文章目录 一.三菱PLC协议读写代码的封装 1.base基类封装 2.Result返回结果 3.A1E封装 4.QNA3E的封装 5.使用 一.三菱PLC协议读写代码的封装 1.base基类封装 pu ...

  9. 2021-12-20 WPF上位机 121-三菱PLC协议读写代码的封装

    文章目录 一.三菱PLC协议读写代码的封装 1.base基类封装 2.Result返回结果 3.A1E封装 4.QNA3E的封装 5.使用 一.三菱PLC协议读写代码的封装 1.base基类封装 pu ...

  10. 西门子PLC协议转换CIP协议,实现与罗克韦尔/AB、欧姆龙PLC之间通讯

    IGT-DSER智能网关模块支持西门子.三菱.欧姆龙.AB等各种品牌的PLC之间通讯,同时也支持PLC与Modbus协议的工业机器人.智能仪表等设备通讯.网关有多个网口.串口,也可选择WIFI,4G无 ...

最新文章

  1. Sublime text 2/3 [Decode error - output not utf-8] 完美解决方法
  2. 网络营销外包对于搜索引擎策略性调整网络营销外包专员如何解析
  3. Java定时任务调度工具
  4. Select控件可选可输入
  5. python 读取 配置文件
  6. 如何通过任务调度实现百万规则报警
  7. C/C++之win98扫雷外挂基础篇
  8. 文本编辑器_markdown编辑器与富文本编辑器优缺点比较
  9. 【干货】神策数据朱德康:用户中台建设实践解析(附PPT下载链接)
  10. 微信跳转浏览器--使用AugPush实现微信跳转手机浏览器
  11. poi,HSSFWorkbook,Excel导出,代码示例
  12. 修改统计信息自动收集时间窗口
  13. 903C Boxes Packing
  14. 卡巴斯基蓝屏问题处理
  15. matlab clc、clear all含义意思
  16. 『牛角书』鸿蒙——简易通讯录项目开发
  17. 教育的真谛 [英] 尼古拉斯·泰特 读书摘录
  18. DTAS棣拓三维公差分析软件容差分析软件蒙特卡洛法:DTAS Talk尺寸联盟参与公益课
  19. 学习速写的方法有哪些?如何快速学会速写?
  20. RFID电子标签有哪些区

热门文章

  1. word公式编辑器复制粘贴未响应_word公式编辑器常见问题汇总,附带解决方法
  2. DGA 域名生成算法攻防
  3. 联通loid认证_光纤LOID 认证 需要填写的用户名是什么?有人说不需要填写密码。为什么我每次认证都是超时?...
  4. 风靡健身圈的生酮饮食居然有这么多好处,受教了
  5. 我努力了18年,不是为了和你一起喝咖啡姐妹篇
  6. 一文讲解5G、互联网、物联网、大数据、人工智能的关系
  7. EXCEL VBA开发单元格日历选择
  8. 深入理解HTTP/HTTPS协议
  9. Excel单元格内自动换行自动行高,打印预览出现内容缺失解决方案
  10. OFDM载波间隔_NBloT上行子载波