程序员开发实例大全宝库

网站首页 > 编程文章 正文

C#编写Modbus-Rtu通讯第一步,通讯协议简介

zazugpt 2024-10-16 18:22:59 编程文章 19 ℃ 0 评论

前面和大家一起学习了如何使用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);

}

大家可以尝试一下,看看能不能顺利的实现加密解密过程。今天的课程先到这里,我们下期再见!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表