基于C#?實(shí)現(xiàn)?OPC?DA?Server的問(wèn)題小結(jié)
最近研究OPC Server,本著有點(diǎn)啥都可以上網(wǎng)找找源代碼會(huì)很快搞定。
找了很久基本上都是C++的而且源代碼大多是編譯不成功的,要么又是部分DLL不提供源碼的。
C#的只有客戶端源碼,且好像也沒(méi)有能完全運(yùn)行的。
本人對(duì)C++的基礎(chǔ)功力實(shí)在不是太好,C++代碼基本處理能能看得懂但是不能寫。
在研究OPC Server前且對(duì)COM,DCOM,COM+的理解力為零。OPC 是啥東西都沒(méi)有聽說(shuō)過(guò),這回是第一次接觸工控行業(yè)。
最后實(shí)在沒(méi)有辦法了。只能靠自己了,于是上網(wǎng)找資料還得是中文資料,英語(yǔ)不好。
最后找到了OPC基金組織提供的C#版接口,該接口主要是作為C#編寫客戶使用的。本著客戶端能用服務(wù)端也能的思想,前提是C#也是支持COM,DCOM,COM+的不然直接交槍了。
關(guān)于C#怎么編寫一個(gè)進(jìn)程外的DCOM組件,這里先不做介紹了。
這里主要先介紹下OPC DA Server 的第一個(gè)接口
public enum OpcServerState { Failed = 2, NoConfig = 3, Running = 1, Suspended = 4, Test = 5 } [ComVisible(true), Serializable, StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode, Pack=2)] public class ServerStatus { ///服務(wù)器啟動(dòng)時(shí)間 public long ftStartTime; /// <summary> /// 當(dāng)前時(shí)間 /// </summary> public long ftCurrentTime; /// <summary> /// 最后一次更新客戶的時(shí)間 /// </summary> public long ftLastUpdateTime; /// <summary> /// 當(dāng)前服務(wù)器狀態(tài) /// </summary> [MarshalAs(UnmanagedType.U4)] public OpcServerState eServerState; /// <summary> /// 本服務(wù)器實(shí)例所管理的組對(duì)象數(shù) /// </summary> public int dwGroupCount; /// <summary> /// 當(dāng)前使用帶寬的百分比,現(xiàn)在返回未知 0xFFFFFFFF /// </summary> public int dwBandWidth; /// <summary> /// 主版本號(hào) /// </summary> public short wMajorVersion; /// <summary> /// 副版本號(hào) /// </summary> public short wMinorVersion; /// <summary> /// 編譯號(hào) /// </summary> public short wBuildNumber; /// <summary> /// 保留 /// </summary> public short wReserved; /// <summary> /// 廠商信息 /// </summary> [MarshalAs(UnmanagedType.LPWStr)] public string szVendorInfo; } public class OPCDAServer : IOPCServer, IOPCCommon, IOPCBrowseServerAddressSpace, IOPCItemProperties , IOPCBrowse, IOPCItemIO, IOPCServerPublicGroups,IDisposable { /// <summary> /// 獲取服務(wù)器基本信息 /// </summary> /// <param name="ppServerStatus">輸出參數(shù) 服務(wù)器信息結(jié)構(gòu)</param> /// <returns></returns> [PreserveSig] public int GetStatus(out ServerStatus ppServerStatus) { ppServerStatus = new ServerStatus(); ppServerStatus.eServerState = OpcServerState.Running; ppServerStatus.szVendorInfo = "公司-個(gè)人組織"; ppServerStatus.dwGroupCount = 10; ppServerStatus.ftCurrentTime = DateTime.Now.ToFileTime(); ppServerStatus.ftLastUpdateTime = DateTime.Now.ToFileTime(); ppServerStatus.ftStartTime = DateTime.Now.ToFileTime.ToFileTime(); ppServerStatus.wMajorVersion = 1; ppServerStatus.wMinorVersion = 1; ppServerStatus.wBuildNumber = 0; return HRESULTS.S_OK; } }
上段代碼就是IOPCServer接口中GetStatus方法的實(shí)現(xiàn),其它方法實(shí)現(xiàn)后面有時(shí)間繼續(xù)。
付上測(cè)試圖
到此這篇關(guān)于基于C# 實(shí)現(xiàn) OPC DA Server的文章就介紹到這了,更多相關(guān)C# OPC DA Server內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)獲取系統(tǒng)目錄并以Tree樹叉顯示的方法
這篇文章主要介紹了C#實(shí)現(xiàn)獲取系統(tǒng)目錄并以Tree樹叉顯示的方法,可以加深讀者對(duì)于C#下數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)方法的認(rèn)識(shí),需要的朋友可以參考下2014-07-07C#基于百度AI實(shí)現(xiàn)機(jī)器翻譯功能
眾所周知,基于百度ai開發(fā)平臺(tái)我們可以實(shí)現(xiàn)了人臉識(shí)別、文字識(shí)別 、語(yǔ)音識(shí)別等功能。本文將介紹它的另一個(gè)功能,即實(shí)現(xiàn)機(jī)器翻譯,感興趣的可以了解一下2022-01-01C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路分享
下面小編就為大家分享一篇C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11c# 圓形識(shí)別方案和直線識(shí)別方案的參考示例
這篇文章主要介紹了c# 圓形識(shí)別方案和直線識(shí)別方案的實(shí)現(xiàn)示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03DataTables List互相轉(zhuǎn)換的實(shí)現(xiàn)類示例
這篇文章主要介紹了將DataTable轉(zhuǎn)換為L(zhǎng)ist,將List轉(zhuǎn)換為DataTable的實(shí)現(xiàn)類實(shí)例方法,大家參考使用吧2013-11-11