笔记Modbus从站以RS-485标准来传输数据的编程要点:“Modbus主、从站通信过程”,“Modbus从站状态转换”,“数据引用”,“时间监测”。
Figure1:Modbus主/从站通信时序
Modbus的一个通信周期是请求加响应或者命令的执行。同一个周期下,只能有一个主站且一个主站只能与一个从站通信。Modbus主站命令可以是主站和广播的方式。广播不需要响应只需要执行相应的命令。
Figure2:Modbus从站状态转换
用芯片内的定时器来完成Modbus从站中的状态转换。在USART中断函数中接收到一个字符就重新启动定时器重新开始计数,当接收完某个字符定时器定时超过发送4.5个字符时间时就表示接收Modbus请求包完毕,在定时器中断函数中就可以使能解析Modbus请求包的变量,当按照上图情况解析完Modbus请求包后使能发送标志,并在USART中断函数中发送Modbus响应包,当发送完最后一个字符后再重新启动定时器重新计数,当计数发送4.5个字符时间后从站又转换为接收状态,重新接收主站发来的Modbus请求包,…,主从站就按照这个秩序一直进行下去。
如在实现Modbus从站时,为功能码0x04(读输入寄存器)开辟一块存储区static char mb_buff[100];。现在Modbus从站中正确接收到mb_req包的内容为
01 |
04 |
00 |
01 |
00 |
03 |
CRCLi |
CRCHi |
Figure3:Modbus字符收取时间间隔
Modbus协议要求收取两个字符的时间间隔要小于发送1.5个字符的时间,那么在用USART中断函数中接收字符时,判断与上一个字符的时间间隔应该加上接收当前字符的时间,只要定时器所记录的时间小于发送2.5个字符时间都是合理的。同理,两个Modbus数据包之间所要求的最小时间间隔也需要加上接收一个字符的时间。但是不能在中断函数中等着接收下一个Modbus数据包的第一个字符了,因为在接收到Modbus请求包mb_req后Modbus从站就不该再继续接收Modbus请求包,从站任务转向解析Modbus请求包,然后让RS-485状态转换为发送模式,以向主站响应Modbus响应包mb_rsp。
SBox Note Over.