施耐德plc通訊的套路就是三個功能塊,addm ,read_var,write_var,下面分別介紹
1、addm
addm功能塊是地址轉(zhuǎn)換,就是把plc 的物理地址轉(zhuǎn)換成plc可識別的地址類型,這句話比較拗口,通俗講,就是把字符串型變量,轉(zhuǎn)換成address 型變量,我們還是看例子
圖一 addm功能塊
如圖一,圖中紅色圓圈內(nèi)就是一個字符串型變量 '2,1' 第一個數(shù)字2表示plc 的串口2,第二個數(shù)字1 表示讀取的從站地址,也就是變頻器的地址,而此功能塊就是把此地址轉(zhuǎn)換成address型變量 a1_add。也許你會有疑問,為什么這么做?我也不知道,此款plc就是這樣,這就是它的套路,對于此種套路,我們只能牢記。在其他plc特別是日系,一般是通過設(shè)置參數(shù)的方式實(shí)現(xiàn),也有使用指令的。
還有一點(diǎn),黃色熒光筆部分的三個黑點(diǎn),是表示電路相通,而它正是把轉(zhuǎn)換好的地址賦值給下面我們要介紹的功能塊。也就是說,讀寫功能塊讀取或?qū)懭胱兞康膹恼镜刂肪褪鞘褂米兞縜1_add。
2 、write_var
此功能塊是用于往從站寫數(shù)據(jù),也就是寫入變頻器的運(yùn)行頻率。
圖二 write_var 功能塊
這個功能塊的信息量就很大了,我們一點(diǎn)點(diǎn)分析
1 看黃色熒光筆部分 addr,這個就是從站的地址,也就是變頻器的地址,它是一個address型變量,就是我們在addm功能塊中轉(zhuǎn)化的,就是圖一的那三個黑點(diǎn),就是連接到此處的,這也是cfc的優(yōu)點(diǎn),要用的變量輕松一連,而在fbd或是ld 中,我們就要建立一個中間變量傳遞一下了。
2 下面三處用熒光筆表示的 就是此功能塊的精髓了,它表示往變頻器的地址0002開始寫入一個word型變量,而寫的這個數(shù)值放在plc變量fre里,這就是這個功能塊的目的,也是此次通信的目的,執(zhí)行結(jié)果,就是把plc變量fre的值,寫到了變頻器的0002里面。當(dāng)然,此處我們只寫入了一個word,其實(shí)此功能塊是支持一次寫入125個的,因?yàn)閝uantity是一個sint型變量。fre是一個數(shù)組型變量,當(dāng)我們要一次寫入很多數(shù)值的時候,用數(shù)組就很方便了。
此處有個知識點(diǎn),通信只能讀取或是寫入word型變量,而word型變量的值只能是正數(shù),當(dāng)我們要讀取或是寫入負(fù)數(shù)的時候,該怎么辦呢?大家可以思考一下。
3 右邊紅色圓圈是功能塊的輸出,它表示了功能塊執(zhí)行的各種狀態(tài),它是標(biāo)準(zhǔn)的plcopen信號(關(guān)于plcopen以后會詳細(xì)介紹,今天只介紹與此功能塊有關(guān)的)
done 表示功能塊執(zhí)行正常后置為true,此處,我們?nèi)∷姆葱盘杹肀O(jiān)控通信狀態(tài),如果超過3s沒有done信號,我們可以認(rèn)為此次寫入失敗,那么就代表通信失敗。
busy表示功能塊執(zhí)行情況的輸出,如果為高電平,表示功能塊正在執(zhí)行。我們讀取它的下降沿,來觸發(fā)下一次操作。
error是功能塊的錯誤,可能你會有疑問,為什么通信錯誤不用這個信號呢?其實(shí)這個錯誤表示的范圍更廣,它表示功能塊檢測到錯誤就報警,有時候,我們通信正常,但是當(dāng)我們讀取的數(shù)據(jù)有問題,或是參數(shù)設(shè)置不正確時,也會報錯,而我在程序中的錯誤僅僅是通信不上的錯誤,也就是,這個error表示的范圍更廣泛,它更適合我們調(diào)試的時候監(jiān)控。而我在程序中取的通信錯誤,是在上位機(jī)做監(jiān)控用的。
3、read_var
讀取和寫入的功能塊完全一樣,大家可以嘗試自己分析一下。
圖三 read_var功能塊
4、數(shù)據(jù)的處理
圖四 數(shù)據(jù)的處理
這段是程序中和我們直接相關(guān)的,寫入的頻率,讀取的頻率和電流都是用move指令處理,放到指定的變量中,方便我們使用,畢竟通信的最終目的就是交互數(shù)據(jù)。
總結(jié):這就是施耐德plc,modbus/rtu通信程序的三個功能塊,其實(shí)本文還有一個目的,那就是我在前面文章指出,初學(xué)plc有一個很大的誤區(qū),就是喜歡對著視頻或是書本一條條學(xué)指令,其實(shí)這是錯誤的,正確的方式是在程序中學(xué)習(xí)指令,試想,如果你不知道m(xù)odbus通信,沒有這個通信例子,干巴巴的學(xué)這三個功能塊,是很枯燥的,是毫無意義的,你也許心里會有一萬匹草泥馬奔騰而過,這都是些什么玩意,但是當(dāng)你根據(jù)這個實(shí)例,當(dāng)你面對一個變頻器要用通信控制的時候,再去學(xué)習(xí)這三個指令,是不是很輕松呢?至少,心里有了目的。
設(shè)置通訊參數(shù)(主要是波特率,校驗(yàn),地址),并確保plc和變頻器側(cè)參數(shù)一致,讀取或?qū)懭胱兞康牡刂?,個數(shù)以及數(shù)據(jù)類型(日系plc不需要這一步,因?yàn)樗欢x變量),是使用modbus基本套路。當(dāng)你使用不同的plc時,你的任務(wù)就是在軟件中找到實(shí)現(xiàn)這些功能的地方,就可以完成通信。還有一點(diǎn)注意,不同的廠家,modbus接口是不一樣的,常見的有db9 rj45,還有最簡單的螺釘接線。
圖五db9
圖六rj45
如 圖五 圖六 所示,是常用的modbus接線端子,使用時,務(wù)必仔細(xì)閱讀手冊,確定 正 負(fù) 端子。
在大量使用功能塊,而且功能塊之間聯(lián)系比較緊密的場合,使用cfc語言時最佳選擇,比如串口通信,運(yùn)動控制,高速計(jì)數(shù)等等。而這些場合用梯形圖,那酸爽,用過日系plc 的朋友應(yīng)該很清楚,寫了幾個屏幕的程序,還沒有進(jìn)入主題。當(dāng)然,也可以用st語言來寫,那樣逼格簡直就是沒法形容了,不過對于后期維護(hù)很不方便,因?yàn)檫@么多變量,st語言的可讀性會很差,不過,對保護(hù)自己的知識產(chǎn)權(quán),到是很不多。因?yàn)?,要想看懂st寫的這種程序,確實(shí)很費(fèi)勁。