johnsonxjq
必攻不守
級別: 略有小成
|
圖片:
三菱Modbus通信初始化,結構化編程,上面的首尾相聯初始化成功,可以正常通信, 下面的書寫模式初始化失敗,端口不發(fā)送數據.失聯狀態(tài).原因不明,哪位高手解釋一下. 讀寫是用ADPRW ,在這里不要懷疑其它部分程序了,我只改這里,一個通信正常,一個完全不能通信 難道是三菱結構化編程還存在bug.三菱的推出結構化編程,真心比西門子的難用,寫程序很慢,本人也是嘗試 [ 此帖被johnsonxjq在2018-07-03 09:27重新編輯 ] |
---|---|
|
instanttw
級別: 探索解密
|
惡魔就躲在 EN 和 ENO。 SFC、ST 的樣子不代表就是階梯圖的樣子。 將兩段程序寫進 PLC 后以階梯圖讀出來觀察就會明白了。 |
---|---|
|
johnsonxjq
必攻不守
級別: 略有小成
|
惡魔就躲在 EN 和 ENO。 SFC、ST 的樣子不代表就是階梯圖的樣子。 將兩段程序寫進 PLC 后以階梯圖讀出來觀察就會明白了。 讀出來,一個是M8411只有一個,全部初始化在后面,一個是M8411有多個,每個帶兩個Mov指令,邏輯上沒問題呀,但實際唉, 三菱的編譯器是否有問題?那就坑人了. |
---|---|
|
twingo49
級別: 網絡英雄
|
其實在modbus通信手冊第35頁已經有提醒了 |
---|---|
本帖最近評分記錄: |
johnsonxjq
必攻不守
級別: 略有小成
|
我正是在此頁看到問題才改的程序,但問題是這樣不對呀,不符合規(guī)則啊.西門子的PLC就沒有這樣的說法.三菱的仿西門子還是有點莫名其妙 |
---|---|
|
twingo49
級別: 網絡英雄
|
不符合規(guī)則很正常的,要是都符合規(guī)則,表示寫一套程式就可以用在任何廠牌的PLC,沒有幾家會這樣做的。 |
---|---|
|
instanttw
級別: 探索解密
|
@johnsonxjq 身邊沒東西可測試,以下只是猜測。
最后執(zhí)行出來 D0 會是多少? 如果不是 8,那就不用解釋了。 如果是 8,只能說三菱對于這樣的設定有嚴格的限制,我們不清楚第一行執(zhí)行后 PLC 內部到底做了什么事情。就算用階梯圖寫一模一樣的程序,通訊一樣會失敗,這和語言無關,手冊也明確寫了如何正確設定。 以 ST 為例:
等同于
也是
編譯器還是呼叫了 MOV 指令,用 M8000 讓指令一直執(zhí)行,但不是無條件執(zhí)行。 基于文本程序的特性,人們更習慣 D0 := D1 而非 MOV,這樣對于較為復雜的算式尤其方便。
這用 DEDIV、DEMOV 或階梯圖寫起來就會較為復雜且不夠直觀。 如果真有需求,我們就使用指令的 EN 參數或是 IF,像是
但您提出的觀點也對,如果連續(xù)幾行的起始都是讀同一個目標,如
那能不能將后面重復的省略以進行優(yōu)化? 這樣的話編譯出來的程式就會是你想要的樣子。 這只有對于常數值才可以進行,如果 LD 的目標是會變動的,就不能將它省略。 M8000 或許是一個特例,但也或許會在我們還不了解的狀況下改變數值。 所以就語言本身來說,其實沒什么問題。小弟也曾被這個問題拐過,但正因為拐過,對于這些特性才有更多思考。 提供參考。 |
|||||||
---|---|---|---|---|---|---|---|---|
本帖最近評分記錄: |
twingo49
級別: 網絡英雄
|
其實重點在M8411,手冊有提到建議M8411只有一次(35~38頁),如果用超過一次,只有最後一次有效,第二種寫法會變成M8411用4次所以只有最後一次有效,因此通不起來。 |
---|---|
本帖最近評分記錄: |
johnsonxjq
必攻不守
級別: 略有小成
|
圖片:
謝謝你的回答,你的思考深入了,實際情況D0=0;另外,我用的是FX3U,結構化編程和ST編程競然不能混用,和西門子相比,三菱的靈活性實在差很多,不過三菱,歐姆龍,臺達都有結構化編程出來 了,向西門子這個龍頭老大告攏.希望不久的將來,能形成大一統局面,為何不同的廠家不能使用同樣結構的語言,來少去我們這些代碼工人的勞動呢.雖然到那時寫程序變得更沒價值了.但畢竟這是進步. [ 此帖被johnsonxjq在2018-07-04 15:15重新編輯 ] |
---|---|
|
johnsonxjq
必攻不守
級別: 略有小成
|
對,仔細看了下手冊,的確有如此說法,如果這樣說就和編譯器有關.我想說的是,三菱這樣做,像是在設陷井. |
---|---|
|