opc協議

 

opc 協議

非opc協議-驅動

 

應用程序使用驅動程序來直接與設備通訊。

缺點:

  • 引用的驅動程序多(上圖中每個應用程序都要引用四種驅動,每個驅動的使用方式也不一樣)
  • 產品的不斷升級給應用端帶來巨大的工作負擔

 

使用opc協議

 

OPC規範了接口函數,不管現場設備以何種形式存在,客戶都以統一的方式去訪問,從而保證軟件對客戶的透明性,使得用戶完全從低層的開發中脫離出來。對於軟件開發商而言,不再費神於開發各種硬件設備的驅動程序,而是把精力和時間集中在增加和完善軟件的功能上,使自己的軟件更易被用戶接受和使用。對於硬件設備製造商,再也不必擔心自己的產品因爲沒有爲某些軟件提供驅動程序而被用戶所忽視或放棄。一次編寫的驅動程序(OPC服務器),可以被所有的應用軟件所用。不僅節省了各種I/O驅動程序的開發費用,而且可以讓製造商集中精力生產更易於用戶使用的、功能完善的硬件。

OPC服務模式

 

OPC服務可以通過OPC組來管理同步一種協議類型的設備,如:上面的場景監視應用只需要對擁有這四個設備的OPC組進行通訊就可以了。

 

OPC接口類型

 OPC服務器通常支持兩種類型的訪問接口,它們分別爲不同的編程語言環境提供訪問機制。這兩種接口是:自動化接口(Automation interface);自定義接口(Custom interface)。自動化接口通常是爲基於腳本編程語言而定義的標準接口,可以使用VisualBasic、Delphi、PowerBuilder等編程語言開發OPC服務器的客戶應用。而自定義接口是專門爲C++等高級編程語言而制定的標準接口。OPC現已成爲工業界系統互聯的缺省方案,爲工業監控編程帶來了便利,用戶不用爲通訊協議的難題而苦惱。任何一家自動化軟件解決方案的提供者,如果它不能全方位地支持OPC,則必將被歷史所淘汰。

 

OPC 優缺點

OPC的優點和不足

與早期的現場設備接口相比, OPC 具有如下幾個優點:

( 1) 減少了重複開發;

( 2) 降低了數據設備間的不兼容;

( 3) 降低了系統集成商的開發成本;

( 4) 改善性能。

OPC 存在的不足

雖然OPC 接口具有種種優勢, 但是如果直接通過OPC 連接實時數據庫依然存在一些問題:

( 1) 雖然OPC 標準中包含了OPC History 標準, 但是多數OPC 服務器並未給予支持, 所以難以爲實時數據庫提供數據緩存功能。

( 2) OPC 服務器無法提供一些常用的計算功能, 如累計、濾波和幾個位號相加的綜合計算功能, 增加了實時數據庫的負擔, 影響了實時數據庫的穩定性和魯棒性。

( 3) OPC 基於微軟的COM/DCOM體系, 在分佈式應用中其所用的RPC 方式常常與企業級的防火牆發生衝突。不能通過防火牆。

OPC體系結構

 

 

 

OLE(Active X)/COM

Active X/COM技術定義各種不同的軟件部件如何交互使用和分享數據。OLE/COM是一種客戶/服務器模式,具有語言無關性、代碼重用性、易於集成性等優點。

 

工作原理

 

 

 

詳細原理圖

 

 

 

OPC服務器

如果我的控制硬件供應商說他們支持OPC,那麼爲什麼我還需要OPC服務器?

當硬件供應商表示他們支持OPC時,通常並不意味着他們直接將OPC服務器嵌入到他們的硬件中。他們的意思是他們擁有OPC服務器軟件,該軟件在某個基於Windows的計算機上運行,該計算機與其硬件對話並使用一個或多個OPC標準公開數據。此外,對於某些硬件供應商,可能需要額外的許可費才能啓用此OPC服務器功能。我們經常聽到用戶對這一點感到困惑。其實只是爲了在銷售時更好聽一點,纔會說“我們支持OPC”,所以在此需要澄清一下供應商所說的內容。

