西门子plc的crc校验程序

西门子PLC德国西门子(SIEMENS)公司生产的可编程序控制器在我国的应用也相当广泛,在冶金、化工、印刷生产线等领域都有应用 。西门子(SIEMENS)公司的PLC产品包括LOGO、S7-200、S7-1200、S7-300、S7-400等 。西门子S7系列PLC体积小、速度快、标准化,具有网络通信能力,功能更强,可靠性高 。S7系列PLC产品可分为微型PLC(如S7-200),小规模性能要求的PLC(如S7-300)和中、高性能要求的PLC(如S7-400)等 。
CRC校验RC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定 。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性 。
工作原理
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码 。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x) 。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式 。
校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置 。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码 。任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应 。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111 。
PLC的crc校验程序方法1:计算法
主程序:OB1
Network 1
LD M0.0
EU
CALL SBR0,AC0 /
INCB VB0
INCB VB0
XMT 发送接收缓冲区,0
Network 2
LD M0.1
EU
CALL SBR0,AC0
AW《》 AC0,+0
MOVB 1,AC0
SBR_0:SBR0
VAR_OUTPUT
crc:INT;
END_VAR
VAR
count:INT;
ptr:DWORD;
END_VAR
BEGIN
Network 1
// MOVW AC0,*#ptr 用于发送,直接将CRC写入发送缓冲区,然后mmodbusBufr加2 。
//
LD SM0.0
MOVW 16#FFFF,AC0
BTI VB0,LW2
MOVD &VB0,LD4
INCD LD4
FOR AC2,+1,LW2
XORB *LD4,AC0
FOR AC1,+1,+8
SRW AC0,1
LD SM1.1
XORW 16#A001,AC0
NEXT
LD SM0.0
INCD LD4
NEXT
Network 2
// MOVW AC0,#crc 用于接收
// 如果程序无须接收,则可删除这一行,删除crc这个OUT参数 。
//
//
//
// MOVW AC0,*#ptr 用于发送
// 直接将CRC写入发送缓冲区,然后mmodbusBufr加2 。
// 如果程序无须发送,则可删除这一行 。
LD SM0.0
SWAP AC0
MOVW AC0,LW0
MOVW AC0,*LD4
Network 3 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_INTERRUPT_BLOCK
方法2:查表法
ORGANIZATION_BLOCK 主程序:OB1
TITLE=和方法1不同的是多了个初始化,简化了CRC计算过程,缩短了时间 。
// 调用方法和方法1一样
BEGIN
Network 1 // 网络标题
// 初始化CRC表,需要512个字节 。VB2256---------VB2767
LD SM0.1
CALL SBR0
Network 2 // 网络标题
// 发送
LD M0.0
EU
CALL SBR1,AC0 //AC0在此无用
INCB VB2000
INCB VB2000
XMT 发送接收缓冲区,0
Network 3
// 接收完成后检查接收的数据对错,如果计算结果为0,则说明传输正确 。
LD M0.1
EU
CALL SBR1,AC0
【西门子plc的crc校验程序】AW《》 AC0,+0
MOVB 1,AC0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=子程序注释
VAR
index1:INT;
index2:INT;
END_VAR
BEGIN
Network 1
LD SM0.0
MOVD &VB2256,AC3
MOVD +0,AC2
FOR LW0,+1,+256
MOVW AC2,AC0
FOR LW2,+1,+8
SRW AC0,1
Network 2
LD SM1.1
XORW 16#A001,AC0
Network 3
NEXT
Network 4
LD SM0.0
MOVW AC0,*AC3
INCW AC2
+I +2,AC3
Network 5
NEXT
Network 6 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_1:SBR1
TITLE=子程序注释
VAR_OUTPUT
crc:INT;
END_VAR
VAR
count:INT;
ptr:DWORD;
END_VAR
BEGIN
Network 1
LD SM0.0
BTI VB2000,LW2
MOVD &VB2000,LD4
INCD LD4
XORD AC0,AC0
MOVD 16#FFFF,AC2
FOR AC1,+1,LW2
MOVB *LD4,AC0
XORW AC2,AC0
ANDW 16#FF,AC0
SLW AC0,1
MOVD &VB2256,AC3
+I AC0,AC3
SWAP AC2
ANDW 16#FF,AC2
XORW *AC3,AC2
INCD LD4
Network 2
NEXT
Network 3
LD SM0.0
SWAP AC2
MOVW AC2,LW0
MOVW AC2,*LD4
Network 4 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_INTERRUPT_BLOCK

    推荐阅读