MODBUS-RTU循环冗余校验的PLC程序实现

本文在对Modbus-RTU协议中使用的错误校验方式–循环冗余校验CRC生成原理分析的基础上,主要就采用西门子PLC S7-200程序实现循环冗余校验功能进行了介绍。

Modbus是工业领域的一种标准通信协议,许多工业设备包括PLC、变频器、触摸屏、智能仪表等都使用Modbus协议作为它们之间的通信标准。该协议规定网络中只允许存在一个主站,其它设备均为从站。

在以上几种设备组成的网络中,笔者一般以PLC作为主站。由于西门子S7-200型PLC功能强大,可靠性高,易于连接成网络,于是以S7-200型PLC为Modbus主站,访问变频器、智能仪表等设备,读取其中重要数据。为了保证传输数据的正确性,必须在S7-200型PLC中校验读取数据的准确性,于是就引入了PLC程序用以实现Modbus -RTU循环冗余校验。

1.Modbus协议和循环冗余校验CRC

Modbus 是一种串行异步通讯协议,是工业控制器网络协议中的一种通用工业标准。此协议定义了一个能供控制器认识使用的消息结构,而不管它们是经过何种网络进行通信的;描述了一控制器请求访问其他设备的过程,如果回应来自其它设备的请求,则侦测并记录错误;制定了消息域格局内容的公共格式。

控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询),其它设备根据主设备查询提供的数据作出响应。通过这种协议,不同厂商生产的控制设备可以连成工业网络,进行相互通信。Modbus有两种传输方式:ASCII和RTU。

为保证传输过程的正确性,需要对通信过程进行差错控制。差错控制最常用的方法是自动请求重发方式(ARQ)、向前纠错方式(FEC)和混合纠错方式(HEC)。在传输过程误码率比较低时,用FEC方式比较理想;在传输过程误码率较高时,采用FEC方式容易出现“乱纠”现象。

在许多数字通信中,广泛采用ARQ方式,此时的差错控制只需要检错功能。实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验及行列冗余码校验等。这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。

但这些方法都有各自的缺点,误判的概率比较高。HEC方式则是ARQ和FEC的结合。编码简单且误判概率很低,在通信系统中得到了广泛的应用。

ASCII方式的错误检测是采用纵向冗长检测(LRC)方法对消息内容计算得出的;RTU方式的错误检测是通过对消息内容进行循环冗余校验(CRC)得出的。循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二元码组。CRC校验码的编码方法是用待发送的二进制数据除以生成多项式,将最后的余数作为CRC校验码。

2.MODBUS-RTU的消息帧格式

MODBUS-RTU循环冗余校验的PLC程序实现

CRC域是两个字节,包含一16位的二进制值,它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

3.MODBUS-RTU中CRC的生成

通过对一个16位寄存器预装载全1来启动CRC计算。然后,开始将后续报文中的8位字节与当前寄存器中的内容进行计算,仅每个字符中的8位数据参与生成CRC的计算,起始位、停止位以及奇偶校验位均不参与生成CRC计算。

CRC产生过程中,每个8位字符都单独和寄存器内容相异或,结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值异或一下;如果LSB为0,则不进行异或运算。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相异或。最终寄存器中的值是消息中所有字节都执行之后的CRC值。

在MODBUS-RTU中经常使用CRC-16作为错误校验手段,采用的CRC-16多项式是16进制A001(即二进制1010000000000001)。生成CRC-16校验字节的步骤如下:

假设消息中第一个8位数据地址为VB2600,第二个、三个等数据地址相应为VB2601、VB2602、VB2603等等,数据个数保存在寄存器VW2522中。

3.1调入一个16位寄存器VW2500,其中所有位设为“1”(即初始值为16进制FFFF);

3.2把VB2600的值与VW2500的低位字节进行异或,运算结果放入VW2500;

3.3 把VW2500的值采用SHR-W指令向右移一位,结果仍存入VW2500;

3.4 若移出的数值是“1”,则当前的VW2500与CRC-16多项式A001进行异或运算,结果仍存入VW2500;若移出的数值是“0”,则不进行异或,重新返回第3步;

3.5采用FOR-NEXT循环语句,重复执行第3和4步,总共执行8次,把结果存入VW2500;

上面计算出来的结果是第一个8位数据的异或结果,其它几个连续的8位数据根据以上运算方法再采用一个FOR-NEXT循环语句计算,循环次数设为VW2522。

3.6 把第二个8位数据VB2601与上面第5步计算的结果相异或,结果存入VW2500;

3.7重复执行第3至5步,把结果存入VW2500。

当VW2522数据个数在三个或以上时,重复执行第6至7步,最后的结果存入VW2500。

4.CRC校验在S7-200中的程序实现

4.1建立一个数据指针VD2530,把消息的n个8位数据的起始地址VB2600传送至VD2530。建立一个FOR-NEXT外循环语句,循环次数设为VW2522。

MODBUS-RTU循环冗余校验的PLC程序实现

4.2给16位寄存器VW2500赋上初始值:16#FFFF,并与第1个8位数据VB2600进行异或;第二个8位数据VB2601则与上一个8位数据循环运算的结果VW2500相异或。

MODBUS-RTU循环冗余校验的PLC程序实现

4.3再建立一个FOR-NEXT内循环语句,循环次数设为8,对数据进行移位异或运算。

MODBUS-RTU循环冗余校验的PLC程序实现

MODBUS-RTU循环冗余校验的PLC程序实现

4.4把数据指针地址加1,指向下一个8位数据,然后进入下一个循环。

MODBUS-RTU循环冗余校验的PLC程序实现

4.5当n个8位数据的循环运算完毕,CRC校验结果保存在VW2590里,此结果高位字节在前;如果将该CRC值放置到报文中时,必须交换高位和低位字节。

MODBUS-RTU循环冗余校验的PLC程序实现

5.结束语

以上介绍的是CRC校验在西门子PLC S7-200的程序中是如何实现的。在运行PLC时,按下“状态表监控”命令,出现状态表监控画面,输入几个8位数据和1个数据位数,把它们写进PLC,即可在VW2590寄存器中得到一个16位的CRC值(高位字节在前)。

通过上述CRC校验程序,S7-200型PLC对所读取的变频器、智能仪表的数据进行一一校验,从而保证了该网络上的各种设备能正常连续地工作。

(摘编自《电气技术》,原文标题为“MODBUS-RTU循环冗余校验的PLC程序实现”,作者为周长忠、邵惠鹤、刘彩霞。)

S7-300/400 PLC应用技术
¥56.25

购买

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据