根据对MODBUS TCP跟RTU之间通讯协议封装后写了一个通讯的DEMO例子,界面是参考的HSL软件的布局,主要是针对线圈寄存器和保存寄存器的多读写。

主要的功能:

  1. MODBUS TCP/RUT两种通讯方式
  2. BOOL类型线圈寄存器的多读写
  3. 保存寄存器各种数据类型的写入读取
  4. 通讯时发送和读取到的字节数据日志

主要逻辑:
首先是跟串口或者TCP通讯,
其次是数据类型的写入,根据不同数据类型的字节长度读取跟写入对应的寄存器长度。
目前主要是针对数据的写入跟读取做一个简单的DEMO,扩展可以在这个之上进行扩展业务逻辑
部分代码展示

 public static RtuHelper Intance = new RtuHelper();//实例化串口public static SerialPort port = new SerialPort();//实例SOCKETpublic Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = 300, ReceiveTimeout = 1000 };private Int16 SendNum = 0;//委托public delegate void ReceiveData(object str);public static event ReceiveData DataLog;//打开串口配置串口public static void SerialClass(ComClass p){port.PortName = p.PortName;port.BaudRate = p.BaudRate;port.DataBits = p.Databit;switch (p.Stopbit){case 1:port.StopBits = StopBits.One; //使用一个停止位break;case 1.5f:port.StopBits = StopBits.OnePointFive; //使用一个停止位break;case 2:port.StopBits = StopBits.Two; //使用一个停止位break;default:break;}switch (p.Paritybit){case "NONE":port.Parity = Parity.None;break;case "ODD":port.Parity = Parity.Odd;break;case "EVEN":port.Parity = Parity.Even;break;case "MARK":port.Parity = Parity.Mark;break;case "SPACE":port.Parity = Parity.Space;break;default:break;}//port.Handshake = Handshake.None;port.RtsEnable = true;port.DtrEnable = true;//获取或设置一个值,改值在串行通讯过程中启用数据终端就绪(DTR)信号。port.ReadTimeout = 2000;}/// <summary>/// 打开串口/// </summary>/// <returns></returns>public static bool OpenPart(){bool ok = false;//如果串口是打开的,先关闭if (port.IsOpen) port.Close();try{//打开串口port.Open();ok = true;}catch (Exception Ex){throw Ex;}return ok;}/// <summary>/// 关闭串口/// </summary>public static void closePort(){if (port.IsOpen){port.Close();}}//关闭socket通讯public void DisConnect(){socket.Disconnect(true);}//打开Socket通讯public bool ReConnect(string IP, int Port){try { IPAddress.Parse(IP); }catch { return false; }socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = 300, ReceiveTimeout = 1000 };socket.Connect(IPAddress.Parse(IP), Port);// task.Wait(ConnTimeout);return socket.Connected;}public List<bool> ReadBools(string addr, UInt16 count, ModbusType modbusType){List<Boolean> rst = new List<Boolean>();if (!Read<Boolean>(addr, count, ref rst, modbusType))Console.WriteLine("ReadBools");return rst;}public bool WriteBools(string addr, UInt16 count, List<bool> value, ModbusType modbusType){return (Write<Boolean>(addr, count, value, modbusType));}private bool Read<T>(string addr, UInt16 count, ref List<T> rst, ModbusType modbusType){//byte[]需要指定长度,不支持LinqList<byte> command = new List<byte>();ParseReadSend(addr, count, rst, ref command, modbusType);byte[] Read = new byte[1024 * 1024];int len = 0;if (modbusType == ModbusType.RTU){if (!SendRTU(command.ToArray(), ref Read))return false;//报文组成完成}else if (modbusType == ModbusType.TCP){if (!SocketSend(command.ToArray(), ref len, ref Read))return false;}if (!AnalysisData(Read, ref rst, count, modbusType))return false;return true;}private bool Write<T>(string addr, UInt16 count, List<T> rst, ModbusType modbusType){//byte[]需要指定长度,不支持LinqList<byte> command = new List<byte>();ParseWriteSend(addr, count, rst, ref command, modbusType);byte[] Read = new byte[1024 * 1024];int len = 0;if (modbusType == ModbusType.RTU){if (!SendRTU(command.ToArray(), ref Read))return false;}else if (modbusType == ModbusType.TCP){if (!SocketSend(command.ToArray(), ref len, ref Read))return false;}return true;}private bool SocketSend(byte[] array, ref int recvlen, ref byte[] ReadData){if (!socket.Connected)return false;if (array.Length != socket.Send(array))return false;DataLog($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} ModbusTcp]:TCP 发送:" + BitConverter.ToString(array).Replace('-', ' ') + "\t\r");recvlen = socket.Receive(ReadData);ReadData = ReadData.Skip(0).Take(recvlen).ToArray();DataLog($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} ModbusTcp]:TCP 接收:" + BitConverter.ToString(ReadData).Replace('-', ' ') + "\t\r");SendNum++;return true;}private bool SendRTU(byte[] SendData, ref byte[] ReadData){if (!port.IsOpen)return false;port.Write(SendData, 0, SendData.Length);DataLog($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} ModbusTcp]:Rtu 发送:" + BitConverter.ToString(SendData).Replace('-', ' ') + "\t\r");Thread.Sleep(500);//响应报文接收和解析byte[] read = new byte[port.BytesToRead];port.Read(read, 0, read.Length);DataLog($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} ModbusTcp]:Rtu 接收:" + BitConverter.ToString(read).Replace('-', ' ') + "\t\r");ReadData = read;return true;}//CRC校验static List<byte> CRC16(List<byte> value, ushort poly = 0xA001, ushort crcInit = 0xFFFF){if (value == null || !value.Any()){throw new ArgumentException("");}//计算ushort crc = crcInit;for (int i = 0; i < value.Count; i++){crc = (ushort)(crc ^ (value[i]));for (int j = 0; j < 8; j++){crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ poly) : (ushort)(crc >> 1);}}byte hi = (byte)((crc & 0xFF00) >> 8);//高位置byte lo = (byte)(crc & 0x00FF);//底位置List<byte> buffer = new List<byte>();buffer.AddRange(value);buffer.Add(lo);buffer.Add(hi);return buffer;}