現在,一些供應商開始利用多平臺功能,並將OPC UA服務器直接嵌入到他們的PLC中。如果你的 HMI或SCADA軟件支持OPC UA,那麼這可能會非常方便。如果你的客戶端應用程序不支持OPC UA,那麼則可以使用OPC網關應用程序來幫助你從OPC UA 連接到 DA。

OPC服務器必須在Server類計算機和操作系統上運行嗎?

OPC服務器不需要服務器類硬件或操作系統。有些供應商可能會針對其具體實施要求這樣做,但OPC標準並沒有規定這一點。OPC服務器軟件通常相當輕巧,可以輕鬆地與臺式PC上的其他軟件應用程序共存。你可以諮詢你的OPC服務器供應商,瞭解你的具體應用要求。(以Software Toolbox的產品爲例,在它的每個產品網站區域都有一個規格頁面,雖然他們的OPC服務器通常不需要服務器級硬件或操作系統。)

2個OPC服務器如何相互通信?而2個OPC客戶端又如何相互通信?

在OPC世界中,通常客戶端是與服務器通信的。但是好消息是OPC服務器可以與其他OPC服務器通信,OPC客戶端也可以使用相同的方式。

爲什麼兩個OPC服務器需要通信?你可以想象一下,你有PLC供應商A和PLC供應商B,並且有一個OPC服務器需要使用兩個不同的PLC供應商的特定設備協議與每個服務器進行通信。你希望將數據從PLC A移動到PLC B,這意味着2個不同的OPC服務器需要相互通信。你可以使用OPC Bridging(OPC橋)軟件應用程序執行此操作。OPC橋接軟件應用程序是OPC客戶端應用程序,可以連接到許多不同的OPC服務器,然後允許你映射兩個OPC服務器之間的數據移動,指定方向,數據轉換等

 

 

  • OPC客戶端與OPC服務器(OPC數據訪問服務器、OPC歷史數據訪問服務器或OPC報警與事件服務器)的通信
  1. 服務器是利用Microsoft Windows的 COM/DCOM技術作爲數據交換的方式。這就是說服務器必須安裝在支持Microsoft Windows操作系統的PC。一個OPC服務器可以同時跟多於一個的 OPC客戶端 通訊。


 

  • OPC服務器 – 數據傳譯器
  1. 服務器的一個關鍵作用就是將以數據源輸出形式傳送的數據, 翻譯成支持之前提到的某一或多於一種的OPC數據訪問規範形式!!!(比如說, OPC實時數據訪問規範)。OPC數據規範羣只是定義了OPC服務器的OPC通訊模塊, 所以數據形式翻譯模塊的準確性和高效性就完全取決於OPC服務器供應商的開發方式
  • OPC服務器與數據源的通信 OPC服務器和數據源用數據源支持的數據形式通信。數據源可以是某個硬件設備, 某個控制器或者是某個應用程序。因爲數據源可以各種各樣, 而每一個不同形式的數據源又都用自己的通訊協議或者API可以通過多個物理通信方式(串行RS485, RS232, 以太網, 無線通訊等)通信, 所以OPC數據規範羣並沒有定義OPC服務器和數據源之間的交流法則。 兩個關於OPC服務器和數據源通訊的最普遍的例子就是:
  • API;通過一個可以是專屬於某一個數據源(請參見MatrikonOPC 霍尼韋爾TPS服務器), 也可也是開放式(請參見MatrikonOPC Modbus服務器)的通信協議。

 

OPC服務器所兼容的設備分類

  • 硬件設備:DCS,PLC,掃描儀,電子設備…
  • 應用軟件:HMI,歷史數據庫,震動檢測器…
  • 通訊協議:DDE,Modbus,ODBC,GenCS…
  • 操作系統:Windows,UNIX,VMS,Macintosh,嵌入式OS…

即OPC服務器可以從上面任何一種形式的數據產生實體中讀取數據。這個實體可以是霍尼韋爾PHD的Application,也可以是Modbus的通訊協議,還可以是一種PLC,也就是一種Device(硬件設備),或者是一種Platform。

 

Matrikon公司的OPCServer Simulator

簡單,單文件註冊後,各種數據類型,各種點類型(只讀點,只寫點,讀寫點)都有了,更好的一點是,如果想做大規模的測試,10萬點,那麼只需要在它的Random下添加任意名稱即可,OPCServer會自動給你建出對應的測點,還是隨機數變化。

配置時的幾個關鍵概念

Alias Group(Group) ——對Items的分類管理,自定義的。類似於Java中的包。

Alias (Item) ——一個Item代表與服務器進行通信的PLC或其它硬件設備上的一個地址。與Kepware中的一樣。

配置順序如下(在Alias Configuration下):

New AliasGroup/Alias --> Inset Alias

Kepware公司的OPCServer

一個商業軟件,需要花費金錢購買License的,但Kepware公司的OPCServer需要花錢的不是OPCServer本身,而是採集驅動。不過Kepware公司的OPCServer提供了不花錢的仿真驅動,用來測試上非常好的。

缺點就是太龐大,不簡單,學習成本較高。但爲了能滿足OPC這類產品的各種測試,它真的是最佳選擇。可以去它的官方網站下載。

配置時的幾個關鍵概念

Chanel——通道是一個從PC到一個或多個外部設備之間的傳播媒介。一個通道可以用來代表一個串行端口(一個安裝在個人電腦上的卡或是以太網接口)。

Device——設備代表了與服務器進行通信的PLC或其他硬件。它受限於Channel所選擇的設備驅動程序(Device driver)。

Group——對tags的分類管理,自定義的。類似於Java中的包。

Tag——一個Tag代表與服務器進行通信的PLC或其它硬件設備上的一個地址。服務器允許動態標籤(客戶端自定義創建)和用戶定義的靜態標籤(服務端管理人員創建的標籤)。動態標籤是直接進入了OPC客戶端和指定設備存取數據。靜態標籤在服務器被創建的且支持標籤擴展,他們可以從OPC客戶瀏覽,支持標籤瀏覽。

配置順序如下:

New Channel -->New Device --> New Group/Tag --> New Tag

OPC客戶端

Matrikon公司的OPCClient

標準,穩定,單文件,通訊過程的信息還比較豐富,我是比較喜歡用它在創建OPC組時定義同步方式或異步方式來驗證遠程計算機的OPC配置是否正確。缺點就是大了點,2M多。

Kepware公司的OPCClient

功能很強大,標準,穩定,日誌信息很豐富,最推薦的功能是支持對OPCServer中點名的條件過濾,支持點表的導入導出,支持自動導入OPCServer的所有點,根據點表識別好點壞點,按照列排序,用它可以彌補很多國產組態軟件不能在線遍歷OPCServer點表的功能、不能過濾OPCServer點的功能、不能識別OPCServer中好點壞點的功能等。缺點就是非單文件。

OPC Client和OPC Server配置的安全策略

下表是對 OPC Client 和 OPC Server 所在操作系統之間的安全策略的配置對應說明:

 

 

Java實現OPC客戶端

有兩種開源包,分別是JeasyOpc和utgard(Openscada),他們的區別如下:

 

經對比分析,我們採用Utgard(Openscada)開源技術,Openscada可以很好的實現與OPC服務器的鏈接及讀寫數據等功能,還可以隨時獲取和修改OPC的Server和Item的屬性狀態信息。所以它能夠很好的滿足我們的需求,建議使用Openscada。

OPC客戶端開發大致步驟

  1. COM組件初始化;
  2. 創建服務器Server對象;
  3. 創建組Group對象;
  4. 創建項Item對象;
  5. 添加Item到Group中;
  6. 添加Group到Server對象中;
  7. 連接服務器(這裏的順序與具體實現有關),完成相應操作;
  8. COM組件關閉


 

數據類型

 

 

Openscada鏈接配置方法

OPC數據存取服務器由三個對象組成:服務器對象(Server)、組對象(Group)和項對象(Item)。

按說明配置好OPC Server 與 OPC Client 所在電腦的組件服務配置和防火牆設置(windows7直接關閉就行了)注意一定要把本機希望鏈接OPC服務的用戶或用戶組添加到DCOM配置列表中,否則鏈接會失敗。

如果其他都配置好了,運行程序還是連接不上的話,首先常看防火牆是否配置(或關閉)。

OPC對象——服務器(OPC Server)、組(OPC Group)、項(OPC Item)。

