一种基于MODBUS总线高压软起动装置液晶显示界面的
5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的 CRC域的值不可能是正确的。所以在通讯端口初始化时,Timer1定时间隔设置为500ms。
2.4 MODBUS的CRC校验原理
CRC校验实现 MODBUS通信的RTU模式中,规定信息帧的最后两个字节用于传递CRC(Cyclic Redundancy Check,循环冗余校验)码。发送方将信息帧中地址域、功能码、数据域的所有字节按规定的方式进行位移并进行XOR(异或)计算,即可得到2字节的 CRC码,并把包含CRC校验码的信息帧作为一连续的流进行传输。接收方在收到该信息帧时按同样的方式进行计算,并将结果同收到的CRC码的双字节比较,如果一致就认为通信正确,否则认为通信有误,从站将发送CRC错误应答。 RTU模式一般采用CRC-16冗余校验方法,CRC-16的校验码为16位(2字节),其中低字节在前,高字节在后。实现CRC校验有两种方法:根据 CRC校验的定义公式进行计算,或者在程序中建立CRC校验值表。在程序中使用前者更容易实现,这里需要使用CRC生成多项式X16+X15+X2+1。该多项式对应的码组系数为18005H(16进制),去除最高位,对应的16位余数为8005H,即为CRC-16常数。CRC-16校验过程如下:将 CRC寄存器的每一位预置为1;把该寄存器值与8bit的信息帧数据进行异或,结果存于该寄存器;对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与CRC-16常数进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8bit数据处理完毕,用此时寄存器的值与下一个8bit数据异或并进行如前一样的8次移位。所有的字符处理完成后 CRC寄存器内的值即为最终的CRC值。CRC添加到消息中时,先加入低字节,然后高字节。RTU模式的传输格式是1个数据位,2个停止位,没有奇偶校验位。通信数据安全由控制参数CRC-16码保证。RTU接收设备依靠接收字符间经过的时间判断一帧的开始,如果经过3个半的字符时间后仍然没有新的字符或者没有完成帧,接收设备就会放弃该帧,并设下一个字符为新一帧的开始,应用程序中,MODBUS协议通信由通讯子模块实现,包含CRC-16计算与验证、信息帧的编制和分解。
![4.jpg](../img/eep/emb/emb-50546c2mvshxk1o5.jpg)
3 MODBUS通讯应用
下面是基于单片机MSP430F149为主芯片的高压软起动装置液晶操控板,以此为例来说明MODBUS通讯的应用。MODBUS通讯主设备是DSP控制器,从设备是高压软起动装置液晶操控板。
3.1 液晶操控板MODBUS通讯测试码
/*****************************MODBUS通讯测试码*****************************
召唤发送:
00 06
00 00 00 0C 1E 88
电压、电流监测功能:
00 03
1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0D 8D
故障显示功能:
00 02
18 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 20 34
*****************************MODBUS通讯测试码*****************************/
2:对以上测试码分别进行说明:
(1):召唤发送,参数设置功能:即控制器(DSP)与液晶屏(430)之间的通讯,是双向的。
00 06
00 00 00 0C 1E 88
以上这段代码是DSP传给430的召唤代码,含义(代码从左到右)是:00:设备代码。本系统中从设备只有高压软起动装置液晶操控板一个设备,故设备代码设置为00。06:功能码,实现何种功能(本例中,06是双向召唤发送功能,实现参数设置;03功能码实现电压、电流监测功能;02功能码实现故障显示功能)。00 00:是起始地址的高八位、低八位。00 0C:是DSP要求430回传字节的个数(不包括设备代码、功能码、数据个数代码、和校验代码),00是个数的高八位、0C是个数的低八位,0C是十六进制(转换成十进制是12,12是从“起动时间、额定电流——备用 3”的个数),1E 88:是CRC校验码。当DSP给430传
00 06
00 00 00 0C 1E 88
代码时,430先将这8个字节保存到一个临时数组RX[]中,然后分别对这8个字节进行判断(1E 88是校验查表得出来的代码),如果检验正确,就会把要回传给DSP的字节放到can_s[]数组中发出去,发送到DSP。以下代码就是430接到
00 06
00 00 00 0C 1E 88
判断正确后,回传给DSP的代码。00 06:是设备代码、功能码。18:回传的字节个数(十六进制18就是十进制24)。B6 8F是回传的校验代码。中间的24个字节(00),每两个字节(00)分别对应“起动时间、额定电流——备用 3”,之所以全是00 ,是因为没有设置参数,在液晶屏上设置参数,
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)