作者 | 主题 |
---|---|
不欲勿施 奇侠 经验值: 8496 发帖数: 875 精华帖: 15 |
楼主 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 至圣 经验值: 70598 发帖数: 12690 精华帖: 60 |
1楼 2020-09-13 13:36:27
主题:回复:博图平台下SCL语言实现CRC校验查表法 感谢分享~~
Q群:https://jq.qq.com/?k=9BDuEgf6
|