CRC校验PLC算法
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(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校验
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校验算法实现
多项式除法可用除法电路来实现。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(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中运用传统梯形图方式和查表法实现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校验计算方法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在使用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寄存器。
crc校验的方法
crc校验的方法
CRC(CyclicRedundancyCheck)校验是一种常用的错误检测方法,它可以在数据传输过程中检测出单比特或多比特的差错。
CRC校验的基本原理是通过生成多项式除法来计算校验码。
以下是CRC校验的基本步骤:
1.选择生成多项式:首先需要选择一个生成多项式,通常使用二进制形式表示。
生成多项式的位数决定了校验码的长度。
常用的生成多项式有CRC-8、CRC-16和CRC-32等。
2.初始化寄存器:将寄存器初始化为全0。
3.逐位计算:按照从高位到低位的顺序,依次对待发送的数据进行处理。
-如果当前位是1,则将寄存器与生成多项式进行异或操作。
-然后将寄存器向右移动一位,最高位补零。
4.处理完所有数据后,得到的寄存器值即为校验码。
5.将校验码附加到待发送的数据后面。
6.接收端收到数据后,同样按照相同的生成多项式进行校验计算。
如果计算出的校验码与接收到的校验码一致,则认为数据没有发生错误;如果不一致,则认为数据可能存在错误。
CRC校验具有简单、高效的特点,能够检测出大部分常见的传输错误。
然而,CRC校验并不能纠正错误,只能检测出错误的存在。
在实际应用中,CRC校验通常与其他纠错方法(如重发请求)结合使用,以提高数据传输的可靠性。
1。
CRC校验PLC算法
CRC校验PLC算法1.选择一个多项式(生成多项式),通常用二进制表示,并且大多数CRC设计都采用了预定义的多项式。
2.将生成多项式转换为二进制的形式,并在多项式的前面加上"1",形成生成多项式的二进制值。
3.将待发送的数据转换为二进制的形式。
4.在待发送的数据后面加上若干个0,个数等于生成多项式的二进制位数减15.将上述两步中得到的二进制值相除,得到余数。
6.将余数添加到待发送的数据后面,形成CRC校验码。
7.将带有CRC校验码的数据发送给接收方。
8.接收方将接收到的数据进行CRC校验,即重复步骤3到59.若余数为0,则说明数据传输正确,否则说明数据传输错误。
在PLC中,CRC校验算法常用于通讯协议中,以确保数据的可靠传输。
PLC作为工业自动化设备的核心控制器,经常与其他设备进行数据交互,例如传感器、执行器等。
通过在数据中添加CRC校验码,可以有效地检测数据传输过程中是否出现了错误。
在PLC中实现CRC校验算法,通常是通过编程语言来实现。
PLC编程语言包括类似于Ladder Diagram(LD)和Structured Text(ST)的编程语言。
以下是一个用ST编程语言实现CRC校验算法的示例:```plaintextFUNCTION_BLOCKCRC16VAR_INPUTData : ARRAY[0..255] OF BYTE; // 待发送的数据数组Length : INT; // 数据长度END_VARVAR_OUTPUTCrc : WORD; // CRC校验码END_VARVARTable : ARRAY[0..255] OF WORD := [0, 0x1021, 0x2042, 0x3063, /* ... */]; // CRC校验表Index : INT;Temp : WORD;i,j:INT;END_VARMETHOD CalculateCrc : WORDVARCrc : WORD := 0xFFFF;BEGINFOR i := 0 TO Length DOIndex := (Crc XOR Data[i]) SHR 8;Crc := (Crc SHL 8) XOR Table[Index];END_FORCalculateCrc := Crc;END_METHODMETHOD Run : VOIDBEGINCrc := CalculateCrc(;END_METHODEND_FUNCTION_BLOCK```上述代码使用了CRC-16的多项式0x8005、输入参数Data代表待发送的数据数组,Length代表数据长度,输出参数Crc为CRC校验码。
三菱PLC的MODBUSRTU的CRC计算程序编写,通讯必须掌握
三菱PLC的MODBUSRTU的CRC计算程序编写,通讯必须掌握首先,我们利用三菱PLC梯形图进行编写,先看下流程图:CRC计算流程图从上图中发现,有两个循环过程,即单个数据的CRC的计算,主要是对首个数据的CRC暂存器进行8次移位运算,另一个大循环是所有数据的运算(先运算完一个8位数据的CRC,下一个数据与这个CRC 进行运算),这样把所有数据都计算完成后即可得到CRC校验码。
按照流程图步骤进行编写:1、初始CRC值:FFFFH,为了方便移位,我们采用位组成的方式来表示CRC暂存器: K4M0,采用变址寄存器V对数据进行依次运算,大的循环次数要根据传输数据的个数来决定,小的循环(单个数据的CRC)移位8次就循环8次,将数据初始化。
基本框架如下:数据初始化程序整体框架2、小循环单个数据的CRC小循环单个数据的CRC计算首先将M100复位是为了后面的高位补零用,SFTR指令是位右移指令,表示对M0为起始位置的16数据右移1位置,高位用M100填补即高位补零,低位M0为移除的溢出数据即LSB。
如果LSB=1,则需要把移位后的数据与A001H进行异或计算,结果保存到CRC暂存器K4M0中,此时将覆盖原来的K4M0中的数据,在这里需要跳转指令CJ跳过LSB=0的情况。
如果LSB=0,只要把移位后的数据放入CRC暂存器中即可。
这样首个数据就运算完成,进行下一个数据的运算(大循环)。
3、CRC校验码全部数据运算完成后,我们要对暂存器进行高低8位调换,将CRC校验码的高位存放到D100,低位存放发到D102中。
至此CRC 校验码计算完成。
如果觉得麻烦,在FX3U中有现成的CRC计算指令CRC S D n,S代表要计算的数据的起始编号,D为CRC校验码保存的数据寄存器,n表示数据个数。
CRC指令下面看下仿真结果:我们用CRC在线计算器看下结果与PLC程序结果进行对比:CRC计算器结果PLC计算结果。
crc校验详解
CRC校验专题以CRC-16为例,说明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值。
翻译:1.意思是首先寄存器中的值是11111111111111112.数据第一个字节一个字节=8位用二进制表示就是【00000000-11111111】之间用这个数值跟寄存器中的16个1中的后8位进行异或(异或不知道什么意思的自己查简单理解就是同为0 异为1)然后把这个数值保存到寄存器中3.判断最后一位是否为0 如果为0寄存器中的值向右移动一位前面补零如果为1 拿寄存器中的值与多项式进行异或。
4.检查当前寄存器中的最后一位如果是0 重复第三步;如果是寄存器中的值与多项式进行异或5.重复3与4直到8此移位完成。
6.重复第2到第五步知道正规数组的数据验证完成7.最终计算出的就是CRC的值实例:实例byte[] bufs=new byte[]{0x2f,0x12,0x31} crc16 多项式码假设是0x8408 二进制形式就是10000100000010001crc=0xffff; 用二进制表示就是11111111111111112拿出bufs中第一个字节0x2f 二进制表示00101111 跟寄存器中的后8位进行异或得到11111111110100003判断CRC寄存器中最后一位当前为0 寄存器右移一位得到0111111111101000 (如果为1就与多项式进行异或)4判断当前寄存器中的值当前最后一位为0 所以重复第三步继续右移得到0011111111110100 最后还是0 在重复第三步0001111111111010 最后还是0 继续第三步0000111111111101 这时最后一位为1了这时与多项式进行异或得到10111011111110015重复判断知道判断完8次6然后再重复第2到第5步直到上面数组中的bufs中三个字节验证完7最终寄存器中的值就是crc值下面进行实战C# code 分析const uint PRESET_VALUE = 0xFFFF; 初始化寄存器的值const uint POLYNOMIAL = 0x8408; 多项式码三个参数 1char数组 byte一样 2.数组长度uint uiCrc16Cal(char[] pucY, int ucX){uint ucI, ucJ;uint uiCrcValue = PRESET_VALUE; 赋除值for(ucI = 0; ucI < ucX; ucI++){uiCrcValue = uiCrcValue ^ pucY[ucI]; 进行异或for(ucJ = 0; ucJ < 8; ucJ++) 由于一个字节 8位所以判段8次{if((uiCrcValue & 0x0001) != 0) (*1下面解释){uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;} (*2下面解释)else{uiCrcValue = (uiCrcValue >> 1);} (*3下面解释)}}return uiCrcValue;}*1 “&”这个符号在C 、C#等语言上是按位与即按二进制比对1与1 得1 0与1得0 0与0得0 例如:比如:10010001(二进制)&11110000等于10010000(二进制)。
crc校验原理
crc校验原理
CRC校验是一种通过计算数据的循环冗余校验值来验证数据
完整性的方法。
它基于多项式除法的原理,在发送端使用生成多项式对数据进行处理,生成校验值,并将该校验值附加在数据后面一并发送到接收端。
接收端使用相同的生成多项式进行计算,得到一个校验值,然后将接收到的校验值与计算得到的校验值进行比较,从而判断数据是否在传输过程中发生了错误。
具体的计算过程如下:
1. 选择一个生成多项式,也称为校验多项式。
生成多项式的位数取决于要检测的错误数量和类型。
常见的生成多项式有
CRC-8、CRC-16、CRC-32等。
2. 将数据进行整理,使其长度与生成多项式相等,并在数据末尾补充若干个0。
3. 将补充后的数据与生成多项式进行模2除法,即进行多项式的异或操作。
4. 将除法得到的余数作为校验值,将其附加在数据后面,并一同发送。
5. 接收端同样对接收到的数据进行整理,并使用相同的生成多项式进行模2除法运算,得到一个余数。
6. 将接收到的校验值与计算得到的余数比较,如果相等,则认为数据传输没有发生错误;如果不相等,则认为数据传输发生了错误。
CRC校验具有较高的检测能力和较低的冲突率,常用于数据
通信中对数据完整性进行验证。
CRC码计算及校验原理计算
CRC码计算及校验原理计算
CRC(Cyclic Redundancy Check)码是一种常用的错误检测码,用于验证数据在传输过程中是否发生错误。
CRC码的计算和校验原理是通过生成多项式对数据进行计算和校验。
以下是CRC码计算及校验原理的详细解释。
一、CRC码的计算原理:
1.选择一个生成多项式G(x),比如G(x)=x^3+x^2+1
2.假设要发送的数据为D(x),将D(x)乘以x的次数等于生成多项式的次数再取模,得到一个除数。
3.将除数与G(x)进行异或运算,产生余数。
4.将余数拼接到原始数据D(x)的后面,得到新的数据N(x)。
5.将数据N(x)进行发送。
二、CRC码的校验原理:
1.接收到数据N(x)后,用生成多项式G(x)去除以接收的数据N(x)。
2.如果除数为0,则认为数据没有发生错误,否则则认为数据发生了错误。
举例说明:
1.计算步骤:
2.校验步骤:
-用生成多项式G(x)去除以接收的数据N(x),得到商和余数。
-如果余数为0,说明数据没有发生错误,否则说明数据发生了错误。
通过以上计算和校验步骤,可以判断数据在传输过程中是否发生错误。
CRC码的优点是简单、效率高,能够检测到大部分错误,被广泛应用
在通信、存储等领域。
然而,CRC码只能检测错误,不能纠正错误。
当数
据发生错误时,需要重新发送数据或通过其他方法进行纠错处理。
CRC校验算法详解
CRC校验算法详解循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的错误校验算法,主要用于数据传输过程中的差错检测。
它将数据视为二进制数,通过生成多项式与数据进行异或运算,最后产生一个余数,将该余数作为校验码附加在数据末尾,接收方通过相同的生成多项式进行校验,如果余数为0,则认为数据传输无误。
CRC校验算法的基本原理是:通过生成多项式对整个数据进行模2除法运算,并得到一个余数作为校验码。
在数据传输过程中,发送方将原始数据和校验码一起发送给接收方,接收方利用相同的生成多项式对整个数据进行除法运算,并检查余数是否为0,来判断数据传输是否正确。
1.确定生成多项式:CRC校验算法中最重要的是生成多项式,它决定了校验能力的大小。
生成多项式通常在最高位和最低位都为1,其他位数也应该尽量选择为1、常用的生成多项式有CRC-8、CRC-16、CRC-32等,每种生成多项式的校验能力不同。
2.将生成多项式转换为二进制数:将生成多项式转换为二进制数表示,用多项式系数的二进制表示法来表示生成多项式。
3.将待发送的数据与校验码进行拼接:在发送数据的最后面添加足够位数的0,等于生成多项式次数减1,将生成多项式次方数减1的二进制表示添加到待发送的数据末尾。
4.进行模2除法运算:将待发送的数据与生成多项式进行模2除法运算,将得到的余数作为校验码。
5.发送数据与校验码:将原始数据与校验码一起发送给接收方,接收方接收到数据后利用相同的生成多项式进行除法运算。
6.检验余数是否为0:接收方进行除法运算后,检查得到的余数是否为0,如果余数为0,则认为数据传输无误;如果余数不为0,则认为数据传输存在错误。
CRC校验算法的优点是简单且高效,能够检测多位错误,且校验码的长度可以根据生成多项式的次方数来确定,可以根据不同的数据传输要求进行调整。
缺点则是无法纠正错误,只能检测错误的存在,需要额外的处理机制来进行纠正。
触摸屏代替时PLC进行做 CRC-16校验程序
(3).检测相异或后的CRC寄存器的最低位,若最低位为1: CRC寄存器先右移1位,再与多项式A001H进行异或; 若为0,则CRC寄存器右移1位,无需与多项式进行异或。 (4).重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全 部进行了处理;
CRC 校验是对 从站地址+命令码+数据进行校验 从上篇中的程序中我们其实 是对D410,D411,D412 进行校验,而这三个寄存器存放的就是从站地址,命令 码,数据。D413 存放的是通过触摸屏计算的CRC结果 最后用RS串口发送结收指令发送数据( 01 06 01 90 “D412=数据”比如给定频率” “D413=CRC校验码”
(5).重复步骤 2 到步骤4,进行下一个 8 位数据的处 理;
(6).最后得到的 CRC 寄存器即为 CRC 码。
编写CRC校验程序
1,做为经常写PLC程序,处理一些I/O信号 的工控人,看到上篇的CRC计算方法和计算 步骤,头都大了,
2,经过实践,我们找到一种非常实用的方 法,用触摸屏的CRC脚 本命令,只需一个指 令就实现CRC的繁锁计算,如右图
编写CRC校验程序
MODUBUS通信协义:
从站地址+命校验是对 从站地址+命令码+数据进行 校验
从上篇中的程序中我们其实 是对
D410,D411,D412 进行校验,而这三个寄存 器存放的就是从站地址,命令码,数据。 D413 存放的是通过触摸屏计算的CRC结果
PLC程序
编写CRC校验程序
CRC校验实验
实验一、CRC校验实验一、实验目的1.熟悉西门子S7-200编程软件SETP7-Micro/WIN SP6的编程和调试方法。
2.掌握CRC校验的原理和在S7-200 PLC中的实现方法。
二、实验设备计算机、西门子S7-200 PLC、RS485编程下载线。
三、实验原理(一)CRC校验基本原理校验码的具体生成过程为:假设被传输的数据流为BYTE[n]BYTE[n-1].... BYTE[1]BYTE[0],将此数据流看成系数为0或1的多项式M(x)。
收发双方约定一个生成多项式G(x)。
本实验中,多项式设为G(x)= X8+X7+X2+1。
在发送端将M(x)所对应的位串左移8位后按模2除法除以G(x)所对应的位串,余数为8位,称为CRC校验码,将CRC校验码附加在被传输的数据流后边,则被传输的带校验码的数据流为BYTE[n]BYTE[n-1]....BYTE[1]BYTE[0]CRC。
在接收端,也进行同样的除法过程,如果接收端的除法结果不为0,则表明数据传输产生了差错,数据接收端自动请求重发,实现纠错。
(二)CRC校验码生成方法和步骤1. 将被传输的数据流左移8位(共n+2个字节),高8位BYTE[n])放入一个长度为8的寄存器。
2. 将寄存器左移1位(寄存器的最低位从下一个字节获得),如果移出位为1,将寄存器中的值与生成多项式G(x)的简记式进行异或运算,运算结果存回寄存器中。
G(x)对应的位串共9位,其最高位总是1,G(x)的简记式为其后8位,为10000101。
如果移出位为0,则仅将寄存器左移1位(寄存器的最低位从下一个字节获得)。
3. 重复第2步,直到扩展后的数据流(n+2个字节)全部移入寄存器。
4. 寄存器中的值则为CRC校验码。
四、实验内容1.根据CRC校验码生成原理编写一段程序,调试并要求能够实现正确计算出任意长度数据串的CRC校验码。
七、实验源程序Network 1LD SM0.0MOVW VW301,VW400 //被传输数据高16位送入16位寄存器MOVW 16#8005,VW100 //VW100中存入生成多项式MOVD &VB303,AC1 //被传输数据下一个字节的地址存入AC1MOVB *AC1,VB20 //VB303中的被传输数据第3个字节存入VB20MOVB VB300,VB10//VB300输数据流的字节数送入VB10Network 2LD SM0.0FOR VW2,1,VW9 //外循环次数为被传输数据的字节数VB10Network 3LD SM0.0FOR VW0,1,8 //内循环次数为8位Network 4LD SM0.0SHRB V20.7,V401.0,16 //将V303.7移入V401.0LD SM1.1XORW VW100,VW400Network 5LD SM0.0SLB VB20.1 //将VB20左移一位Network 6NEXTNetwork 7LD SM0.0INCB AC1MOVB *AC1,VB20 Network 8NEXT。
Modbus CRC校验算法 - plc 电工论坛
摘要: 终于找到了 Modbus CRC 校验算法 算法一: unsigned int calccቤተ መጻሕፍቲ ባይዱc(uchar crcbuf,uint crc) { uchar i; crc=crc ^ crcbuf; for (i=0;i8;i++) { uchar chk; chk=crc1; crc=crc1; crc=crc0x7fff; if (chk==1) c ...
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; uint CRC16(uchar *updata,uint len) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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校验值写入数据区结尾。