OPC Client浏览OPC Server的简单实例程序源代码

合集下载

vb与欧姆龙OPC服务器编程实例(读取PLC100个内存的vb源代码)

vb与欧姆龙OPC服务器编程实例(读取PLC100个内存的vb源代码)

Option ExplicitOption Base 1 ' All OPC Automation Arrays start with 1Dim MyOPCServer As OPCServer ' OPCServer ObjectDim MyGroups As OPCGroups ' OPCGroups Collection ObjectDim WithEvents MyGroup As OPCGroup ' OPCGroup ObjectDim MyItems As OPCItems ' OPCItems Collection ObjectDim MyItemServerHandles() As Long ' Server Handles for ItemsDim MyTID As Long ' Transaction ID for asynchronous calls Private Sub Command1_Click()Dim Errors() As LongCall MyItems.Remove(100, MyItemServerHandles, Errors)MyGroups.RemoveAllSet MyGroup = NothingSet MyGroups = NothingMyOPCServer.DisconnectSet MyOPCServer = NothingEnd SubPrivate Sub Command2_Click()PFAsyncWriteCommandEnd SubPrivate Sub Command3_Click()Form_LoadEnd SubPrivate Sub Form_Load()MyTID = 1Set MyOPCServer = New OPCServerCall MyOPCServer.Connect("OMRON.OPC.2")Set MyGroups = MyOPCServer.OPCGroupsMyGroups.DefaultGroupUpdateRate = 500MyGroups.DefaultGroupIsActive = TrueSet MyGroup = MyGroups.Add("Group1")MyGroup.IsSubscribed = TrueMyGroup.IsActive = TrueMyGroup.UpdateRate = 500Dim ErrorFlag As BooleanDim ItemObj As OPCItemDim ItemIDs(100) As StringDim ItemClientHandles(100) As LongDim Errors() As LongErrorFlag = FalseSet MyItems = MyGroup.OPCItemsDim m As IntegerFor m = 0 To 3Text1(m).ForeColor = vbRedText1(m).FontSize = 15Text2(m).ForeColor = vbRedText2(m).FontSize = 15NextFor m = 4 To 99Text1(m).ForeColor = vbBlueText1(m).FontSize = 15NextFor m = 1 To 100ItemIDs(m) = "Device.Group1.Tag" & CStr(m)ItemClientHandles(m) = mNextCall MyItems.AddItems(100, ItemIDs, ItemClientHandles, MyItemServerHandles, Errors)End SubPrivate Sub MyGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)On Error GoTo ErrorHandler '订阅方式回馈信息存储Dim i As LongFor i = 1 To NumItemsIf ClientHandles(i) > 0 And ClientHandles(i) < 101 ThenIf Qualities(i) = 192 Thendata1(ClientHandles(i)) = ItemValues(i)Else' MsgBox GetQualityText(Qualities(i))End IfElseMsgBox "DataChange Item " + Str$(i) + " has invalid Client Handle ", vbCriticalEnd IfNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "OnDataChange", vbCritical, "ERROR"End SubPrivate Sub Timer1_Timer()Dim i As IntegerFor i = 1 To 100Text1(i - 1).Text = data1(i)Next iEnd SubPublic Sub PFAsyncWriteCommand() '异步写入命令On Error GoTo ErrorHandlerDim i, j As LongDim Values(4) As VariantDim Errors() As LongDim CID As LongDim AsyncHandles(4) As LongFor j = 1 To 4AsyncHandles(j) = MyItemServerHandles(j)Values(j) = Text2(j - 1).TextNextMyTID = MyTID + 1Call MyGroup.AsyncWrite(4, AsyncHandles, Values, Errors, MyTID, CID)For i = 1 To 4If Not Errors(i) = 0 Then MsgBox "Item " + Str$(i) + " FAILED. Error Code = " + Str$(Errors(i)), vbCritical NextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Writing Items Asyncronous", vbCritical, "ERROR"End SubPrivate Sub MyGroup_AsyncWriteComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, Errors() As Long)On Error GoTo ErrorHandler '异步写命令回馈信息Dim i As LongFor i = 1 To NumItemsIf Not Errors(i) = 0 Then MsgBox "AsyncWriteComplete Item Clienthandle = " + Str$(ClientHandles(i)) + " FAILED. Error Code = " + Str$(Errors(i)), vbCriticalNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Async Write Complete", vbCritical, "ERROR"End Sub。

DELPHI OPC Client 例子

DELPHI  OPC Client 例子

DELPHI OPC Client 例子(2008-09-25 20:23:52)分类:DELPHI 标签:delphi opc client opcserver remoteserver security group杂谈unit Unit1;interfaceusesWindows, Forms, ComObj, ActiveX, SysUtils, OPCtypes, OPCDA, OPCutils,StdCtrls, Classes, Controls, OPCenum;typeTForm1 = class(TForm)Button1: TButton;ListBox1: TListBox;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;constOneSecond = 1 / (24 * 60 * 60);// these are for use with the Matrikon sample serverServerProgID = 'OPC.SimaticNET';Item0Name = 'S7:[@LOCALSERVER]DB1,STRING8.10';Item1Name = 'S7:[@LOCALSERVER]DB1,STRING30.10';RPC_C_AUTHN_LEVEL_NONE = 1;RPC_C_IMP_LEVEL_IMPERSONATE = 3;EOAC_NONE = 0;varServerIf: IOPCServer;GroupIf: IOPCItemMgt;GroupHandle: OPCHANDLE;Item0Handle: OPCHANDLE;Item1Handle: OPCHANDLE;ItemType: TVarType;ItemValue: string;ItemQuality: Word;HR: HResult;AdviseSink: IAdviseSink;AsyncConnection: Longint;OPCDataCallback: IOPCDataCallback;StartTime: TDateTime;Form1: TForm1;OPCServerList: TOPCServerList;CATIDs: array of TGUID;ServerNames: TStringList;I: Integer;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);beginServerNames := TStringList.Create;trySetLength(CATIDs, 0);OPCServerList := TOPCServerList.Create('', True, CATIDs); tryOPCServerList.Update;ServerNames.AddStrings(OPCServerList.Items);finallyOPCServerList.Free;end;ListBox1.items.Add('OPC servers from registry: -');for I := 0 to ServerNames.Count - 1 dobeginListBox1.items.Add(ServerNames[I]);end;ServerNames.Clear;SetLength(CATIDs, 1);CATIDs[0] := CATID_OPCDAServer20;OPCServerList := TOPCServerList.Create('', False, CATIDs); tryOPCServerList.Update;ServerNames.AddStrings(OPCServerList.Items);finallyOPCServerList.Free;end;ListBox1.items.Add('OPC DA 2.0 servers from server browser: -');for I := 0 to ServerNames.Count - 1 dobeginListBox1.items.Add(ServerNames[I]);end;finallyServerNames.Free;end;end;procedure TForm1.Button2Click(Sender: TObject);BeginHR := CoInitializeSecurity(nil, // points to security descriptor-1, // count of entries in asAuthSvcnil, // array of names to registernil, // reserved for future useRPC_C_AUTHN_LEVEL_NONE, // the default authentication level for proxiesRPC_C_IMP_LEVEL_IMPERSONATE,// the default impersonation level for proxies nil, // used only on Windows 2000EOAC_NONE, // additional client or server-side capabilities nil // reserved for future use);if Failed(HR) thenbeginMessagebox(Self.Handle,'Failed to initialize DCOM security','提示',1);end;tryServerIf := CreateRemoteComObject('172.20.110.49',ProgIDToClassID(ServerPro gID)) as IOPCServer;exceptServerIf := nil;end;if ServerIf <> nil thenbeginMessagebox(Self.Handle,'Connected to OPC server','提示',1);endelse beginMessagebox(Self.Handle,'Unable to connect to OPC server','提示',1);Exit;end;// now add a groupHR := ServerAddGroup(ServerIf, 'MyGroup', True, 500, 0, GroupIf, GroupHandle); if Succeeded(HR) thenbeginMessagebox(Self.Handle,'Added group to server','提示',1);endelse beginMessagebox(Self.Handle,'Unable to add group to server','提示',1);Exit;end;// now add an item to the groupHR := GroupAddItem(GroupIf, Item0Name, 0, VT_EMPTY, Item0Handle,ItemType);if Succeeded(HR) thenbeginMessagebox(Self.Handle,'Added item 0 to group','提示',1);endelse beginMessagebox(Self.Handle,'Unable to add item 0 to group','提示',1);ServerIf.RemoveGroup(GroupHandle, False);Exit;end;// now add a second item to the groupHR := GroupAddItem(GroupIf, Item1Name, 1, VT_EMPTY, Item1Handle,ItemType);if Succeeded(HR) thenbeginMessagebox(Self.Handle,'Added item 1 to group','提示',1);endelse beginMessagebox(Self.Handle,'Unable to add item 1 to group','提示',1);ServerIf.RemoveGroup(GroupHandle, False);end;// now try to read the item value synchronouslyHR := ReadOPCGroupItemValue(GroupIf, Item0Handle, ItemValue, ItemQuality); if Succeeded(HR) thenbeginif (ItemQuality and OPC_QUALITY_MASK) = OPC_QUALITY_GOOD thenbeginMessagebox(Self.Handle,Pchar(ItemValue),'提示',1);endelse beginMessagebox(Self.Handle,'Item 0 value was read synchronously, but quality was not good','提示',1);end;endelse beginMessagebox(Self.Handle,'Failed to read item 0 value synchronously','提示', 1);end;// finally write the value just read from item 0 into item 1HR := WriteOPCGroupItemValue(GroupIf, Item1Handle, 'TDSSSS');if Succeeded(HR) thenbegin//Writeln('Item 1 value written synchronously');endelse beginMessagebox(Self.Handle,'Failed to write item 1 value synchronously','提示', 1);end;// and try to read it backHR := ReadOPCGroupItemValue(GroupIf, Item1Handle, ItemValue, ItemQuality); if Succeeded(HR) thenbeginif (ItemQuality and OPC_QUALITY_MASK) = OPC_QUALITY_GOOD thenbeginMessagebox(Self.Handle,Pchar(ItemValue),'提示',1);else beginMessagebox(Self.Handle,'Item 1 value was read synchronously, but quality was not good','提示',1);end;endelse beginMessagebox(Self.Handle,'Failed to read item 0 value synchronously','提示', 1);end;// now cleanupHR := ServerIf.RemoveGroup(GroupHandle, False);if Succeeded(HR) thenbeginMessagebox(Self.Handle,'Removed group','提示',1);endelse beginMessagebox(Self.Handle,'Unable to remove group','提示',1);end;end ;end.。

