Modbus协议笔记
读线圈:就是说读开关量输出的状态,看看开关量输出的到底是开着的还是关着的,这样说有点不专业,但是好明白。比如要在上位机显示开关量输出的当状态,就得用这个功能码。
写线圈:就是说读开关量输入的状态,开关量的输入大多是为了查看执行元件的动作情况,看看是否执行到位。
读保持寄存器:就是说对被控制的从器件设置一些状态值,如设置时间,设置一些定值,设置互感器的变比什么的。
读输入寄存器:意思说读取一些寄存器的输入值,如模拟量的采集,AD结果寄存器的值什么的。如果要在上位机实时显示电压,电流,温度什么,就要用到这个命令。
强制线圈:意思就是说发出投切控制命令,如机器的启动,停止等。
1.0x01功能码用于读线圈,一个线圈代表一个比特位,每一个线圈有一个索引,从1开始,但是地址编号从0开始
以上图为例:
0x13即十进制19
即从地址为19(线圈索引为20)的线圈开始读,读取19个线圈,也就是响应中的线圈索引为20-38这19个线圈,响应中的0xCD/0x6B/0x05的每一个比特位代表了对应该位的线圈的状态;19个线圈2个字节存不下,所以需要3个字节返回。
2.0x02功能码用于读离散量,其原理与读线圈是一样的,此处不多言了,以下图为例
3.0x03功能码用于读保持寄存器
每个寄存器含有两个字节,请求命令中请求的是寄存器的个数,因此,响应数据中返回“2*寄存器个数”个字节
4.0x04功能码用于读输入寄存器,其原理与读保持寄存器一样
5.0x05功能码用于写单个线圈
注意,是写“单个”线圈,也就是一个比特位(地址为0x00AC)
6.0x06功能码用于写单个寄存器
7.0x0F用于写多个线圈
8.0x10(即16)用于写多个寄存器
9.RTU模式,传的是数据的二进制表示。
10.ASCII模式,传的是数据的十六进制表示的字面值的字符,数据变换为HEX后,再变作为文字发送。
·例: 100→0x64→0x36(‘ 6’ )+0x34(‘ 4’ )。