CAN总线故障解决之谜寻找通讯中的黑暗森林
远程IO设备Modbus通信调试指南:解密数据流的秘密代码
在遥控IO设备实现Modbus通信时,作为从机,它们遵循了精心设计的Modbus通讯过程。我们专注于MODBUS-RTU协议的命令子集,其中包含读寄存器命令(03)和单寄存器设置命令(06)。每个消息之间至少需要3.5个字节时间的间隔,以确保无缝连接。
其中,03命令用于主机从远程IO设备中提取采集数据或端口状态,而06命令则负责设置设备参数或控制继电器动作。
功能码03(读指令)
利用Modbus通信协议中的功能码03,我们能够从远程设备中提取数值信息。主机向从机发送请求格式如下:
从机地址
功能码
起始地址
数据个数及CRC校验码
例如,如果要读取地址为0000的寄存器中的一个数值,该数值占用两个字节,并且高位在前,则主机将发送以下请求:
01 03 00 00 01 C5 CA
而响应格式为:
01 03 XX XX DATA1 DATA2 CRC_L CRC_H
其中XX是字节数目,DATA1和DATA2分别代表高低位字节,而CRC_L和CRC_H表示CRC校验码的低位字节和高位字节。
功能码06(写指令)
同样地,我们可以使用功能码06来向远程设备写入一个寄存器中的数值。主机会以以下格式发送请求:
从机地址
功能码
寄存器地址
设置数据及CRC校验码
举例来说,要将485地址设置为1,上级主机会发起以下写操作:
00 06 00 01 00 FF FB -> 设定485地址为1到2并确认成功后返回应答信号。
然后,从机会以相同结构但反转顺序返回确认信号,如下所示:
01,6,0,1,0,FF,BB -> 确认485已经被设定为1.
实际应用案例
示例一:读取所有寄存器内容
假设我们的目标是阅读485总线上所有可用的16个寄存器上的内容,每个注册由两字符组成,因此共计32字符。在这个过程中,我们首先需要确定哪些注册是有效的,这通常通过查看传感器或者其他硬件的手册来完成。一旦我们确定了哪些注册是有效并且应该被访问,那么我们就可以构建相应的事务包。事务包包括目的地服务器、函数代码、起始位置、数量以及最后是一个16比特长度的Cyclic Redundancy Check (CRCC) 校验符。如果服务器正确接收到事务包,它将按照要求提供对应数量的一系列二进制数字。这段数据也包含在回复消息内,与事务包中的数量相同长度,并紧随其后的CRCC校验符。
示例二:更改485总线上的某一条路线上的传感器类型
如果你想改变一个路由上某一传感子的类型,你可能需要执行类似这样的操作:
对于第一个传感子,可以这样做:
# write(0x02, [sensor_type], start_address=0x0008)
这将修改第八行开始处的一个传感子的类型。
对于第二个传感子,可以这样做:
# write(0x02, [sensor_type], start_address=0x001A)