西门子S7-1200CRC校验

合集下载

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-200plc通过自由口与CDI9600变频器的RS485通讯正反转CRC和值校验

s7-200plc通过自由口与CDI9600变频器的RS485通讯正反转CRC和值校验

s7-200plc通过自由口与CDI9600变频器的RS485通讯正反转CRC和值校验
这是我刚刚做的一个实验,因为网上关于S7-200自由口通讯的例子不多,也没有完整的解决一个问题的例子,我就想弄一个实际试了一下成功的,下面我将我的程序列出来供大家参考,有不对的不妥的地方要指出来,不胜感激!
我要实现的功能是226PLC与CDI9600变频器的RS485通讯,能控制启动正反转,停止,设定频率,实时查询下变频器的频率
用的是PLC的P0口,3脚接485+对应接变频器的SG+,8脚接485-对应接变频器的SG-
具体的设置是变频器设
P04.26=3即波特率9600
P04.27=0即8位,无校验,1停止位
P04.28=1即变频器的地址
PLC这里不要特殊的设置,都在程序里设置的
主程序:初始化P0口为自由口,并设置好相关中断和条件,对变频器进行控制
SBR0:是控制变频器的一些指令的初始化,写入VB300-VB450的区域方便调用,其中可以自由设置变频器的地址,并根据设置的地址来计算指令的和值,完成指令的初始化
SBR1:是CRC和值校验程序,将接收的报文进行和值校验,在接收完成后由INT0调用
INT0:是接收完成的中断程序
INT1:是接收完由INT0延时10ms调用,主要是完成回传命令,但这里PLC做主机,不用回传命令
INT2:是发送完成后的中断程序,这里做了如果是手动发送的指令则在这里将SMB87.7位置回1,并开始接收变频器的回传。

程序相对比较简单,我就不详细说了,程序中有注释的。

crc校验 -循环冗余校验 原理和方法 -回复

crc校验 -循环冗余校验 原理和方法 -回复

crc校验-循环冗余校验原理和方法-回复标题:循环冗余校验(CRC)原理与方法在数据通信领域,确保数据的完整性是至关重要的。

任何数据传输过程都可能引入错误,因此需要采用一种可靠的方法来检测和纠正这些错误。

这就是循环冗余校验(CRC)的作用。

本文将详细介绍CRC的原理和方法。

一、CRC的基本原理CRC是一种根据数据产生一个简短固定位数的校验码的方法。

它通过将待校验的数据与一个预先定义好的生成多项式进行模二除法运算,得到的余数即为CRC校验码。

接收方再用同样的生成多项式对收到的数据和校验码进行模二除法运算,如果余数为0,则表示数据正确无误;否则,就表示数据出现了错误。

二、CRC的工作流程1. 数据预处理:首先,对原始数据进行一些预处理操作,例如添加填充位、反转位序等,以满足特定的CRC算法要求。

2. 计算CRC校验码:然后,使用预定的生成多项式对预处理后的数据进行模二除法运算,得到的余数就是CRC校验码。

3. 传输数据和校验码:最后,将原始数据和计算得到的CRC校验码一起发送给接收方。

三、CRC的生成多项式选择生成多项式的选择对于CRC的性能至关重要。

一个好的生成多项式应具备以下特点:1. 最高位和最低位必须为1,这样可以保证最高次项和常数项不为0。

2. 应尽量避免有太长的连续0或1,因为这会导致检错能力下降。

3. 应尽量包含更多的1,这样可以提高检错能力。

4. 可以选择常用的标准生成多项式,如CRC-8、CRC-16、CRC-32等。

四、CRC的优缺点优点:1. 简单易实现:只需要简单的逻辑运算即可完成校验。

2. 效率高:相比于其他复杂的检错编码方法,CRC的计算速度更快。

3. 检错能力强:只要生成多项式选择得当,CRC可以检测出大部分的突发错误和随机错误。

缺点:1. 不能纠错:一旦检测到错误,只能丢弃数据包,无法纠正错误。

2. 对于某些特定的错误模式,可能会出现漏检的情况。

五、总结总的来说,CRC是一种简单而有效的数据校验方法。

crc校验原理及步骤

crc校验原理及步骤

crc校验原理及步骤嘿,咱今儿就来聊聊这 CRC 校验!你说这 CRC 校验啊,就像是给数据穿上了一件特别的“保护衣”。

它的原理呢,其实挺有意思。

就好像我们要识别一群人里有没有冒牌货,得有个特别的办法来判断。

CRC 校验就是通过一种特定的计算方式,给数据生成一个独一无二的“标记”。

那具体步骤是咋样的呢?首先啊,得选个合适的生成多项式,这就好比选一把合适的钥匙。

然后呢,把要校验的数据当成宝贝一样,和这个生成多项式一起进行一番奇妙的运算。

这运算过程啊,就像是一场数据的舞蹈,各种数字在里面蹦跶、组合。

等这舞蹈结束,就得到了一个校验码。

