电工学习网

 找回密码
 立即注册
查看: 4362|回复: 1
打印 上一主题 下一主题

STEP7平台使用SCL实现CRC校验

[复制链接]
跳转到指定楼层
楼主
发表于 2017-8-17 17:21:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序是CP340 MODBUS RTU主站程序中的一部分,分享出来,供大家参考。
FUNCTION_BLOCK MBUS_MASTER_MSG        //功能块名
VAR_INPUT
    // Input Parameters     //输入参数
    INSTRUCTION_ACTIVE          :   BOOL    ;   //指令是否激活,真为激活,假为不激活
    NEW_REQUEST     :   BOOL    ;   //新请求脉冲(设置为 1 时仅对新请求扫描一次)
    SLAVE           :   INT     ;   //从站地址(0 到 247)
    RW              :   INT     ;   //读 = 0,写 = 1
    ADDR            :   DINT    ;   //Modbus 地址(即 00001,10001,20001,40001,400001)
    COUNT           :   INT     ;   //元素个数(1 到 120 个字或 1 到 1920 位)
    MBUS_BUFFER_DB   :   BLOCK_DB    ;   //MODBUS缓冲区数据块
    MBUS_POINTER_DB  :   BLOCK_DB    ;   //MODBUS读写数据块
    MBUS_POINTER_BYTE   :   INT    ;   //MODBUS读写字节地址
END_VAR
VAR_OUTPUT
    // Output Parameters    //输出参数
    DONE    :   BOOL    ;   //完成标志脉冲(0 = 忙,1 = 完成)
    ERROR   :   BYTE    ;   //错误(00无错误,03接收超时,04输入参数错误,05Modbus未激活,06忙 其它指令在工作,08接收数据长度与预计长度不符,0A发送错误,0B接收错误,)
    MBUS_SEND_STATUS    :   WORD    ;   //发送指令错误规范(0 = 无错误)
    MBUS_REV_STATUS     :   WORD    ;   //接收指令错误规范(0 = 无错误)
END_VAR
VAR
    // Static Variables     //静态局部变量
    RetryCount              :   INT     ;   //当前已处理重试次数
    Broadcast               :   BOOL    ;   //广播位
    Send_LEN                :   INT     ;   //发送数据的长度
    Expected_Length         :   INT   ;   //接收数据的预计长度
    Rev_LEN                :   INT     ;   //接收数据的长度
    DB_POINTER  :   INT   ;                 //数据指针
    CRC_INDEX   :   INT   ;                 //CRC校验用索引
    CRC_BIT     :   INT   ;                //CRC校验用位移位次数
    CRC_LSB     :   BOOL    ;               //CRC校验用最低有效位
END_VAR
//CRC校验,将从MBUS_BUFFER_DB数据块的第0个字节开始,一直到发送的最后一个字节
    MBUS_BUFFER_DB.DW268 := WORD#16#FFFF;      //CRC寄存器的初始化
    FOR CRC_INDEX := 0 TO ( Send_LEN - 1 ) BY 1 DO
        MBUS_BUFFER_DB.DB269 := MBUS_BUFFER_DB.DB[CRC_INDEX] XOR MBUS_BUFFER_DB.DB269 ; //信息字节与当前CRC最低有效字节异或
       FOR CRC_BIT := 0 TO 7 BY 1 DO
            CRC_LSB := MBUS_BUFFER_DB.DX269.0 ;      //将CRC最低有效位保存起来,用于之后的判断
            MBUS_BUFFER_DB.DW268 := SHR ( IN := MBUS_BUFFER_DB.DW268 , N := 1 ) ;   //右移
            IF CRC_LSB = TRUE THEN                                                  //如果CRC_LSB位为真
                MBUS_BUFFER_DB.DW268 := MBUS_BUFFER_DB.DW268 XOR WORD#16#A001   ;   //与多项式异或
            END_IF;
        END_FOR;
     END_FOR;
    MBUS_BUFFER_DB.DW268 := ROL ( IN := MBUS_BUFFER_DB.DW268 , N :=  8 )    ;         //CRC循环左移,相当于交换高低字节
    MBUS_BUFFER_DB.DW[ Send_LEN ] := MBUS_BUFFER_DB.DW268 ;   //将CRC校验传到缓冲区
目前已经实现plc采用TCP开放式通信连接串口服务器,再在串口上实现MODBUS RTU通信,过些天再来分享。

回复

使用道具 举报

沙发
发表于 2017-8-17 21:05:59 | 只看该作者
这个是西门子的资料   看不太懂

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-8-31 00:25

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表