最近研究OPC
Server,本着有點啥都可以上網找找源代碼會很快搞定。
找了很久基本上都是C++的而且源代碼大多是編譯不成功的,要么又是部分DLL不提供源碼的。
C#的只有客戶端源碼,且好像也沒有能完全運行的。
本人對C++的基礎功力實在不是太好,C++代碼基本處理能能看得懂但是不能寫。
在研究OPC
Server前且對COM,DCOM,COM+的理解力為零。OPC 是啥東西都沒有聽說過,這回是第一次接觸工控行業。
最后實在沒有辦法了。只能靠自己了,於是上網找資料還得是中文資料,英語不好。
最后找到了OPC基金組織提供的C#版接口,該接口主要是作為C#編寫客戶使用的。本着客戶端能用服務端也能的思想,前提是C#也是支持COM,DCOM,COM+的不然直接交槍了。
關於C#怎么編寫一個進程外的DCOM組件,這里先不做介紹了。
這里主要先介紹下OPC DA Server
的第一個接口
1
public
enum OpcServerState
2 {
3 Failed = 2,
4 NoConfig = 3,
5 Running = 1,
6 Suspended = 4,
7 Test = 5
8 }
9
10 [ComVisible( true), Serializable, StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode, Pack= 2)]
11 public class ServerStatus
12 {
13 /// 服務器啟動時間
14 public long ftStartTime;
15
16 /// <summary>
17 /// 當前時間
18 /// </summary>
19 public long ftCurrentTime;
20
21 /// <summary>
22 /// 最后一次更新客戶的時間
23 /// </summary>
24 public long ftLastUpdateTime;
25
26 /// <summary>
27 /// 當前服務器狀態
28 /// </summary>
29 [MarshalAs(UnmanagedType.U4)]
30 public OpcServerState eServerState;
31
32 /// <summary>
33 /// 本服務器實例所管理的組對象數
34 /// </summary>
35 public int dwGroupCount;
36
37 /// <summary>
38 /// 當前使用帶寬的百分比,現在返回未知 0xFFFFFFFF
39 /// </summary>
40 public int dwBandWidth;
41
42 /// <summary>
43 /// 主版本號
44 /// </summary>
45 public short wMajorVersion;
46
47 /// <summary>
48 /// 副版本號
49 /// </summary>
50 public short wMinorVersion;
51
52 /// <summary>
53 /// 編譯號
54 /// </summary>
55 public short wBuildNumber;
56
57 /// <summary>
58 /// 保留
59 /// </summary>
60 public short wReserved;
61
62 /// <summary>
63 /// 廠商信息
64 /// </summary>
65 [MarshalAs(UnmanagedType.LPWStr)]
66 public string szVendorInfo;
67 }
68
69 public class OPCDAServer : IOPCServer, IOPCCommon,
70 IOPCBrowseServerAddressSpace, IOPCItemProperties
71 , IOPCBrowse, IOPCItemIO, IOPCServerPublicGroups,IDisposable
72 {
73 /// <summary>
74 /// 獲取服務器基本信息
75 /// </summary>
76 /// <param name="ppServerStatus"> 輸出參數 服務器信息結構 </param>
77 /// <returns></returns>
78 [PreserveSig]
79 public int GetStatus( out ServerStatus ppServerStatus)
80 {
81 ppServerStatus = new ServerStatus();
82 ppServerStatus.eServerState = OpcServerState.Running;
83 ppServerStatus.szVendorInfo = " 公司-個人組織 ";
84 ppServerStatus.dwGroupCount = 10;
85 ppServerStatus.ftCurrentTime = DateTime.Now.ToFileTime();
86 ppServerStatus.ftLastUpdateTime = DateTime.Now.ToFileTime();
87 ppServerStatus.ftStartTime = DateTime.Now.ToFileTime.ToFileTime();
88 ppServerStatus.wMajorVersion = 1;
89 ppServerStatus.wMinorVersion = 1;
90 ppServerStatus.wBuildNumber = 0;
91 return HRESULTS.S_OK;
92 }
93 }
2 {
3 Failed = 2,
4 NoConfig = 3,
5 Running = 1,
6 Suspended = 4,
7 Test = 5
8 }
9
10 [ComVisible( true), Serializable, StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode, Pack= 2)]
11 public class ServerStatus
12 {
13 /// 服務器啟動時間
14 public long ftStartTime;
15
16 /// <summary>
17 /// 當前時間
18 /// </summary>
19 public long ftCurrentTime;
20
21 /// <summary>
22 /// 最后一次更新客戶的時間
23 /// </summary>
24 public long ftLastUpdateTime;
25
26 /// <summary>
27 /// 當前服務器狀態
28 /// </summary>
29 [MarshalAs(UnmanagedType.U4)]
30 public OpcServerState eServerState;
31
32 /// <summary>
33 /// 本服務器實例所管理的組對象數
34 /// </summary>
35 public int dwGroupCount;
36
37 /// <summary>
38 /// 當前使用帶寬的百分比,現在返回未知 0xFFFFFFFF
39 /// </summary>
40 public int dwBandWidth;
41
42 /// <summary>
43 /// 主版本號
44 /// </summary>
45 public short wMajorVersion;
46
47 /// <summary>
48 /// 副版本號
49 /// </summary>
50 public short wMinorVersion;
51
52 /// <summary>
53 /// 編譯號
54 /// </summary>
55 public short wBuildNumber;
56
57 /// <summary>
58 /// 保留
59 /// </summary>
60 public short wReserved;
61
62 /// <summary>
63 /// 廠商信息
64 /// </summary>
65 [MarshalAs(UnmanagedType.LPWStr)]
66 public string szVendorInfo;
67 }
68
69 public class OPCDAServer : IOPCServer, IOPCCommon,
70 IOPCBrowseServerAddressSpace, IOPCItemProperties
71 , IOPCBrowse, IOPCItemIO, IOPCServerPublicGroups,IDisposable
72 {
73 /// <summary>
74 /// 獲取服務器基本信息
75 /// </summary>
76 /// <param name="ppServerStatus"> 輸出參數 服務器信息結構 </param>
77 /// <returns></returns>
78 [PreserveSig]
79 public int GetStatus( out ServerStatus ppServerStatus)
80 {
81 ppServerStatus = new ServerStatus();
82 ppServerStatus.eServerState = OpcServerState.Running;
83 ppServerStatus.szVendorInfo = " 公司-個人組織 ";
84 ppServerStatus.dwGroupCount = 10;
85 ppServerStatus.ftCurrentTime = DateTime.Now.ToFileTime();
86 ppServerStatus.ftLastUpdateTime = DateTime.Now.ToFileTime();
87 ppServerStatus.ftStartTime = DateTime.Now.ToFileTime.ToFileTime();
88 ppServerStatus.wMajorVersion = 1;
89 ppServerStatus.wMinorVersion = 1;
90 ppServerStatus.wBuildNumber = 0;
91 return HRESULTS.S_OK;
92 }
93 }
上段代碼就是IOPCServer接口中GetStatus方法的實現,其它方法實現后面有時間繼續。
付上測試圖
這本人第一次寫博客,有不清楚的請亮解。有錯字純屬正常。