技术论坛

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

返回主题列表
作者 主题
不欲勿施
奇侠

经验值: 8075
发帖数: 838
精华帖: 14
楼主    2020-09-13 13:19:36
主题:S7 300 400博图平台下SCL语言实现CRC校验查表法

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


13478405725
RENHQ
至圣

经验值: 68539
发帖数: 12105
精华帖: 59
1楼    2020-09-13 13:36:27
主题:回复:博图平台下SCL语言实现CRC校验查表法

感谢分享~~

Q群:https://jq.qq.com/?k=9BDuEgf6
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。