luyanlong1
不停的学习,努力!
级别: 家园常客
精华主题: 0
发帖数量: 152 个
工控威望: 798 点
下载积分: 4964 分
在线时间: 90(小时)
注册时间: 2013-05-20
最后登录: 2024-11-26
查看luyanlong1的 主题 / 回贴
楼主  发表于: 2016-08-21 12:05
PLC发送8个字节,仪表回应21个字节,用8位的寄存器没问题,但是用16位的话,仪表回应回来的21个字节会出现错位,大侠们有什么好办法处理一下
lvpretend
级别: 论坛先锋
精华主题: 0
发帖数量: 1264 个
工控威望: 1434 点
下载积分: 3697 分
在线时间: 324(小时)
注册时间: 2015-07-20
最后登录: 2024-11-29
查看lvpretend的 主题 / 回贴
1楼  发表于: 2016-08-21 16:45
你传回来的数据加入放在D2000开始。

D2005是数据字1的高8位,但在PLC里却是放在低8位的,也就是需要把数据左移动8位,实际上就是乘以256(16#100)。

由于台达乘法运算比移位运算更快(处理器有专用乘法器),所以就是D2005 * 256

注意,16位乘法的结果是32位的,也就是占用2个16位数据,我们只需要低16位。所以这也是我喜欢全部用浮点数来运算的原因,反正是32位,不去管16位/32位之间的转换问题,慢也慢不到哪里去。

MUL  D2005   256   D100
这时D100中的数据就是D2005左移8位的数据了。

D2006是数据字1的低8位,在PLC里本就是放在低8位的,不用管它。

ADD D2006  D100  D200

这个时候D200中的数据就是按要求组合完成的16数据了。

再下来把这个16位数据转换成32位浮点数

FLT D200  D300   ,为了运算方便,建议不要直接采用地址,而采用变量定义,比如这里定义一个浮点数 R1

则上条指令就是  FLT D200 R1

然后进行小数点处理,因为有3个小数位,所以R1/1000
DEDIV  R1  1000.00  R1  
    
注意,常数要带小数点,系统才知道是浮点数。
这个时候R1中就把小数位搞好了。

再来做符号位
D2003是符号位,为1就是负数,那么就可以用接点逻辑运算来做
LD=  D2003   1     DEMUL  R1  -1.00 R1

这样就OK了。
当然,移位也可以,指令还要精简些,但速度差不多。

写得有点烦锁,不知道有写错的地方没有,你参考下,用仿真写段指令试下。
本帖最近评分记录:
  • 下载积分:+3(luyanlong1) 真诚感谢!