北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章528 浏览8053598

西门子SCL编程实例——CRC校验算法实现[付费]

本文是一篇付费文章,介绍了CRC校验的基本原理、CRC的参数模型及使用SCL语言实现CRC校验的代码(功能全面:支持输入数据反转、输出数据反转、输出结果异或)。SCL代码包括三个函数/函数块:FB5014_CRC16、FC5007_ReverseByte和FC5008_ReverseWord,第一个用来实现16位CRC校验,后面两个是用来实现字节反转和字反转的函数。

CRC校验的全称是“循环冗余校验(Cyclic Redundancy Check)”,其主要作用是对数据的完整性或正确性进行检验。
最常见的是通信过程的数据校验:数据发送方将要发送的数据按照约定的CRC校验方法算出一个CRC校验码,然后将数据及其校验码发送给接收方。数据接收方将接收到的数据按照同样的算法进行计算,并将计算出的CRC校验码与发送方的CRC校验码进行比较。如果两者一致,说明数据传输过程没有错误;如果不一致,说明传输过程中出现问题,需要重新发送或者执行其它错误处理方法。
另外一种常见的应用是确定数据的完整性,或者确认数据是否被更改。典型的例子如西门子安全程序的CRC校验码,编译器通过计算代码(FB/FC)的CRC校验码来判断代码是否有更改。另外在数据的加密和解密中也有很多应用。
CRC校验并不是百分百能发现错误,极低概率的情况下会出现CRC校验码正确而数据错误的情况,这与CRC的参数模型(位宽、多项式等多种因素)有很大的关系。很多通信协议都有固定的CRC校验参数设置,从而起到最大的纠错效果。今天这篇文章,我们来介绍下CRC的基本原理及使用西门子SCL语言编写实现16位CRC校验函数。本文包括如下三个主题:

  •  CRC校验的基本原理;

  • CRC校验的参数模型;

  • CRC16校验的SCL代码实现;

cover.png

1、CRC校验的基本原理
CRC校验的本质是选择一个合适的除数,需要校验的数据作为被除数,被除数与除数进行模2除法,得到的余数就是CRC校验码。
这里最重要的是理解模2除法。
“模2除法”就是模为2的除法。这里的“模”表示一种系数,与“模运算”中的“模”是一个意思。模运算就是求余数的运算,数学符号为“Mod”。比如:7对3进行模运算的结果为1(7 Mod 3=1),这里的“3”就是模。而模2除法中的“模”等于2。
模2除法是模2运算的一种,模2运算包括模2加法、模2减法、模2乘法和模2除法,它们与我们熟悉的四则运算规则基本相同,区别在于运算的结果仅对本位有影响,对其它位没有影响。
模2运算是二进制数的运算,但是加法不进位。比如二进制加法1+1=10(二进制数)。但是由于不进位,因此结果为0;减法也是一样,如果需要,可以向前一位借位(借1当2),但是对前一位不影响。比如:0-1=1;
模2运算的具体法则如下:
①模2加法:0+0=0;0+1=1;1+0=1;1+1=0;
②模2减法:0-0=0;0-1=0;1-0=1;1-1=0;
③模2乘法:0*0=0;0*1=0;1*0=0;1*1=1;
④模2除法:0÷1=0;1÷1=1;
CRC校验的算法可以分为如下几步:

  • 假设被除数(要进行CRC校验的数)的二进制长度为m位(m个bit);

  • 选定一个二进制长度为n位的除数;

  • 将被除数左移n-1位,空出的位添0,从而形成一个新的二进制长度为m+n-1位的被除数;

  • 将新被除数与除数进行模2除法,得到余数就是CRC校验码;

说明几点:

  • 被除数与除数进行模2除法,等同于两者进行异或(Xor)运算;

  • 除数是由一个多项式公式的系数组成的‍。很多通信标准的CRC校验都有固定的多项式,比如,CRC-16/MODBUS的多项式为x^16+x^15+x^2+1,其中:x^16表示x的16次方。将其系数转换为二进制数为 1 1000 0000 0000 0101,等于16进制数16#18005。多项式最高次幂的系数固定为1,因此常将其省略,省略后的多项式称为简记式,比如前面的16#18005,其简记式为16#8005;

  • 除数多项式公式的阶数也称为CRC校验的宽度,它等于CRC校验码的位数。比如上面的多项式,其阶数为16,因此其CRC校验码的位数为16;

2、CRC校验的参数模型
为了更好的提高CRC校验的能力,实际应用的CRC校验有很多参数,包括:

  • 宽度;

  • 简记式;

  • 初始值;

  • 输入数据反转;

  • 输出结果反转;

  • 输出结果异或;

宽度和简记式已经介绍过了。后续程序中有提到的多项式,都是指简记式。接下来介绍其它几个概念:
①初始值:即CRC校验码的初始值,它是在CRC计算之前赋给CRC校验码的值;


该内容需要付费阅读,请点击》这里《


关于其中的函数和函数块我已经测试过多次,如果你有任何问题,欢迎留言讨论。
我的书《西门子S7-1200/1500 PLC SCL语言编程 ——从入门到精通》对SCL语言有更详细的介绍,感兴趣的话可以看看下面的链接:

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论