1026 【萬(wàn)泉河】?jì)?yōu)雅到極致的MODBUS庫函數計劃
在工控行業(yè),無(wú)論使用哪一個(gè)品牌平臺的PLC, MODBUS都是其中最重頭的通訊協(xié)議。 而因為MODBUS通訊協(xié)議性質(zhì)本身,實(shí)現通訊有一定的難度。 而且每做一個(gè)新項目,通訊程序都還要重新再調試一遍,所以比較頭疼。 這是因為MODBUS的輪尋機制是必須在程序中編程實(shí)現。
比如一個(gè)COM端口, 一條485總線(xiàn)上面掛了N個(gè)MODBUS設備, 那么就需要做循環(huán),對每個(gè)設備的每個(gè)數據區輪番做READ或者WRITE查詢(xún)。而如果設備的類(lèi)型不同, 還需要每個(gè)單獨處理數據區和數據。
這一點(diǎn)在自動(dòng)化項目時(shí)非常令人頭疼。 所以,大家伙在入門(mén)之后,就不滿(mǎn)足于僅僅能實(shí)現通訊功能了, 紛紛摸索實(shí)現模塊化的方法,以期實(shí)現MODBUS通訊的優(yōu)雅實(shí)現。
然而,最優(yōu)雅的MODBUS通訊見(jiàn)過(guò)沒(méi)?
最理想的優(yōu)雅到極致的模塊化的實(shí)現方式應該是:
比如485網(wǎng)絡(luò )上有一臺MODBUS通訊的DANFOSS變頻器,那么只需要一個(gè)完全定制封裝好的FB庫函數:
拖到OB1程序來(lái),管腳參數中標明這臺變頻器的MODBUS地址,然后就可以實(shí)現以通信方式的控制了。
當然不是指一定要直接在OB1中,而是指在OB1架構下,只需要這一個(gè)模塊的一個(gè)調用。 除此之外所有類(lèi)似于初始化,通訊握手等的指令,一概不需要做了。 因為全部在這一個(gè)模塊內部實(shí)現了。
而如果有多個(gè)站,也只不過(guò)是再拖入調用多個(gè)實(shí)例。
而如果485總線(xiàn)上有多個(gè)類(lèi)型的站點(diǎn), 那么通過(guò)設計不同設備類(lèi)型的FB, 也是同樣拖入,即可實(shí)現通訊功能。
這是在面向對象架構,把設備全部都作為對象處理的情況下。 本人專(zhuān)著(zhù)《PLC標準化編程原理與方法》中P149頁(yè)開(kāi)始的2個(gè)節有介紹過(guò)。
書(shū)中介紹的變頻器是ABB,而本文中發(fā)的是DANFOSS。即,其實(shí)我們在后期隨著(zhù)工程應用的需要,已經(jīng)把這2個(gè)品牌型號的變頻器的通訊控制都做成了庫函數。
而在非面向對象的架構下, 比如文章《0905 【萬(wàn)泉河】80模擬量例子程序升級版V2.0》中介紹的使用MODBUS通訊的遠程IO, 則可以使用低一層的封裝塊:
其中數據區BUFF,指向了一個(gè)定義好的全局數據塊:
這樣數據塊中的數組內的數值4X[1]就直接代表了此站點(diǎn)模塊的40001通道的數值,就可以直接在程序中使用了。
注意看到上面的FB的管腳都有一個(gè)SUBNET, 含義是如果1個(gè)PLC系統內有多條485的總線(xiàn),也是可以的。 比如需要通信的站點(diǎn)比較多,在一個(gè)總線(xiàn)上面輪詢(xún)的周期太長(cháng), 數據刷新不夠快的情況下,可以通過(guò)增加PTP模塊或者M(jìn)ODBUS TCP轉RTU網(wǎng)關(guān)的方式,增加到多條總線(xiàn)。
而在設備的參數部分,只需要輸入總線(xiàn)編號和站地址,就可以區分了。
前面的介紹沒(méi)有區分MODBUS RTU和TCP, 其實(shí)這兩者都是需要輪詢(xún)的。 即便是TCP,理論上講可以使用多個(gè)端口同時(shí)通訊,但在實(shí)際操作中,PLC系統分配給TCP通訊的通訊資源是有限制的。 如果要同時(shí)通訊, 一個(gè)站點(diǎn)的讀和寫(xiě)就要分別占用了2個(gè)端口,資源會(huì )快速耗盡。
而在MODBUS TCP的協(xié)議定義中,也仍然有站地址的標記,我們現在知道了,是為了TCP/RTU的網(wǎng)關(guān)設計的,即當使用網(wǎng)關(guān)把485總線(xiàn)轉換為以太網(wǎng)之后,報文中仍然需要有站地址的區分, 以實(shí)現一整條485總線(xiàn)上的所有從站的數據,都可以有區分地被主站讀取。
我們設計的SUBNET網(wǎng)絡(luò )的定義,在100以下為RTU,而100以上為T(mén)CP,由此實(shí)現了通用兼容。
這些功能,在書(shū)中只是做了介紹,但并沒(méi)有直接講解實(shí)現的代碼。 因為這些是屬于底層的搭建庫的需要,書(shū)中只是介紹方法,具體的設計工作仍然需要工程師各自實(shí)現。
甚至對煙臺方法的學(xué)員,這部分的庫和代碼也并沒(méi)有提供。 煙臺方法提供的只是思想架構方法,并不提供程序代碼,更不承擔代碼正確的責任。 這是煙臺方法和市面上的制作庫函數售賣(mài)或者分享的一些個(gè)人不同。因為做的是完全不同的事情。
甚至, 我也鼓勵一些學(xué)員可以嘗試使用各種各樣的現成的庫函數來(lái)做自己公司的標準化項目。那些庫函數,在標準化煙臺方法的眼里,都是基石,可以選擇用來(lái)蓋房子的磚頭。 而煙臺方法是幫助工程師搭建房子的順序方法,每個(gè)公司各自的企業(yè)標準就是所謂的房子。
那么,這套MODBUS的庫函數,本質(zhì)上也是磚頭。 是用來(lái)實(shí)現標準化的模塊。當然是有相關(guān)功能需求的公司才需要,而沒(méi)有用到MODBUS的公司則不需要。
這套庫函數,我已經(jīng)開(kāi)發(fā)完成將近三年了。 而三年中,我們自己的項目在不斷使用,并打磨,逐漸升級完善。 而對外,則只是一小段時(shí)間內做過(guò)小范圍的出售。 大部分時(shí)間里則是雪藏的。并沒(méi)有過(guò)多宣傳,也沒(méi)有推廣。
最近,有學(xué)員和網(wǎng)友來(lái)咨詢(xún)在西門(mén)子之外的PLC平臺實(shí)現的方法,加上我自己正在編著(zhù)《三菱PLC標準化編程煙臺方法》的專(zhuān)著(zhù),對MODBUS部分庫的欠缺,也有些焦慮。
所以,有計劃把這套庫函數再次拿出來(lái),以低成本的方式分享給同行。
分享的目的主要是為了擴展。通過(guò)擴展,建立一個(gè)比較龐大齊全的生態(tài)社區。
擴展分兩個(gè)維度。
首先是設備的類(lèi)型,比如支持MODBUS的各種現場(chǎng)設備如變頻器,儀表等等,都需要封裝成專(zhuān)用的庫函數。做好了之后需要的時(shí)候, 從目錄中找到對應型號的庫函數,直接拖入使用即可。
這部分的技術(shù)難度比較小。 比如從ABB變頻器到DANFOSS變頻器,只不過(guò)是各自的參數地址不同, 控制字和狀態(tài)字的定義不同,制作時(shí)只需要照貓畫(huà)虎,在原有的庫函數基礎上改一改,參數部分改好了, 經(jīng)過(guò)實(shí)際應用檢驗通過(guò)了,就可以反饋加入到列表中,這樣再有人需要的時(shí)候,就可以直接使用了。而不需要再去翻手冊找參數,調試實(shí)驗通訊。
另一個(gè)維度的擴展是不同的PLC品牌和型號,這部分的難度比較大。 我目前已經(jīng)做了2個(gè)系列,分別是SIEMENS S7-1200/1500和S7-200 SMART。 而其它的品牌的PLC, 我雖然大都已經(jīng)開(kāi)發(fā)了標準化方法,但MODBUS通訊部分, 目前基本空白。 甚至,大部分品牌的基本的MODBUS 通信我都不會(huì ),因為沒(méi)做過(guò)。
當然,主要還是我個(gè)人目前為止,這兩個(gè)維度上的需求都沒(méi)有。 而要擴展到那么多的自動(dòng)化產(chǎn)品廠(chǎng)家,工作量也是巨大的。
所以,希望的是群策群力,大家一同貢獻, 一同分享的模式。 所有有能力有興趣的同行一起來(lái)做這件事,大家一起貢獻,同時(shí)又可以都有回報。
這就需要一個(gè)比較完善的分享和貢獻回饋機制,而不是簡(jiǎn)單一個(gè)免費分享能做到的。
具體的分享方法,會(huì )在近期整理推出,當然也不會(huì )一次性固化,先搞一個(gè)基本的架構做起來(lái),以后再持續完善。
在此期間, 也歡迎同行給我私信提供寶貴建議。
我預期的是,將來(lái)實(shí)現MODBUS通訊的人工調試成本大幅度降低。 比如有人要做某個(gè)PLC與某個(gè)設備的MODBUS通訊,只需要來(lái)我們這里翻一翻庫里的目錄,選擇好,拿去直接使用,一次性使用費用在幾十元以?xún),如果有多個(gè)類(lèi)型的設備,加起來(lái)也不過(guò)幾百元。 比起個(gè)人摳摳搜搜搭臺子做實(shí)驗,要簡(jiǎn)便和高效地多。 尤其不需要個(gè)人獨立面對通訊失敗的糟糕局面了。 購買(mǎi)之后,有相應的開(kāi)發(fā)者在后臺輔助服務(wù)。
我在剛開(kāi)始做這套庫函數的開(kāi)發(fā)的時(shí)候,寫(xiě)過(guò)文章《【萬(wàn)泉河】MODBUS并行通訊實(shí)現》
https://mp.weixin.qq.com/s/PZX-E3PKicYADcA_yzNlIg然后就有看不懂的杠子手來(lái)杠我不懂常識, MODBUS跑的物理介質(zhì)都是485總線(xiàn)是串行的, 并不能并行,指責我怎么可以并行通訊。
廢話(huà), 如果它天生支持并行,就沒(méi)我什么事了。 恰恰因為他底層是串行,我們才可以通過(guò)自己的努力,在應用層面實(shí)現一個(gè)貌似的并行,哪怕是偽并行,也是我們能做到的貢獻。
那么,我們以后就為這套庫機制專(zhuān)門(mén)起個(gè)名字,就叫優(yōu)雅MODBUS庫好了。 翻譯到英文,我稱(chēng)其為Grace Modbus Library ,簡(jiǎn)稱(chēng)GML。優(yōu)雅庫為優(yōu)雅煙臺方法服務(wù),也可以為未使用煙臺方法的同行服務(wù)。
有老外做過(guò)一個(gè)開(kāi)源的REXHIP項目,我研究過(guò)也分享過(guò)。 但我對他的實(shí)現方法不滿(mǎn)意。 認為比我現在做到的優(yōu)雅程度還差許多。所以不贊成加入他們的開(kāi)源貢獻計劃, 而是搞一套我們中國人自己的庫。