大家好,欢迎来到IT知识分享网。
前面和大家一起学习了如何使用C#编写串口读写程序和威纶触摸屏实现数据交换。这个通讯是最简陋的通讯方式,只能用于两个设备都是自己编程的情况下。在实际应用中,我们要读取的设备一般都已经做好了通讯协议,而Modbus-Rtu是最常用的协议之一。
作为工业上非常常用的通讯协议,Modbus-Rtu支持一个主机连接多个从站,这意味着485连接成了最合适的总线连接形式。主机作为提问者,根据站号查询每个站的寄存器状态,这种方式叫做轮询。所以连接的从站越多,全部读取一遍所有从站的时间就越长。而且为了总线稳定,两个从站之间的读取还需要一些间隔时间,所以我个人感觉Modbus-Rtu适用于对数据采集频率不高的应用场景中。
Modbus-Rtu的基本格式如上图所示。它包括通信地址、功能代码、数据和差错校验,地址就是主机要通讯的从站地址,功能码就是主机想要从机做什么事情,而数据就是具体要从站完成的事情。
功能码常用的就是上图中的几个,学会这几个基本上就能用Modbus-Rtu做项目了。
这里最难理解的就是校验。很多没有接触过通讯协议的朋友可能有些一头雾水,所以感觉有必要解释一下。通俗地说,校验就是相当于密码本。发数据的一方在写信时,将信上所写的内容利用密码本上的规则计算一下,然后把结果填在信后面。收信的一方在收到信息后,会按照同样的密码本规则来核对一下,如果结果和人发信人发来的结果一致,就说明信的内容完全正确,没有人修改过。
Modbus-Rtu的校验CRC-16 ,公式是 x16+x15+x2+1 计算方式参考上图来做,编辑完成的程序如下:
publicvoid CRC16Calc(byte[] dataBuff, int dataLen)
{
int CRCResult = 0xFFFF;
if (dataLen < 2)
{
return;
}
for (int i = 0; i < (dataLen – 2); i++)
{
CRCResult = CRCResult ^ dataBuff[i];
for (int j = 0; j < 8; j++)
{
if ((CRCResult & 1) == 1)
CR
CResult = (CRCResult >> 1) ^ 0xA001;
else CRCResult >>= 1;
}
}
dataBuff[dataLen – 1] =Convert.ToByte(CRCResult
>> 8);
dataBuff[dataLen – 2] =Convert.ToByte(CRCResult & 0xff);
}
大家可以尝试一下,看看能不能顺利的实现加密解密过程。今天的课程先到这里,我们下期再见!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/108763.html