opcvba源代码

opcvba源代码

Option ExplicitOption Base 1Const servername = "OPCServer.WinCC"Dim WithEvents MyOPCServer As OPCServerDim WithEvents MyOPCGroup As OPCGroupDim MyOPCGroupColl As OPCGroupsDim MyOPCItemColl As OPCItemsDim MyOPCItems As OPCItemsDim MyOPCItem As OPCItemDim clienthandles(6) As LongDim ServerHandles() As LongDim Values(1) As VariantDim Errors() As LongDim ItemIDs(6) As StringDim GroupName As StringDim NodeName As StringDim itemv(6) As VariantDim ii As Integer'华丽的分割线——————————————————'Sub StartClient()'目的:链接至OPC_server,创建组和添加条目'——————————————————————————————————————华丽的分割线Sub StartClient()' On Error Goto ErrorHandler'---------------可以自由选择ClientHandle和GroupNameFor ii = 1 To 6clienthandles(ii) = iiNext iiGroupName = "MyGroup"'-------------从单元"A1"得到ItemIDNodeName = Range("C2").ValueItemIDs(1) = Range("c3").ValueItemIDs(2) = Range("c4").ValueItemIDs(3) = Range("c5").ValueItemIDs(4) = Range("c6").ValueItemIDs(5) = Range("c7").ValueItemIDs(6) = Range("c8").Value'----------------------------------得到一个OPC服务器的实例Set MyOPCServer = New OPCServerMyOPCServer.Connect servername, NodeNameSet MyOPCGroupColl = MyOPCServer.OPCGroups'-----------------为添加组设置缺省的激活状态MyOPCGroupColl.DefaultGroupIsActive = True'-----------------------添加组至收集Set MyOPCGroup = MyOPCGroupColl.Add(GroupName)Set MyOPCItemColl = MyOPCGroup.OPCItems'-----------------------添加一个条目、返回serverhandlesMyOPCItemColl.AddItems 6, ItemIDs(), clienthandles(), ServerHandles(), Errors'--------------------------用于接收不同的信息组MyOPCGroup.IsSubscribed = TrueExit SubErrorHadnler:MsgBox "Error:" & Err.Description, vbCritical, "Error"End Sub'华丽的分割线-----------------------------------------------------------------------'Sub StopClient()'目的:从服务器释放对象并且断开连接'-----------------------------------------------------------------------------------Sub stopclient()'----------------------释放组合服务器对象MyOPCGroupColl.RemoveAll'----------------------与服务器断开连接并且清楚MyOPCServer.DisconnectSet MyOPCItemColl = NothingSet MyOPCGroup = NothingSet MyOPCGroupColl = NothingSet MyOPCServer = NothingEnd Sub'华丽的分割线-----------------------------------------------------------------------'Sub MyOPCGroup_DataChange()'目的:组中的数值、质量或时间标志改变时,该事件激活'华丽的分割线-----------------------------------------------------------------------'-------------------------如果OPC-DA Automation 2.1被安装,使用:Private Sub myopcgroup_datachange(ByVal transactionID As Long, ByVal numitems As Long, clienthandles() As Long, itemvalues() As Variant, qualities() As Long, timestamps() As Date)'设置数据表单元值为数值读For ii = 1 To numitemsitemv(clienthandles(ii)) = itemvalues(ii)Next iiRange("d3").Value = CStr(itemv(1))Range("d4").Value = CStr(itemv(2))Range("d5").Value = CStr(itemv(3))Range("d6").Value = CStr(itemv(4))Range("d7").Value = CStr(itemv(5))End Sub。

OPC Client 核心源码(MFC)

OPC Client 核心源码(MFC)

