三菱PLC在國内自動化行業使用非常廣泛,作為經典的日系工控産品品牌之一,他留給我的印象是簡單、好用、便宜(相比歐美産品),而且編程軟件也由原來的GX Developer推出了更強大的GX Works2和GX Works3,除了基本的梯形圖簡單工程外還支持ST,FBD,SFC等高級語言結構化編程,但是可能由于時間短或者其他原因,在應用這些高級語言時卻有不少讓人抓狂的BUG,下面就列舉一些本人發現的BUG和不足,讓大家少走彎路。
聲明數組起始數不為0時會出錯在标簽頁中聲明數組标簽時,勾選數組設定數量n後,會默認聲明成[0..n-1],例如聲明10個word數組:
但是數據類型中的(0..9)是可以編輯的,我們可以改為(1..10):
更改之後編程、編譯、下載、運行都沒有報錯,但是他會出現一個緻命的bug:數組中某個數據賦值不正确或無法賦值!是不是很詭異, 但是這個錯誤不是一定出現的,隻有在大量使用複雜編程的時候才有可能出現,以前項目中出現一次我找了一整天才發現原因!附上當時的異常照片:
圖中程序是将bit數組Done(1..7)賦給7個bit變量,但是Done[6]的值卻無法傳遞給其他變量,解決這個問題的方法就是将所有數組的起始号都改為0,即使0用不到,空着浪費也要聲明出來。
for循環下結構體數組多層嵌套會出錯在我的蜘蛛紙牌視頻中(三菱PLC編寫《蜘蛛紙牌》),有一段程序就碰到了這個問題,如下圖:
在這段程序中我将數組 iDownNumb[ii] 傳遞給 jj ,又将 jj 寫入結構體的元素數組 BEHIND_LINE[ii].Numb[jj] 中,我為什麼要這麼寫呢?我可以直接寫成 BEHIND_LINE[ii].Numb[iDownNumb[ii]] 的啊,為什麼要用個 jj 變量呢?原因是如果我省略 jj 将數組變量直接寫入結構體元素數組中,那麼這個FOR循環執行後 BEHIND_LINE[ii].Numb中賦的值就不正确,跟等号後面的數組變量pageList裡面的值完全沒有關系,我當時因為這個情況一度懷疑我是不是哪裡寫錯了看不出來,腦袋秀逗了?弄了半天才發現問題所在,大家以後如果遇到類似的問題,先不要懷疑自己,有可能是軟件比較坑爹,解決的辦法就如上圖所示,變量不要嵌套太多層,多用點中間變量來過度一下。
長時間編輯程序軟件會崩潰這個問題最坑爹了,寫了半天的程序,終于寫的差不多了想點一下編譯,看看有沒有錯誤,結果軟件卡死崩潰了,關鍵是還沒有自動保存,隻能眼睜睜的看着你好不容易寫了半天的程序變成淺灰色,看着那轉着圈圈的鼠标和彈出的錯誤提示框,狠心的點下“關閉程序”。當時的心情就是:關機不幹了。。。
所以在使用GX Works2時一定要養成随手點保存的良好習慣,如果你真的忘了保存且軟件崩潰的話,記得及時給顯示出來的程序照一張照片,能救一點是一點。
軟件崩潰的時候還可能導緻程序文件受損,這個就更慘了,比如網上這個人:
保存時斷電導緻整個程序打不開,幾天的活白幹了,這就太打擊人了,所以重要的項目程序不僅要“保存”還要“另存”。
添加注釋時程序會變“綠”相信用過三菱ST的都遇到過這個問題吧,隻要你寫注釋,就會大概率發生這個問題 :
還是剛才的蜘蛛紙牌中的程序,我隻是在賦值語句後面增加一段注釋,加了一行空行,程序的部分标簽就變為了與注釋相同的綠色,這個綠色如果隻是出現在标簽上影響還不太大,如果出現在基本指令或者功能函數上,很可能編譯會報錯。
剛開始使用GX Works的人可能會不知所措,但解決的辦法很簡單,點擊保存按鈕,顔色就會恢複正常了,如果你不幸的遇到了不能編譯的情況,你還要找到變綠的指令,保存後在後面敲擊空格,或者重新輸入才能解決。
低版本的軟件使用ModbusTCP模塊報錯ModbusTCP用的人可能不是很多,三菱的PLC需要智能模塊支持,這個模塊賣的很貴而且貨期也長,網上資料也少,在使用這個模塊時按照手冊一步步配置,給400一遍遍打電話詢問,但編譯的時候一直報錯,後來問了很多人才鎖定問題出在軟件版本上而不是設置上,當時三菱官網下載的中文最高版本仍然不能解決問題,後來網上各種找、給各個三菱供應商打電話找到一個英文版的才好用,現在我用的是V1.555D中文版也能夠正常使用這個模塊了,下載運行後模塊的報警燈仍然會閃,但是不影響使用了。
下面說說三菱PLC在ST語言下的一些不足:
隻能聲明一維數組三菱PLC隻能聲明一維數組,這對編程人員來說有了很大的限制。像西門子、倍福、施耐德都是可以聲明多維數組的:
上圖是西門子博圖軟件聲明的一個三維int數組,如果三菱支持這個功能,上面蜘蛛紙牌的程序中BEHIND_LINE[ii].Numb[jj]就不必寫成結構體 數組的形式,直接寫成一個二維數組BEHIND_LINE[ii,jj] 就可以了。
隻能建立一層結構體在三菱的結構體中隻能聲明基本類型的标簽,無法聲明其他的結構體,這也注定了三菱不能像施耐德和西門子那樣完成複雜的邏輯功能。看一下西門子的多層結構體:
調用後是這樣的:
有什麼用呢?給大家看一下我們機器人控制系統的局部變量:
ROBOT結構體作為機器人核心控制程序的接口,所有的設置、狀态和命令等全部包含其中,圖中展示的隻是其中的幾個參數。
數學計算中數據類型無法自動轉換比如三菱的加法運算,我們把加号“ ”用鼠标拖入程序中,看他支持的數據類型:
圖中顯示,加法運算支持任意類型的數字量 任意類型的數字量;那我們直接寫“1 1.2”可不可以呢?
編譯後顯示報錯,提示數據類型不一緻,也就是“ ”的前後必須是相同的類型,因為1是整形,1.2是浮點型,如果想要進行上面的運算,必須将1寫成1.0才行。簡直不可理喻啊!
word類型标簽不支持按位尋址三菱的内部軟元件D是可以按位使用的,比如D0.0表示字軟元件D0的第 0 位,可以當作開關量來使用。但是如果你聲明一個word類型的标簽,也是16位的數據類型,而且PLC會把他自動分配給D軟元件緩存,但他卻不支持按位使用,比如聲明varTemp:word;程序varTemp.0:=true會報錯:
可以看到varTemp.0無法解析,不知道這是為啥。。。
其他三菱還有一些其他的問題,比如ST編程不支持單步執行、程序斷點等功能,你們還遇到過哪些問題呢?
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!