johnsonxjq
必攻不守
级别: 略有小成
精华主题: 0
发帖数量: 149 个
工控威望: 333 点
下载积分: 470 分
在线时间: 70(小时)
注册时间: 2007-08-31
最后登录: 2024-09-01
查看johnsonxjq的 主题 / 回贴
楼主  发表于: 2018-07-03 09:21
图片:
三菱Modbus通信初始化,结构化编程,上面的首尾相联初始化成功,可以正常通信,
下面的书写模式初始化失败,端口不发送数据.失联状态.原因不明,哪位高手解释一下.
读写是用ADPRW ,在这里不要怀疑其它部分程序了,我只改这里,一个通信正常,一个完全不能通信
难道是三菱结构化编程还存在bug.三菱的推出结构化编程,真心比西门子的难用,写程序很慢,本人也是尝试
[ 此帖被johnsonxjq在2018-07-03 09:27重新编辑 ]
instanttw
级别: 探索解密
精华主题: 0
发帖数量: 26 个
工控威望: 155 点
下载积分: 2292 分
在线时间: 39(小时)
注册时间: 2013-04-25
最后登录: 2021-11-04
查看instanttw的 主题 / 回贴
1楼  发表于: 2018-07-03 15:08
恶魔就躲在 EN 和 ENO。
SFC、ST 的样子不代表就是阶梯图的样子。
将两段程序写进 PLC 后以阶梯图读出来观察就会明白了。
instanttw
级别: 探索解密
精华主题: 0
发帖数量: 26 个
工控威望: 155 点
下载积分: 2292 分
在线时间: 39(小时)
注册时间: 2013-04-25
最后登录: 2021-11-04
查看instanttw的 主题 / 回贴
2楼  发表于: 2018-07-04 10:09
@johnsonxjq

身边没东西可测试,以下只是猜测。

复制代码
  1. INC(MOV(M8411, H1087, D8420), D0);
  2. INC(MOV(M8411, H1, D8421), D0);
  3. INC(MOV(M8411, K1000, D8429), D0);
  4. INC(MOV(M8411, K400, D8430), D0);
  5. INC(MOV(M8411, K10, D8431), D0);
  6. INC(MOV(M8411, K1000, D8432), D0);
  7. INC(MOV(M8411, H1, D8435), D0);
  8. INC(MOV(M8411, K50, D8436), D0);

最后执行出来 D0 会是多少?
如果不是 8,那就不用解释了。
如果是 8,只能说三菱对于这样的设定有严格的限制,我们不清楚第一行执行后 PLC 内部到底做了什么事情。就算用阶梯图写一模一样的程序,通讯一样会失败,这和语言无关,手册也明确写了如何正确设定。

以 ST 为例:
复制代码
  1. D0 := D1;

等同于
复制代码
  1. MOV(M8000, D1, D0);

也是
复制代码
  1. LD M8000
  2. MOV D1 D0

编译器还是呼叫了 MOV 指令,用 M8000 让指令一直执行,但不是无条件执行。



基于文本程序的特性,人们更习惯 D0 := D1 而非 MOV,这样对于较为复杂的算式尤其方便。
复制代码
  1. volume := 4.0 / 3.0 * PI * radius ** 3.0;

这用 DEDIV、DEMOV 或阶梯图写起来就会较为复杂且不够直观。
如果真有需求,我们就使用指令的 EN 参数或是 IF,像是
复制代码
  1. MOV(M1234, D1001, D1000)




但您提出的观点也对,如果连续几行的起始都是读同一个目标,如
复制代码
  1. LD M8411

那能不能将后面重復的省略以进行优化? 这样的话编译出来的程式就会是你想要的样子。
这只有对于常数值才可以进行,如果 LD 的目标是会变动的,就不能将它省略。
M8000 或许是一个特例,但也或许会在我们还不了解的状况下改变数值。


所以就语言本身来说,其实没什么问题。小弟也曾被这个问题拐过,但正因为拐过,对于这些特性才有更多思考。


提供参考。
本帖最近评分记录:
  • 下载积分:+1(aaa2073) 热心助人!