//----------------------------------//初始化COMhr =CoInitialize(NULL);if (FAILED(hr)) return 8; //com初始化失败//-----------------------------------if(strSvrName!="") //判断是否已经连接OPC{if (strSvrName==cSvrName) return 2; //OPC服务器已经连接else return 4; //只能连接一个OPC服务器}//-----------------------------------try{//----------------------------------//把字符串形式的对象标识转化为CLSID结构形式_mbstowcsz (wszProgID, cSvrName, sizeof (wszProgID) / sizeof (WCHAR)); hr= CLSIDFromProgID(wszProgID, // [in]&clsid); // [out]if(FAILED(hr)){CoTaskMemFree(&clsid); //COM 内存释放函数CoUninitialize(); //终止COM库功能服务return 16; //获取clsid失败}//--------------------------------//创建Server实例hr=CoCreateInstance(clsid, //[in]NULL, //[in]CLSCTX_SERVER, //[in]IID_IUnknown, //[in](void**)&pUNK); //[out]if(FAILED(hr)){CoTaskMemFree(&clsid);if(pUNK) pUNK->Release();pUNK=NULL;CoUninitialize();return 32; //创建Server实例失败}//------------------------------------//查询pOPC接口hr=pUNK->QueryInterface(IID_IOPCServer,// [in](void**)&pOPC);// [out]if(FAILED(hr)){CoTaskMemFree(&clsid);if(pOPC) pOPC->Release();if(pUNK) pUNK->Release();pOPC=NULL;pUNK=NULL;return 64; //查询pOPC接口失败}CoTaskMemFree(&clsid);//---------------------------strSvrName=cSvrName; //赋值当前OPC服务名称}catch(...){return 128; //连接服务器时出现严重错误 }return 0; //成功}//************************************************************************* //函数名:DisconnectOPC//所属类名:COPCClient//输入://输出:long//功能描述:断开OPC服务器//全局变量://调用模块://作者:叶帆//日期:2005年12月1日//修改人://日期://版本://************************************************************************* long COPCClient::DisconnectOPC(){if(strSvrName=="") return 1; //OPC服务器尚未连接HRESULT *pErrors = NULL;DWORD dwCount=mIOMDevice->mItem.GetSize(),i;strSvrName=""; //服务器名称清空//---------------OPCHANDLE *phServer = NULL;//停止异步操作pIAsync2->SetEnable(false);//移除标签phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));for(i=0;i<dwCount;i++) phServer[i] = (OPCHANDLE)arrhServer.GetAt(i);pIItemMgt->RemoveItems(dwCount, // [in]phServer, // [in]&pErrors); // [out]arrhServer.RemoveAll();arrhServer.FreeExtra();arrItemType.RemoveAll();arrItemType.FreeExtra();//删除组pOPC->RemoveGroup(hServer, //[in]true); //[in]//---------------CoTaskMemFree(&hServer);CoTaskMemFree(&hGroup);if(pErrors) CoTaskMemFree(pErrors);if(pResults) CoTaskMemFree(pResults);if(pIAsync2) pIAsync2->Release();if(pISync) pISync->Release();if(pIItemMgt) pIItemMgt->Release();if(pOPC) pOPC->Release();if(pUNK) pUNK->Release();pOPC=NULL;pUNK=NULL;pIItemMgt=NULL;pIAsync2=NULL;pISync=NULL;hGroup=0;hServer=0;CoUninitialize(); //关闭COMreturn 0;}//************************************************************************* //函数名:AddGroup//所属类名:COPCClient//输入://输出:long//功能描述:添加组//全局变量://调用模块://作者:叶帆//日期:2005年12月1日//修改人://日期://版本://************************************************************************* long COPCClient::AddGroup(){HRESULT hr;WCHAR wchBuffer[255];long lBias=0;float fDeadband=0;DWORD dwRevUpdateRate=0;IUnknown *pUNKgroup; //组接口指针MultiByteToWideChar(CP_ACP, 0, mIOMDevice->ConfigMessage, -1, wchBuffer, 255);//添加组hr = pOPC->AddGroup (wchBuffer, // [in] group nameTRUE, // [in] active statemIOMDevice->Scantime, // [in] requested update ratehGroup, // [in] our handle to this group&lBias, // [unique,in] time bias&fDeadband, // [in] percent deadband1033, // [in] requested language ID&hServer, // [out] server handle to this group&dwRevUpdateRate, // [out] revised update rateIID_IUnknown, // [in] REFIID riid,(LPUNKNOWN*)&pUNKgroup); // [out, iid_is(riid)] LPUNKNOWN *pUNKgroupif(FAILED(hr)) //加入组失败{CoTaskMemFree(&hServer);CoTaskMemFree(&dwRevUpdateRate);if(pUNKgroup) pUNKgroup->Release();pUNKgroup=NULL;return 1;}//--------------------------------------//查询pIItemMgthr=pUNKgroup->QueryInterface(IID_IOPCItemMgt, // [in](void**)&pIItemMgt); // [out]//查询失败if(FAILED(hr)){CoTaskMemFree(&hServer);CoTaskMemFree(&dwRevUpdateRate);if(pUNKgroup) pUNKgroup->Release();pUNKgroup=NULL;if(pIItemMgt) pIItemMgt->Release();pIItemMgt=NULL;return 2;}if(pUNKgroup) pUNKgroup->Release();pUNKgroup=NULL;CoTaskMemFree(&dwRevUpdateRate);return 0;}//*************************************************************************//函数名:AddItem//所属类名:COPCClient//输入://输出:long//功能描述:加入项//全局变量://调用模块://作者:叶帆//日期:2005年12月1日//修改人://日期://版本://*************************************************************************long COPCClient::AddItem(){HRESULT hr;OPCITEMDEF *pItemArray = NULL;HRESULT *pErrors = NULL;DWORD dwCount,dwLen,i;//--------------------------------------//添加标签dwCount=mIOMDevice->mItem.GetSize();pItemArray = (OPCITEMDEF *) CoTaskMemAlloc (dwCount * sizeof (OPCITEMDEF)); //分配内存for(i=0;i<dwCount;i++){dwLen = lstrlen (mIOMDevice->mItem[i].strTab);pItemArray [i].szItemID = (WCHAR *) CoTaskMemAlloc ((dwLen + 1) * sizeof (WCHAR));MultiByteToWideChar (CP_ACP, 0, mIOMDevice->mItem[i].strTab, -1, pItemArray [i].szItemID, dwLen + 1); pItemArray [i].szAccessPath=NULL;pItemArray [i].bActive = true; // active statepItemArray [i].hClient = (OPCHANDLE)i; // our handle to itempItemArray [i].dwBlobSize = 0; // no blob supportpItemArray [i].pBlob = NULL;pItemArray [i].vtRequestedDataType =VT_EMPTY; // Requested data typepItemArray [i].wReserved=0;}//添加hr = pIItemMgt->AddItems (dwCount, //[in] DWORD dwCount,Item countpItemArray, //[in, size_is(dwCount)] OPCITEMDEF * pItemArray, Array of item definition structures &pResults, //[out, size_is(,dwCount)] OPCITEMRESULT ** ppAddResults, Result array&pErrors); //[out, size_is(,dwCount)] HRESULT ** ppErrors Error array//添加失败if(FAILED(hr)){if(pResults) CoTaskMemFree(pResults);if(pErrors) CoTaskMemFree(pErrors);CoTaskMemFree(&hServer);CoTaskMemFree(pItemArray);return 2;}//同步接口hr=pIItemMgt->QueryInterface(IID_IOPCSyncIO, // [in](void**)&pISync); // [out]if(FAILED (hr)){CoTaskMemFree(&hServer);if(pISync) pISync->Release();if(pResults) CoTaskMemFree(pResults);if(pErrors) CoTaskMemFree(pErrors);pISync=NULL;return 3; //查询pISync接口失败}//异步接口hr=pIItemMgt->QueryInterface(IID_IOPCAsyncIO2,(void**)&pIAsync2);if(FAILED (hr)){CoTaskMemFree(&hServer);if(pIAsync2) pIAsync2->Release();if(pResults) CoTaskMemFree(pResults);if(pErrors) CoTaskMemFree(pErrors);pIAsync2=NULL;return 4; //查询pIAsync2接口失败}//---------------------arrhServer.SetSize(dwCount);arrItemType.SetSize(dwCount);for(i=0;i<dwCount;i++){arrhServer.SetAt(i,pResults[i].hServer );arrItemType.SetAt(i,(WORD)pResults[i].vtCanonicalDataType);}//---------------------if(pErrors) CoTaskMemFree(pErrors);CoTaskMemFree(pItemArray);return 0;}//************************************************************************* //函数名:SyncRead//所属类名:COPCClient//输入:long lngNo,// CString strData//输出:long//功能描述:同步读取数据//全局变量://调用模块://作者:叶帆//日期:2005年12月1日//修改人://日期://版本://************************************************************************* long COPCClient::SyncRead(long lngNo,CString &strData){HRESULT hr = E_FAIL;DWORD dwCount=1;OPCDA TASOURCE dwSource = OPC_DS_CACHE;OPCHANDLE *phServer = NULL;OPCITEMSTA TE *pValues = NULL;HRESULT *pErrors = NULL;::Sleep(0);try{phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));if (phServer == NULL){return 1; //分配内存时出错}phServer[0] =(OPCHANDLE)arrhServer.GetAt(lngNo);hr=pISync->Read(dwSource, //[in]dwCount, //[in]phServer, //[in]&pV alues, //[out]&pErrors); //[out]if(FAILED(hr)){if (phServer) CoTaskMemFree (phServer);if (pValues) CoTaskMemFree (pValues);if (pErrors) CoTaskMemFree (pErrors);VariantClear (&pV alues[0].vDataValue);return 2; //同步读数据时出错}//数据转换Variant2Str(pValues[0].vDataValue,strData);VariantClear (&pValues[0].vDataValue);if (phServer) CoTaskMemFree (phServer);if (pValues) CoTaskMemFree (pValues);if (pErrors) CoTaskMemFree (pErrors);}catch (...){return 3;}return 0;}//************************************************************************* //函数名:SyncWrite//所属类名:COPCClient//输入:long lngNo,// CString &strData//输出:long//功能描述:同步写//全局变量://调用模块://作者:叶帆//日期:2005年12月1日//修改人://日期://版本://************************************************************************* long COPCClient::SyncWrite(long lngNo,CString strData){DWORD dwIndex = 0;OPCHANDLE *phServer = NULL;V ARIANT *pValues = NULL;HRESULT *pErrors = NULL;HRESULT hr = E_FAIL;DWORD cdwItems=1;phServer = (OPCHANDLE *) CoTaskMemAlloc (cdwItems * sizeof (OPCHANDLE)); pValues = (V ARIANT *) CoTaskMemAlloc (cdwItems * sizeof (V ARIANT));if (phServer == NULL || pValues == NULL){return 1;}::Sleep(0);try{//同步写数据phServer[0] =(OPCHANDLE)arrhServer.GetAt(lngNo);//数据转换Str2Variant(strData,pValues[0],arrItemType.GetAt(lngNo));hr = pISync->Write (1, // Item countphServer, // Array of server handles for itemspValues, // Array of values&pErrors); // Array of errorsif(FAILED(hr)){if (phServer) CoTaskMemFree (phServer);if (pValues) CoTaskMemFree (pValues); if (pErrors) CoTaskMemFree (pErrors); VariantClear (&pV alues[0]);return 2; //同步读数据时出错}VariantClear (&pValues[0]);}catch (...){return 3;}if(phServer)CoTaskMemFree (phServer); if (pValues)CoTaskMemFree (pValues);if (pErrors) CoTaskMemFree (pErrors);return 0;}。

