Modbus:
总线通信协议、是一种应用层的报文传输协议
Modbus-RTU(常用)、Modbus-ASCII、Modbus-TCP
通讯模式:主从方式通信,不能同步进行通信
Modbus-RTU协议
帧结构 = 地址(占一个字节) + 功能码(占一个字节) + 数据地址 + 寄存器数量 + CRC校验码
功能码:01 读线圈寄存器 02 读离散输入寄存器 03代表查询 04 读输入寄存器 06代表修改 10代表连续修改
例如查询功能码03:
主机发送:01 03 00 00 00 01 84 0A
从机发送:01 03 02 19 98 B2 7E
分析主机:
01 代表从机地址,也就是传感器地址
03 功能码 代表查询功能,查询传感器的数据
00 00 代表查询的起始寄存器的地址,从0x0000开始查询
01 代表查询寄存器的数量:1个
84 0A 代表CRC校验码 从首个字节开始到84前面为止
分析从机:
01 代表这个传感器的地址
03 功能码 代表查询功能,查询传感器的数据 这里主机与从机必须保持一致,否则数据有问题
02 代表后面数据的字节数
19 98 代表01这个寄存器的数据值
B2 7E 代表CRC校验码 从首个字节开始到B2前面为止
例如修改功能码06:
主机发送:01 06 00 00 00 01 48 0A
从机发送:01 06 00 00 00 01 48 0A
分析主机:
01 代表从机地址,也就是传感器地址
06 功能码 代表修改单个寄存器功能
00 00 代表查询的起始寄存器的地址,从0x0000开始修改
00 01 代表修改的值为 00 01
48 0A 代表CRC校验码 从首个字节开始到48前面为止
分析从机:
跟主机一致
归纳:
03-主机发送起始地址+寄存器数量,从机回复总字节数+数据
06-主机发送起始地址+数据内容,从机返回起始地址+数据内容
10-主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量
Modbus-ACSII协议
ASCII码虽然效率不如RTU,但是RTU是16进制发送,显示屏显示不出,会出现乱码,所以为了方便调试显示,而选择ACSII
帧形式:起始(1字符) + 地址(2字符) + 数据 + LRC(2字符) + 结束(2字符 CR,LF)
Modbus-TCP协议
数据帧分为:MBAP+PDU
报文头MBAP:长度为7字节
事务处理标识(2字节) + 协议标识(2字节) + 长度(2字节) + 单元标识符(1字节)
事务处理标识:报文的序列号,一般每次通信后要加1以区别不同的通信数据报文
协议标识:00 00表示Modbus TCP协议
长度:表示接下来的数据长度,单位为字节
单元标识符:可以理解为设备地址
帧结构PDU
由功能码+数据组成,功能码为1字节,数据长度不定,由具体功能决定
Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器
线圈:PLC的输出位,开关量,在Modbus中可读可写
离散量:PLC的输入位,开关量,在Modbus中只读
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器:PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写
通信方式:
主站为client端,主动建立连接,从站为server端,等待连接
主站请求:功能码+数据
从站正常响应:请求功能码+响应数据
从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
通信过程
1、connect建立TCP连接
2、准备Modbus报文
3、使用send命令发送报文
4、在同一连接下等待应答
5、使用recv命令读取报文,完成一次数据交换
6、通信任务结束时,关闭TCP连接