.Net对ModbusTcp通讯的封装
第一次接触上位机的通讯,查阅了很多资料,总结下我眼里的ModbusTcp。
1.协议
Modbus是开放的协议,IANA(互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。Modbus是标准的协议,因为从1978年以来,在工业自动化行业,已安装了百万计的串口Modbus设备和10万计的Modbus TCP/IP设备,拥有超过300多个Modbus兼容设备厂商,还有90%的第三厂家的I/O支持Modbus TCP/IP,所以是使用最广泛的标准。
2.报文
TCP报文示例:从站站号 0x01 读取开始地址为0x0002的线圈数据,读0x0008位
解析:00 01 00 00 00 06 01 01 00 02 00 08
事务处理标识:2字节事务处理标识符。理解为序列号 协议标识符:2字节协议标识符。TCP就是00 00 长度:2字节。表示后面的数据长度 单元标识符:设备地址 功能码:功能码 数据:00是高位 02是低位。这里就是表示0x0002的线圈位置;00是高位 08是低位。这里读0x0008位。数据长度可变
3.操作对象
Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器
线圈状态:输出端口。可设定端口的输出状态,也可以读取该位的输出状态,可分为两种不同的执行状态,例如保持型或边沿触发型
离散输入状态:输入端口。通过外部设定改变输入状态,可读但是不可写
保持寄存器:输出参数或保持参数,控制器运行时被设定的某些参数,可读可写
输入寄存器:输入参数。控制器运行时从外部设备获得的参数,可读但不可写
4.功能码
Read Coils (FC1)
Read Discrete Inputs (FC2)
Read Holding Registers (FC3)
Read Input Registers (FC4)
Write Single Coil (FC5)
Write Single Register (FC6)
Write Multiple Coils (FC15)
Write Multiple Registers (FC16)
5.高低位问题
Modbus一个字节(byte)只能保存0~255(也可以说是-128到127)的数字。
当数值超过一个byte时,需继续增加byte传递数据,此时需区分高位和低位(可以简单理解为高位值为2时代表两个满值低位)
有部分厂家,高位和低位具体是哪个不一定,有的前面是高位,有的后面是高位,需确认区分
举个例子,有以下数据:
14 44 DF 07
A B C D
按照正常的字节顺序,给数据进行标序,依次是ABCD,这也是大部分国内设备使用的字节顺序。但国外设备大多数为:BADC,即高位在前字节交换
按照四种字节顺序,依次有以下转换
高位在前
按照ABCD排序
14 44 DF 07
9.9394556E-27
低位在前
按照DCBA排序
07 DF 44 14
3.35933235E-34
高位在前字节交换
按照BADC排序
44 14 07 DF
592.123
低位在前字节交换
按照CDAB排序
DF 07 14 44
-9.733479E+18
6.字节转换说明
byte -> byte 原样返回
byte -> bool 使用1个字节存储,占用1个地址位;1为true,否则返回false
byte -> short 使用2个字节存储,占用1个地址位;默认使用AB顺序转换
byte -> ushort 使用2个字节存储,占用1个地址位;默认使用AB顺序转换
byte -> int 使用4个字节存储,占用2个地址位;默认使用ABCD顺序转换,支持指定字节顺序进行转换
byte -> uint 使用4个字节存储,占用2个地址位;默认使用ABCD顺序转换,支持指定字节顺序进行转换
byte -> long 使用8个字节存储,占用4个地址位;每4个字节默认按照ABCD顺序转换,支持指定字节顺序进行转换
byte -> ulong 使用8个字节存储,占用4个地址位;每4个字节默认按照ABCD顺序转换,支持指定字节顺序进行转换
byte -> float 使用4个字节存储,占用2个地址位;默认使用ABCD顺序转换,支持指定字节顺序进行转换
byte -> double 使用8个字节存储,占用4个地址位;每4个字节默认按照ABCD顺序转换,支持指定字节顺序进行转换
- 0
- 0
-
分享