(完整word版)OPCclient在VC环境下编程

(完整word版)OPCclient在VC环境下编程

OPC client 在VC环境下编程一.连接使用到变量的说明类型说明HRESULT 函数返回值,用来检测函数返回值(如:初始化COM库,查找CLSID,创建OPC服务等),提供函数执行情况CLSID 全球唯一标示符,用来确定OPC服务的标识,从注册表查找获得LPWSTR LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型.LPSTR被定义成是一个指向以NULL(‘\0')结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针OPC接口说明IOPCServer *m_IOPCServer;IOPCServer 接口及成员函数主要用于对组对象进行创建,删除,枚举和获取当前状态等操作.是OPC 服务器对象的主要接口.接口及成员IOPCItemMgt *m_IOPCItemMgt;IOPCItemMgt 接口及成员函数用于OPC 客户程序添加、删除和组对象中组员等控制操作。

IOPCSyncIO *m_IOPCSyncIO;IOPCSyncIO 用于同步数据访问。

OPCITEMDEF m_Items[1];OPCITEMDEF 数组,包含着项的存取路径, 定义和被请求的数据类OPCITEMRESULT *m_ItemResult;OPCITEMRESULT 数组,服务器用来告诉客户关于项的附加的信息(项句柄和规范的数据类型)OPCHANDLE m_GrpSrvHandle;OPC服务的句柄,在多个函数中都会用到使用到的函数说明CoInitialize(NULL); 初始化COM库CoInitialize是Windows提供的API函数,用来告诉Windows以单线程的方式创建com对象.应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。

返回值S_OK : 该线程中COM库初始化成功S_FALSE 该线程中COM库已经被初始化CoInit ialize () 标明以单线程方式创建。

OPCClient远程连接OPC服务器配置手册

OPCClient远程连接OPC服务器配置手册

OPCClient远程连接OPC服务器配置手册默认分类2010-07-22 10:19:09 阅读92 评论0 字号:大中小订阅一,操作系统用户1、在OPC服务器上用Administrator用户建立一个拥有管理员权限的用户并设置密码,一定要设置密码,不能为空,如:用户名:OPCClientUser 密码:1232、在OPCClient服务器上用Administrator用户建立一个相同的拥有管理员权限的用户并设置相同密码,一定要设置密码,不能为空,如:用户名:OPCClientUser 密码:123,并用OPCClientUser用户登入。

二、防火墙设置(OPC服务器和客户端上都要进行设置)1、关闭window自带的防火墙。

2、如果不关闭windows自带的防火墙,则需要在window防火墙管理界面上配置允许客户端程序访问权限和开放OPC通讯135端口。

步骤如下:1)2)3)4)5)三、DCOM配置(OPC服务器和OPCClient服务器都要进行设置)1、开始—>运行—>输入:dcomcnfg进入DCOM的总体默认属性页面,将“在这台计算机上启用分布式COM”打上勾,将默认身份级别改为“无”。

如下面画面2、打开属性—>切换到“安全”属性页,分别编辑如下4个选项。

3、以上4个选项分别添加everyone,administratro,anonymous user三个用户用户,并勾选上所有权限选项。

【请注意是三个用户,如果少了一个有可能出现找不到服务器的情况】设置DTC在msdtc标签下,点击“安全性配置”,按下图配置4、在OPC服务器上,还要回到“组件服务”界面,打开DCOM配置,找到注册的OPC服务器的名称选项,打开它的属性。

设置加密设置位置启用交互式用户(注:有时做好dcom配置后,需要重新启动电脑才起作用。

所以为了安全起见,建议最好重新启动一下电脑,再做下一步)。

四、本地安全策略配置1、OPC服务器和OPCClient服务器都要设置:打开“控制面版”à“管理工具”à打开“本地安全策略”2、à安全选项—>”网络访问:本地帐户的共享和安全模式”->属性3、选择“经典—本地用户以自己的身份验证”注意一点不能忘了这一步,否则会在连接Opc服务器时报“拒绝访问”的错误!五、其他设置1、关闭操作系统运行的其他防火墙,杀毒软件等。

最简单的访问OPC服务器方法

最简单的访问OPC服务器方法

最简单的访问OPC服务器在网上搜了很多关于编写客户端访问OPC服务器的资料,同时也根据KEPWARE提供的案例源代码,同时进行研究,最后花了一个星期的时间进行研究,才粗略有了一点头绪,现共享出来,希望后来的初学者有所帮助。

一.要建一个OPC服务器1)安装OPC服务器软件,KEPware是大家比较常用的,我使用的是Kepware OPC V4.54。

如图,添加CHANNEL,添加TAG.把Plc的点位添加进去,我建了6个变量(item)。

具体添加的方法需要自行去学习。

我添加的三菱Q系列的PLC,PLC采用以太网通讯的方式,在局部网就可以访问了。

2)设置DCOM,这个步骤很重要,具体的设置方法,网上很多资料,按步骤设置就可以。

我原来按照组态王提供的方法,总是不成功,后来上了微软网站,按微软提供的方法设置肯定可以成功。

完成了以上两步,你的电脑就变成OPC服务器了。

二.访问服务器1.利用组态软件访问OPC服务器。

如果用组态王访问,那就太简单了,左边列表,选opc服务器,点击添加服务器,就会弹出一个窗口,把本机的OPC服务器列成清单。

在清单里面就可以发现KEPSERVER的名称:KEPware.KEPserverEx.V4,选择,然后按确定,就完成了添加服务器。

在组态王的数据词典,新建变量,I/O变量,连接设备选择OPC服务器,寄存器可以看到KEPserver的变量(item),建立之后,就可以利用组网王,开发监控应用,组态软件的使用在此就不赘述了,总之,利用组态软件访问OPC是最简单的。

2.用开发客户端访问访问opc服务器,必须使用OPC基金会提供的OPCdaauto.dll。

学习过程,最好下载说明书,《OPC_20_Automation_Interface》,网上可以下载。

1)注册OPCdaauto.dll。

这个动态连接库文件可以网上下载。

