Modbus簡介
Modbus通常用于設備之間的監(jiān)控和數(shù)據(jù)采集(SCADA)式網(wǎng)絡通信。例如,大型服務器可用于控制可編程邏輯控制器(PLC)或可編程自動化控制器(PAC),而PLC / PAC可依次掌握傳感器,閥門,電動機或任何其他嵌入式設備。
為了滿足這些需求,Modbus被設計為一種請求 - 響應協(xié)議,具有靈活的數(shù)據(jù)和功能模型功能,這是它至今仍在使用的部分原因。
請求 - 響應周期
Modbus協(xié)議遵循主從架構,其中主設備向從設備發(fā)送請求并等待響應。該架構使主設備可以完全控制信息流,這對舊的多點串行網(wǎng)絡有益。即使在現(xiàn)代TCP / IP網(wǎng)絡上,它也能讓主設備對從機行為進行高度控制,這在某些設計中很有用。
圖 1. Modbus設備的主從,請求 - 響應關系
在Modbus中,此請求是一組分層數(shù)據(jù)。第一層是應用程序數(shù)據(jù)單元(ADU),這是大多數(shù)人認為使用的Modbus的“類型”。有三個ADU:ASCII,遠程終端單元(RTU)和TCP / IP。
TCP是一種現(xiàn)代格式,允許在軟件中有效處理Modbus請求和響應,以及通過為每個請求使用專用連接和標識符來實現(xiàn)更高效的網(wǎng)絡連接。RTU和ASCII是較舊的串行ADU格式,兩者之間的主要區(qū)別在于RTU使用緊湊的二進制表示,而ASCII將所有請求作為ASCII字符流發(fā)送。
對于大多數(shù)應用,首選ADU取決于所需的物理網(wǎng)絡(以太網(wǎng),串行或其他),網(wǎng)絡上的設備數(shù)量以及網(wǎng)絡上主設備和從設備支持的ADU。從使用Modbus的應用程序的角度來看,數(shù)據(jù)應該簡單地暴露,就好像ADU不存在一樣。
在每個ADU中,有一個協(xié)議數(shù)據(jù)單元(PDU),它是Modbus協(xié)議的核心。每個PDU包含功能代碼和相關數(shù)據(jù)。每個功能代碼都有一個明確定義的響應,您可以將此功能代碼視為發(fā)送給從站的命令。
在某些情況下,可能會發(fā)生錯誤。Modbus為異常定義了一個特定的PDU,讓主人知道發(fā)生了什么。大多數(shù)驅動程序將其轉換為對使用中的語言或應用程序有意義的形式。
Modbus數(shù)據(jù)模型
Modbus簡單靈活地管理數(shù)據(jù)訪問。本地,Modbus支持兩種數(shù)據(jù)類型:布爾值和無符號的16位整數(shù)。
在SCADA系統(tǒng)中,嵌入式設備通常將某些值定義為輸入,例如增益或比例積分微分(PID)設置,而其他值則是輸出,如當前溫度或閥門位置。為滿足這一需求,Modbus數(shù)據(jù)值分為四個范圍(見表1)。從站可以在每個范圍內定義多達65,536個元素。
表1. Modbus數(shù)據(jù)模型塊
在許多情況下,傳感器和其他設備生成的數(shù)據(jù)類型不僅僅是布爾值和無符號整數(shù)。從設備通常將這些較大的數(shù)據(jù)類型轉換為寄存器。例如,壓力傳感器可以在兩個16位寄存器之間分割32位浮點值。
Modbus以完全概念的方式公開這些值,這意味著它們實際上可能不存在于內存中。例如,可以定義從設備,使得保持寄存器和輸入寄存器實際上共享相同的存儲器,如果該行為對從設備有意義的話。在大多數(shù)情況下,從站將它支持的每種類型的數(shù)據(jù)存儲在單獨的內存中,并限制主站可以訪問的數(shù)據(jù)元素的數(shù)量。這種靈活性是一種選擇,因為數(shù)據(jù)通過Modbus功能代碼明確定義的行為公開。
Modbus功能代碼
Modbus功能代碼確定主機如何訪問和修改數(shù)據(jù)。與概念上的數(shù)據(jù)范圍不同,功能代碼具有明確定義的行為。當要求從站執(zhí)行功能代碼時,它使用該功能的參數(shù)來執(zhí)行明確定義的行為。圖2顯示了功能請求和設備實際內存之間的這種聯(lián)系。
圖2. 功能代碼,數(shù)據(jù)范圍和從設備的實際內存之間的映射
最常見的功能代碼以它們修改或訪問的概念數(shù)據(jù)范圍命名。例如,“讀取保持寄存器”采取將數(shù)據(jù)從定義為保持寄存器的存儲器中拉出并將其返回到主機的操作。表2列出了最常見的功能代碼。
表2. 通用功能代碼
LabVIEW中的Modbus入門
NI提供三種與Modbus設備連接的主要機制:(1)高級OPC服務器,(2)Modbus I / O服務器,以及(3)通過LabVIEW在NI LabVIEW 2014軟件中引入的低級Modbus API實時或LabVIEW數(shù)據(jù)記錄和監(jiān)控(DSC)模塊。
LabVIEW Modbus API
當您的應用程序需要對Modbus請求的排序和時序進行高級別控制時,低級Modbus API是首選方案。在靈活性至關重要的情況下,低級API通常也是首選。相比之下,LabVIEW Modbus API提供的靈活性和功能也意味著您的應用程序代碼必須更加復雜才能正確管理API。為了幫助您理解這種復雜性,LabVIEW提供了兩個示例。
Modbus介紹示例
第一個示例Modbus Library.lvproj提供了API功能的基本概述。它還演示了PC上的實現(xiàn)與實時目標之間的差異。圖3顯示了Real-Time Modbus Master示例中涉及的代碼。
圖3. RT Target.vi上的Master
此示例演示了使用LabVIEW API的Modbus應用程序的核心要求。首先,創(chuàng)建一個Modbus實例。在這種情況下,TCP主服務器。但是,您可以通過更改多態(tài)實例選擇器將此示例切換為串行主機。
圖4. 更改Modbus主站的類型
創(chuàng)建實例后,您可以開始輪詢從設備以獲取數(shù)據(jù)。該示例顯示了功能代碼讀取輸入寄存器的使用。API支持的所有Modbus功能代碼都顯示在相應的調色板上。由于協(xié)議的實現(xiàn),從屬API具有主無法實現(xiàn)的附加功能。例如,從器件可以寫入輸入寄存器范圍,而主器件只能從該范圍讀取。圖5顯示了功能代碼。
圖5. 顯示功能代碼的Modbus主站和從站調色板
最后,關閉Modbus實例,取消分配與實例關聯(lián)的內存。這也會關閉所有引用,包括實例使用的TCP連接或NI-VISA串行引用。
到目前為止,只討論了主要的例子; 但是,每個示例都遵循大多數(shù)LabVIEW用戶所熟悉的相同基本模式:打開,讀/寫和關閉。
最后,盡管API看起來確實相同,但了解關鍵差異非常重要。如果您的設備是主設備,它必須通過網(wǎng)絡向相應的從設備發(fā)送請求以獲取數(shù)據(jù)。另一方面,從屬設備有自己的本地數(shù)據(jù)存儲,可以快速訪問它。
冗余主示例
基本示例可能足以滿足某些應用; 但是,對于目標是與傳感器或網(wǎng)關通信的復雜應用來說,這可能還不夠。為了彌補這一差距,示例應用程序展示了如何使用兩個主設備與給定的從設備進行通信。如果其中一個主設備發(fā)生故障并且與從機或人機界面(HMI)失去連接,則另一個主設備接管。
圖6. 冗余主示例的設計
如果此設計滿足您的應用程序的需要,或者您對更復雜的Modbus通信示例感興趣,請在示例查找器中查看Redundant Modbus Masters.lvproj。
Modbus I / O服務器
Modbus I / O服務器位于LabVIEW DSC和LabVIEW Real-Time模塊中,為通過Modbus進行通信提供了高級引擎。您可以注冊要訪問的數(shù)據(jù)集,而不是指定要發(fā)送的功能代碼,I / O服務器會以指定的速率自動調度請求。
要使用I / O服務器,請將新的I / O服務器添加到項目中的所需目標。與低級API一樣,您可以在Modbus主站或從站之間進行選擇,這些會導致其他參數(shù)。例如,主站具有定義的輪詢速率 - 每個請求發(fā)送到從站的速率,而從站必須等待這些請求并且沒有預定義的時序。
創(chuàng)建I / O服務器后,您可以指定要讀取的設備上的項目。與您必須自己生成和處理請求的低級API不同,Modbus I / O服務器允許您從各種格式和數(shù)據(jù)類型中進行選擇。例如,您可以通過將變量映射到項400001來讀取地址0處的保持寄存器,通過選擇400001.1讀取該寄存器的第一位,并通過選擇F400001讀取存儲在寄存器0和1中的單精度浮點數(shù)。
選擇要訪問的變量后,可以使用框圖上的共享變量節(jié)點讀取或寫入這些變量。您甚至可以為變量名稱添加別名。
圖7. 一個簡單的I / O服務器應用程序
與I / O服務器應用程序相關的編程工作極少且易于理解。請記住,這種易用性有限制。數(shù)據(jù)僅以預定義的速率更新,并且無法在運行時添加或刪除請求的數(shù)據(jù)。如果您的應用程序可以接受這些限制,則建議使用I / O服務器作為跨平臺選項。
帶OPC I / O服務器或OPC UA的NI OPC服務器
對于涉及通過不同協(xié)議進行通信的許多從設備的復雜應用,標準Modbus I / O可能還不夠。常見的解決方案是使用OPC服務器,它充當所有系統(tǒng)的數(shù)據(jù)聚合器,然后使用LabVIEW DSC模塊中包含的OPC I / O服務器與該OPC服務器通信。
圖8顯示了該架構的一個示例,NI OPC服務器使用Modbus直接與傳感器通信,OPC UA與NI CompactRIO PAC通信。在NI OPC服務器中聚合數(shù)據(jù)后,OPC I / O服務器可以檢索數(shù)據(jù)并與LabVIEW應用程序共享。
圖8. 使用Modbus,NI OPC服務器和OPC I / O服務器的SCADA應用程序
還可以開發(fā)使用OPC UA Toolkit的類似架構(2017年之前的LabVIEW DSC模塊中包含OPC UA功能)代替OPC I / O服務器。但是,OPC UA驅動程序是低級驅動程序,不提供OPC I / O服務器提供的易用性。
要開發(fā)這樣的應用程序,必須首先為NI OPC服務器生成有效配置,以便與從屬設備進行通信。這是通過生成定義驅動程序配置的通道和設備來完成的,這些通道定義了該驅動程序的單個端點。配置設備后,您可以生成標簽。
圖9. 用于以上架構的NI OPC服務器中的示例配置
配置NI OPC服務器后,可以配置OPC I / O服務器與這些標簽進行通信。當Modbus I / O服務器配置為訪問寄存器時,OPC I / O服務器配置為訪問OPC服務器中的標簽。
圖10. 配置OPC I / O服務器
此綁定過程會生成您可以在應用程序中使用的變量。
圖11. 使用OPC I / O服務器的簡單應用程序
在使用OPC將LabVIEW連接到任何PLC時,可以完整地了解此過程。
Modbus是一種簡單的協(xié)議,您可以通過各種方式使用它來實現(xiàn)功能強大的應用程序。
對于Modbus通信,NI提供三個主要選項,提供各種功能以滿足您的應用需求。首先,低級API提供對協(xié)議的精細控制,具有高性能,但代價是易于使用。使用低級API時,必須手動完成所有操作。對于更簡單的監(jiān)控應用,Modbus I / O服務器為訪問或提供Modbus數(shù)據(jù)提供了更簡單,更簡單的API。為了便于使用,I / O服務器放棄了對某些應用程序可能需要的協(xié)議的嚴格控制。最后,對于大型復雜系統(tǒng),將全功能OPC服務器視為數(shù)據(jù)聚合器可能是有益的。然后,只需使用LabVIEW OPC UA Toolkit或OPC I / O服務器等工具,即可讓您的應用程序訪問此數(shù)據(jù)。
聯(lián)系客服