这个校验码可重要啦,就像人的身份证号一样,能证明数据的身份。

当数据要传输或者存储的时候,就把这个校验码也带上。

等数据到了目的地,接收方再按照同样的步骤来一次,看看算出来的校验码和带来的一不一样。

如果一样,那就说明数据在旅途中没出啥问题,完好无损地到达啦!要是不一样呢,哎呀,那可就麻烦啦,说明数据可能在途中遭遇了什么“小意外”,得赶紧找找问题出在哪儿。

你想想,要是没有这 CRC 校验,那数据在传输过程中出了错都不知道呢!这就好像我们寄个重要包裹,没有保价一样,心里多不踏实呀!CRC 校验在很多地方都大显身手呢!比如在通信领域,它能确保信息准确无误地传达;在计算机存储中,它能保证数据的可靠性。

它就像一个默默无闻的守护者,时刻守护着数据的安全。

所以啊,可别小瞧了这 CRC 校验,它虽然听起来有点复杂,但作用可大着呢!它就像是数据世界里的一位忠诚卫士,为我们的数据保驾护航,让我们能安心地使用和传输数据。

你说是不是很厉害呢?。

CRC校验PLC算法

CRC校验PLC算法

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

iBufLen:该数组的长度。

unsigned int CRC_Verify(unsigned char *cBuffer, unsigned int iBufLen) {unsigned int i, j; //#define wPolynom 0xA001unsigned 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)。

在西门子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校验计算子程序 - 西门子plc

CRC校验计算子程序 - 西门子plc

CRC校验计算子程序 - 西门子plc TITLE=子程序注释// CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把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 DWORDNetwork 1LD SM0.0MOVW 16#FFFF, AC0 //初始化CRC寄存器BTI *LD0, LW4 //数据缓冲区第一个字节为数据长度MOVD LD0, LD6INCD LD6 //指针指向第一个待处理字节Network 2LD SM0.0FOR AC2, +1, LW4 //开始循环处理每一个字节Network 3LD SM0.0XORB *LD6, AC0 //字节首先与CRC寄存器低位进行异或Network 4LD SM0.0FOR AC1, +1, +8 //移位处理循环,处理一个字节的8位Network 5LD SM0.0SRW AC0, 1 //CRC寄存器右移一位Network 6LD SM1.1 //如果移出位为0,则进入下一次循环XORW 16#A001, AC0 //如果移出位为1,CRC寄存器与多项式16#A001异或Network 7NEXTNetwork 8LD SM0.0INCD LD6 //指针加1指向下一个字节Network 9NEXTNetwork 10LD SM0.0SWAP AC0 //交换CRC寄存器高低字节MOVW AC0, *LD6 //CRC校验值写入数据区结尾。

crc校验 -循环冗余校验 原理和方法 -回复

crc校验 -循环冗余校验 原理和方法 -回复

crc校验-循环冗余校验原理和方法-回复CRC校验(Cyclic Redundancy Check)是一种在数据传输过程中常用的错误检测技术。

它通过对数据进行计算并生成一组校验码,用于检测数据是否在传输过程中发生了错误。

CRC校验算法广泛应用于计算机网络、通信系统以及存储设备等领域。

一、原理:CRC校验是基于二进制的模2除法实现的。

它可以用来检测数据传输过程中是否出现了错误,但不能纠正错误。

CRC校验使用一个固定的生成多项式(通常是16位或32位),该多项式作为校验算法的一部分。

生成多项式被称为“生成多项式”或“CRC多项式”。

在进行CRC校验时,发送方和接收方都需要使用相同的生成多项式。

CRC校验的基本原理是在发送数据之前,发送方计算数据和生成多项式的除法,并将得到的余数(或称为校验码)追加到待发送的数据之后。

接收方在接收到数据后,同样计算数据和生成多项式的除法,并将得到的余数与接收到的校验码进行比较。

如果余数为0,说明数据传输过程中没有发生错误;如果余数不为0,说明数据传输过程中出现了错误。

二、方法:1. 选择生成多项式:在进行CRC校验时,首先需要选择一个适当的生成多项式。

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

这些多项式都是经过严格计算和测试的,可以提供较高的校验能力。

2. 划定消息的边界:在进行CRC校验之前,需要将待发送的数据划分为消息和一些冗余位。

通常,消息包括需要传输的原始数据,而冗余位则由生成多项式的系数决定。

3. 数据和生成多项式的除法:使用生成多项式对消息和冗余位进行除法。

具体操作可以采用多种方法实现,例如位操作、字节操作以及表格查找等。

根据除法运算的性质,进行进位运算、模2求和等,最终得到一个余数。

4. 拼接校验码:将得到的余数追加到消息的末尾,得到一个完整的数据帧。

这个余数被称为校验码,它包含了数据中可能出现的错误的信息。

5. 数据传输:将带有校验码的数据帧发送给接收方。

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

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校验,用此校验方法在校验中犹豫用到的校验方法为一位法,所以在循环时所需的时间比较长。

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

相关文档
最新文档