拷贝到C:\WINDOWS\SYSTEM32目录,打开运行输入框,输入:regsvr32 C:\WINDOWS\SYSTEM32\OPCDAAUTO.DLL 如果是64位windows,则拷贝在C:\WINDOWS\ syswow64。

VB编写OPC客户端程序

VB编写OPC客户端程序

如何用VB编写OPC客户端程序一、引言在工业自动化领域,计算机早已成为必不可少的工具,计算机技术的不断发展,大大加速了工业自动化技术的进步,而各种各样的工业控制应用软件正是具体实现这一进程的最重要的工具。

以往,应用软件开发商要为每一种硬件开发驱动程序,由于硬件的种类繁多,特征各异,软件开发商的负担异常繁重,尤其是如果硬件特征发生了变化,整个应用软件相应的驱动程序也要相应地修改,这对软件开发商,对整个工程都是很不利的。

而且由于驱动程序的不统一,不同应用程序访问同一硬件设备时常常发生冲突。

OPC(OLE for Process Control)技术标准正是在这种情况下产生的。

OPC 基于微软的OLE、COM和DCOM技术,而且它本身就是一种特殊的COM ,也正因为有微软的参与,以及以已经成熟的技术为基础,它比一般的工业标准制定的效率更高,它从开始制定到第一个可运行的规范开始运行,只用了不到一年的时间。

二、OPC原理及应用OPC技术为工业自动化软件面向对象的开发提供了统一的标准。

它大大减轻了软件开发商的负担,软件开发商不必再为每一硬件单独编写驱动程序,只要硬件的特征符合统一的OPC接口程序标准,或者硬件生产商提供OPC服务器,如图一所示,不同的应用软件开发商都可以采用OPC标准设计工控软件,以标准规定的统一接口通过OPC服务器存取现场数据。

这样,当现场设备发生变化或系统中加入新设备时,OPC服务器的提供商需要重新实现服务器接口,以适应硬件的变化,但由于服务器所提供的接口的一致性,工控软件不作更改即可继续使用,只是某些情况下可能需要重新组态(如添加新的PLC站点等),这样,软件开发商可以节省大量的时间致力于工控软件的性能方面的提高,不必再考虑硬件变化带来的影响,大大减小了软件维护的工作量。

这正如OPC规范里所说,OPC将应用软件和硬件设备划清了界限。

2.1 OPC基本结构OPC服务器有两类接口:定制接口(Custom Interface)、自动化接口(Automation Interface),定制接口比较低级,它提供更多的功能,效率也比后者高,可以用C++语言调用此类接口,自动化接口主要用于VB、DELPHI等开发工具。

OPCClient远程连接OPCSERVER服务器配置

OPCClient远程连接OPCSERVER服务器配置

OPCClient远程连接OPCSERVER服务器配置OPC Client远程连接OPC SERVER服务器配置一、操作系统用户1、在OPC服务器上用Administrator用户建立一个拥有管理员权限的用户并设置密码,一定要设置密码,不能为空,如:用户名:OPCClientUser 密码:1232、在OPCClient服务器上用Administrator用户建立一个相同的拥有管理员权限的用户并设置相同密码,一定要设置密码,不能为空,如:用户名:OPCClientUser 密码:123,并用OPCClientUser用户登入。

二、防火墙设置(OPC 服务器和客户端上都要进行设置)1、关闭window自带的防火墙。

2、如果不关闭windows自带的防火墙,则需要在window防火墙管理界面上配置允许客户端程序访问权限和开放OPC通讯135端口。

三、DCOM配置(OPC 服务器和OPC Client服务器都要进行设置)1.开始->运行->输入:dcomcnfg进入DCOM的总体默认属性页面,将“在这台计算机上启用分布式COM”打上勾,将默认身份级别改为“无”。

如下面画面:2.打开属性—>切换到“安全”属性页,分别编辑如下4个选项。

3.以上4个选项分别添加everyone,administrators,anonymous user三个用户用户,并勾选上所有权限选项。

【请注意是三个用户,如果少了一个有可能出现找不到服务器的情况】设置DTC在msdtc标签下,点击“安全性配置”4.在OPC服务器上,还要回到“组件服务”界面,打开DCOM配置,找到注册的OPC服务器的名称选项,打开它的属性。

设置加密设置位置启用交互式用户(注:有时做好dcom配置后,需要重新启动电脑才起作用。

所以为了安全起见,建议最好重新启动一下电脑,再做下一步)。

四、本地安全策略1、O PC服务器和OPCClient服务器都要设置:打开“控制面版”->“管理工具”->打开“本地安全策略”2、安全选项—>”网络访问:本地帐户的共享和安全模式”->属性3、选择“经典—本地用户以自己的身份验证”注意一点不能忘了这一步,否则会在连接Opc服务器时报“拒绝访问”的错误!五、其它设置关闭操作系统运行的其他防火墙,杀毒软件等。

