大部分PLC都支持Modbus通信,如果视觉软件端实现了Modbus的寄存器读写操作,相对来说软件端功能更完善,能够支持更多的设备通讯。
Modbus是一种串行通信协议,Modbus成为工业领域通信协议的标准,大部分工业仪器、设备常用的连接方法都支持。
去Modbus官方文档中, 文档很全很多,Modubus支持多种模式变种,我这里实现最常见的Modbus RTU模式和TCP是的。
看Modubus协议可知,Modbus RTU协议与TCP协议的区别就是TCP多一个MBAP头。
读寄存器操作
![d83908d96c84c9a9200e8c49b8e47c96.png](https://i-blog.csdnimg.cn/blog_migrate/76de8f1249562c118cf8cd7c9629cdf7.jpeg)
RTU 和TCP读取
以上为读读取寄存器地址1000(十六进制就是03 E8)读取数量4个的报文格式,可以看到RTU和TCP的区别 ,RTU没有MBAP报文头,而TCP没有地址码,RTU多了一个CRC校验,在串口通信中一般都要校验。
TCP回复:00 01 00 00 00 0B 01 03 08 00 00 00 00 00 00 00
其中前半部分部分为头,后部分为读到的数据
RTU回复 01 03 08 00 00 00 00 00 00 00 00 95 D7
其中中间部分为数据,结尾为校验和,开始为头数据部分
写寄存器操作
![932a33204686a1bb811c6db17c64fe28.png](https://i-blog.csdnimg.cn/blog_migrate/e5678412ef02af1bb5bc643e4b3675d9.jpeg)
RTU和TCP写寄存器
以上为清空1000寄存器值为0的操作
RTU回复: 00 01 00 00 00 00 00 00
TCP回复: 00 01 00 00 00 06 01 10 03 E8 00 01
我这里使用Modbus Slave/Poll为调试。
上代码
//写入寄存器操作
// nStartAddr 其实寄存器
// nNum 寄存器个数
//data 写入数据
private void WriteModus(int nStartAddr, int nNum, byte[] data)
{
if (null == Connect)
throw new Exception("连接对象为null");
byte[] sendBytes;
List datalist = new List();
if (_Connection.ConnectType() == "COM")
{
sendBytes = new byte[7 + nNum * 2 + 2];
datalist.Add(0x01);
datalist.Add(0x10);
string strHex = string.Format("{0:X4}