CRC校验PLC算法

合集下载

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现CRC校验算法的原理是利用生成多项式来计算数据的校验值。

在发送端,将数据和生成多项式进行计算得到一个校验值,然后将这个校验值附加到发送的数据后面一起传输。

在接收端,接收到数据后再次进行计算,并与接收到的校验值进行比较,如果相同则说明数据传输过程中没有错误,否则说明数据传输过程中出现错误。

下面是CRC校验算法的具体步骤:1.选择一个生成多项式,通常用一个二进制数表示。

生成多项式的位数称为CRC位数,常见的有CRC-8,CRC-16,CRC-32等。

2.将生成多项式的最高位与数据的最高位对齐,然后进行异或运算。

异或运算的结果作为下一次异或运算的输入,直到将所有数据都计算完毕。

3.将计算得到的结果作为校验值附加到数据后面一起传输。

下面是一个简单的CRC校验算法的代码实现:```pythondef crc(data, generator):crc_value = 0generator_length = len(generator)for bit in data:crc_value ^= bitif crc_value & 0x1:crc_value = (crc_value >> 1) ^ int(generator, 2)else:crc_value = crc_value >> 1return crc_value#测试数据data = [1, 0, 1, 1]generator = "1011"#进行CRC校验residue = crc(data, generator)print(residue)```在上面的代码中,`data`表示要进行校验的数据,以列表的形式表示,每个元素是一个二进制位。

`generator`表示生成多项式,以字符串的形式表示,每个字符是一个二进制位。

程序输出的结果为校验值。

总结:本文详细介绍了CRC校验算法的原理和步骤,并给出了一个简单的代码实现。

CRC校验PLC算法

CRC校验PLC算法

CRC校验PLC算法CRC(Cyclic Redundancy Check)是一种常用的错误检测算法,广泛应用于数据通信、网络传输、存储等领域。

在PLC(可编程逻辑控制器)中,CRC校验算法被用来验证数据的完整性,以确保数据的可靠传输。

首先,需要选择一个合适的生成多项式。

生成多项式是CRC校验算法的核心部分,可以选择不同的生成多项式来适应不同的应用场景。

常用的生成多项式有CRC-8、CRC-16和CRC-32等。

生成多项式通常以二进制表示,如CRC-16的生成多项式为X^16+X^15+X^2+1接下来是除法运算,即将待校验的数据与生成多项式进行除法运算。

首先,将待校验的数据左移生成多项式的位数,然后进行异或运算。

重复这个过程,直到无法再进行除法运算为止。

最后所得到的余数为CRC校验码。

最后一步是余数校验,即将计算得到的CRC校验码与接收到的校验码进行比较。

如果两者相等,表明数据传输没有错误;如果不相等,将发生数据错误,需要重新发送数据。

CRC校验算法的特点是简单、高效、可靠。

它能够检测出多位错误,对于一位错误的检测率高达99.99%。

由于CRC校验算法只对数据进行检测,而不对错误进行纠正,因此在实际应用中,往往与其他纠错算法(如重复冗余校验码)结合使用,以提高错误的检测和纠正能力。

CRC校验算法在PLC中的应用是非常广泛的。

在数据通信方面,PLC 会将传感器或执行器的状态信息通过通信模块发送给上位机或其他设备,CRC校验可以确保数据传输的准确性。

在存储方面,PLC会将数据写入存储器中,在读取数据时,CRC校验可以验证数据的完整性,防止出现数据丢失或损坏。

总之,CRC校验算法是一种常用的错误检测算法,广泛应用于PLC等领域。

它通过生成多项式、除法运算和余数校验的步骤,对数据进行校验,保证数据传输的可靠性。

在实际应用中,CRC校验算法可以与其他纠错算法结合使用,提高错误检测和纠正的能力,确保数据的安全传输。

西门子S7-1200CRC校验

西门子S7-1200CRC校验

CRC校验原理以及梯形图的实现
计算法:
CRC校验生成步骤:
1、预置一个16位CRC寄存器为16进制FFFF,即所有数均为1.
2、该16位寄存器的低8位字节与信息帧的第一位字节的8位进行异或运算,
运算结果放入16位寄存器。