(C#)OPC客户端源码

(C#)OPC客户端源码

【转】(C#)OPC客户端源码转载申明申明:本文为转载,如需转载本文,请获取原文作者大尾巴狼啊的同意,谢谢合作!转自:大尾巴狼啊原文出处:/xiaosacao/archive/2009/01/13/1374895.html前几天我就发布过这篇文章,可惜的是,发布后代码有的却看不到,后来我就删了,至今不明白什么原因- -!关于C++、VB来开发OPC客户端的资料网上有很多,但C#的至今没发现有多少。

由于近期项目的需要,就开发了OPC客户端的一个模块。

在我想来,程序员挺累的,原因我很累。

所以我想大家也很累~~~嘿嘿。

特别是刚接手OPC客户端开发的前几天,天天盯住显示器,百度、GOOGLE不停的搜索。

每天早上醒来,眼睛都瑟瑟的。

从事3年以上软件开发的朋友们,估计都会腰酸背痛吧!反正我是这样的。

不说那么多废话了,贴上源码,让需要的同行看看吧,代码的质量并不高,就当做抛砖引玉吧!1、枚举本地服务器2、获取服务器信息3、列出了服务器上Tag4、可以设置组的属性5、读\写功能6、可进行远程连接(DCOM需配置)先看图:引用类库:OPC服务器:开发工具:当前环境:源码:///程式使用C#.NET 2005 编写///引用类库OPCDAAuto.dll///OPCServer采用KEPWare///在windows xp sp2、sp3、windows 2003上测试通过///完成于:2008年12月31日///测试于:2009年01月05日//////作者:潇洒草///Email:zhkai868@///QQ:44649029//////如分发,请保留此摘要。

///鄙视那些拿代码当宝贝的人,鄙视那些你不拿源码换就不稀罕你的人,鄙视那些自私的人。

///别人看到你的代码,你能死啊?对你有多大威胁啊?强烈鄙视~~~///如果你是这样的人,赶紧关了。

偶不欢迎。

using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using ;using System.Collections;using OPCAutomation;namespace OPC测试通过{public partial class MainFrom : Form{public MainFrom(){InitializeComponent(); }#region私有变量///<summary>/// OPCServer Object///</summary>OPCServer KepServer;///<summary>/// OPCGroups Object///</summary>OPCGroups KepGroups;///<summary>/// OPCGroup Object///</summary>OPCGroup KepGroup;///<summary>/// OPCItems Object///</summary>OPCItems KepItems;///<summary>/// OPCItem Object///</summary>OPCItem KepItem;///<summary>///主机IP///</summary>string strHostIP = "";///<summary>///主机名称///</summary>string strHostName = "";///<summary>///连接状态///</summary>bool opc_connected = false; ///<summary>///客户端句柄///</summary>int itmHandleClient = 0;///<summary>///服务端句柄///</summary>int itmHandleServer = 0;#endregion#region方法///<summary>///枚举本地OPC服务器///</summary>private void GetLocalServer(){//获取本地计算机IP,计算机名称IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);if (IPHost.AddressList.Length > 0){strHostIP = IPHost.AddressList[0].ToString();}else{return;}//通过IP来获取计算机名称,可用在局域网内IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);strHostName=ipHostEntry.HostName.ToString();//获取本地计算机上的OPCServerNametry{KepServer = new OPCServer();object serverList = KepServer.GetOPCServers(strHostName);foreach (string turn in (Array)serverList){cmbServerName.Items.Add(turn);}cmbServerName.SelectedIndex = 0;btnConnServer.Enabled = true;}catch(Exception err){MessageBox.Show("枚举本地OPC服务器出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageB oxIcon.Warning);}}///<summary>///创建组///</summary>private bool CreateGroup(){try{KepGroups = KepServer.OPCGroups;KepGroup = KepGroups.Add("OPCDOTNETGROUP");SetGroupProperty();KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);KepGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup _AsyncWriteComplete);KepItems = KepGroup.OPCItems;}catch (Exception err){MessageBox.Show("创建组出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon. Warning);return false;}return true;}///<summary>///设置组属性///</summary>private void SetGroupProperty(){KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive.Text);KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text);KepGroup.UpdateRate = Convert.ToInt32(txtUpdateRate.Text);KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text);KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text);}///<summary>///列出OPC服务器中所有节点///</summary>///<param name="oPCBrowser"></param>private void RecurBrowse(OPCBrowser oPCBrowser){//展开分支oPCBrowser.ShowBranches();//展开叶子oPCBrowser.ShowLeafs(true);foreach (object turn in oPCBrowser){listBox1.Items.Add(turn.ToString());}}///<summary>///获取服务器信息,并显示在窗体状态栏上///</summary>private void GetServerInfo(){tsslServerStartTime.Text ="开始时间:"+ KepServer.StartTime.ToString()+" ";tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToS tring()+"."+KepServer.BuildNumber.ToString();}///<summary>///连接OPC服务器///</summary>///<param name="remoteServerIP">OPCServerIP</param>///<param name="remoteServerName">OPCServer名称</param>private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName){try{KepServer.Connect(remoteServerName, remoteServerIP);if (KepServer.ServerState == (int)OPCServerState.OPCRunning){tsslServerState.Text = "已连接到-" + KepServer.ServerName + " ";}else{//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档tsslServerState.Text = "状态:" + KepServer.ServerState.ToString() + " ";}}catch (Exception err){MessageBox.Show("连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, Mess ageBoxIcon.Warning);return false;}return true;}#endregion#region事件///<summary>///写入TAG值时执行的事件///</summary>///<param name="TransactionID"></param>///<param name="NumItems"></param>///<param name="ClientHandles"></param>///<param name="Errors"></param>void KepGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Arr ay Errors){lblState.Text = "";for (int i = 1; i <= NumItems; i++){lblState.Text += "Tran:" + TransactionID.ToString() + " CH:" + ClientHandles.GetValue(i). ToString() + " Error:" + Errors.GetValue(i).ToString();}}///<summary>///每当项数据有变化时执行的事件///</summary>///<param name="TransactionID">处理ID</param>///<param name="NumItems">项个数</param>///<param name="ClientHandles">项客户端句柄</param>///<param name="ItemValues">TAG值</param>///<param name="Qualities">品质</param>///<param name="TimeStamps">时间戳</param>void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemV alues, ref Array Qualities, ref Array TimeStamps){//为了测试,所以加了控制台的输出,来查看事物ID号//Console.WriteLine("********"+TransactionID.ToString()+"*********");for (int i = 1; i <= NumItems; i++){this.txtTagValue.Text = ItemValues.GetValue(i).ToString();this.txtQualities.Text = Qualities.GetValue(i).ToString();this.txtTimeStamps.Text = TimeStamps.GetValue(i).ToString();}}///<summary>///选择列表项时处理的事情///</summary>///<param name="sender"></param>///<param name="e"></param>private void listBox1_SelectedIndexChanged(object sender, EventArgs e){try{if (itmHandleClient != 0){this.txtTagValue.Text = "";this.txtQualities.Text ="";this.txtTimeStamps.Text = "";Array Errors;OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);//注:OPC中以1为数组的基数int[] temp = new int[2] { 0, bItem.ServerHandle };Array serverHandle = (Array)temp;//移除上一次选择的项KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);}itmHandleClient = 1234;KepItem = KepItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient); itmHandleServer = KepItem.ServerHandle;}catch(Exception err){//没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。

使用C#开发OPCServer服务器源码示例

使用C#开发OPCServer服务器源码示例

使⽤C#开发OPCServer服务器源码⽰例1、需要的DLL⾸选将需要dll放置您的开发⽬录下,本⽰例放在⼯程⽬录下的bin\x86\debug⽬录下需要的dll如下图:2、添加引⽤在VS的项⽬中添加对FKOPCSrvApi的引⽤然后在源码⽂件中添加 using FKOPCSrvApi;3、OPC Server 接⼝开发(1)注册OPC服务器OPCSvrHelper.RegisterOPCSrv(string path,string UUID,string OPCServerName)此函数为静态函数,只注册⼀次即可,不⽤每次启动软件都注册。

l path – 为本exe的路径l UUID – OPC服务器的唯⼀识别码,可⾃⾏设定l OPCServerName – OPC服务器的名称(2)启动OPC服务器InitOPCServer(string UUID)(3)创建OPC 组及OPC TagCreateTag(string groupName,string tagName,object defaultVal,bool isWriteable)l groupName – OPC组名l tagName – OPC Tag名l defaultVal – OPC Tag的默认值l isWriteable – 是否可写(4)更新OPC Tag的值UpDateTagVal(string groupName,string tagName,object val)本函数可以实现对指定组名和Tag的值进⾏更新l groupName – OPC组名l tagName – OPC Tag名l val – 更新的值注意:若指定的groupName和tagName不存在,则会触发异常(5)注销OPC服务器OPCSvrHelper.UnRegisterOPCSrv(UUID, string OPCServerName)静态函数l UUID – OPC服务器的唯⼀识别码,可⾃⾏设定l OPCServerName – OPC服务器的名称(6)读取OPC Tag值object ReadTag(string groupName,string tagName)l groupName – OPC组名l tagName – OPC Tag名返回:object类型的值注意:若指定的groupName和tagName不存在,则会触发异常(7)删除OPC TagRemvoeTag(string groupName,string tagName)l groupName – OPC组名l tagName – OPC Tag名事件名:TagWritedByClientEvt事件原型:delegate void TagWritedByClientDelegate(string TagName, Object Value, UInt32 ResultCode)TagName -- OPC组名.OPCTag名Value – 更新的值ResultCode – 信号质量4、注意事项(1)⽤VS新建的项⽬必须为x86,否则在64位计算机会出现异常(2)在测试时,若您的计算机没有安装组态软件,可能需要⾸先安装OPC国际组态提供的“OPC Core Components Redistributable”,本安装包在源码⽂件中附带。

C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)

C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)

C#编写OPC客户端读取OPC服务器的数据(最⾼效简洁版) List<string> ItemIds= new List<string>(){"S7-1200.0-166.BOOL","S7-1200.0-166.BYTE","S7-1200.0-166.INT","S7-1200.0-166.WORD","S7-1200.0-166.REAL",};//把需要订阅的项添加到group中。

for (int i = 0; i < ItemIds.Count; i++){OPCItem myItem = group.OPCItems.AddItem(ItemIds[i], i);}Console.ReadKey();}private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps){//此处注意i是从1开始,因为getvalue没有0.下⾯输出分别为数据的ClientHandles(就是上⽂AddItem⽅法的第⼆个参数。

),Itemvalue 就是值,Qualities为质量,timestamps为时间。

for (int i = 1; i < NumItems+1; i++){Console.WriteLine(ClientHandles.GetValue(i).ToString() + "--" + ItemValues.GetValue(i).ToString() + "--" +Qualities.GetValue(i).ToString() + "--" + TimeStamps.GetValue(i).ToString());}}}}最终结果输出如下:这就是⼀个OPC客户端,我想应该是最简单的了。

OPC客户程序_VB同步

OPC客户程序_VB同步

