任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
生成多项式:G(X)=X^8+X^2+X+1转化为100000111 =0x1070#define POLY(0x1070U <<3)
u8 crc8(u16 data)
{
int i
for(i = 0i <8i++) {
if (data &0x8000)
data = data ^ POLY
data = data <<1
}
return (u8)(data >>8)
}
是否可以解决您的问题?
先看些资料(可通过网络搜索),稍微了解CRC校验原理。其实该CRC校验的过程就是异或、移位、取余数。目前CRC校验有直接计算和查表法。这两种方法我都用梯形图(编程语言: RSLOGIX 500 )实现过。
直接计算会让PLC的执行时间将变得很长,特别是当传输数据量大的时候,因为每个字节的每个位都要进行一次计算。
推荐用查表法,PLC执行快,一个字节查表一次,计算一次。至于算法可百度搜索,很多用C语言实现的,想办法把它转为梯形图实现就可以了,其实也并不需要知道它的原理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)