2。1。1 数据包
Modbus协议的数据包形式如图2-1所示:
图2-1 Modbus协议数据包的形式
Modbus的数据帧包含起始位,设备地址,功能码,数据信息,CRC校验位,结束位。第一帧为从机地址,第二帧为功能代码,第三帧是主机想要访问的寄存器地址,最后两帧为16位的CRC校验码。在整个传输过程中,两帧之间必须有间隔,如果间隔时间大于3。5帧,则接收设备将会刷新,会自动的将下一个字节认定为新消息的地址域。相反,如果空闲时间小于3。5帧的时间间隔,接收设备认定该信息是先前信息的延续。所以该系统设计将会用到4ms的时间定时来判断数据帧的发送和接收是否完毕[4]。
在主从通信时,首先主机向从机发送设备的地址码, 所有的附属设备都会接收该地址,并比较其地址,看看是否和自己的相同,。若地址不同就不能接收数据包以及对数据帧进行解析处理。如果设备号地址正确,它将准备接收数据包的剩余帧。从机设备接收数据后, 会自动生成已经接收数据的CRC校验码, 并将该校验码与主机发送的CRC校验码相比较, 如果一致就会认为接收正确,接下来从机根据功能码的不同来完成具体的响应,并生成数据包,返回发送给主机;如果校验码的比较结果不一致,则从机向主机发送出的数据包就是错的, 一个数据包的错误实际上是将功能码的高位置1,它不可能出现127以上的功能代码,如果出现,则判定为错误[3]。
返回的信息中包括了地址码、功能码、数据以及校验码。
通讯数据帧包含的有,一个字节地址码,一个字节功能码,多个字节数据区,CRC校验采用的是冗余循环校验法。
地址码是通信数据帧中的第一个字节,一般为0到255设备号之间。该字节表示的是由该设备号所对应的已设置的从机去接收主机发送过来的信息。每个从机都有唯一的地址码来区分不同的设备。只有符合地址的从机才能响应,回送数据也是以该地址码开始。
功能码是通信数据帧的第二个字节,功能码可以在1到127号之间定义,功能码是告诉从机应该干什么,执行什么任务。从机响应后,它会返回报文,报文中的功能码与发送的一致,就表示从机已响应。
数据区可以是地址,也可以是一些数据,来指导从机工作响应。
2。1。2 通信命令格式
本次实验数据包主要用到的3个功能码:
1)功能码03
代码功能:读单个或多个寄存器
系统实现的功能是设置设备号为01的设备将要读的寄存器的地址以及个数。
数据包格式包含两种数据包,即发送和接收两类数据包。
主机发送数据包格式如表2-2所示。
表2-2发送数据包内容
主机发送 字节数 发送的数据 解析
设备号 1 01 与从机01通信
功能码 1 03 读单个或多个寄存器
寄存器起始地址 2 0000 寄存器起始地址为0000
寄存器数 2 0001 读1个寄存器
CRC码 2 840A 前2个字节的CRC码