回复:S7-1200用SCL语言写CRC检验码

你以为你是谁

  • 帖子

    4602
  • 精华

    11
  • 被关注

    316

论坛等级:至圣

注册时间:2007-08-02

钻石 钻石 如何晋级?

发布于 2018-11-14 07:47:37

1楼

之前论坛一个大师写的,名字不记得了,今天分享给你:

FUNCTION FC16 : WORD


// ModBus CRC16算法


CONST

    ARRAY_COUNT := 32;

END_CONST


VAR_INPUT

    Byte_Array : ARRAY[0..ARRAY_COUNT-1] OF BYTE;

    Count : INT;

END_VAR


VAR_TEMP

    CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: WORD;     

    i, index: INT;

END_VAR

    CRC16Lo := 16#FF; //CRC16Lo为CRC寄存器低8位     

    CRC16Hi := 16#FF; //CRC16Hi为CRC寄存器高8位     

    CL := 16#01;     

    CH := 16#A0; //  A001 H 是CRC-16多项式代码     

    FOR i := 0 TO Count-1 DO     

        CRC16Lo := CRC16Lo XOR Byte_Array[i]; //每一个数据与CRC寄存器异或     

        FOR index := 0 TO 7 DO     

            UseHi := CRC16Hi;     

            UseLo := CRC16Lo;     

            CRC16Hi := SHR (IN:=CRC16Hi, N:=1);     

            CRC16Lo := SHR (IN:=CRC16Lo, N:=1); //右移一位     

            IF ((UseHi AND 16#1) = 16#1) THEN //如果高位字节最后一位是1的话     

                CRC16Lo := CRC16Lo OR 16#80; //低位字节右移后前面补1     

            END_IF;

            

            IF ((UseLo AND 16#1) = 16#1) THEN //如果LSB 为1,则与多项式进行异或     

                CRC16Hi := CRC16Hi XOR CH;     

                CRC16Lo := CRC16Lo XOR CL;     

            END_IF;     

        END_FOR;     

    END_FOR;     

    FC16 := SHL(IN:=CRC16Lo, N:=8) OR CRC16Hi;

END_FUNCTION




PCS7系统爱好者,技术交流:617522577@qq.com
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15100条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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