如何用宏写CRC校验程序 点击:1061 | 回复:7



xihaiyibei

    
  • 精华:0帖
  • 求助:2帖
  • 帖子:2帖 | 9回
  • 年度积分:0
  • 历史总积分:36
  • 注册:2011年4月04日
发表于:2013-01-30 07:06:39
楼主
在台达人机里如何用宏写CRC校验程序,有详细的例子吗



liujian5118

  • 精华:2帖
  • 求助:8帖
  • 帖子:31帖 | 3109回
  • 年度积分:199
  • 历史总积分:19924
  • 注册:2009年3月25日
发表于:2013-01-30 08:57:47
1楼

以前一同事(论坛里叫苏菲)写的!参考下

$1100 = FFFFH
$10000 = 2000
FOR $100
$1100 = $1100^*$10000
FOR 8
$4000.0 = GETB($1100.0)
$4001 = $1100>>1
IF $4000.0 == OFF
$1100 = $4001
ELSE
$1100 = $4001 ^ A001H
ENDIF
NEXT
$10000 = $10000 + 1
NEXT
$102 = $100 + 2
SWAP($1200, $1100, 1)
*$10000 = $1200/256
$10000 = $10000+1
*$10000 = $1200%256
$1210 = H2A($1200)
$1300 = $1211*256
$1302 = $1210 + $1300
$1301 = $1213*256
$1303 = $1212 + $1301
$10004 = 1400 +$100
BMOV($1400,$1000,$100)
BMOV(*$10004,$1302,2)

liujian5118

  • 精华:2帖
  • 求助:8帖
  • 帖子:31帖 | 3109回
  • 年度积分:199
  • 历史总积分:19924
  • 注册:2009年3月25日
发表于:2013-01-30 09:14:17
2楼

校验码计算没有问题(我自己也写了个版本的),但是在RTU模式使用Putchar getchar 指令发送却没成功。和本来是要和其他家通讯的,后面拿台达PLC,也没成功。感觉是RTU模式当数据低电平高于3.5个字符判断为停止的原因。没用示波器去抓实际数据!LZ可以试下,我也学习下!

ma287434580

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2012年3月05日
发表于:2013-04-30 23:12:19
3楼
楼主这个CRC好像有点问题呀!$1210 = H2A($1200)

ma287434580

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2012年3月05日
发表于:2013-04-30 23:13:07
4楼
楼主这个CRC好像有点问题呀!$1210 = H2A($1200)

ma287434580

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2012年3月05日
发表于:2013-04-30 23:13:09
5楼
楼主这个CRC好像有点问题呀!$1210 = H2A($1200)

HuaiJZ

  • 精华:0帖
  • 求助:0帖
  • 帖子:18帖 | 159回
  • 年度积分:0
  • 历史总积分:362
  • 注册:2003年8月19日
发表于:2013-05-01 22:04:41
6楼

让屏去干这个事,屏会很痛苦的,又不是PLC。

台达的屏的通讯口有MODBUS协议,为什么还要自己写校验?

epodak

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 31回
  • 年度积分:0
  • 历史总积分:86
  • 注册:2012年2月08日
发表于:2013-07-31 19:03:04
7楼

#$500 内存放CRC校验字

$500=0FFFFH

$511=0A001H


#需要计算的数据,依次存放在$501--$506

#第一字节校验

$510=$501


$500=$500^$510

FOR 8

#循环右移1位

$509.0=GETB $500.0

$500=$500>>1

$500.15=GETB $509.0


IF $500<8000H THEN GOTO LABEL 10

$500=$500-8000H

$500=$500^$511


LABEL 10


NEXT


#第二字节校验

$510=$502


$500=$500^$510

FOR 8

#循环右移1位

$509.0=GETB $500.0

$500=$500>>1

$500.15=GETB $509.0


IF $500<8000H THEN GOTO LABEL 20

$500=$500-8000H

$500=$500^$511


LABEL 20


NEXT



#第三字节校验

$510=$503


$500=$500^$510

FOR 8

#循环右移1位

$509.0=GETB $500.0

$500=$500>>1

$500.15=GETB $509.0


IF $500<8000H THEN GOTO LABEL 30

$500=$500-8000H

$500=$500^$511


LABEL 30


NEXT


#第四字节校验

$510=$504


$500=$500^$510

FOR 8

#循环右移1位

$509.0=GETB $500.0

$500=$500>>1

$500.15=GETB $509.0


IF $500<8000H THEN GOTO LABEL 40

$500=$500-8000H

$500=$500^$511


LABEL 40


NEXT



#第五字节校验

$510=$505


$500=$500^$510

FOR 8

#循环右移1位

$509.0=GETB $500.0

$500=$500>>1

$500.15=GETB $509.0


IF $500<8000H THEN GOTO LABEL 50

$500=$500-8000H

$500=$500^$511


LABEL 50


NEXT


#第六字节校验

$510=$506


$500=$500^$510

FOR 8

#循环右移1位

$509.0=GETB $500.0

$500=$500>>1

$500.15=GETB $509.0


IF $500<8000H THEN GOTO LABEL 60

$500=$500-8000H

$500=$500^$511


LABEL 60


NEXT





RET

凑合看看吧。


热门招聘
相关主题

官方公众号

智造工程师