- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于PLC的Modbus协议的实现
按照上述程序格式, 即可在数据发送区写入指令进行相应的操作。
1) 读取温度, 其指令格式: [ 设备地址] [ 命令号] [ 通道号] [ 传感器编号] [ 读取个数高8 位] [ 低8位] [ CRC 低8 位] [ CRC 高8 位] , 其中CRC 校验字节以子程序形式调用. 设备响应: [ 设备地址] [ 命令号] [ 返回的字节个数] [ 数据1] [ 数据2] . . . [ 数据n] [ CRC 低8 位] [ CRC 高8 位] 。
每个18b20 读取温度的返回值占用两个字节.
转换方法: 将实际温度扩大100 倍, 再将此数值分为两个字节传送出来即可. 例如, 实测出来温度是28.65℃ , 扩大100 倍即2 865, 则发送的第一个字节是2 865/ 256 即是11, 第二个字节是2 865% 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, 加到报文。
其程序流程如图5, 以上面的温度读取指令为例, 其CRC 校验梯形图如图6。
图5 CRC 校验流程
图6 CRC 校验程序
在读取温度时, 应严格遵守DS18b20 的读写时序, 否则就会出现错误, 丢帧等, 若用脉冲信号定时读取, 则间隔应不小于100 ms. 一般出现错误帧时数据显示为0℃, 此时可以进行简单的滤波, 例如传回值为0 时不显示数据, 或者多组数据取平均值后再显示, 以避免温度显示的大幅度跳动。 DS18b20的初始化温度显示为85℃, 若一直不变, 则此传感器可能已经损坏或是接线不良, 应进行相应的检查。
上一篇:中国TDD-LTE阵营加大
频谱价格不断上涨
下一篇:云计算存储技术