MODBUS的CRC校验和程序(5)

2019-03-10 12:35

使用RTU模式时,消息发送至少要以3.5个字符时间的停顿间隔开始(如表1中的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0-9,A-F。网络设备不断侦测网络总线,当第一个域(地址域)接收到,每个设备都进行解码以判断是否发给自己。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始[3]。

整个消息帧必须作为一连续的流传输。如果在帧完成之前有超过3.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前一消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC 域的值不可能是正确的。一典型的RTU模式的消息结构如表1所示。

表1 RTU模式的消息帧结构

Tab.1 The message frame structure of RTU mode

3.3 Modbus基本规则

(1) 所有RS485通讯回路都应遵照主/从方式,依照这种方式,数据可以在一台主机(如PC机)和多台从机(如DYZB-101A)之间传递,从机数量应限制在32个以内。

(2) 主机初始化和控制在RS485通讯回路上传递的所有信息。

(3) 任何一次通讯都不能从从机开始。

(4) 在RS485回路上的所有通讯都以“信息帧”方式传递。

(5) 如果主机或从机接收到含有未知命令的信息帧,则不予以响应。

主机为主动通信方式,通信开始后主机依次查询各从机并等待从机的应答,主机发出某一询问码后,必须在一段时间内接收到对应从机的应答。当通讯命令发送至仪表时,符合相应的地址码的设备接收通讯的命令,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返送给主机。返送的信息中包括地址码,执行动作的功能码,执行动作后的数据以及错误校验码(CRC或LRC)。如果出错就不发送任何信息。如果主机在规定的接收时间内没有收到对应从机的任何有效的应答,则可以认为该从机通信故障,从下一个从机继续询问。

4 主机通信软件设计

DYZB-101A型低压智能综合保护器适用于交流400V低压电力系统,作为低压电动机的保护、检测设备。该智能仪表中的数据信息主要分为动态信息、查询信息和控制信息。动态信息包括电流、电压、功率等信息;查询信息包括启动次数、运行时间、开关状态、报警等信息;控制信息包括对时、启动、设置参数等信息。上位机监控系统在获取智能仪表中的各类信息时,主要是采用轮巡的方式,由于不同的数据信息对实时性的要求不同,因此上位机可针对各类不同的数据信息进行周期性轮巡和非周期性轮巡,其中周期性轮巡可根据实际

需要设置不同的轮巡周期。本文将以对智能仪表中实时性要求较高的动态信息为例来讨论上位机通讯软件的实现[4]。

4.1 MSComm控件与串行通信

RS232/485转换器将RS232信号转换成RS485信号进行传输。对于主机来讲,通信软件就是对RS232串行通信端口进行编程。

主机通信软件采用Windows环境下的VB 6.0进行编程。Windows操作系统在底层实现了和串行通信有关的很多复杂的工作,它自动将所有接收到的字符放到接收缓冲区中,而所有发送的字符也都进入发送缓冲区中。程序可读取接收缓冲区的数据,或者向发送缓冲区发送数据。VB6.0是微软公司开发的一种可视化编程工具,具有界面友好、编程方便、简单易行等特点。VB6.0与Windows系统有着非常完美的接口,可据以设计系统的内建及外挂控件更是众多。同时,VB6.0还提供了一个非常方便的通信控件MSComm。应用程序嵌入MSComm控件,通过MSComm控件提供的事件驱动或查询方式来进行串行通信管理[5, 6]。

编写RS485网络通信程序很少用事件驱动方式,而多采用查询方式。本程序使用的方法对常用的查询方式进行了简化,不用检测CommEvent属性值,节省了程序运行时间。

4.2 编程要点

4.2.1 实现校验

主机发送查询命令或接收从机应答数据时,校验码的计算是通过调用函数fun_SerialCRC()实现的。函数fun_SerialCRC()放在程序模块中。

CRC校验的软件实现有两种方法:一种为计算法;另一种为查表法。计算法就是依据CRC校验码的产生原理来设计程序的。其优点就是:模块代码少,修改灵活,可移植性好。其缺点就是:计算量大。而查表法的优缺点正好与计算法相反,因为对于固定字节CRC校验计算的多项式因子,其CRC值是固定的,因而,采用查表法可以简化计算过程、节省应答时间、提高通信效率。本文采用的是查表法,程序流程图如图3所示。

图3 CRC16查表法实现流程图

Fig.3 The flowchart of CRC16 table lookup

4.2.2 实现周期性轮巡发送

为了保证主机不断地将查询命令下达到各个从机,程序使用一个定时器控件Timer1,将Timer控件的间隔属性设置为100ms,在定时器的Timer事件过程中写入主机向一台从机发送查询信息的子程序SendPackage()。这样每隔100ms调用一次子程序,主机向一台从机完成一次命令发送。如果有十台从机,这样依次每隔100ms便查询一台从机,1s钟就可以实现对十台从机的轮巡。

如果主机是对各个从机的同一个数据信息进行查询,查询信息帧的命令内容是完全相同的,除从机地址码不同外,其格式基本相同。发送命令子程序流程图如图4所示。

图4 发送命令子程序流程图

Fig.4 The subroutine flowchart of sending command


MODBUS的CRC校验和程序(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中小学布置调整规划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: