Modbus相关知识点及问题总结
本人水平有限,写得不对的地方望指正
困惑:线圈状态的值是否是存储在线圈寄存器里面?是否有线圈寄存器的说法?网上有说法说是寄存器占两个字节,但线圈的最少操作单位是位。类似于继电器的通断状态,直接根据电路的特性就可以直接拿到。就好像一根电线一样,你剪断是一个断状态,你把它接起来是通的状态。根据电路特性就可以实时获取了。我找遍了全网都没有找到一个权威的答案,就暂且有吧!
一 从读写功能分类:
读的:
功能码 01:读取线圈寄存器的值,可读写
功能码 02:读取离散输入寄存器的值,只读
功能码 03:读保持寄存器,可读写,可读多个或者单个寄存器内容,所谓保持寄存器是指寄存器数值可以读写,该寄存器数值用于输出模拟量;
功能码 04:读输入寄存器,所谓输入寄存器是指寄存器数值只能由传感器输入的模拟量来驱动更新数值,数值是只读的;一般是读取各种实时数据
写的:
功能码 05:写单个线圈寄存器
功能码 06:写单个保持寄存器,也可以说预置单个保持寄存器;
功能码 10:写多个保持寄存器,也可以说预置多个保持寄存器;
功能码 0F:写多个线圈寄存器
上面涉及到的寄存器:
线圈寄存器(可读写):应用于类似于继电器的打开或者关闭状态的二值量
离散输入寄存器(只读,网上有说是线圈寄存器的只读形式):应用于实时获取的二值量,类似于接线柱的高低电平。
保持性寄存器(可读写):应用类似于设备的配置信息,如设置通信波特率、设备地址等
输入寄存器(只读):应用类似于温度或者湿度传感器的值(不受主观意识影响),但我在淘宝中搜索了多个使用modbus协议的传感器设备,它们都是使用保持性寄存器,其实是并不严谨的,从这个知乎链接modbus 协议 功能码 03 和 04的区别? - 知乎中找到了支持我的观点的说法。
二 读写规律
2.1 读单个或者多个寄存器
请问报文格式:
响应报文格式:
线圈和离散输入寄存器的状态可以使用一个比特位来表示,其他的一个寄存器的值需要用两个字节来表示(数据高位、数据低位)
例子:
2.2 写单个值(保持型寄存器和输入寄存器的数据的字节数都是2的倍数)
对应功能码:05和06
请求报文:
响应报文(和请求报文一样):
例子:
2.2 写多个值(保持型寄存器和输入寄存器的数据的字节数都是2的倍数)
对应功能码:0F和10
请问报文:
响应报文(砍掉中间一部分):
例子:
三 地址表示方式:
你可能在某些文章看到的地址表示方式如下图那样方式表示的:
查阅相关文档了解到,上面的这种方式是PLC的地址表示方式
个人猜测: 上面这种是绝对地址,而我们通过C#编程传输的地址应该是相对地址(为了减少数据量的传输,因为功能码就能唯一确定一个绝对地址),如:
绝对地址40002=(功能码03的绝对地址40001)+相对地址0x01
待验证:
功能码01、02读到的位满8个组合成一个字节,可以用功能04读取
modbus协议功能码和常见问题 - 百度文库