登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:CRC校验程序

点击:782 回复:7

图片是一台PH值仪表的CRC函数,这个函数看不懂,想用S7-200的PLC和它通讯,请问CRC校验的程序该如何编写?谢谢
附件 Screenshot_20210728_234034_com.tencent.mm.jpg
附件 Screenshot_20210728_234934_com.tencent.mm.jpg
附件 Screenshot_20210728_234942_com.tencent.mm.jpg
最后修改:2021/7/28 23:50:41
21-07-28 23:47
unsigned int crc_chk_value(unsigned char *data_value, unsigned char length)
{
unsigned int crc_value=0xFFFF;
int i;
while(length--)
{ crc_value^=*data_value++;
for(i=0;i<8;i++)
{ if(crc_value&0x0001)
crc_value=( crc_value>>1)^0xA001;
else
crc_value= crc_value>>1;
}
}
return(crc_value);
}
21-07-29 08:22
老200还是smart
21-08-01 07:14
modbus库直接用,不用另外写程序
21-08-01 07:17
200或者200 Smart一般都有Modbus RTU指令库,可以调用和这个设备进行通信。
可以参考我发布的相关PLC实现Modbus通信视频教程:
http://m.gkong.com/bbs/485788.ashx
21-08-01 13:49
typedef??? unsigned char???? uchar;
typedef??? unsigned int????? uint;
?
code uchar crcbuff [] = { 0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};
uint crc;????????????????? // CRC 码
void main(void)
{
? uchar *ptr;
? crc = 0;??????????????? // CRC? 初值
? ptr = crcbuff;????????????? //? 指向第一个 Byte 数据
? crc = crc16l(ptr,8);???????????
? while(1);
}
?
uint crc16l(uchar *ptr,uchar len)??????? // ptr 为数据指针,len 为数据长度
{
? uchar i;
? while(len--)
? {
????? for(i=0x80; i!=0; i>>=1)
??? {
??????? if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;}??????? 1-1??
????????? else crc<<=1;????????????????????   1-2
????? if((*ptr&i)!=0) crc^=0x1021;???????????????     1-3??
??? }
??? ptr++;
? }
? return(crc);
}
?
执行结果 crc = 0xdbc0;
最后修改:2021/8/1 15:13:34
21-08-01 15:12
好奇怪,代码乱了
21-08-01 16:01
为什么要自己写CRC检验呢?用PLC,这个CRC检验是内部处理的,自动添加在报文后面的
21-08-02 14:15

工控新闻

更多新闻资讯