基于C#?實(shí)現(xiàn)?OPC?DA?Server的問題小結(jié)
最近研究OPC Server,本著有點(diǎn)啥都可以上網(wǎng)找找源代碼會很快搞定。
找了很久基本上都是C++的而且源代碼大多是編譯不成功的,要么又是部分DLL不提供源碼的。
C#的只有客戶端源碼,且好像也沒有能完全運(yùn)行的。
本人對C++的基礎(chǔ)功力實(shí)在不是太好,C++代碼基本處理能能看得懂但是不能寫。
在研究OPC Server前且對COM,DCOM,COM+的理解力為零。OPC 是啥東西都沒有聽說過,這回是第一次接觸工控行業(yè)。
最后實(shí)在沒有辦法了。只能靠自己了,于是上網(wǎng)找資料還得是中文資料,英語不好。![]()
最后找到了OPC基金組織提供的C#版接口,該接口主要是作為C#編寫客戶使用的。本著客戶端能用服務(wù)端也能的思想,前提是C#也是支持COM,DCOM,COM+的不然直接交槍了。
關(guān)于C#怎么編寫一個進(jìn)程外的DCOM組件,這里先不做介紹了。
這里主要先介紹下OPC DA Server 的第一個接口
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ù)器啟動時間
public long ftStartTime;
/// <summary>
/// 當(dāng)前時間
/// </summary>
public long ftCurrentTime;
/// <summary>
/// 最后一次更新客戶的時間
/// </summary>
public long ftLastUpdateTime;
/// <summary>
/// 當(dāng)前服務(wù)器狀態(tài)
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public OpcServerState eServerState;
/// <summary>
/// 本服務(wù)器實(shí)例所管理的組對象數(shù)
/// </summary>
public int dwGroupCount;
/// <summary>
/// 當(dāng)前使用帶寬的百分比,現(xiàn)在返回未知 0xFFFFFFFF
/// </summary>
public int dwBandWidth;
/// <summary>
/// 主版本號
/// </summary>
public short wMajorVersion;
/// <summary>
/// 副版本號
/// </summary>
public short wMinorVersion;
/// <summary>
/// 編譯號
/// </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 = "公司-個人組織";
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)后面有時間繼續(xù)。
付上測試圖

到此這篇關(guān)于基于C# 實(shí)現(xiàn) OPC DA Server的文章就介紹到這了,更多相關(guān)C# OPC DA Server內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)獲取系統(tǒng)目錄并以Tree樹叉顯示的方法
這篇文章主要介紹了C#實(shí)現(xiàn)獲取系統(tǒng)目錄并以Tree樹叉顯示的方法,可以加深讀者對于C#下數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)方法的認(rèn)識,需要的朋友可以參考下2014-07-07
C#基于百度AI實(shí)現(xiàn)機(jī)器翻譯功能
眾所周知,基于百度ai開發(fā)平臺我們可以實(shí)現(xiàn)了人臉識別、文字識別 、語音識別等功能。本文將介紹它的另一個功能,即實(shí)現(xiàn)機(jī)器翻譯,感興趣的可以了解一下2022-01-01
C#中一個高性能異步socket封裝庫的實(shí)現(xiàn)思路分享
下面小編就為大家分享一篇C#中一個高性能異步socket封裝庫的實(shí)現(xiàn)思路,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
DataTables List互相轉(zhuǎn)換的實(shí)現(xiàn)類示例
這篇文章主要介紹了將DataTable轉(zhuǎn)換為List,將List轉(zhuǎn)換為DataTable的實(shí)現(xiàn)類實(shí)例方法,大家參考使用吧2013-11-11

