OPC是Object Linking and Embedding(OLE)for Process Control 的縮寫,它是微軟公司的對象鏈接和嵌入技術在過程控制方面的應用。OPC以OLE/COM/DCOM技術為基礎,采用客戶/服務器模式,為工業自動化軟件面向對象的開發提供了統一的標準,這個標準定義了應用Microsoft操作系統在基于PC的客戶機之間交換自動化實時數據的方法,采用這項標準后,硬件開發商將取代軟件開發商為自己的硬件產品開發統一的OPC接口程序,而軟件開發者可免除開發驅動程序的工作,充分發揮自己的特長,把更多的精力投入到其核心產品的開發上。
SimaticNet是西門子全集成自動化系統中的一個重要組成部分,它為完善的工業自動化控制系統的通訊提供部件和網絡,同時提供多個OPCServer,為數據的外部訪問提供接口,本文主要以OPC.SimaticNET為例說明。
采用不同的通信方式,通過OPC.SimaticNET,現場數據可以方便地提供給用戶:
OPC的讀寫方式
在實際使用中,主要包括對現場數據的讀寫操作。
OPC讀數有三種方式:同步、異步、訂閱。
同步通訊時,OPC客戶程序向OPC服務器進行請求時,OPC客戶程序必須等到OPC服務器對應的響應全部完成以后才能返回,在此期間OPC客戶程序一直處于等待狀態,若進行讀操作,那么必須等待OPC服務器響應后才返回。因此在同步通訊時,如果有大量數據進行操作或者有很多OPC客戶程序對OPC服務器進行讀操作,必然造成OPC客戶程序的阻塞現象。因此同步通訊適用于OPC客戶程序較少,數據量較小時的場合。
異步通訊時,OPC客戶程序對服務器進行請求時,OPC客戶程序請求后立刻返回,不用等待OPC服務器的響應,可以進行其它操作。OPC服務器完成響應后再通知OPC客戶程序,如進行讀操作,OPC客戶程序通知OPC服務器后離開返回,不等待OPC服務器的讀完成,而OPC服務器完成讀后,會自動的通知OPC客戶程序,把讀結果傳送給OPC客戶程序。因此相對于同步通訊,異步通訊的效率更高。
訂閱方式時,OPC客戶程序對服務器進行請求時,OPC客戶程序操作后立刻返回,不用等待OPC服務器的操作,可以進行其它操作, OPC 服務器的Group組在組內有數據發生改變時,自動根據更新周期刷新相應的客戶端數據,如下圖,客戶端只向OPC服務發送一次請求,之后不再對服務器請求。
OPC寫數有兩種方式:同步、異步。區別與上面講的機制一樣,在生產應用中,如果寫數據參與控制,一般采用同步方式。
OPC訪問接口方式:
OPC主要包含兩種接口:CUSTOM標準接口和OLE自動化標準接口,自定義接口是服務商必須提供的,而自動化接口則是可選的。
自定義接口是一組COM接口,主要用于采用C++語言的應用程序開發;
自動化接口是一組OLE接口,主要用于采用VB,DELPHI,Excel等基于腳本編程語言的應用程序開發。
許多OPC服務器,包括OPC.SimaticNet,是在COM平臺開發的,從而對于基于.NET 框架下的C#語言,作為客戶端程序語言訪問OPCServer,需要解決兩個平臺間無縫遷移的問題。OPC基金會對會員提供了OpcRcw動態鏈接庫,OPC NET COM包裝器和OPC NET API,將OPC復雜的規范封狀成簡單易用的C#類,可以比較容易地實現數據訪問。
本文中通過實驗,逐步講解了通過C#編寫客戶端程序,訪問OPC.SimaticNet,對PLC數據進行讀寫的實現過程。自定義接口及自動化接口都進行了測試,但基于C#的語言特性,建議采用自定義接口訪問,同時有很多OPCServer服務商,對外是不提供自動化接口的,西門子的SimaticNet及WinCC的OPCServer都提供自動化接口。
OPC Server端組態配置:
如上圖建立連接S7_connection_1,然后在OPC Scout測試連接的正確性。
從上面可以看到數據訪問都是正常的。
C#自動化接口
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using OPCSiemensDAAutomation;//引用連接庫
第一步,添加下列命名空間(首先在COM組件中添加相應組件)
using OPCSiemensDAAutomation;
第二步,定義OPC相關變量
OPCServer MyOpcServer; //定義OPCServer
OPCGroup MyOpcGroup; //定義組
OPCItem MyOpcItem1; //Item
OPCItem MyOpcItem2; //值
long[] ServerHandle = new long[2]; //Item的句柄
第三步,建立連接及對象
MyOpcServer = new OPCServer();
MyOpcServer.Connect("OPC.SimaticNet", "192.168.0.102");
MyOpcGroup = MyOpcServer.OPCGroups.Add("MyGroup1");
MyOpcItem1 = MyOpcGroup.OPCItems.AddItem("S7:[S7 connection_1]DB10,INT0",1);
MyOpcItem2 = MyOpcGroup.OPCItems.AddItem("S7:[S7 connection_1]DB10,INT2", 2);
ServerHandle[0] = MyOpcItem1.ServerHandle;
ServerHandle[1] = MyOpcItem2.ServerHandle;
第四步,同步讀數據,
private void Btn_Read_S_Click(object sender,EventArgs e)//同步讀數據
{
……
MyOpcItem1.Read(1,out ItemValues,out Qualities, out TimeStamps);
//ItemValues,Qualities,TimeStamps分別是值,質量碼
//也可以通過調用SyncRead函數,參數可參考異步讀函數
……
}
第四步,同步寫數據
private void Btn_Write_S_Click(object sender,EventArgs e)
{
……
MyOpcItem1.Write(Txt_W1.Text);
//也可以通過調用SyncWrite函數,參數可參考異步寫函數
……
}
第五步,異步事件定義,
在異步操作情況下,需要定義相應的異步事件
MyOpcGroup.DataChange +=new
DIOPCGroupEvent_DataChangeEventHandler(MyOpcGroup_DataChange); //
//訂閱方式下數據改變
iteComplete +=new
DIOPCGroupEvent_AsyncWriteCompleteEventHandler(MyOpcGroup_WriteComplete);
//寫完成事件
MyOpcGroup.AsyncReadComplete += new
DIOPCGroupEvent_AsyncReadCompleteEventHandler(MyOpcGroup_ReadComplete);
//讀完成事件
MyOpcGroup.AsyncCancelComplete += new
DIOPCGroupEvent_AsyncCancelCompleteEventHandler(MyOpcGroup_CancelComplete);
//取消操作事件
在使用中注意,其事件函數要按照特定接口:
void MyOpcGroup_DataChange(int TransactionID, int NumItems,ref Array ClientHandles,
ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)
void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles,
ref Array Errors)
void MyOpcGroup_ReadComplete(int TransactionID, int NumItems,ref System.Array
ClientHandles,ref System.Array ItemValues,ref System.Array Qualities,
ref System.Array TimeStamps,ref System.Array Errors)
void MyOpcGroup_CancelComplete(int CancelID)
第六步訂閱方式讀
void MyOpcGroup_DataChange(int TransactionID, int NumItems,ref Array ClientHandles,
ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)
{
……
//注意數據改變時,Item數量要通過NumItems得到,也就是說只有數據改變時,才對一
遍,所以降低了服務器負擔。要注意讀語句寫法。
……
}
第七步異步讀
private void Btn_Read_A_Click(object sender,EventArgs e)//異步讀事件
{
int[] handle = new int[3] {ServerHandle[0], ServerHandle[1],0};//注意方式
Array MyServerHandles = (Array)handle;
Array errors;
int cancelID;
……
MyOpcGroup.AsyncRead(2, ref MyServerHandles, out errors, READASYNC_ID, out
cancelID);
……
}
void MyOpcGroup_ReadComplete(int TransactionID, int NumItems,ref System.Array
ClientHandles,ref System.Array ItemValues,ref System.Array Qualities,
ref System.Array TimeStamps,ref System.Array Errors)
{
……
//注意TransactionID的對應
……
}
注意array在函數內部做參數時,數據下標是從1開始的,所以要考慮將第0位空出
來,n個Item,就要定義n+1列數組,添加一個0,但在函數使用時,又是從左開始讀的。
否則會報錯。
第八步異步寫
private void Btn_Write_A_Click(object sender,EventArgs e)
{
……
MyOpcGroup.AsyncWrite(2,ref MyServerHandles, ref Myvalues,out errors,
WRITEASYNC_ID,out cancelID);
……
}
void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles
ref Array Errors)
{
……
}
同樣要注意Array在函數內部做參數的傳遞。
第九步釋放對象
private void Btn_Disconn_Click(object sender,EventArgs e)
{
……
}
OPCItem的數據類型:
在通過自定義接口訪問時,
ItemArray[1].szAccessPath = "";
ItemArray[1].szItemID = "S7:[S7 connection_1]DB10,Real4";//地址,不同數據類型表示
ItemArray[1].bActive = 1;//是否激活
ItemArray[1].hClient = 2;//表示ID
ItemArray[1].dwBlobSize = 0;
ItemArray[1].pBlob =IntPtr.Zero;
ItemArray[1].vtRequestedDataType = 5;
ItemArray[2].szAccessPath = "";
ItemArray[2].szItemID = "S7:[S7 connection_1]DB10,STRING26.10";//地址,不同數據類型表
示方法不同
ItemArray[2].bActive = 1;//是否激活
ItemArray[2].hClient = 3;//表示ID
ItemArray[2].dwBlobSize = 0;
ItemArray[2].pBlob =IntPtr.Zero;
ItemArray[2].vtRequestedDataType = 8;
-
接口
+關注
關注
33文章
8775瀏覽量
152396 -
西門子
+關注
關注
97文章
3085瀏覽量
116870 -
OPC
+關注
關注
7文章
351瀏覽量
46472
原文標題:如何在C#中實現OPC數據訪問
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Labview通過西門子OPC和S7-200 Smart PLC通信的一種方式
OPC讀寫速度問題
關于C51和ARM讀寫寄存器方式區別?
DMA內部寄存器的讀寫方式和應用場合
鋇錸技術的BL102 OPC UA網關的OPC UA配置方式
OPC統一數據訪問技術研究Study on OPC Unif
與AB PLC通過opc方式連接的方法
OPC數據訪問服務器的研究與實現
基于OPC的數據訪問服務器開發

ARM指令尋址方式之內存訪問指令尋址

HPI接口的工作模式以及與上位主機的連接方式解析

評論