3、把这个16位寄存器向右移一位,用0补充高位。

4、若向右移出的是1,则生成多项式A001和这个寄存器进行异或运算若移
出数为0则返回第三步。

5、重复3和4 直至移出8位。

6、重复2步到第5步进行下一个8位数据的处理。

7、最后得到的CRC寄存器即为CRC码。

梯形图实现CRC校验:
由上述步骤可知要实现CRC校验要用到双重循环,而在西门子S7-
1200中没有像S7-
300中那样的loop虚幻指令,所以我们只能用普通指令进行编写循环。

首先,建立第五步的内部循环,首先建立函数块命名为“校验”,在“校验”函数块中定义
输出参数:准备惊醒校验的“校验数”、校验时要移动的位数“校验次数”
首次惊醒异或的“校验值_1”
输出参数:校验后的结果“校验值”
然后,建立第6步的函数块,命名“为CRC校验块”在函数块中定义输入输出参数。

输入参数:要校验的数组“数组”、开始校验的位置“起始下标”、校验的数“元素值”、要校验的个数“字节数”
输出参数:校验完成后的地校验值“校验结果”
在函数中会用到调用上一步中所建立的函数块“校验”
最后在函数中调用“CRC校验块”即可实现CRC校验,用此校验方法在校验中犹豫用到的校验方法为一位法,所以在循环时所需的时间比较长。

可以采用查表的方法来降低计算所需要的时间。

基于PLC自由通信的CRC校验算法实现

