大家好,欢迎来到IT知识分享网。
Modbus以及上位机软件实际运用
Demo代码
Modbus简介
协议版本
ModbusRTU
Modbus RTU是一种紧凑的,采用二进制表示数据的方式,使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和(CRC)。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。
ModbusASCII
Modbus ASCII是一种人类可读的,冗长的表示方式。使用串行通信(serial communication)方式。ASCII格式采用纵向冗余校验的校验和(LRC)。相比之下,RTU格式的协议较为常用。
Modbus/TCP
对于通过TCP/IP(例如以太网)的连接,存在多个Modbus/TCP变种,这种方式不需要校验和计算,目前较为广泛运用的是Modbus/TCP。
通讯简析
错误通讯
其中的异常码如下表所示:
寄存器/暂存器
寄存器分四类
| 类别 | 区号 | 读写 | 值范围 |
|---|---|---|---|
| 线圈状态 | 0区 | 可读可写布尔量 | 00001-09999 |
| 离散输入状态 | 1区 | 只读布尔量 | 10001-19999 |
| 输入寄存器 | 3区 | 只读寄存器 | 30001-39999 |
| 保持寄存器 | 4区 | 可读可写寄存器 | 40001-49999 |
RTU协议帧结构
CRC校验
CRC占用两个字节包含了一个16位的二进制值,如上表所示的CRCL和CRCH。这两个值在发出的时候已经由发出的设备计算得出,然后附加到数据帧尾部,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等就判断数据发生了错误。
功能码
上位机代码实例
ModbusSlave
TCP协议
功能码如下:
- 线圈寄存器:实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01 0x05 0x0f
- 离散输入寄存器:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。所以功能码也简单就一个读的 0x02
- 保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,所以功能码有对应的三个:0x03 0x06 0x10
- 输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。对应的功能码也就一个 0x04
Modebus封装——NModbus
读取线圈数据
读取线圈数据首先要将模拟器设置成线圈
读取离散线圈数据
读取保存寄存器
读取输入寄存器
写入单线圈
写入单寄存器
写入多线圈
写入多寄存器
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111769.html