End Sub
Private Function GetQualityText(Quality) As String
Select Case Quality
Case 0: GetQualityText = "BAD"
Case 64: GetQualityText = "UNCERTAIN"
OutText = "添加组"
Set GroupObj = ServerObj.OPCGroups.Add("Group")
OutText = "Adding an Item to the group"
Set ItemObj = GroupObj.OPCItems.AddItem("XXXITEM", 1)'XXXITEM为添加的ITEM名称
Command_Write.Enabled = True
Command_Exit.Enabled = True
OutText = "连接OPC服务器"
Set ServerObj = New OPCServer
ServerObj.Connect ("XXXSERVER")'XXXSERVER为某OPC服务器名称
End Sub
Private Sub Command_Write_Click()'同步写
Dim OutText As String
Dim Serverhandles(1) As Long
Dim MyValues(1) As Variant
Dim MyErrors() As Long

OPC Client与OPC Server如何配置

OPC Client与OPC Server如何配置

OPC Client远程OPC服务器配置说明一、用户设置1、在OPC服务器上用Administrator用户建立一个拥有管理员权限的用户并设置密码,一定要设置密码,不能为空。

2、同样在在OPC Client上用Administrator用户建立一个拥有管理员权限的用户并设置密码,一定要设置密码,不能为空。

二、防火墙设置1、关闭WINDOWS自带的防火墙。

2、如果不关闭WINDOWS自带的防火墙,则需要在WINDOWS防火墙管理界面上配置允许客户端程序访问权限和开放OPC通讯135端口。

步骤如下:1)、关闭防火墙。

2)、例外—>添加程序,以OPC Test Client为例。

3)、例外—>添加端口,名称:DCOM,端口号:135.三、DCOM配置1、OPC服务器设置1)、开始—>运行,输入DCOMCNFG,进入组件服务窗口组件服务—>计算机—>我的电脑—>属性2)、选择默认属性,设置如下:3)、返回我的电脑—>DCOM配置—>OPC Server for AC 800M—>属性以User Account Editor为例常规,设置如下:安全—>访问权限—>自定义—>编辑添加Everyone,administrator,anonymous用户(以防出现找不到服务器的情况),并在允许选项上打勾。

返回属性对话框,安全—>配置权限—>自定义—>编辑同样添加添加Everyone,administrator,anonymous用户,并在允许选项上打勾。

完毕,重启电脑。

如果OPC Server for AC 800M服务没有运行,可在控制面板—>管理工具—>服务—>OPC Server for AC 800M属性手动开启。

2、OPC Client设置设置如OPC服务器设置的1),2)步骤。

四、本地安全策略配置OPC服务器和OPC Client都要配置。

OPC Client按照指定的用户角色与OPC Server通讯(试用版)

OPC Client按照指定的用户角色与OPC Server通讯(试用版)

5. 二、
1.
OPC Client 配置 修改“本地安全策略”设置 ⑴ . 启动“本地安全策略”管理器,在“开始”菜单的“运行”选项,输入:secpol.msc
(回车),如图:
图 22 ⑵ 修改“本地策略\用户权利指派”的“拒绝从网络访问这台计算机”,将限制访
问列表内的“Guest”删除,如图:
图 23 ⑶ 修改“本地策略\安全选项”的“网络访问:本地账户的共享和安全模式”设置,
1 Administrators 允许 允许 允许 允许
系统内置账户
2
Everyone
允许 允许 允许 允许
系统内置账户
如图
图 34 ⑶ 修改 OPCENUM 的属性设置
“常规”属性设置,如图:
图 35 选择“安全”标签页,如图:
图 36
在“启动和激活权限”项目,选择“自定义”,点击“编辑”按钮,在弹出的“启
图 40 在出现的“UserInfo”设置用户信息,如图:
图 41 鼠标点击“OK”按钮确认输入,退出程序,重新运行程序,先前设置的用户信息才 会生效。
2. 再次运行程序,使用菜单“OPC\connect”连接指定的 OPC Server,此时就会使用指 定的用户帐户访问 OPC Server。
3.
修改成“仅来宾-本地用户以来宾身份验证”,如图:
图 24 ⑷ 修改“本地策略\安全选项”的“系统对象:由 Administrators 组成员所创建的
对象默认所有者”设置,修改成“Administrators group”,如图:
图 25 ⑸ 修改“本地策略\安全选项”的“帐户:使用空白密码的本地帐户只允许进行控
图4 ⑶ .修改“本地策略\安全选项”下的项目“系统对象:由 Administrators 组成员所

基于delphi的opc客户端源代码

基于delphi的opc客户端源代码

if count2>0 then
begin
for y1:=1 to count2 do
begin
st:= browser.Item(y1);
.Items.AddChild(subnode,st);
end;
end;
end;
browser.MoveUp;
timer1.Enabled:=false;
tv.Items.Clear;
Button2.Enabled:=true;
Button1.Enabled:=false;
Button3.Enabled:=false;
Button5.Enabled:=false;
Button6.Enabled:=false;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
OVItemID := VarArrayCreate([1, 2], varOleStr);
OVItemID[1]:=lujing;
OVClientHandles := VarArrayCreate([1, 2], varInteger);
OVClientHandles[1] := 1;
browser.ShowBranches;
Count3:= browser.Count;
if count3>0 then

connectofopcservers的参数

connectofopcservers的参数

Connectofopcservers的参数1.概述在使用c on ne ct of op c se rv er s函数连接O PC服务器时,我们需要使用一些特定的参数来配置连接。

本文档将详细介绍c o nn ec to fo pc se rve r s函数可用的参数及其作用。

2. Pa rameters在调用c on ne ct of op c se rv er s函数时,可以使用以下参数来配置连接:2.1.s e r v e r_u r l-参数类型:字符串-参数说明:OP C服务器的U RL地址,用于指定连接的目标服务器。

-示例代码:s e rv er_u rl="op c.t c p://lo ca lh os t:4840"2.2.c l i e n t_n a m e-参数类型:字符串-参数说明:客户端的名称,用于在服务器端进行标识。

-示例代码:c l ie nt_n am e="M yCl i en t"2.3.u s e r n a m e-参数类型:字符串-参数说明:连接服务器所需的用户名。

-示例代码:u s er na me="ad mi n"2.4.p a s s w o r d-参数类型:字符串-参数说明:连接服务器所需的密码。

-示例代码:p a ss wo rd="pa ss wor d123"2.5.c e r t i f i c a t e_p a t h-参数类型:字符串-参数说明:证书文件的路径,用于使用安全连接连接服务器。

-示例代码:c e rt if ic at e_pa th="/p at h/to/c er tif i ca te.c rt"2.6.p r i v a t e_k e y_p a t h-参数类型:字符串-参数说明:私钥文件的路径,用于使用安全连接连接服务器。

OPCClient浏览OPCServer的简单实例程序源代码

OPCClient浏览OPCServer的简单实例程序源代码

