在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
用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
[7941]
[12264]
[13728]
[10673]
[26465]
[17420]
[19439]
[23406]
[25171]
[8077]

客服
小程序
公众号