使用RTU模式时,消息发送至少要以3。5个字符时间的停顿间隔开始,如图3的T1-T2-T3-T4所示。传输的个域是设备地址,可以使用的传输字符是十六进制数值。通信期间,网络设备不断侦测网络总线,包括停顿间隔时间内,当个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在后一个传输字符之后,至少要有3。5个字符时间的停顿以标定消息的结束,之后可开始新的消息传输。典型的消息帧如图3所示。使用RTU模式,消息包括了一个基于CRC方法的错误检测域。CRC域检测了整个消息的内容。

图3 Modbus消息帧结构
CRC域是两个字节,包含一个16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误,后面将具体讲述CRC算法的实现。
3 系统软件构成
考虑到操作的方便性,在系统初次安装时,先在PC机上用上位机软件将所有传感器的ID搜索出来,然后按实际安装位置给每个传感器编号,读温度测试传感器是否工作正常。在PLC上使用Modbus协议通信时首先要对通信格式进行设定,即对D8120寄存器进行写操作,在本系统条件下设置为0C87,即数据长度为8位,无校验,无起始位与停止位,波特率9600bps。修改D8120设置后,确保通断PLC电源一次。再用RS指令进行数据的传输,相关程序格式如图4所示。

图4 RS指令程序格式
按照上述程序格式,即可在数据发送区写入指令进行相应的操作。
1)读取温度,其指令格式:[设备地址][命令号][通道号][传感器编号][读取个数高8位][低8位][CRC低8位][CRC高8位],其中CRC校验字节以子程序形式调用。设备响应:[设备地址][命令号][返回的字节个数][数据1][数据2]。。。[数据n][CRC低8位][CRC高8位]。
每个18b20读取温度的返回值占用两个字节。
转换方法:将实际温度扩大100倍,再将此数值分为两个字节传送出来即可。例如,实测出来温度是28。65℃,扩大100倍即2865,则发送的个字节是2865/256即是11,第二个字节是2865%256即49,那么传送的两个字节为0×0B和0×31。
需要注意的是,由于采用两线制的485连线方式,会产生回波通信,即接收端会先接收到自己发送出去的数据,但数据还是会正常发送给采集模块,此时接收端则应该避开前面的无用数据,接收后面模块响应的有效数据。
2)在系统运行后,若需更换传感器,则需执行以下两条指令,首先,搜索ID,[01][06][0c][00][00][00][CRC低][CRC高],此指令为搜索模块1上各个通道的所有传感器。然后写编号,例如:[01][06][09][05][00][05][CRC低][CRC高],表示将第9通道的原来编号为05的传感器更换后重新设定为05,执行此两条指令后,方可重新读取温度。
3)CRC校验字节的生成是比较关键的一步,其过程比较复杂,步骤如下:
①预置一个16位CRC寄存器为十六进制FFFF,即所有数位均为1。
②该16位寄存器的低8位字节与信息帧的个字节的低8位进行&异或运算。运算结果放入这个16位寄存器。
③把这个16寄存器向右移一位,用0填补高位。
④若向右(标记位)移出的数位是1,则生成多项式A001(1010000000000001)和这个寄存器进行“异或”运算;若向右移出的数位是0,则返回③。
⑤重复③和④,直至移出8位。
⑥重复③~⑤,直至该报文所有字节均与16位寄存器进行&异或运算,并移位8次。
⑦将得到的l6位CRC寄存器的高、低位字节进行,即2字节CRC,加到报文。
西门子代理商,西门子模块代理商,西门子一级代理商,西门子PLC代理,西门子中国代理商