MODBUS RTU/TCP通讯实例C#(附源码)相关推荐

  1. mac下dashboard小控件开发实例(附源码)

    1.背景          用mac的用户都应该知道,mac有一个很好的功能,就是dashboard小控件的功能,按下F12键就可以自由切换.博主最近在背GRE单词,就尝试这开发了一个背单词的dash ...

  2. 基于Pytorch的机器学习Regression问题实例(附源码)

    文章目录 一.写在前面 二.构建神经元网络 要解决什么问题 构建Python代码 运行结果 三.优化神经元网络 增加学习次数 调整LearningRate 调整优化方式 激活函数 小结 四.增加神经元 ...

  3. c#串口通讯详解(附源码)

    串口通讯 串口通讯是计算机传输数据的一种通讯方式,只不过是以比特位来传输数据的 串口通讯的相关参数 波特率: 波特率的大小代表每秒钟可以传输多少个二进制位,如波特率是9600,能每秒传输9600二进制 ...

  4. Django开发密码管理表实例【附源码】

    为什么80%的码农都做不了架构师?>>>    文章及代码比较基础,适合初.中级人员,高手略过 阅读此篇文章你可以: 获取一个Django实现增删改查的案例源码 了解数据加密的使用场 ...

  5. Android APP:Preference使用详解和实例(附源码)

    Android APP:Preference使用详解和实例 一.Preference 是Android app中重要的控件之一,Settings 模块大部分都是通过Preference 实现的,这里将 ...

  6. android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...

    本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能.分享给大家供大家参考,具体如下: 本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和 ...

  7. HTML/JSP/CSS网页编写实例,附源码

    最近在刚接触web前端,学习网页编写,虽然网上案例很多但是实战起来还是问题很多,经过不懈努力终于完成了一个简单的web页面,在此记录一下,分享源码大家共同学习. 最终效果如下: 如上图所示整个页面有5 ...

  8. android实现阅读器底部菜单,android仿新闻阅读器菜单弹出效果实例(附源码DEMO下载)...

    开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉得是最后完成后发网站客户端的,可是这样体现不出一个功能一个功能的分析实现效果, ...

  9. Cocos Creator多人对战联网游戏快速开发实例(附源码)

    前言:游戏主要是基于前端引擎Cocos Creator开发,涉及后端联网的部分,使用了游戏服务器引擎Matchvs开发完成. 准备工作:相关引擎工具引擎下载及指南 Matchvs JavaScript ...

最新文章

  1. winscp是什么软件_winscp ftp,winscp ftp是什么软件?软件介绍
  2. Tomcat工程部署常见问题
  3. 动态调频DVFS_转
  4. gitlab 安装报错:Could not find modernizr-2.6.2 in any of the sources
  5. Linux之使用MobaXterm远程连接Linux前提条件
  6. 【在线工具收集】抢票音视频剪辑照片PS代码在线编译打字练习游戏
  7. 在线日志解析方法:Drain,Logram
  8. 统计年鉴 付费下载 夏泽网
  9. Java中找朋友的代码_找朋友游戏介绍
  10. 一个人,仅30天!开发一款3D竞技足球游戏!他究竟经历了些什么?
  11. 计算机专业文科生录取分数线,文科生适合报考的5所学校,录取分数线不高,但就业前景很好...
  12. listen函数详解
  13. APICS与AX的Master Planning(三)---Firm Planned Orders已确认计划订单
  14. 通过修改rom包永久获取root权限和所有应用调试功能ro.debuggable
  15. 工欲善其事,必先利其器--vim-tips
  16. 为何浙江富人多(一点启示)
  17. 计算机报声音怎么弄,excel表格输入数据报语音-excel的语音报数怎么弄出来?
  18. 人工智能 | CIFAR10卷积神经网络实践
  19. 使用VirtualBox在PC上安装Android OS
  20. windows 显示苹果分区_EFI分区的挂载

热门文章

  1. 百度上传插件 Web Uploader 使用之单图片上传
  2. r语言 把2条roc曲线画在同一个图上_R语言如何将多个图像画到一张图
  3. 一牛网:如何实现低成本PCB设计与布局
  4. AVR ATMEGA8(2)
  5. jsp无法解析,直接在浏览器中显示html源代码
  6. HPMSA2050直连服务器配置,惠普入门级存储MSA2050系列
  7. Theos(五):.deb 与 dm.pl
  8. 我的P4B533主板集成声卡驱动
  9. android8.0 odex 目录,安卓8.0合并ODEX工具
  10. 计算机代码里隐藏是哪个单词,excel单词程序(可乱序、自动查词典、List过滤、星级过滤)...