上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法。
以下为我的源代码,有详细的注释无需我多言。
编译平台:VS2008SP1、WINXP、KEPServer
除此之外,我也安装了西门子的Net2006和Step7,其中Net2006是负责OPC的,可能会在系统中创建一些dll之类的,并提供几个OPC服务器
以下是我Program.cs(基于控制台的)的全部内容,仍旧采用C#语言:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Collections;
  7. using OPCAutomation;
  8. using System.Threading;
  9.  
  10. namespace OPCDAAutoTest
  11. {
  12. class Tester
  13. {
  14. static void Main(string[] args)
  15. {
  16. Tester tester=new Tester();
  17. tester.work();
  18. }
  19. #region 私有变量
  20. /// <summary>
  21. /// OPCServer Object
  22. /// </summary>
  23. OPCServer MyServer;
  24. /// <summary>
  25. /// OPCGroups Object
  26. /// </summary>
  27. OPCGroups MyGroups;
  28. /// <summary>
  29. /// OPCGroup Object
  30. /// </summary>
  31. OPCGroup MyGroup;
  32. OPCGroup MyGroup2;
  33. /// <summary>
  34. /// OPCItems Object
  35. /// </summary>
  36. OPCItems MyItems;
  37. OPCItems MyItems2;
  38. /// <summary>
  39. /// OPCItem Object
  40. /// </summary>
  41. OPCItem[] MyItem;
  42. OPCItem[] MyItem2;
  43. /// <summary>
  44. /// 主机IP
  45. /// </summary>
  46. string strHostIP = "";
  47. /// <summary>
  48. /// 主机名称
  49. /// </summary>
  50. string strHostName = "";
  51. /// <summary>
  52. /// 连接状态
  53. /// </summary>
  54. bool opc_connected = false;
  55. /// <summary>
  56. /// 客户端句柄
  57. /// </summary>
  58. int itmHandleClient = ;
  59. /// <summary>
  60. /// 服务端句柄
  61. /// </summary>
  62. int itmHandleServer = ;
  63. #endregion
  64. //测试用工作方法
  65. public void work()
  66. {
  67. //初始化item数组
  68. MyItem = new OPCItem[];
  69. MyItem2 = new OPCItem[];
  70.  
  71. GetLocalServer();
  72. //ConnectRemoteServer("TX1", "KEPware.KEPServerEx.V4");//用计算机名的局域网
  73. //ConnectRemoteServer("192.168.1.35", "KEPware.KEPServerEx.V4");//用IP的局域网
  74. if (ConnectRemoteServer("", "KEPware.KEPServerEx.V4"))//本机
  75. {
  76. if (CreateGroup())
  77. {
  78. Thread.Sleep();//暂停线程以让DataChange反映,否则下面的同步读可能读不到
  79. //以下同步写
  80. MyItem[].Write("I love you!");//同步写
  81. MyItem[].Write(true);//同步写
  82. MyItem[].Write(-);//同步写
  83. MyItem[].Write();//同步写
  84.  
  85. //以下同步读
  86. object ItemValues; object Qualities; object TimeStamps;//同步读的临时变量:值、质量、时间戳
  87. MyItem[].Read(,out ItemValues,out Qualities,out TimeStamps);//同步读,第一个参数只能为1或2
  88. int q0 = Convert.ToInt32(ItemValues);//转换后获取item值
  89. MyItem[].Read(, out ItemValues, out Qualities, out TimeStamps);//同步读,第一个参数只能为1或2
  90. int q1 = Convert.ToInt32(ItemValues);//转换后获取item值
  91. MyItem[].Read(, out ItemValues, out Qualities, out TimeStamps);//同步读,第一个参数只能为1或2
  92. bool q2 = Convert.ToBoolean(ItemValues);//转换后获取item值
  93. MyItem[].Read(, out ItemValues, out Qualities, out TimeStamps);//同步读,第一个参数只能为1或2
  94. string q3 = Convert.ToString(ItemValues);//转换后获取item值,为防止读到的值为空,不用ItemValues.ToString()
  95.  
  96. Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  97. Console.WriteLine("0-{0},1-{1},2-{2},3-{3}",q0,q1,q2,q3);
  98.  
  99. //以下为异步写
  100. //异步写时,Array数组从下标1开始而非0!
  101. int[] temp = new int[] { ,MyItem[].ServerHandle,MyItem[].ServerHandle,MyItem[].ServerHandle, MyItem[].ServerHandle };
  102. Array serverHandles = (Array)temp;
  103. object[] valueTemp = new object[] { "",,,true, "Love" };
  104. Array values = (Array)valueTemp;
  105. Array Errors;
  106. int cancelID;
  107. MyGroup.AsyncWrite(, ref serverHandles, ref values, out Errors, , out cancelID);//第一参数为item数量
  108. //由于MyGroup2没有订阅,所以以下这句运行时将会出错!
  109. //MyGroup2.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);
  110.  
  111. //以下异步读
  112. MyGroup.AsyncRead(, ref serverHandles, out Errors, , out cancelID);//第一参数为item数量
  113.  
  114. /*MyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byte
  115. MyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//short
  116. MyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//bool
  117. MyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string*/
  118.  
  119. Console.WriteLine("************************************** hit <return> to Disconnect...");
  120. Console.ReadLine();
  121. //释放所有组资源
  122. MyServer.OPCGroups.RemoveAll();
  123. //断开服务器
  124. MyServer.Disconnect();
  125. }
  126. }
  127.  
  128. //END
  129. Console.WriteLine("************************************** hit <return> to close...");
  130. Console.ReadLine();
  131. }
  132. //枚举本地OPC服务器
  133. private void GetLocalServer()
  134. {
  135. //获取本地计算机IP,计算机名称
  136. strHostName = Dns.GetHostName();
  137. //或者通过局域网内计算机名称
  138. strHostName = "TX1";
  139.  
  140. //获取本地计算机上的OPCServerName
  141. try
  142. {
  143. MyServer = new OPCServer();
  144. object serverList = MyServer.GetOPCServers(strHostName);
  145.  
  146. foreach (string server in (Array)serverList)
  147. {
  148. //cmbServerName.Items.Add(turn);
  149. Console.WriteLine("本地OPC服务器:{0}", server);
  150. }
  151. }
  152. catch (Exception err)
  153. {
  154. Console.WriteLine("枚举本地OPC服务器出错:{0}",err.Message);
  155. }
  156. }
  157. //连接OPC服务器
  158. /// <param name="remoteServerIP">OPCServerIP</param>
  159. /// <param name="remoteServerName">OPCServer名称</param>
  160. private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName)
  161. {
  162. try
  163. {
  164. MyServer.Connect(remoteServerName, remoteServerIP);//连接本地服务器:服务器名+主机名或IP
  165.  
  166. if (MyServer.ServerState == (int)OPCServerState.OPCRunning)
  167. {
  168. Console.WriteLine("已连接到:{0}",MyServer.ServerName);
  169. }
  170. else
  171. {
  172. //这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
  173. Console.WriteLine("状态:{0}",MyServer.ServerState.ToString());
  174. }
  175. MyServer.ServerShutDown+=ServerShutDown;//服务器断开事件
  176. }
  177. catch (Exception err)
  178. {
  179. Console.WriteLine("连接远程服务器出现错误:{0}" + err.Message);
  180. return false;
  181. }
  182. return true;
  183. }
  184. //创建组
  185. private bool CreateGroup()
  186. {
  187. try
  188. {
  189. MyGroups = MyServer.OPCGroups;
  190. MyGroup = MyServer.OPCGroups.Add("测试");//添加组
  191. MyGroup2 = MyGroups.Add("测试2");
  192. OPCGroup MyGroup3 = MyGroups.Add("测试3");//测试删除组
  193. //以下设置组属性
  194. {
  195. MyServer.OPCGroups.DefaultGroupIsActive = true;//激活组。
  196. MyServer.OPCGroups.DefaultGroupDeadband = ;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
  197. MyServer.OPCGroups.DefaultGroupUpdateRate = ;//默认组群的刷新频率为200ms
  198. MyGroup.UpdateRate = ;//刷新频率为1秒。
  199. MyGroup.IsSubscribed = true;//使用订阅功能,即可以异步,默认false
  200. }
  201.  
  202. MyGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);
  203. MyGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);
  204. MyGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);
  205. //由于MyGroup2.IsSubscribed是false,即没有订阅,所以以下的DataChange回调事件不会发生!
  206. MyGroup2.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange2);
  207. MyGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);
  208.  
  209. MyServer.OPCGroups.Remove("测试3");//移除组
  210. AddGroupItems();//设置组内items
  211. }
  212. catch (Exception err)
  213. {
  214. Console.WriteLine("创建组出现错误:{0}", err.Message);
  215. return false;
  216. }
  217. return true;
  218. }
  219. private void AddGroupItems()//添加组
  220. {
  221. //itmHandleServer;
  222. MyItems = MyGroup.OPCItems;
  223. MyItems2 = MyGroup2.OPCItems;
  224.  
  225. //添加item
  226. MyItem[] = MyItems.AddItem("BPJ.Db1.dbb96", );//byte
  227. MyItem[] = MyItems.AddItem("BPJ.Db1.dbw10", );//short
  228. MyItem[] = MyItems.AddItem("BPJ.Db16.dbx0", );//bool
  229. MyItem[] = MyItems.AddItem("BPJ.Db11.S0", );//string
  230. //移除组内item
  231. Array Errors;
  232. int []temp=new int[]{,MyItem[].ServerHandle};
  233. Array serverHandle = (Array)temp;
  234. MyItems.Remove(, ref serverHandle, out Errors);
  235. MyItem[] = MyItems.AddItem("BPJ.Db11.S0", );//string
  236.  
  237. MyItem2[] = MyItems2.AddItem("BPJ.Db1.dbb96", );//byte
  238. MyItem2[] = MyItems2.AddItem("BPJ.Db1.dbw10", );//short
  239. MyItem2[] = MyItems2.AddItem("BPJ.Db16.dbx0", );//bool
  240. MyItem2[] = MyItems2.AddItem("BPJ.Db11.S0", );//string
  241.  
  242. }
  243. public void ServerShutDown(string Reason)//服务器先行断开
  244. {
  245. Console.WriteLine("服务器已经先行断开!");
  246. }
  247. /// <summary>
  248. /// 每当项数据有变化时执行的事件
  249. /// </summary>
  250. /// <param name="TransactionID">处理ID</param>
  251. /// <param name="NumItems">项个数</param>
  252. /// <param name="ClientHandles">项客户端句柄</param>
  253. /// <param name="ItemValues">TAG值</param>
  254. /// <param name="Qualities">品质</param>
  255. /// <param name="TimeStamps">时间戳</param>1 `
  256. void GroupDataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
  257. {
  258. Console.WriteLine("++++++++++++++++DataChanged+++++++++++++++++++++++");
  259. /*for (int i = 1; i <= NumItems; i++)
  260. {
  261. Console.WriteLine("item值:{0}", ItemValues.GetValue(i).ToString());
  262. //Console.WriteLine("item句柄:{0}", ClientHandles.GetValue(i).ToString());
  263. //Console.WriteLine("item质量:{0}", Qualities.GetValue(i).ToString());
  264. //Console.WriteLine("item时间戳:{0}", TimeStamps.GetValue(i).ToString());
  265. //Console.WriteLine("item类型:{0}", ItemValues.GetValue(i).GetType().FullName);
  266. }*/
  267. }
  268. void GroupDataChange2(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
  269. {
  270. Console.WriteLine("----------------------DataChanged2------------------");
  271. /*for (int i = 1; i <= NumItems; i++)
  272. {
  273. Console.WriteLine("item2值:{0}", ItemValues.GetValue(i).ToString());
  274. //Console.WriteLine("item2质量:{0}", Qualities.GetValue(i).ToString());
  275. //Console.WriteLine("item2时间戳:{0}", TimeStamps.GetValue(i).ToString());
  276. }*/
  277. }
  278. /// <summary>
  279. /// 异步写完成
  280. /// 运行时,Array数组从下标1开始而非0!
  281. /// </summary>
  282. /// <param name="TransactionID"></param>
  283. /// <param name="NumItems"></param>
  284. /// <param name="ClientHandles"></param>
  285. /// <param name="Errors"></param>
  286. void GroupAsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
  287. {
  288. Console.WriteLine("%%%%%%%%%%%%%%%%AsyncWriteComplete%%%%%%%%%%%%%%%%%%%");
  289. /*for (int i = 1; i <= NumItems; i++)
  290. {
  291. Console.WriteLine("Tran:{0} ClientHandles:{1} Error:{2}", TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString());
  292. }*/
  293. }
  294.  
  295. /// <summary>
  296. /// 异步读完成
  297. /// 运行时,Array数组从下标1开始而非0!
  298. /// </summary>
  299. /// <param name="TransactionID"></param>
  300. /// <param name="NumItems"></param>
  301. /// <param name="ClientHandles"></param>
  302. /// <param name="ItemValues"></param>
  303. /// <param name="Qualities"></param>
  304. /// <param name="TimeStamps"></param>
  305. /// <param name="Errors"></param>
  306. void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)
  307. {
  308. Console.WriteLine("****************GroupAsyncReadComplete*******************");
  309. for (int i = ; i <= NumItems; i++)
  310. {
  311. //Console.WriteLine("Tran:{0} ClientHandles:{1} Error:{2}", TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString());
  312. Console.WriteLine("Vaule:{0}",Convert.ToString(ItemValues.GetValue(i)));
  313. }
  314. }
  315. }
  316. }

