1 / 18
文档名称:

最新freemodbus-笔记.docx

格式:docx   大小:277KB   页数:18页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

最新freemodbus-笔记.docx

上传人:小果冻 2022/7/26 文件大小:277 KB

下载得到文件列表

最新freemodbus-笔记.docx

文档介绍

文档介绍:FreeModbus-笔记
FreeModbus 笔记
Modbus-RTU是基于485总线根底上一个主从协议,主站主动发起通信,从站接收主站的消息并响应主站的指令。
这里主要探讨FreeModbus中的RTU从站协议的实
FreeModbus-笔记
FreeModbus 笔记
Modbus-RTU是基于485总线根底上一个主从协议,主站主动发起通信,从站接收主站的消息并响应主站的指令。
这里主要探讨FreeModbus中的RTU从站协议的实现。
从站的串口每次接收一个字节数据,并产生串口中断〔中断翻开〕,那么串口中传过来的一个个字节如何组成一个Modbus的数据帧呢?

,这个时间和波特率相关,不同波特率下,。
,,,在一般的串口通信中,发送1个字符需要:1位起始位,8位数据位,1位校验位(可无),1位停止位,总共 1+8+1+1 = 11位, * 11 = ,假设波特率是9600,那么传输1位的时间是1000/9600 = (ms) ,这样, 4 ms ,即定时器需要的中断时间
,,都作为这一帧数据来处理。当串口在>,那么认为当前主站Modbus发送完了一个数据帧。可以进行后面的Modbus数据帧处理了。再收到的数据回作为下一个Modbus数据帧的首字节。
接收一个字节,是由串口中断来进行完成的,判断是否超时是由定时器中断来完成的。因此以上看是很清楚的一个协议流程需要串口和定时器配合共同完成。所以在看RTU实现协议时一定要记住这点。
从站主要是接收,被动响应,所以先分析接收机的状态:
接收状态机
接收状态包含以下几种:
STATE_RX_INIT, /*!< 接收机在初始态 */
STATE_RX_IDLE, /*!<接收机在空闲态 */
STATE_RX_RCV, /*!< 接收到一帧数据 */
STATE_RX_ERROR /*!< 错误数据帧 */
状态机转换图:
状态机的转换不是由一个函数来确定的,是由多个函数共同作用的结果。。
所以在程序一开始要对串口和定时器进行正确的设置。
当初始化完毕后,接收状态机初始态是STATE_RX_INIT,。,串口收到了一个字节,那么认为是还没准备好的情况下,总线发起的一次Modbus传输,此时这帧数据是不处理的,所以,要等到这一帧数据传送完〔〕。
,说明总线上的数据帧已经传完,处于空闲状态,为发起下一帧数据传输做好了准备。所以接收状态机转换为
STATE_RX_IDLE,同时发送一个EV_READY事件,告诉Modbus以及准备好接收数据了。。
在STATE_RX_IDLE状态下,只会接收串口数据来触发状态转换〔定时被关闭〕。当接收到一个字节时,认为总线开始了一个新的数据帧的传输,把这个字节保存在Modbus数据缓冲区,并将缓冲区指针加1,并将接收状态机转换为STATE_RX_RCV。
在STATE_RX_RCV状态下,接收到一个新字节,将该字节保存在缓冲区,并将缓冲区指针加1,判断接收的字节总长是否>最大帧长,如果不大于,继续保持STATE_RX_RCV状态,等待接收下一个字节或超时〔接收完成〕。当大于最大帧长,说明接收到了错误帧。状态转到STATE_RX_ERROR。
在STATE_RX_RCV状态下,,此时认为总线已经发送完成一个Modbus数据帧,将状态转换到STATE_RX_IDLE,等待下一个数据帧到来。同时触发EV_FRAME_RECEIVED事件,告诉ModbusPoll已经成功接收一帧数据,可以解析并处理了。
在STATE_RX_ERROR状态下,接收到再多的字节都认为是错误的,所以一直停留在错误态,