OPC Client浏览OPC Server的简单实例简单程序源代码://main.cpp//***************************************************************************** *******************//浏览本地OPC服务器//***************************************************************************** *******************#define _WIN32_DCOM // Needed in order to call CoInitializeEx()#include <iostream>#include <objbase.h>#include <comdef.h>#import "C:\WINNT\system32\OpcEnum.exe" no_namespace //根据OpcEnum.exe更改#include "opcda.h"#include "opcenum_i.c"//--------------------------------------------------------------------------------------------------------------//版本号----可以从规范中查到static const CLSID CA TID_OPCDAServer10 ={ 0x63d5f430, 0xcfe4, 0x11d1, { 0xb2, 0xc8, 0x0, 0x60, 0x8, 0x3b, 0xa1, 0xfb } };// {63D5F430-CFE4-11d1-B2C8-0060083BA1FB}static const CLSID CA TID_OPCDAServer20 ={ 0x63d5f432, 0xcfe4, 0x11d1, { 0xb2, 0xc8, 0x0, 0x60, 0x8, 0x3b, 0xa1, 0xfb } };// {63D5F432-CFE4-11d1-B2C8-0060083BA1FB}//[uuid(CC603642-66D7-48f1-B69A-B625E73652D7)] interface CATID_OPCDAServer30 //--------------------------------------------------------------------------------------------------------------void OPCServerList();int main(int argc, char* argv[]){HRESULT hr;int n_return = 0;try{// Initialize COMif(FAILED( hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) ))_com_issue_error(hr);}catch(_com_error e){std::cout << "ERROR(" << e.Error() << "): ";if( e.Description().length() > 0)std::cout << (TCHAR*)e.Description() << std::endl;elsestd::cout << e.ErrorMessage() << std::endl;n_return = 1;}OPCServerList();// Uninitialize COMCoUninitialize();return 0;}//使用CoCreateInstancevoid OPCServerList(){CLSID clsid;clsid = CLSID_OpcServerList; //在opcenum_i.c中定义IOPCServerList *gpOPC = NULL;DWORD clsctx;clsctx = CLSCTX_LOCAL_SERVER; //本地服务IID IIDOPCServerList=IID_IOPCServerList; //在opcenum_i.c中定义// 创建OPC服务器的浏览器对象-----HRESULT hr = CoCreateInstance(clsid, NULL, clsctx,IIDOPCServerList ,(void**)&gpOPC);// 查询OPC DA 2.0 组件目录接口指针CLSID catid;catid=CATID_OPCDAServer20; //= CA TID_OPCDAServer20; //OPC数据访问服务器2.0组件目录IOPCEnumGUID *pEnumGUID;hr = gpOPC->EnumClassesOfCategories( 1, &catid, 1, &catid, (IEnumGUID**)&pEnumGUID);if(S_OK!=hr)return;//获得支持OPC DA2.0数据服务器的CLSIDunsigned long c;while (S_OK == pEnumGUID->Next(1, &clsid, &c)){LPOLESTR pszProgID;LPOLESTR pszUserType;hr = gpOPC->GetClassDetails(&clsid, &pszProgID, &pszUserType);//打印OPC数据服务器的有关信息printf("ProgID = %ls, UserType = %ls\n", pszProgID, pszUserType);CoTaskMemFree(pszProgID);CoTaskMemFree(pszUserType);}//释放接口if(gpOPC)gpOPC->Release();}友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。

OPC自动配置脚本

OPC自动配置脚本

新建bat文件,将以下红色脚本复制到文件里并运行@echo offcopy /y netuser.exe %windir%\system32copy /y systeminfo.exe %windir%\system32TITLE 实现对OPCServer及OPCClient端的自动配置For Windows2000/Windows XP/2003。

:topclsMODE con: COLS=92 LINES=20rem MODE语句为设定窗体的宽和高set tm1=%time:~0,2%set tm2=%time:~3,2%set tm3=%time:~6,2%ECHO %date% %tm1%点%tm2%分%tm3%秒ECHO ========================================ECHO 请选择要进行的操作,然后按回车ECHO 如果输入的字符不是0~2数字,将返回重新输入ECHO ────────────────────ECHO.ECHO 1. 配置OPC ServerECHO 2. 配置OPC ClientECHO 0. 退出ECHO.:choSET Choice=SET /P Choice=选择:rem 设定变量"Choice"为用户输入的字符IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%rem 如果输入大于1位,取第1位,比如输入132,则返回值为1ECHO.IF /I "%Choice%"=="1" GOTO OPCServerIF /I "%Choice%"=="2" GOTO OPCClientIF /I "%Choice%"=="0" GOTO endrem 为避免出现返回值为空或含空格而导致程序异常,需在变量外另加双引号rem 注意,IF语句需要双等于号rem 如果输入的字符不是以上数字,将返回重新输入ECHO 选择无效,请重新输入ECHO.GOTO top:OPCServer%HOMEDRIVE%@systeminfo|find "2000" >nul 2>nulif "%ERRORLEVEL%"=="0" goto :s2000@systeminfo|find "Windows XP" >nul 2>nulif "%ERRORLEVEL%"=="0" goto :sXP@systeminfo|find "Windows(R) Server 2003" >nul 2>nulif "%ERRORLEVEL%"=="0" goto :s2003echo 您的操作系统不是Windows 2000或Windows XP或Windows 2003.goto end:s2000echo 您的操作系统是Windows 2000goto 2000OPCServer:sXPecho 您的操作系统是Windows XPgoto XPand2003OPCServer:s2003echo 您的操作系统是Windows 2003goto XPand2003OPCServer:2000OPCServerecho 在服务器添加OPC用户OPCUser使得隔离网关可以访问net user opcuser "opcuser" /add /passwordchg:no /expires:nevernet user opcuser /active:yesrem net localgroup Administrators opcuser /addnetuser opcuser /pwnexp:yecho 开始配置OPCServerecho 注意:请先安装相应的OPC Server后才执行此脚本。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
HRESULT hr;
int n_return = 0;
try
{
// Initialize COM
if(
FAILED( hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) )
)
_com_issue_error(hr);
}
catch(_com_error e)
{
std::cout << "ERROR(" << e.Error() << "): ";
if( e.Description().length() > 0)
std::cout << (TCHAR*)e.Description() << std::endl;
else
std::cout << e.ErrorMessage() << std::endl;
IOPCServerList *gpOPC = NULL;
DWORD clsctx;
clsctx = CLSCTX_LOCAL_SERVER;//本地服务
IID IIDOPCServerList=IID_IOPCServerList;//在opcenum_i.c中定义
//创建OPC服务器的浏览器对象-----
{ 0x63d5f432, 0xcfe4, 0x11d1, { 0xb2, 0xc8, 0x0, 0x60, 0x8, 0x3b, 0xa1, 0xfb } };
// {63D5F432-CFE4-11d1-B2C8-0060083BA1FB}
//[uuid(CC603642-66D7-48f1-B69A-B625E73652D7)] interface CATID_OPCDAServer30
gpOPC->Release();
}
//打印OPC数据服务器的有关信息
printf("ProgID = %ls, UserType = %ls\n", pszProgID, pszUserType);
CoTaskMemFree(pszProgID);
CoTaskMemFree(pszUserType);
}
//释放接口
if(gpOPC)
HRESULT hr = CoCreateInstance(clsid, NULL, clsctx,IIDOPCServerList ,(void**)&gpOPC);
//查询OPC DA 2.0组件目录接口指针
CLSID catid;
catid=CATID_OPCDAServer20;//= CATID_OPCDAServer20;//OPC数据访问服务器2.0组件目录
IOPCEnumGUID *pEnumGUID;
hr = gpOPC->EnumClassesOfCategories( 1, &catid, 1, &catid, (IEnumGUID**)&pEnumGUID);
if(S_OK!=hr)
return;
//获得支持OPC DA2.0数据服务器的CLSID
#include <iostream>
#include <objbase.h>
#include <comdef.h>
#import "C:\WINNT\system32\OpcEnum.exe" no_namespace//根据OpcEnum.exe更改
#include "opcda.h"
#include "opcenum_i.c"
n_return = 1;
}
OPCServerList();
// Uninitialize COM
CoUninitialize();
return 0;
}
//使用CoCreateInstance
void OPclsid = CLSID_OpcServerList;//在opcenum_i.c中定义
unsigned long c;
while (S_OK == pEnumGUID->Next(1, &clsid, &c))
{
LPOLESTR pszProgID;
LPOLESTR pszUserType;
hr = gpOPC->GetClassDetails(&clsid, &pszProgID, &pszUserType);
//--------------------------------------------------------------------------------------------------------------
//版本号----可以从规范中查到
static const CLSID CATID_OPCDAServer10 =
//--------------------------------------------------------------------------------------------------------------
void OPCServerList();
int main(int argc, char* argv[])
//************************************************************************************************
#define _WIN32_DCOM // Needed in order to call CoInitializeEx()
{ 0x63d5f430, 0xcfe4, 0x11d1, { 0xb2, 0xc8, 0x0, 0x60, 0x8, 0x3b, 0xa1, 0xfb } };
// {63D5F430-CFE4-11d1-B2C8-0060083BA1FB}
static const CLSID CATID_OPCDAServer20 =
OPC Client浏览OPC Server的简单实例
简单程序源代码:
//main.cpp
//************************************************************************************************
//浏览本地OPC服务器
相关文档
最新文档