OPC是Object Linking and Embedding(OLE)for Process Control 的縮寫,它是微軟公司的對(duì)象鏈接和嵌入技術(shù)在過(guò)程控制方面的應(yīng)用。OPC以O(shè)LE/COM/DCOM技術(shù)為基礎(chǔ),采用客戶/服務(wù)器模式,為工業(yè)自動(dòng)化軟件面向?qū)ο蟮拈_(kāi)發(fā)提供了統(tǒng)一的標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)定義了應(yīng)用Microsoft操作系統(tǒng)在基于PC的客戶機(jī)之間交換自動(dòng)化實(shí)時(shí)數(shù)據(jù)的方法,采用這項(xiàng)標(biāo)準(zhǔn)后,硬件開(kāi)發(fā)商將取代軟件開(kāi)發(fā)商為自己的硬件產(chǎn)品開(kāi)發(fā)統(tǒng)一的OPC接口程序,而軟件開(kāi)發(fā)者可免除開(kāi)發(fā)驅(qū)動(dòng)程序的工作,充分發(fā)揮自己的特長(zhǎng),把更多的精力投入到其核心產(chǎn)品的開(kāi)發(fā)上。
SimaticNet是西門子全集成自動(dòng)化系統(tǒng)中的一個(gè)重要組成部分,它為完善的工業(yè)自動(dòng)化控制系統(tǒng)的通訊提供部件和網(wǎng)絡(luò),同時(shí)提供多個(gè)OPCServer,為數(shù)據(jù)的外部訪問(wèn)提供接口,本文主要以O(shè)PC.SimaticNET為例說(shuō)明。
采用不同的通信方式,通過(guò)OPC.SimaticNET,現(xiàn)場(chǎng)數(shù)據(jù)可以方便地提供給用戶:
OPC的讀寫方式
在實(shí)際使用中,主要包括對(duì)現(xiàn)場(chǎng)數(shù)據(jù)的讀寫操作。
OPC讀數(shù)有三種方式:同步、異步、訂閱。
同步通訊時(shí),OPC客戶程序向OPC服務(wù)器進(jìn)行請(qǐng)求時(shí),OPC客戶程序必須等到OPC服務(wù)器對(duì)應(yīng)的響應(yīng)全部完成以后才能返回,在此期間OPC客戶程序一直處于等待狀態(tài),若進(jìn)行讀操作,那么必須等待OPC服務(wù)器響應(yīng)后才返回。因此在同步通訊時(shí),如果有大量數(shù)據(jù)進(jìn)行操作或者有很多OPC客戶程序?qū)PC服務(wù)器進(jìn)行讀操作,必然造成OPC客戶程序的阻塞現(xiàn)象。因此同步通訊適用于OPC客戶程序較少,數(shù)據(jù)量較小時(shí)的場(chǎng)合。
異步通訊時(shí),OPC客戶程序?qū)Ψ?wù)器進(jìn)行請(qǐng)求時(shí),OPC客戶程序請(qǐng)求后立刻返回,不用等待OPC服務(wù)器的響應(yīng),可以進(jìn)行其它操作。OPC服務(wù)器完成響應(yīng)后再通知OPC客戶程序,如進(jìn)行讀操作,OPC客戶程序通知OPC服務(wù)器后離開(kāi)返回,不等待OPC服務(wù)器的讀完成,而OPC服務(wù)器完成讀后,會(huì)自動(dòng)的通知OPC客戶程序,把讀結(jié)果傳送給OPC客戶程序。因此相對(duì)于同步通訊,異步通訊的效率更高。
訂閱方式時(shí),OPC客戶程序?qū)Ψ?wù)器進(jìn)行請(qǐng)求時(shí),OPC客戶程序操作后立刻返回,不用等待OPC服務(wù)器的操作,可以進(jìn)行其它操作, OPC 服務(wù)器的Group組在組內(nèi)有數(shù)據(jù)發(fā)生改變時(shí),自動(dòng)根據(jù)更新周期刷新相應(yīng)的客戶端數(shù)據(jù),如下圖,客戶端只向OPC服務(wù)發(fā)送一次請(qǐng)求,之后不再對(duì)服務(wù)器請(qǐng)求。
OPC寫數(shù)有兩種方式:同步、異步。區(qū)別與上面講的機(jī)制一樣,在生產(chǎn)應(yīng)用中,如果寫數(shù)據(jù)參與控制,一般采用同步方式。
OPC訪問(wèn)接口方式:
OPC主要包含兩種接口:CUSTOM標(biāo)準(zhǔn)接口和OLE自動(dòng)化標(biāo)準(zhǔn)接口,自定義接口是服務(wù)商必須提供的,而自動(dòng)化接口則是可選的。
自定義接口是一組COM接口,主要用于采用C++語(yǔ)言的應(yīng)用程序開(kāi)發(fā);
自動(dòng)化接口是一組OLE接口,主要用于采用VB,DELPHI,Excel等基于腳本編程語(yǔ)言的應(yīng)用程序開(kāi)發(fā)。
許多OPC服務(wù)器,包括OPC.SimaticNet,是在COM平臺(tái)開(kāi)發(fā)的,從而對(duì)于基于.NET 框架下的C#語(yǔ)言,作為客戶端程序語(yǔ)言訪問(wèn)OPCServer,需要解決兩個(gè)平臺(tái)間無(wú)縫遷移的問(wèn)題。OPC基金會(huì)對(duì)會(huì)員提供了OpcRcw動(dòng)態(tài)鏈接庫(kù),OPC NET COM包裝器和OPC NET API,將OPC復(fù)雜的規(guī)范封狀成簡(jiǎn)單易用的C#類,可以比較容易地實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)。
本文中通過(guò)實(shí)驗(yàn),逐步講解了通過(guò)C#編寫客戶端程序,訪問(wèn)OPC.SimaticNet,對(duì)PLC數(shù)據(jù)進(jìn)行讀寫的實(shí)現(xiàn)過(guò)程。自定義接口及自動(dòng)化接口都進(jìn)行了測(cè)試,但基于C#的語(yǔ)言特性,建議采用自定義接口訪問(wèn),同時(shí)有很多OPCServer服務(wù)商,對(duì)外是不提供自動(dòng)化接口的,西門子的SimaticNet及WinCC的OPCServer都提供自動(dòng)化接口。
OPC Server端組態(tài)配置:
如上圖建立連接S7_connection_1,然后在OPC Scout測(cè)試連接的正確性。
從上面可以看到數(shù)據(jù)訪問(wèn)都是正常的。
C#自動(dòng)化接口
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;//引用連接庫(kù)
第一步,添加下列命名空間(首先在COM組件中添加相應(yīng)組件)
using OPCSiemensDAAutomation;
第二步,定義OPC相關(guān)變量
OPCServer MyOpcServer; //定義OPCServer
OPCGroup MyOpcGroup; //定義組
OPCItem MyOpcItem1; //Item
OPCItem MyOpcItem2; //值
long[] ServerHandle = new long[2]; //Item的句柄
第三步,建立連接及對(duì)象
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;
第四步,同步讀數(shù)據(jù),
private void Btn_Read_S_Click(object sender,EventArgs e)//同步讀數(shù)據(jù)
{
……
MyOpcItem1.Read(1,out ItemValues,out Qualities, out TimeStamps);
//ItemValues,Qualities,TimeStamps分別是值,質(zhì)量碼
//也可以通過(guò)調(diào)用SyncRead函數(shù),參數(shù)可參考異步讀函數(shù)
……
}
第四步,同步寫數(shù)據(jù)
private void Btn_Write_S_Click(object sender,EventArgs e)
{
……
MyOpcItem1.Write(Txt_W1.Text);
//也可以通過(guò)調(diào)用SyncWrite函數(shù),參數(shù)可參考異步寫函數(shù)
……
}
第五步,異步事件定義,
在異步操作情況下,需要定義相應(yīng)的異步事件
MyOpcGroup.DataChange +=new
DIOPCGroupEvent_DataChangeEventHandler(MyOpcGroup_DataChange); //
//訂閱方式下數(shù)據(jù)改變
iteComplete +=new
DIOPCGroupEvent_AsyncWriteCompleteEventHandler(MyOpcGroup_WriteComplete);
//寫完成事件
MyOpcGroup.AsyncReadComplete += new
DIOPCGroupEvent_AsyncReadCompleteEventHandler(MyOpcGroup_ReadComplete);
//讀完成事件
MyOpcGroup.AsyncCancelComplete += new
DIOPCGroupEvent_AsyncCancelCompleteEventHandler(MyOpcGroup_CancelComplete);
//取消操作事件
在使用中注意,其事件函數(shù)要按照特定接口:
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)
{
……
//注意數(shù)據(jù)改變時(shí),Item數(shù)量要通過(guò)NumItems得到,也就是說(shuō)只有數(shù)據(jù)改變時(shí),才對(duì)一
遍,所以降低了服務(wù)器負(fù)擔(dān)。要注意讀語(yǔ)句寫法。
……
}
第七步異步讀
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的對(duì)應(yīng)
……
}
注意array在函數(shù)內(nèi)部做參數(shù)時(shí),數(shù)據(jù)下標(biāo)是從1開(kāi)始的,所以要考慮將第0位空出
來(lái),n個(gè)Item,就要定義n+1列數(shù)組,添加一個(gè)0,但在函數(shù)使用時(shí),又是從左開(kāi)始讀的。
否則會(huì)報(bào)錯(cuò)。
第八步異步寫
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在函數(shù)內(nèi)部做參數(shù)的傳遞。
第九步釋放對(duì)象
private void Btn_Disconn_Click(object sender,EventArgs e)
{
……
}
OPCItem的數(shù)據(jù)類型:
在通過(guò)自定義接口訪問(wèn)時(shí),
ItemArray[1].szAccessPath = "";
ItemArray[1].szItemID = "S7:[S7 connection_1]DB10,Real4";//地址,不同數(shù)據(jù)類型表示
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";//地址,不同數(shù)據(jù)類型表
示方法不同
ItemArray[2].bActive = 1;//是否激活
ItemArray[2].hClient = 3;//表示ID
ItemArray[2].dwBlobSize = 0;
ItemArray[2].pBlob =IntPtr.Zero;
ItemArray[2].vtRequestedDataType = 8;
-
接口
+關(guān)注
關(guān)注
33文章
8692瀏覽量
151921 -
西門子
+關(guān)注
關(guān)注
95文章
3062瀏覽量
116448 -
OPC
+關(guān)注
關(guān)注
7文章
350瀏覽量
46326
原文標(biāo)題:如何在C#中實(shí)現(xiàn)OPC數(shù)據(jù)訪問(wèn)
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論