电工学习网

 找回密码
 立即注册
查看: 1328|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-9-15 17:50:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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校验用变量的高低字节
      "CRCCheck code" : Word;   // 最终CRC校验码
      CRCtable : Array[0..255] of Word;   // CRC校验表
      CrcTableIndex : Int;   // CRC表的字索引号
   END_VAR
BEGIN
//生成CRC校验表
IF "FirstScan" = 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] AND BYTE#16#FF) XOR (#CRCbyte[1] AND BYTE#16#FF)); //生成CRC校验表字的索引号
   #CRCvariable := SHR_WORD(IN := #CRCvariable, N := INT#8) XOR #CRCtable[#CrcTableIndex];             //得到CRC校验变量
END_FOR;
#"CRCCheck code" := ROR_WORD(IN := #CRCvariable, N := INT#8);   //得到最终CRC校验码

//经测试,在CPU315-2 PN/DP中工作,此查表法仅为同环境下计算法的plc循环时间的五分之一
//此文本复制到TXT,改扩展名为scl,导入源文件就可以,首次扫描脉冲需要创建一下
END_FUNCTION_BLOCK

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-4-20 02:55

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表