Openscada開源項目:

 ConnectionInformation中:

 Host——本地主機/網絡主機IP (示例:localhost(默認)、127.0.0.1)

 Domain——域(默認爲localhost)

 User——用戶名

 Password——用戶登錄密碼

 Clsid——應用在註冊表中相對應的CLSID值

 Grogid——應用在註冊表中對應的程序名稱

 【Clsid 和 Grogid 作用相同,只要設置一個就可以了,如果兩個都設置了,程序會優先選擇Clsid。我們建議使用Clsid,因爲使用Grogid時,Openscada的內部處理還是會通過JISystem.getClsidFromProgId( progId )方法將其轉換爲Clsid,並且還需要進行服務器上用戶的權限的高級配置纔可以使用。查找Clsid和Grogid的方法:打開註冊表(regedit)—》在HKEY_CLASSES_ROOT下找到相應的OPC服務器名稱,該名稱就是Grogid,在其目錄下的CLSID的值(右邊區域)就是Clsid】

開發

1.MatrikonOPC模擬檢測點添加

 

2.關閉防火牆 3代碼

public static void main(String[] args) throws Exception {
    // 連接信息
    final ConnectionInformation ci = new ConnectionInformation();
    ci.setHost("localhost");         // 電腦IP
    ci.setDomain("");                  // 域,爲空就行
    ci.setUser("OPCServer");         // 電腦上自己建好的用戶名 注意:用管理用戶
    ci.setPassword("123456");          // 用戶名的密碼
     ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305"); // MatrikonOPC的註冊表ID,可以在“組件服務”裏看到
     final String itemId = "test.a";    // 項的名字按實際


    // 啓動服務
    final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
 
    try {
        // 連接到服務
        server.connect();
        // add sync access, poll every 500 ms,啓動一個同步的access用來讀取地址上的值,線程池每500ms讀值一次
        // 這個是用來循環讀值的,只讀一次值不用這樣
        final AccessBase access = new SyncAccess(server, 500);
        // 這是個回調函數,就是讀到值後執行這個打印,是用匿名類寫的,當然也可以寫到外面去
        access.addItem(itemId, new DataCallback() {
            @Override
            public void changed(Item item, ItemState itemState) {
                int type = 0;
   try {
      type = itemState.getValue().getType(); // 類型實際是數字,用常量定義的
   } catch (JIException e) {
      e.printStackTrace();
   }
                System.out.println("監控項的數據類型是:-----" + type);
                System.out.println("監控項的時間戳是:-----" + itemState.getTimestamp().getTime());
                System.out.println("監控項的詳細信息是:-----" + itemState);

                // 如果讀到是short類型的值
                if (type == JIVariant.VT_I2) {
                    short n = 0;
      try {
         n = itemState.getValue().getObjectAsShort();
      } catch (JIException e) {
         e.printStackTrace();
      }
                    System.out.println("-----short類型值: " + n);
                }

                // 如果讀到是字符串類型的值
                if(type == JIVariant.VT_BSTR) {  // 字符串的類型是8
                    JIString value = null;
      try {
         value = itemState.getValue().getObjectAsString();
      } catch (JIException e) {
         e.printStackTrace();
      } // 按字符串讀取
                    String str = value.getString(); // 得到字符串
                    System.out.println("-----String類型值: " + str);
                }
            }
        });
        // start reading,開始讀值
        access.bind();
        // wait a little bit,有個10秒延時
        Thread.sleep(10 * 1000);
        // stop reading,停止讀取
        access.unbind();
    } catch (final JIException e) {
        System.out.println(String.format("%08X: %s", e.getErrorCode(), server.getErrorMessage(e.getErrorCode())));
    }
}

4測試

write values-測試數據

 

代碼結果

 

總結

 

OPC就是爲了不同供應廠商的設備和應用程序之間的接口標準化,使其間的數據交換更加簡單化的目的而提出的。作爲結果,從而可以向用戶提供不依靠於特定開發語言和開發環境的可以自由組合使用的過程控制軟件組件產品。OPC的設計目的最重要的是即插即用,也就是採用標準方式配置硬件和軟件接口。一個設備可以很容易地加入現有系統並立即投入使用,不需要複雜的配置,且不會影響現有的系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章