@johnsonxjq
身邊沒(méi)東西可測(cè)試,以下只是猜測(cè)。
復(fù)制代碼- 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);
|
最后執(zhí)行出來(lái) D0 會(huì)是多少?
如果不是 8,那就不用解釋了。
如果是 8,只能說(shuō)三菱對(duì)于這樣的設(shè)定有嚴(yán)格的限制,我們不清楚第一行執(zhí)行后 PLC 內(nèi)部到底做了什么事情。就算用階梯圖寫一模一樣的程序,通訊一樣會(huì)失敗,這和語(yǔ)言無(wú)關(guān),手冊(cè)也明確寫了如何正確設(shè)定。
以 ST 為例:
等同于
也是
編譯器還是呼叫了 MOV 指令,用 M8000 讓指令一直執(zhí)行,但不是無(wú)條件執(zhí)行。
基于文本程序的特性,人們更習(xí)慣 D0 := D1 而非 MOV,這樣對(duì)于較為復(fù)雜的算式尤其方便。
復(fù)制代碼- volume := 4.0 / 3.0 * PI * radius ** 3.0;
|
這用 DEDIV、DEMOV 或階梯圖寫起來(lái)就會(huì)較為復(fù)雜且不夠直觀。
如果真有需求,我們就使用指令的 EN 參數(shù)或是 IF,像是
但您提出的觀點(diǎn)也對(duì),如果連續(xù)幾行的起始都是讀同一個(gè)目標(biāo),如
那能不能將后面重復(fù)的省略以進(jìn)行優(yōu)化? 這樣的話編譯出來(lái)的程式就會(huì)是你想要的樣子。
這只有對(duì)于常數(shù)值才可以進(jìn)行,如果 LD 的目標(biāo)是會(huì)變動(dòng)的,就不能將它省略。
M8000 或許是一個(gè)特例,但也或許會(huì)在我們還不了解的狀況下改變數(shù)值。
所以就語(yǔ)言本身來(lái)說(shuō),其實(shí)沒(méi)什么問(wèn)題。小弟也曾被這個(gè)問(wèn)題拐過(guò),但正因?yàn)楣者^(guò),對(duì)于這些特性才有更多思考。
提供參考。