光洋S系列PLC Modbus通讯用CRC校验程序,已经试验成功 点击:1787 | 回复:4



张智勇

    
  • 精华:13帖
  • 求助:4帖
  • 帖子:344帖 | 4142回
  • 年度积分:0
  • 历史总积分:4044
  • 注册:2004年8月21日
发表于:2009-02-13 10:37:42
楼主

http://www.plc-fa.hk/detail.asp?id=8498看到关于光洋PLC的CRC校验文章《 基于ModBus RTU的CRC-16算法及其Koyo SM实现 》,自己手头刚好有光洋SM/SN等PLC,就下载到PLC后试验,发觉原作者的程序得到的结果根本就是错误的

打电话发手机短信以及电子邮件联系作者长时间都没有答复,自己就参考西门子S7-200的CRC校验程序做了一个光洋SN32的CRC校验程序,开始没有用SM PLC的原因是光洋的FOR 循环指令不支持嵌套,SM还不支持程序跳转指令和子程序.很郁闷,就先用光洋SN32制作CRC校验程序,等CRC校验完成后再往SM24套用.

SN32程序如下:

PLC SN

ISG S0
//如程序需要校验以R2000~R2002连续3个字6个字节的CRC校验结果,由于CRC校验是以字节为单位计算,这里先把R2000双字节数据变成单字节数据保存在R2200开始的连续6个寄存器.我试验的计算0506003A01F4的CRC结果R2000=16#605,R2001=16#3A00,R2002=16#F401 .这里先R2200=16#05 R2201=16#06 R2202=16#00 R2203=16#3A R2204=16#01 R2205=16#F4
LDR O2000  
OUTW R3600    //P3600储存CRC校验首字寄存器地址
LDR O2200
OUTW R3601    //把字转换为字节保持的首地址
LDS K3
OUTW R3602    //CRC校验的字个数,这里=3
LDS K6
OUTW R3603    //CRC校验的字节个数,这里=6,也可以为奇数如5等
JMP S10

SG S10

FOR R3602   //循环执行3次,把R2000~2002双字节转换为单字节后保存到R2200~2205寄存器

LD SP1
LDW P3600
ANDC Kff
OUTW P3601
BINC R3601
LDW P3600
SHFR K8
ANDC Kff
OUTW P3601
BINC R3600
BINC R3601

NEXT     //双字节转单字节循环程序结束,下面就是计算R2200~R2205的CRC校验程序

LD SP1
LDC Kffff
OUTW R3660   //将16位CRC校验寄存器R3660所有位全部置1(写入16#FFFF)
LDR O2200
OUTW R3661   //CRC校验字节指针,计算以R2200开头的字节
FOR R3603      //循环执行R3603=6次

LD SP1
LDW P3661
XORW R3660
OUTW R3660     //第一个字节与CRC校验寄存器R3660异或运算,结果保存到R3660(这里用字异或,R2200~2205高位=0不影响运算结果)
BINC R3661       //首地址指针+1,下一次循环时计算R2201,以此类推
CAL K1                 //下面该计算字节8个位运算,由于光洋SN32不支持FOR指令嵌套,这里把FOR指令放在子程序里面,效果一样

NEXT     //循环运算结束

LD SP1
JMP S0   //CRC校验结束后返回S0级

END   //程序结束

CLBL K1

FOR K8    //连续执行8次下面指令

LD SP1
LDW R3660
ANDC K1
OUTW R3663   //取R3660最后一位保存到R3663寄存器,因为光洋移位指令不支持溢出,不能够像西门子那样用SM1.1做溢出标志
LDW R3660
SHFR K1
OUTW R3660   //R3660右移一位

LDEQ R3663 K1 //如果R3660右移一位之前最后一位=1,则
LDW R3660
XORC Ka001
OUTW R3660     //把CRC校验寄存器与16#A001异或运算后保存到R3660,

NEXT

CEND




张智勇

  • 精华:13帖
  • 求助:4帖
  • 帖子:344帖 | 4142回
  • 年度积分:0
  • 历史总积分:4044
  • 注册:2004年8月21日
发表于:2009-02-13 11:17:31
1楼

用SN32 704语句试验完毕,由于SM PLC不支持程序跳转/子程序,FOR也不能够嵌套,只好把位运算部分重复执行,程序比较大.

PLC SM

ISG S0

LDR O2000
OUTW R3600
LDR O2200
OUTW R3601
LDS K3
OUTW R3602
LDS K6
OUTW R3603
JMP S10

SG S10

FOR R3602

LD SP1
LDW P3600
ANDC Kff
OUTW P3601
BINC R3601
LDW P3600
SHFR K8
ANDC Kff
OUTW P3601
BINC R3600
BINC R3601

NEXT

LD SP1
LDC Kffff
OUTW R3660
LDR O2200
OUTW R3604
FOR R3603

LD SP1
LDW P3604
XORW R3660
OUTW R3660
BINC R3604

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660

LD SP1
LDW R3660
ANDC K1
OUTW R3605
LDW R3660
SHFR K1
OUTW R3660

LDEQ R3605 K1
LDW R3660
XORC Ka001
OUTW R3660


NEXT

LD SP1
JMP S0

END

张智勇

  • 精华:13帖
  • 求助:4帖
  • 帖子:344帖 | 4142回
  • 年度积分:0
  • 历史总积分:4044
  • 注册:2004年8月21日
发表于:2009-02-13 11:18:24
2楼

少用一个FOR,程序多100语句,达到171语句

董绍伶

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2009年3月07日
发表于:2009-03-07 14:58:43
3楼

我公司有一台KOYO的编程有一点问题,可以跟您用电话联络吗?可发邮件到我信箱告之电话号码吗?   tung16889@hotmail.com

张智勇

  • 精华:13帖
  • 求助:4帖
  • 帖子:344帖 | 4142回
  • 年度积分:0
  • 历史总积分:4044
  • 注册:2004年8月21日
发表于:2009-03-07 16:14:28
4楼
什么问题?qq475761006

热门招聘
相关主题

官方公众号

智造工程师