基于PLC自由通信的CRC校验算法实现
Z C C校验算法 R
多项式除法可用除法电路来实现。C C编码采 R 用的除法运算是模 2 除法, 它与算术除法类似, 但每一 位除( 的结果不影响其他位, 减) 即不向上一位借位, 故实际上就是异或, 因此,R C C校验的除法电路可由 一组移位寄存器和模 2 加法器( 异或单元) 组成。 以c CI u为例, 6 级移位寄存器和 3 R一 T 它由1 个 加法器组成, 1 如图 所示( 编码/ 解码共用) 。编码/ 解 码前将各寄存器初始化为“ ” 信息位随着时钟移人。 1, 当信息位全部输人后, 从寄存器组输出 C C结果。 R c c校验码的计算可以靠专用的硬件电路来实 R
该算法的基本依据为: 计算本字节后的 C C码, R 等于
上一字节余式 C C码的低 8 R 位左移 8 加上上一字 位, 节 C C右移 8位和本字节之和后所求得的 C C码。 R R
信号长度为 叭生成多项式用以x 表示,( 的最高 ) 9x ) 幂次为n一 k二r R 校验码多项式用 R x 表示; C ; C ( ) 编
码后将一组由原始信息码和 C C校验码组成的数据 R 块称为一个码元 , T 劝 表示。 用( 发送方编码方法 : 尸 x 乘以 了( 将 ( ) 即对应的二进 制码序列左移 ; , 尸 x 的右边就会空出n一 位)这样 ( ) k
以 C CIU为例,R R一 T C C校验码的计算步骤如下:
ie r c ai o t yt . n r e e bi f h 出 m t n e f l y t es e
HUJ 一u i ha n
K yw 川5 ccc dnac cek( R ) p Cfeo o m n ao ; R 一 U cd addcd eo : yl r udny hc C C ; L r dmCm ui tn C CI ; oe n eoe ie e ci T

crc校验方式

crc校验方式

crc校验方式一、引言在数据通信中,为了保证数据的完整性和正确性,常常需要对数据进行校验。

CRC(Cyclic Redundancy Check)是一种常用的校验方式,它可以通过计算数据的循环冗余校验值来检测数据是否被篡改。

本文将对CRC校验方式进行详细介绍。

二、CRC校验原理1. CRC码的生成过程CRC码的生成过程是通过将原始数据与一个预设的多项式进行异或运算得到的。

具体步骤如下:(1)将原始数据添加k个0,使其长度为n+k位。

(2)将多项式P左移k位得到G(x)。

(3)将n+k位的原始数据除以G(x),得到商Q(x)和余数R(x)。

(4)将余数R(x)作为CRC码添加到原始数据后面,得到n+k位的带CRC码的数据。

2. CRC校验过程接收方收到带有CRC码的数据后,会对其进行如下操作:(1)将接收到的n+k位带CRC码的数据除以G(x),得到商Q'(x)和余数R'(x)。

(2)如果R'(x)等于0,则认为接收到的数据没有发生错误;否则认为接收到的数据发生了错误。

三、CRC校验实现方法1. CRC-8CRC-8是一种8位的CRC校验方式,它的多项式为x^8+x^2+x^1+x^0。

其校验码长度为1字节(8位),可以用于检测数据传输中的单比特错误。

2. CRC-16CRC-16是一种16位的CRC校验方式,它的多项式为x^16+x^15+x^2+1。

其校验码长度为2字节(16位),可以用于检测数据传输中的双比特错误。

3. CRC-32CRC-32是一种32位的CRC校验方式,它的多项式为x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+ x^5+x^4+ x3+ x + 1。

其校验码长度为4字节(32位),可以用于检测数据传输中的多比特错误。

四、CRC校验应用场景1. 网络通信在网络通信中,数据传输过程中可能会发生丢包、重发等问题,使用CRC校验可以有效地检测并纠正这些问题。

在西门子PLC中使用SCL语言实现CRC校验计算

在西门子PLC中使用SCL语言实现CRC校验计算

在西门子PLC中使用SCL语言实现CRC校验计算在西门子PLC中运用传统梯形图方式和查表法实现Modbus通讯和CRC校验,会影响控制的稳定和对采集设备的数量和数据量有所限制,无法做到高效、稳定。

采用SCL语言编程很好解决了原有的问题,并使控制器效率大大提高。

标签:西门子PLC;SCL语言;Modbus;CRC校验1、引言当前几乎所有的PLC控制器都带有Modbus总线通信接口,这其中也包括西门子的S7300和S7400系列[1],西门子PLC的CPU模块自身不带有Modbus 通信口,需配置相应的RS485通讯模块(CP340/CP341/CP440/CP441),再配置相应的Modbus通讯协议硬件狗,就是说你要用西门子PLC做Modbus通讯时,你需要增加RS485通讯模块和Modbus通讯协议硬件狗费用。

根据西门子公开报价,Modbus通讯协议硬件狗的价格要14000.00元。

而且用传统的梯形图编程方法实现CRC校验,會导致CPU处理量迅速增加,严重占用了CPU的资源,导致CPU死机,影响系统的稳定性。

为解决以上问题,我们以前采用查表法解决CRC校验问题,但用查表发存在很大的局限性,比如:只能有固定的设备地址、固定的数据长度和固定的数据寄存器地址;当需通讯的设备有几十台或上百台后,查表法就会显的效率很低、程序累赘繁琐,影响系统稳定。

使用SCL语言编程方式(除西门子编程软件外需另外安装的一种编程方式,这是一种类似于C语言的一种编程方式),就很好的解决了以上问题。

2、Modbus通讯和CRC校验的相关介绍2.1 Modbus通讯协议Modbus通讯协议[2]在一根通讯线上采用主从应答方式的通讯连接方式。

首先主机寻址到唯一设备地址的终端(从机),随后从机发出相应信号以反向的方式传输给主机。

Modbus通讯只允许主机和从机之间通讯,不允许从机之间通讯,这样就保证了从机在初始化时占有数据链路,而仅限于相应到达本从机的查询信号。

CRC校验计算方法

CRC校验计算方法

CRC校验计算方法1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。

例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。

3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+g R x R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。

标准CRC生成多项式如下表:名称生成多项式简记式* 标准引用CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8 x8+x6+x4+x3+x2+x1 0x5ECRC-12 x12+x11+x3+x+1 80FCRC-16 x16+x15+x2+1 8005 IBM SDLCCRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCSCRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCSCRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP基本算法(人工笔算):以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位。

PLC实现RTU_CRC算法

PLC实现RTU_CRC算法

PLC实现RTU_CRC算法PLC在使用MODBUS_RTU通信时,为了防止通信错误,都会通信帧后增加2个字节的CRC校验。

使用传统的协议宏来实现,计算CRC部分就可以交给PLC内部的相应模块;当然使用梯形图来实现CRC换算也是可行的。

下面将就使用PLC梯形图来计算CRC的结果。

一:功能块内置变量申明,对功能块的输入输出端口进行定义,为插入至主循环中对接的端口进行连接。

二:循环程序中调用CRC功能块,将功能块的“RTU_CRC16”加载入主循环中。

并连接输入输出端口。

再点击仿真按扭。

D10:输入需计算的个数;D11:计算后输出的CRC值;D12:计算后输出的CRC值进行高底字节交换(数据的大小端用)。

在仿真数据存储区D区中D2500至D2509共计十个地址中,输入需计算的数据后,在D10中指明需计算的个数。

因一个D区占用2个8位数据,故十个D区地址即20个字节,对应十六进制数#14即&20 → #14功能块内仿真详细。

使用变址寻址再加入循环移位指令。

三:CRC运算校验验证。

在PLC起始地址中输入需计算的数据,也可以在校验中根据如上图片填入“ABCDEFAAAAAABBBB1CCC1DDDEEEEFFFFABCDAAAA”,再点击“计算”,得出结果。

紫色框为换算后的数据。

可以观察到PLC梯形图计算的与CRC计算的结果都为“F713”,即得出PLC梯形图计算CRC结果完全正确。

同时如果需大端小端交换,那么可以使用OUT_2 D12输出的值。

四:程序解说D10:需计算的数据字节个数;比如图上十六进制#14对应十进制&20,即申明计算20个字节。

D11:功能块计算后输出的CRC值;D12:功能块计算后输出的CRC值进行高底字交换。

(用于大小端应用)D2500-D2509:输入计算的数据地址。

五:CRC计算方法(换算流程)1:预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器2:把第一个8位二进制数据与16位的CRC寄存器的低八位相异或,结果存放于CRC寄存器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC校验函数
cBuffer:计算CRC校验码的数组。

iBufLen:该数组的长度。

unsigned int CRC_Verify(unsigned char *cBuffer, unsigned int iBufLen) {
unsigned int i, j; //#define wPolynom 0xA001
unsigned int wCrc = 0xffff;
unsigned int wPolynom = 0xA001;
/*---------------------------------------------------------------------------------*/
for (i = 0; i < iBufLen; i++)
{
wCrc ^= cBuffer[i];
for (j = 0; j < 8; j++)
{
if (wCrc &0x0001)
{ wCrc = (wCrc >> 1) ^ wPolynom; }
else
{ wCrc = wCrc >> 1; }
}
}
return wCrc;
}
如何用PLC写上述的CRC校验函数,笔者整理了一个CRC校验计算的子程序。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1(0xffff),然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB),移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码(16#A001)进行异或,否则如果LSB为零,则无需进行异或。

重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit 数据异或并进行如前一个数据似的8次移位。

所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

下面为CRC的计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。

此时一个8-bit数据处理完毕。

6.重复第2至第5步直到所有数据全部处理完成。

7.最终CRC寄存器的内容即为CRC值。

输入参数:
待校验数据区指针,第一个字节为数据长度
LD0 DataBuff IN DWORD
Network 1
LD SM0.0
MOVW 16#FFFF, AC0 //初始化CRC寄存器
BTI *LD0, LW4 //数据缓冲区第一个字节为数据长度
MOVD LD0, LD6
INCD LD6 //指针指向第一个待处理字节
Network 2
LD SM0.0
FOR AC2, +1, LW4 //开始循环处理每一个字节
Network 3
LD SM0.0
XORB *LD6, AC0 //字节首先与CRC寄存器低位进行异或
Network 4
LD SM0.0
FOR AC1, +1, +8 //移位处理循环,处理一个字节的8位 Network 5
LD SM0.0
SRW AC0, 1 //CRC寄存器右移一位
Network 6
LD SM1.1 //如果移出位为0,则进入下一次循环 XORW 16#A001, AC0 //如果移出位为1,CRC寄存器与多项式16#A001异或
Network 7
NEXT
Network 8
LD SM0.0
INCD LD6 //指针加1指向下一个字节
Network 9
NEXT
Network 10
LD SM0.0
SWAP AC0 //交换CRC寄存器高低字节
MOVW AC0, *LD6 //CRC校验值写入数据区结尾。

相关文档
最新文档