luyanlong1
不停的学习,努力!
级别: 家园常客
精华主题: 0
发帖数量: 154 个
工控威望: 798 点
下载积分: 4954 分
在线时间: 90(小时)
注册时间: 2013-05-20
最后登录: 2024-09-13
查看luyanlong1的 主题 / 回贴
楼主  发表于: 2016-08-21 12:05
PLC发送8个字节,仪表回应21个字节,用8位的寄存器没问题,但是用16位的话,仪表回应回来的21个字节会出现错位,大侠们有什么好办法处理一下
tingfenghu
级别: 工控侠客

精华主题: 0
发帖数量: 2845 个
工控威望: 3617 点
下载积分: 3517 分
在线时间: 3802(小时)
注册时间: 2007-11-04
最后登录: 2024-11-20
查看tingfenghu的 主题 / 回贴
1楼  发表于: 2016-08-21 14:06
昨天已经回复过你,还没有搞定,建议还是看看手册吧.
楼主留言:
我第一次搞这种东西,确实不懂,我没用AD模块,直接是RTU通信的,刚刚又试了下,AND用错了,就是不太理解AND和OR还有XOR,有点反不过劲的感觉
二手PLC,触摸屏,伺服驱动,各类气动设备
http://shop58129605.taobao.com/
lvpretend
级别: 论坛先锋
精华主题: 0
发帖数量: 1258 个
工控威望: 1428 点
下载积分: 3680 分
在线时间: 322(小时)
注册时间: 2015-07-20
最后登录: 2024-11-16
查看lvpretend的 主题 / 回贴
2楼  发表于: 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) 真诚感谢!
    tingfenghu
    级别: 工控侠客

    精华主题: 0
    发帖数量: 2845 个
    工控威望: 3617 点
    下载积分: 3517 分
    在线时间: 3802(小时)
    注册时间: 2007-11-04
    最后登录: 2024-11-20
    查看tingfenghu的 主题 / 回贴
    3楼  发表于: 2016-08-21 20:50
    d10分解成d0,d1,再将d0 ,d1 合并成 d11,ROL,ROR是循环移位,需要考虑进位,详细的自己是研究.
    我用三菱的软件,好像台达差不多的.
    [attachment=151214]
    [ 此帖被tingfenghu在2016-08-21 21:05重新编辑 ]
    本帖最近评分记录:
  • 下载积分:+3(luyanlong1) 真诚感谢!
  • 二手PLC,触摸屏,伺服驱动,各类气动设备
    http://shop58129605.taobao.com/