@johnsonxjq
身边没东西可测试,以下只是猜测。
复制代码- INC(MOV(M8411, H1087, D8420), D0);
- INC(MOV(M8411, H1, D8421), D0);
- INC(MOV(M8411, K1000, D8429), D0);
- INC(MOV(M8411, K400, D8430), D0);
- INC(MOV(M8411, K10, D8431), D0);
- INC(MOV(M8411, K1000, D8432), D0);
- INC(MOV(M8411, H1, D8435), D0);
- INC(MOV(M8411, K50, D8436), D0);
|
最后执行出来 D0 会是多少?
如果不是 8,那就不用解释了。
如果是 8,只能说三菱对于这样的设定有严格的限制,我们不清楚第一行执行后 PLC 内部到底做了什么事情。就算用阶梯图写一模一样的程序,通讯一样会失败,这和语言无关,手册也明确写了如何正确设定。
以 ST 为例:
等同于
也是
编译器还是呼叫了 MOV 指令,用 M8000 让指令一直执行,但不是无条件执行。
基于文本程序的特性,人们更习惯 D0 := D1 而非 MOV,这样对于较为复杂的算式尤其方便。
复制代码- volume := 4.0 / 3.0 * PI * radius ** 3.0;
|
这用 DEDIV、DEMOV 或阶梯图写起来就会较为复杂且不够直观。
如果真有需求,我们就使用指令的 EN 参数或是 IF,像是
但您提出的观点也对,如果连续几行的起始都是读同一个目标,如
那能不能将后面重復的省略以进行优化? 这样的话编译出来的程式就会是你想要的样子。
这只有对于常数值才可以进行,如果 LD 的目标是会变动的,就不能将它省略。
M8000 或许是一个特例,但也或许会在我们还不了解的状况下改变数值。
所以就语言本身来说,其实没什么问题。小弟也曾被这个问题拐过,但正因为拐过,对于这些特性才有更多思考。
提供参考。