Modbus标准的定义是:
一主多从
主有寄存器
寄存器有四个存储区:
0区:输出线圈(Coils)存储区。它是可读可写的。这个区域用于存储可以写入或读出的布尔量,如IO口的电平高低、灯的开关状态等。
1区:输入线圈(Discrete Inputs)存储区。这个区域主要用于存储只读的状态信息,通常也是布尔量类型。
3区:输入寄存器(Input Registers)存储区。这个区域用于存储只读的数据,如传感器的温度数据等。这些数据通常是16位寄存器类型。
4区:保持寄存器(Holding Registers)存储区。这个区域存储的是可读可写的16位寄存器类型的数据,例如设置的密码等。
作为总线协议却没有忙判定机制
————————————————
modbus的报文格式?
有三种:modbus-RTU、modbus-ASCLL、modbus-TCP
modbus-RTU
从机地址 | 功能码 | 数据… | CRC | CRC |
传十六进制
modbus-ASCLL
起始 | 从机地址 | 功能码 | 数据… | CRC |
传ascll
modbus-TCP
事务处理标识箱* | 协议标识符* | 长度 | 单元标识符* | 功能码 | 数据 |
modbus-TCP一看比较复杂,先放一边,RTU版和ASCLL版差不多一样。
然后,从机地址?没有主机地址?功能码是什么?数据又怎么定义?
只有从机地址,主机和某一从机对话时,都是以从机地址开头
功能码定义:
01H 读取输出线圈
02H 读取输入线圈
03H 读取保持寄存器
04H 读取输入寄存器
05H 写入单线圈
06H 写入单寄存器
0FH 写入多线圈
10H 写入多寄存器
数据段的定义好像没有特别明确,各家各有不同。
以我手里的一份《modbus采集规范应用手册》为例
主问询:00 00 00 0F,前16位是开始地址,后16位是连续问的长度
从响应:03 AA BB CC,前8位表长度(单位是八位,这里是03,就是说后面有3个八位),后面是数据值(不是地址),这里主收到从响应后,根据其询问的地址去改数据值------就是说这里问答必须是一一对应的。