回复:CRC效验SCL程序

v_wind

  • 帖子

    289
  • 精华

    3
  • 被关注

    36

论坛等级:侠圣

注册时间:2013-03-08

普通 普通 如何晋级?

发布于 2017-10-07 20:30:15

8楼

FUNCTION "CRC_CHK" : Void

{ S7_Optimized_Access := 'TRUE' }

VERSION : 0.1

   VAR_IN_OUT 

      ArrayBuf : Array[*] of Byte;

   END_VAR


   VAR_TEMP 

      ArrayBuf_LEN : UDInt;

      VariantBuf : Variant;

      CRC_INDEX : Int;

      VariantBuf_LEN : DInt;

      CRC_BIT : Int;

      temp : Word;

      temp_1 : Byte;

   END_VAR



BEGIN

VariantPut(SRC:=#ArrayBuf,

          DST:=#VariantBuf);

#ArrayBuf_LEN :=CountOfElements(#VariantBuf);

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

#ArrayBuf[#VariantBuf_LEN - 1] := 16#FF;      //CRC寄存器的初始化

#ArrayBuf[#VariantBuf_LEN - 2] := 16#FF;      //CRC寄存器的初始化

#temp.%B0 := #ArrayBuf[#VariantBuf_LEN - 1];

#temp.%B1 := #ArrayBuf[#VariantBuf_LEN - 2];

FOR #CRC_INDEX := 0 TO #VariantBuf_LEN - 3 BY 1 DO

   //信息字节与当前CRC最低有效字节异或

   #temp_1 := #ArrayBuf[#CRC_INDEX] AND 16#FF;

   #temp := #temp_1 XOR #temp;

   FOR #CRC_BIT := 0 TO 7 BY 1 DO

       IF (#temp AND 16#01) = 16#01 THEN    //CRC最低有效位为真

           #temp := SHR(IN := #temp, N := 1);   //右移1位

           #temp := #temp XOR 16#A001;   //与多项式异或

       ELSE

           #temp := SHR(IN := #temp, N := 1);   //右移1位

       END_IF;

   END_FOR;

END_FOR;

//将CRC校验传到缓冲区

#ArrayBuf[#VariantBuf_LEN - 1] := #temp.%B1;

#ArrayBuf[#VariantBuf_LEN - 2] := #temp.%B0;

END_FUNCTION

以上是修改过的程序,用Array[*] of Byte确实不用开辟新的空间,但读取长度还需要 Variant类型的,这个程序仅仅是编译通过,没有测试的。

程序是块生成源,保存SCL格式的,再用笔记本打开复制出来的。

精华帖版主置评:认真研究,说干就干。钻研精神值得称赞。 -yming

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15582条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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