如何連接客戶端與opc伺服器
① opc伺服器和客戶端如何連接,通訊
伺服器的話要看,如果是client-server結構的DCS,伺服器位於上位和控制器之間,他將你的指令和現場數據通過伺服器來經過交換,伺服器一般是冗餘配置,如果是並行結構來說沒有所謂伺服器的概念,只有個工程師站,程序的下裝通過工程師站,但是數據的獲取和指令的下達通過操作員站就行,這個好處就是當工程師站壞了的話操作員站可以正常工作
OPC伺服器的作用是通過OPC協議將DCS的數據取出,並開放,一般一個OPC伺服器下面連接一個或多個客戶端,客戶端通過安裝相應的軟體(也支持OPC協議),來取得DCS的協議
樂拾薌逸盆然朵邢瀏曄鏈特磊楓待謹璀楷塘丞彰
② 如何通過代碼連接遠程OPC伺服器
第62行的代碼,DCOM既然是遠程伺服器,那它就應該是可以運行在另外一台機器上,然後被其他機器的客戶端所使用。所以C++的客戶端代碼里,你可以通過編程的方式指定伺服器的名稱,但是對於C#來說,因為連接到DCOM伺服器並激活COM對象的操作是由CLR完成的,沒有辦法在代碼里指定。不過不用著急,指定DCOM伺服器還有另外一個方式,就是修改注冊表的鍵值,告訴本機的COM運行庫,伺服器在另外一台機器上,請把下面的鍵值添加到客戶端機器的注冊表裡:
HKEY_CLASSES_ROOT\APPID\{5e9ddec7-5767-11cf-beab-00aa006c3606}\RemoteServerName=<機器名>
下面的是我的代碼
public void ListAll(Guid catid, out OpcServers[] serverslist)
{
serverslist = null;
Dispose();
Guid guid = new Guid("13486D51-4821-11D2-A494-3CB306C10000");
Type typeoflist = Type.GetTypeFromCLSID(guid);
OPCListObj = Activator.CreateInstance(typeoflist);
ifList = (IOPCServerList)OPCListObj;
if (ifList == null)
Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);
ifList.EnumClassesOfCategories(1, ref catid, 0, ref catid, out EnumObj);
if (EnumObj == null)
Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);
ifEnum = (IEnumGUID)EnumObj;
if (ifEnum == null)
Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);
int maxcount = 300;
IntPtr ptrGuid = Marshal.AllocCoTaskMem(maxcount * 16);
int count = 0;
ifEnum.Next(maxcount, ptrGuid, out count);
if (count < 1)
{ Marshal.FreeCoTaskMem(ptrGuid); return; }
serverslist = new OpcServers[count];
byte[] guidbin = new byte[16];
int runGuid = (int)ptrGuid;
for (int i = 0; i < count; i++)
{
serverslist[i] = new OpcServers();
Marshal.Copy((IntPtr)runGuid, guidbin, 0, 16);
serverslist[i].ClsID = new Guid(guidbin);
ifList.GetClassDetails(ref serverslist[i].ClsID,
out serverslist[i].ProgID, out serverslist[i].ServerName);
runGuid += 16;
}
Marshal.FreeCoTaskMem(ptrGuid);
Dispose();
}
用此代碼連接本地OPC伺服器是沒有問題的,但是通過上面對注冊表的編輯,將伺服器換成遠程伺服器,就不能訪問,代碼運行起來還是連接的是本地OPC伺服器。請教各位我該如何設置才能連接遠程OPC伺服器
③ OPC客戶端怎麼與服務端遠程通訊,在同一區域網內,沒開防火牆
1、正常,要選支持遠程連接的opc客戶端,輸入ip和opc服務的名稱,有可能就連上了,一般的都是枚舉本地的opc伺服器,看不到區域網內的。
2、不清楚。
④ OPC客戶端如何與服務端遠程通訊,在同一區域網內,沒開防火牆
首先聲明變數,這樣才能觸發事件(DataChange)來獲取實時數據。連接不同的OPC伺服器只要改變其伺服器名稱和OPC伺服器所在的計算機名稱即可。
⑤ 如何實現OPC伺服器與OPC客戶端的主動通信
我用過kepware寫過,沒用過組態王,不太明白你說的主動與被動。客戶端添加Group的時候,你只要把IsSubscribed設置為true,伺服器端就會在數據發生變化時,觸發客戶端的DataChange事件,這應該就是你說的主動;而客戶端的非同步讀、寫事件AsyncRead、AsyncWrite,則是主動向伺服器請求,這應該就是你說的被動。
⑥ vc開發的opc客戶端怎麼鏈接opc伺服器
很簡單,wincc裡面添加一個opc通道,就象添加一個s7協議(與300-400plc通訊)一樣
⑦ 如何通過OPC自定義介面來實現客戶端數據的讀取
使用OPC
DA進行Client的讀寫操作時,我們使用Custom介面,出此之外還有Automation介面。以下是Custome介面開發時涉及到的三個關鍵對象:OpcServer、OpcGroup、OpcItem,下圖是他們之間的邏輯關系:
上圖列出了名為S7 connection_1的S7連接,展開Object對象,列出PLC的結構。我們選擇一種來新建我們的Item,由於我這里沒有PLC模塊,所以無法截圖給大家看。
至此我們的OPC Client的運行環境搭建完畢。
•編寫OPC Client端程序。
我們需要使用OPC Foundation提供的自定義介面來進行開發,在Visual Studio引用名為:OpcRcw.Comn.dll和OpcRcw.Da.dll這兩個DLL。
我們定義一個名為OpcDaCustomAsync的類,讓這個類繼承自:IOPCDataCallback,IDisposable
⑧ 如何通過OPC自定義介面來實現客戶端數據的讀取
通過OPC自定義介面來實現客戶端數據的讀取步驟如下。
1:使用OPC DA進行Client的讀寫操作時,我們使用Custom介面,出此之外還有Automation介面。以下是Custome介面開發時涉及到的三個關鍵對象:OpcServer、OpcGroup、OpcItem。
2:在客戶端開發時,要使用OpcServer對象來實現客戶端與Opc伺服器之間的連接。一個OpcServer對象下有多個OpcGroup,一個OpcGroup下有多個OpcItem,在自定義介面下的Client開發,是以Group為單位的操作,數據讀寫都是通過OpcGroup進行的。
3:我們可以不寫OPC Client程序來測試,如何通過OPCServer與PLC之間的交互。首先當我們安裝完畢SimaticNet之後,需要對Station Configuration Editor進行配置。
4:當我們組態完畢時,如何判斷組態是否正確,在SimaticNet的目錄上有個叫Opc Scout(Opc Scout V10)的軟體,列出來了本機所有的Server,我們能使用名為OPC.SimaticNET的Server。