johnsonxjq
必攻不守
級別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 149 個
工控威望: 333 點
下載積分: 470 分
在線時間: 70(小時)
注冊時間: 2007-08-31
最后登錄: 2024-12-19
查看johnsonxjq的 主題 / 回貼
樓主  發(fā)表于: 2018-07-03 09:21
圖片:
三菱Modbus通信初始化,結(jié)構(gòu)化編程,上面的首尾相聯(lián)初始化成功,可以正常通信,
下面的書寫模式初始化失敗,端口不發(fā)送數(shù)據(jù).失聯(lián)狀態(tài).原因不明,哪位高手解釋一下.
讀寫是用ADPRW ,在這里不要懷疑其它部分程序了,我只改這里,一個通信正常,一個完全不能通信
難道是三菱結(jié)構(gòu)化編程還存在bug.三菱的推出結(jié)構(gòu)化編程,真心比西門子的難用,寫程序很慢,本人也是嘗試
[ 此帖被johnsonxjq在2018-07-03 09:27重新編輯 ]
instanttw
級別: 探索解密
精華主題: 0
發(fā)帖數(shù)量: 26 個
工控威望: 155 點
下載積分: 2292 分
在線時間: 39(小時)
注冊時間: 2013-04-25
最后登錄: 2021-11-04
查看instanttw的 主題 / 回貼
1樓  發(fā)表于: 2018-07-03 15:08
惡魔就躲在 EN 和 ENO。
SFC、ST 的樣子不代表就是階梯圖的樣子。
將兩段程序?qū)戇M PLC 后以階梯圖讀出來觀察就會明白了。
instanttw
級別: 探索解密
精華主題: 0
發(fā)帖數(shù)量: 26 個
工控威望: 155 點
下載積分: 2292 分
在線時間: 39(小時)
注冊時間: 2013-04-25
最后登錄: 2021-11-04
查看instanttw的 主題 / 回貼
2樓  發(fā)表于: 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);

最后執(zhí)行出來 D0 會是多少?
如果不是 8,那就不用解釋了。
如果是 8,只能說三菱對于這樣的設定有嚴格的限制,我們不清楚第一行執(zhí)行后 PLC 內(nèi)部到底做了什么事情。就算用階梯圖寫一模一樣的程序,通訊一樣會失敗,這和語言無關(guān),手冊也明確寫了如何正確設定。

以 ST 為例:
復制代碼
  1. D0 := D1;

等同于
復制代碼
  1. MOV(M8000, D1, D0);

也是
復制代碼
  1. LD M8000
  2. MOV D1 D0

編譯器還是呼叫了 MOV 指令,用 M8000 讓指令一直執(zhí)行,但不是無條件執(zhí)行。



基于文本程序的特性,人們更習慣 D0 := D1 而非 MOV,這樣對于較為復雜的算式尤其方便。
復制代碼
  1. volume := 4.0 / 3.0 * PI * radius ** 3.0;

這用 DEDIV、DEMOV 或階梯圖寫起來就會較為復雜且不夠直觀。
如果真有需求,我們就使用指令的 EN 參數(shù)或是 IF,像是
復制代碼
  1. MOV(M1234, D1001, D1000)




但您提出的觀點也對,如果連續(xù)幾行的起始都是讀同一個目標,如
復制代碼
  1. LD M8411

那能不能將后面重復的省略以進行優(yōu)化? 這樣的話編譯出來的程式就會是你想要的樣子。
這只有對于常數(shù)值才可以進行,如果 LD 的目標是會變動的,就不能將它省略。
M8000 或許是一個特例,但也或許會在我們還不了解的狀況下改變數(shù)值。


所以就語言本身來說,其實沒什么問題。小弟也曾被這個問題拐過,但正因為拐過,對于這些特性才有更多思考。


提供參考。
本帖最近評分記錄:
  • 下載積分:+1(aaa2073) 熱心助人!