STEP7平台使用SCL实现CRC校验

已锁定

不欲勿施

  • 帖子

    836
  • 精华

    16
  • 被关注

    391

论坛等级:奇侠

注册时间:2009-03-27

黄金 黄金 如何晋级?

STEP7平台使用SCL实现CRC校验

3576

3

2017-08-17 14:14:46

此程序是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校验用位移位次数

END_VAR


//CRC校验,将从MBUS_BUFFER_DB数据块的第0个字节开始,一直到发送的最后一个字节

    MBUS_BUFFER_DB.DW268 := WORD#16#FFFF;      //CRC寄存器的初始化

    FOR CRC_INDEX := 0 TO ( Send_LEN - 1 ) BY 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

            

                IF ( MBUS_BUFFER_DB.DW268 AND WORD#16#0001 ) = WORD#16#0001 THEN    //如果CRC最低有效位为真,那么

                MBUS_BUFFER_DB.DW268 := SHR ( IN := MBUS_BUFFER_DB.DW268 , N := 1 ) ;   //右移1位

                MBUS_BUFFER_DB.DW268 := MBUS_BUFFER_DB.DW268 XOR WORD#16#A001   ;   //与多项式异或

            ELSE

                MBUS_BUFFER_DB.DW268 := SHR ( IN := MBUS_BUFFER_DB.DW268 , N := 1 ) ;   //右移1位

            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通信,过些天再来分享。


STEP7平台使用SCL实现CRC校验 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54713条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。