上一篇简单讨论了一下modbus的发送报文,这篇开始讨论一下接收报文。发送报文比较简单固定的格式,但是回复报文就会复杂一点,不过万变不离其宗,数据解析还是那样。上一篇说到建议大家做modbus要配置灵活,这里可以贴一下我的配置。
![modbus配置1](https://img-blog.csdn.net/20171202145639654?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejUyMDEzMTQxMDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![modbus配置2](https://img-blog.csdn.net/20171202145742850?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejUyMDEzMTQxMDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
一、定帧
在解析数据之前,我们首先需要做的是定帧,因为我们报文发送出去了,并不一定代表设备就会回复正确的报文,这里我们就不能再胡乱解析。定帧我认为最重要的几不如下:
1、看报文长度够不够,如果是串口的485,那么数据传输速度上就会有限制,你读一个寄存器,那么设备回复一个寄存器的内容会很快。但是如果连续去读寄存器,那么报文就会比较长,例如你100ms去读一次串口数据,但是100ms内,数据并没有全部上送上来。这时候就需要我们去再等100ms去读。这时,需要我们保存上一次的数据,跟这次数据拼接。
2、得到长度符合的数据,这时候还需要去校验CRC,看看数据回复的报文是否合法。
3、长度超出,直接pass掉,开始读下一次的。
至于大家可能会问,我怎么知道合法的长度时多少,这个只需要好好看一下回复报文格式,就可以计算出来。
二、数据计算
这也是最难的一部分,正如上面图片中,我们需要去选择数据的组装方式。一个字节的时候好说,不存在什么低前高后,高前低后。一般回复数据是一个寄存器两个字节一组,这就存在着字节的高前低后之分。像浮点型这样的数据,四字节,就存在字的高前低后之分,这些其实设备说明书中都会讲到。不过难的是怎么写在代码之中。
这里我的配置简单的列出了几个数据类型选择
![数据类型选择](https://img-blog.csdn.net/20171202151838542?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvejUyMDEzMTQxMDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里就需要根据不同的数据类型,选择不同的计算方法。而且类型选择什么就要严格按数据类型来做,举个例子,短整型能显示的整数,选择整形也可以正确显示,这里不提空间浪费问题。但是如果厂家需要显示是负数,那么短整型和整形显示的就会不一样。
1、遥测计算
计算遥测还好,可以直接按字节去算,比如其中一个设备的寄存器回复数据两个字节02 01。组装方式也是高前低后,那么就可以02*256+01,如果是地前高后那就是01*256+2,这里计算方式不限,也可以选择memcpy函数,但是要考虑设备的大小端问题。
2、遥信计算
遥信比较麻烦一点,计算出数据后,需要按位移动。比计算除遥测要多一步。因为遥信是状态量,每一位都代表一个状态。所以需要去移位计算出每一位的值。
好了,接收报文就简单讲到这,有什么不懂或者说有错误的地方,大家可以留言。最后欢迎大家加入嵌入式交流群,群号:***586166104***
浅谈ModBus-接收报文
最新推荐文章于 2024-09-21 14:04:19 发布