OPCDAAuto.dll的C#使用方法浅析的更多相关文章

  1. OPCDAAuto.dll的C#使用方法浅析(转载)

    上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...

  2. Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()

    Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...

  3. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!&&在eclipse.ini中为eclipse指定jdk启动

    参考:http://blog.csdn.net/zyz511919766/article/details/7442633 http://blog.sina.com.cn/s/blog_028f0c1c ...

  4. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!

    启动 Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误的解决方法 http://blog.csdn.net/z ...

  5. 使用OPCDAAuto.dll编写C# OPC采集程序

    在一台新机器上运行使用OPC自动化接口编写的C#程序报错如下: 索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出 ...

  6. C++调用DLL有两种方法——静态调用和动态调用

    C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报  分类: cpp(30)  [ ...

  7. C# Winform窗口之间传值的多种方法浅析(转)

    摘要http://www.jb51.net/article/63837.htm 这篇文章主要介绍了C# Winform窗口之间传值的多种方法浅析,本文起讲解了通过构造器传值.通过属性传递.通过事件携带 ...

  8. 关于opcdaauto.dll的注册

    关于opcdaauto.dll的注册 无论win7_32还是win7_64位都执行一样的CMD命令,即regsvr32 opcdaauto.dll . 如果从网上下载的opcdaauto.dll 文件 ...

  9. python2在安装pywin32后出现ImportError: DLL load failed 解决方法

    python2在安装pywin32后出现ImportError: DLL load failed 解决方法 在python2中有时候会出现: import win32api   ImportError ...

随机推荐

  1. Effective C++ 条款03:尽可能使用const

    场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...

  2. HTML中a标签的锚点

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. hdu 2126 Buy the souvenirs 二维01背包方案总数

    Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. PHP5+APACHE2.2配置

    注意这里用的是PHP5.3版本 在Windows系统上使用Apache2.2上模块化安装PHP5.3 PHP5.3增加了一些功能,如namespace,静态迟绑定等. 本篇文章将帮您如何安装PHP5. ...

  5. Pandas数据帧(DataFrame)

    数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列. 数据帧(DataFrame)的功能特点: 潜在的列是不同的类型 大小可变 标记轴(行和列) 可以对行和列执行算术运算 结构体 ...

  6. HTTP Status 500 - Unable to instantiate Action, customerAction, defined for 'customer_toAddPage' i

    使用struts2时碰到这样的错误 HTTP Status 500 - Unable to instantiate Action, customerAction, defined for 'custo ...

  7. 图片qq浏览器不显示,微信显示问题原因

    1.qq浏览器关闭云加速就可以了

  8. 前端 velocity(.vm)模板里写ajax出现解析异常

    异常信息:Caused by: org.apache.velocity.exception.ParseErrorException: Encountered "{" at dist ...

  9. PostgreSQL EXPLAIN执行计划学习--多表连接几种Join方式比较

    转了一部分.稍后再修改. 三种多表Join的算法: 一. NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表 ...

  10. 关于linux 编程

    emacs 编辑器 gcc/g++ 编译器 gdb 调试工具 valgrind 内存泄露检查 doxygen 文档组织工具