opc編程
㈠ c#編程用opc的方式讀寫plc中的寄存器
PLC數據要通過串口編程或socket編程來獲齲PLC一般通過RS232串口或RS485串口,與電腦進行數據通訊,或者擴展以太模塊(匯流排擴展,或串口加裝),通過乙太網進行數據通訊。對應於不同的介面,通訊程序也不一樣,RS232可直接接入電腦,RS485要通過
㈡ 什麼是OPC技術求解
在過去,為了存取現場設備的數據信息,每一個應用軟體開發商都需要編寫專用的介面函數。由於現場設備的種類繁多,且產品的不斷升級,往往給用戶和軟體開發商帶來了巨大的工作負擔。通常這樣也不能滿足工作的實際需要,系統集成商和開發商急切需要一種具有高效性、可靠性、開放性、可互操作性的即插即用的設備驅動程序。在這種情況下,OPC標准應運而生。OPC標准以微軟公司的OLE技術為基礎,它的制定是通過提供一套標準的OLE/COM介面完成的,在OPC技術中使用的是OLE 2技術,OLE標准允許多台微機之間交換文檔、圖形等對象。
COM是Component Object Model的縮寫,是所有OLE機制的基礎。COM是一種為了實現與編程語言無關的對象而制定的標准,該標准將Windows下的對象定義為獨立單元,可不受程序限制地訪問這些單元。這種標准可以使兩個應用程序通過對象化介面通訊,而不需要知道對方是如何創建的。例如,用戶可以使用C++語言創建一個Windows對象,它支持一個介面,通過該介面,用戶可以訪問該對象提供的各種功能,用戶可以使用Visual Basic,C,Pascal,Smalltalk或其它語言編寫對象訪問程序。在Windows NT4.0操作系統下,COM規范擴展到可訪問本機以外的其它對象,一個應用程序所使用的對象可分布在網路上,COM的這個擴展被稱為DCOM(Distributed COM)。
通過DCOM技術和OPC標准,完全可以創建一個開放的、可互操作的控制系統軟體。OPC採用客戶/伺服器模式,把開發訪問介面的任務放在硬體生產廠家或第三方廠家,以OPC伺服器的形式提供給用戶,解決了軟、硬體廠商的矛盾,完成了系統的集成,提高了系統的開放性和可互操作性。
OPC伺服器通常支持兩種類型的訪問介面,它們分別為不同的編程語言環境提供訪問機制。這兩種介面是:自動化介面(Automation interface);自定義介面(Custom interface)。自動化介面通常是為基於腳本編程語言而定義的標准介面,可以使用VisualBasic、Delphi、PowerBuilder等編程語言開發OPC伺服器的客戶應用。而自定義介面是專門為C++等高級編程語言而制定的標准介面。OPC現已成為工業界系統互聯的預設方案,為工業監控編程帶來了便利,用戶不用為通訊協議的難題而苦惱。
㈢ OPC 應用程序開發 可以用C#嗎還可以用哪些
可以用C#,VB,DELPHI,C++等,大多高級語言都可以。
不過,用現成的OPC開發包,更好些。
㈣ 新人不懂OPC是什麼東西
OPC(OLE for Process Control),是一個工業標准,用於過程式控制制的OLE。
管理這個標準的國際組織是OPC基金會,OPC基金會現有會員已超過220家。遍布全球,包括世界上所有主要的自動化控制系統、儀器儀表及過程式控制制系統的公司。
基於微軟的OLE(現在的Active X)、COM (部件對象模型)和DCOM (分布式部件對象模型)技術。OPC包括一整套介面、屬性和方法的標准集,用於過程式控制制和製造業自動化系統。
OPC 基於Microsoft公司的 Distributed interNet Application (DNA) 構架和 Component Object Model (COM) 技術的,根據易於擴展性而設計的。OPC規范定義了一個工業標准介面。
OPC是以OLE/COM機製作為應用程序的通訊標准。OLE/COM是一種客戶/伺服器模式,具有語言無關性、代碼重用性、易於集成性等優點。
(4)opc編程擴展閱讀
OPC技術原理
OPC標准以微軟公司的OLE技術為基礎,它的制定是通過提供一套標準的OLE/COM介面完成的。
COM和DCOM技術
COM(組件對象模型)是所有OLE機制的基礎,它是WINDOWS系統中一種為了實現與編程語言無關的對象而制定的標准。這種標准可以使兩個應用程序通過對象化介面通訊,而不需要知道對方是如何創建的。
COM規范擴展到可訪問本機以外的其它對象,一個應用程序所使用的對象可分布在網路上,這個擴展被稱為DCOM。OPC是作為工業標準定義的特殊的COM介面。
㈤ 如何在C++中實現OPC訪問
OPC的文檔網上很多,我在這里要介紹的主題是使用C++通過自動化介面來訪問OPC Server,寫這篇文章的目的是我在網上沒有搜索到這方面的文檔,如果我有這方面的需要,我想在網上一定也有其他朋友有這個需要,希望能對這些朋友有一些幫助。
使用C++來訪問OPC Server, 相對於使用自定義介面來說,自動化介面要簡單很多,因為這和Visual Basic使用的是同一個介面,使用過Visual Basic來訪問OPC Server的朋友一定能有這個體會。首先是准備好開發環境,一般測試是在模擬環境中進行,這樣比較保險,可以使用一些免費的模擬OPC Server。我這里准備的是Matrikon的模擬伺服器,模擬器安裝以後。編程環境是VC++ 6.0,使用200X和2010也都大同小異。
為了演示簡單,新建一個Win32控制台工程agOPC,新建agOPC.cpp源文件並加到工程里。
// --------------------------------- agOPC.cpp -----------------------------------------------
//在agOPC.cpp開頭添加如下一行
#import "C:Program FilesMatrikonOPCCommonOPCAuto.dll" no_namespace
//這是通過OPCAuto.dll里所包含的類型庫信息產生C++能訪問的頭文件,此時在工程的Debug文件夾下產生OPCAuto.tlh和OPCAuto.tli兩個文件。
//添加需要的頭文件
#pragma warning( disable : 4786 ) // 為了避免vector報出的C4786警告
#include< comdef.h> // 使用到了_bstr_t,_variant_t,_com_error都在這個文件里定義
#include< iostream>
#include< vector>
using namespace std;
//聲明全局變數
typedef struct OLEInit {
OLEInit() { CoInitialize( NULL ); }
~OLEInit() { CoUninitialize(); }
} OLEInit;
OLEInit oleInit; // 必須在最前面定義,因為在使用COM之前必須初始化COM庫,否則程序會崩潰
// 由於是全局變數oleInit的構造函數在所有對象的構造函數調用之前調用,
// 析構函數在所有對象的析構函數調用之後調用
IOPCAutoServerPtr opcSvr; // 這些智能指針類型在OPCAuto.tlh中定義
IOPCGroupsPtr opcGrps;
IOPCGroupPtr opcGrp;
vector<OPCItemPtr> opcItms; // 使用vector來保存三個測試Item。
//連接到OPC Server, 我所使用的參數是"Matrikon.OPC.Simulation.1"
void agOPCConn( const char *opcSvrName ) {
HRESULT hr;
hr = opcSvr.CreateInstance( __uuidof( OPCServer ) );
if( FAILED( hr ) ) {
cerr<< "OPCServer CreateInstance failed, hr = " << hr<< endl;
exit(1);
}
opcSvr->Connect( opcSvrName );
}
//斷開和OPC Server的連接
void agOPCDisc() {
opcGrps->RemoveAll(); // 刪除所有的組, 這個演示實例只有一個組
opcSvr->Disconnect(); // 斷開和OPC Server的連接
}
//創建一個組
void agOPCCreateGroup() {
// OPCGroups是特殊的屬性,執行的時候會調用OPCAuto.tlh中的IOPCGroupsPtr GetOPCGroups();
opcGrps = opcSvr->OPCGroups;
opcGrp = opcGrps->Add( _variant_t( "group1" ) ); // 組名隨意取
}
//在組里添加三個不同類型的測試Item, 類型可以從Item的名字可以看出
void agOPCAddItems() {
OPCItemPtr opcItm;
opcItm = opcGrp->OPCItems->AddItem( _bstr_t( "Bucket Brigade.Int4" ), 1 );
opcItms.push_back( opcItm );
opcItm = opcGrp->OPCItems->AddItem( _bstr_t( "Bucket Brigade.Int2" ) , 1);
opcItms.push_back( opcItm );
opcItm = opcGrp->OPCItems->AddItem( _bstr_t( "Bucket Brigade.String" ) , 1);
opcItms.push_back( opcItm );
}
//用來顯示讀取的Item的值
void agDumpVariant(VARIANT *v)
{
switch(v->vt)
{
case VT_I2:
printf(" value(VT_I2) = %d ", v->iVal );
break;
case VT_I4:
printf(" value(VT_I4) = %ld ", v->lVal );
break;
case VT_BSTR:
printf(" value(VT_BSTR) = %ls ", v->bstrVal );
break;
default:
printf(" value(unknown type:%d) ", v->vt );
break;
}
}
//同步讀取三個Item的值,同步在很多情況下都是簡單有效的選擇方案,其實讀取的非同步方式在C++中可以建立一個工作線程來執行同步讀的操作,等有新的Item值的時候再通過某種線程間通信的方式告訴主線程「數據改變」的事件
void agOPCReadItems() {
_variant_t quality;
_variant_t timestamp;
SAFEARRAY *pServerHandles;
SAFEARRAY *pValues;
SAFEARRAY *pErrors;
SAFEARRAYBOUND rgsabound[ 1 ];
long dim[ 1 ];
long svrHdl;
vector<_variant_t> values;
vector<long> errs;
int i;
_variant_t value;
long err;
// VC數組索引從0開始,而在OPCAuto.dll需要中從1開始,所以是rgsabound[ 0 ].cElements = 4,而給pServerHandles賦值的時候應該給索引是1,2,3相應的賦值Server Handle
rgsabound[ 0 ].cElements = 4;
rgsabound[ 0 ].lLbound = 0;
pServerHandles = SafeArrayCreate( VT_I4, 1, rgsabound ); //構建一個1維數組,類型是VT_I4
for( i = 0; i < opcItms.size(); i++ ) {
svrHdl = opcItms[i]->ServerHandle;
dim[ 0 ] = i + 1;
// 給數組的每個元素賦值,對應的索引值是1, 2, 3
SafeArrayPutElement( pServerHandles, dim, &svrHdl );
}
opcGrp->SyncRead( OPCDevice,
3, // 讀取的Item數目
& pServerHandles, // 輸入的伺服器端句柄數組
& pValues, // 輸出的Item值數組
& pErrors, // 輸出的Item錯誤狀態數組
& quality, // 讀取的值的狀態
& timestamp ); // 讀取的事件戳
for( i = 1; i <= opcItms.size(); i++ ) {
dim[ 0 ] = i;
SafeArrayGetElement( pValues, dim, &value ); // 讀取Item值在value中
SafeArrayGetElement( pErrors, dim, &err ); // 讀取錯誤狀態值在err中
values.push_back( value );
errs.push_back( err );
}
for( i = 0; i < values.size(); i++ ) {
agDumpVariant( &values[ i ] ); // 顯示讀取的Item值
cout<< ", err = "<< errs[ i ]<< endl;
}
SafeArrayDestroy( pServerHandles );
SafeArrayDestroy( pValues );
SafeArrayDestroy( pErrors );
}
// 寫入3個Item的值,為了演示實例簡單,參數傳遞3個對應的Item值
void agOPCWriteItems( vector<_variant_t> values) {
_variant_t quality;
_variant_t timestamp;
SAFEARRAY *pServerHandles;
SAFEARRAY *pValues;
SAFEARRAY *pErrors;
long dim[ 1 ];
long svrHdl;
int i;
SAFEARRAYBOUND rgsabound[ 1 ];
rgsabound[ 0 ].cElements = values.size() + 1;
rgsabound[ 0 ].lLbound = 0;
pServerHandles = SafeArrayCreate( VT_I4, 1, rgsabound );
pValues = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
for( i = 0; i < values.size(); i++ ) {
svrHdl = opcItms[i]->ServerHandle;
dim[ 0 ] = i + 1;
SafeArrayPutElement( pServerHandles, dim, &svrHdl );
SafeArrayPutElement( pValues, dim, &values[i] );
}
opcGrp->SyncWrite( 3,& pServerHandles, &pValues,& pErrors );
SafeArrayDestroy( pServerHandles );
SafeArrayDestroy( pValues );
SafeArrayDestroy( pErrors );
}
//main主程序
int main()
{
try
{
agOPCConn( "Matrikon.OPC.Simulation.1" );
agOPCCreateGroup();
agOPCAddItems();
// 第一次寫和讀
vector<_variant_t> values;
values.push_back( ( long )156 );
values.push_back( ( short )11 );
values.push_back( "opc" );
agOPCWriteItems( values );
agOPCReadItems();
cout << "---------------------------------------"<< endl;
// 第二次寫和讀
vector<_variant_t> values1;
values1.push_back( ( long )123456 );
values1.push_back( ( short )666 );
values1.push_back( "hello" );
agOPCWriteItems( values1 );
agOPCReadItems();
}
catch ( _com_error &e ) {
// 應該在上面的子函數裡面捕捉異常,但為了演示簡單,在主函數裡面捕捉異常
_bstr_t bstrSource( e.Source( ) );
_bstr_t bstrDescription( e.Description( ) );
cout<< "Code = "<< e.Error()<< endl;
cout<< "Code meaning = "<< e.ErrorMessage()<< endl;
cout<< "Source = "<< ( LPCTSTR ) bstrSource<< endl;
cout<< "Description = "<< ( LPCTSTR ) bstrDescription<< endl;
}
return 0;
}
㈥ PLC與PC通訊程序用VB編程多還是用OPC編程多啊那個更好
首先需要明白兩者的「職責」:VB是用於上位機的編程,屬於計算機編程部分,OPC屬於計算機的一種API「介面」,這種軟體上的介面其實也屬於驅動程序的一種,和硬體上的「介面」功能原理一樣,OPC就是為了連通PLC和VB程序之間通訊的「橋梁」或「介面」。想你所說的OPC編程應該是通訊數據的交換寄存器的設置,通訊數據長度設置等。
因此PC和PLC之間的通訊(控制、監控、數據寫入等)是通過VB調用OPC的「介面」數據來實現通訊的。
㈦ OPC數據採集如何編程
1.軟硬體平台的配置 OPC伺服器的搭建使用西門子公司提供的SIMATIC NET 2006...
2.OPC伺服器的搭建
3.PC站的硬體機架的配置。雙擊桌面Station Configuration Editor快捷圖標,打開 Station Con...
4.控制台的配置。從開始菜單中選擇Simatic>Simatic net>Configura...
5.通過.NET平台編程實現OPC客戶端 利用Visual Studio 2005開.