S7 300 400博图平台下SCL语言实现CRC校验查表法

已锁定

不欲勿施

  • 帖子

    839
  • 精华

    14
  • 被关注

    257

论坛等级:奇侠

注册时间:2009-03-27

钻石 钻石 如何晋级?

S7 300 400博图平台下SCL语言实现CRC校验查表法

2593

7

2020-09-13 13:19:36

FUNCTION_BLOCK "CRC"

{ S7_Optimized_Access := 'FALSE' }

VERSION : 0.1

   VAR 

      DATA : Array[0..250] of Byte;   // 待校验的数据

      ByteIndex : Int;   // 待校验数据的字节号索引号

      CrcBitIndex : Int;   // CRC校验表生成中所用的位索引号

      CrcVariable : Word;   // CRC校验用变量字

      CrcByte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} AT CrcVariable : Array[0..1] of Byte;   // CRC校验用变量的高低字节

      CrcCheckCode : Word;   // 最终CRC校验码

      CrcTable : Array[0..255] of Word;   // CRC校验表

      CrcTableIndex : Int;   // CRC表的字索引号

      FirstScanOn : Bool := true;//第一次扫描

   END_VAR

BEGIN

//生成CRC校验表

IF #FirstScanOn = TRUE THEN                                                              //第一次扫描时生成CRC表

   FOR #CrcTableIndex := INT#0 TO INT#255 BY INT#1 DO

       #CrcTable[#CrcTableIndex] := INT_TO_WORD(#CrcTableIndex);

       FOR #CrcBitIndex := INT#0 TO INT#7 BY INT#1 DO

           IF (#CrcTable[#CrcTableIndex] AND WORD#16#0001) = WORD#16#0001 THEN

               #CrcTable[#CrcTableIndex] := SHR_WORD(IN := #CrcTable[#CrcTableIndex], N := int#1);

               #CrcTable[#CrcTableIndex] := #CrcTable[#CrcTableIndex] XOR WORD#16#A001;

           ELSE

               #CrcTable[#CrcTableIndex] := SHR_WORD(IN := #CrcTable[#CrcTableIndex], N := int#1);

           END_IF;

       END_FOR;

   END_FOR;

END_IF;

//CRC循环冗余校验查表法

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

FOR #ByteIndex := INT#0 TO INT#240 BY INT#1 DO                                            //提取待校验的数据

   #CrcTableIndex := BYTE_TO_INT(#DATA[#ByteIndex] XOR #CrcByte[1] ); //生成CRC校验表字的索引号

   #CrcVariable := SHR_WORD(IN := #CrcVariable, N := INT#8) XOR #CrcTable[#CrcTableIndex];             //得到CRC校验变量

END_FOR;

#CrcCheckCode := ROR_WORD(IN := #CrcVariable, N := INT#8);                         //得到最终CRC校验码

#FirstScanOn := FALSE;

//经测试,在CPU315-2 PN/DP中工作,此查表法仅为同环境下计算法的PLC循环时间的五分之一

//此文本复制到TXT,改扩展名为scl,导入源文件就可以。

END_FUNCTION_BLOCK


S7 300 400博图平台下SCL语言实现CRC校验查表法 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54030条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

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