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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Collections;
using OPCAutomation;
using System.Threading;namespace OPCDAAutoTest
{class Tester{static void Main(string[] args){Tester tester=new Tester();tester.work();}#region 私有变量/// <summary>/// OPCServer Object/// </summary>
        OPCServer MyServer;/// <summary>/// OPCGroups Object/// </summary>
        OPCGroups MyGroups;/// <summary>/// OPCGroup Object/// </summary>
        OPCGroup MyGroup;OPCGroup MyGroup2;/// <summary>/// OPCItems Object/// </summary>
        OPCItems MyItems;OPCItems MyItems2;/// <summary>/// OPCItem Object/// </summary>
        OPCItem[] MyItem;OPCItem[] MyItem2;/// <summary>/// 主机IP/// </summary>string strHostIP = "";/// <summary>/// 主机名称/// </summary>string strHostName = "";/// <summary>/// 连接状态/// </summary>bool opc_connected = false;/// <summary>/// 客户端句柄/// </summary>int itmHandleClient = 0;/// <summary>/// 服务端句柄/// </summary>int itmHandleServer = 0;#endregion//测试用工作方法public void work(){//初始化item数组MyItem = new OPCItem[4];MyItem2 = new OPCItem[4];GetLocalServer();//ConnectRemoteServer("TX1", "KEPware.KEPServerEx.V4");//用计算机名的局域网//ConnectRemoteServer("192.168.1.35", "KEPware.KEPServerEx.V4");//用IP的局域网if (ConnectRemoteServer("", "KEPware.KEPServerEx.V4"))//本机
            {if (CreateGroup()){Thread.Sleep(500);//暂停线程以让DataChange反映,否则下面的同步读可能读不到//以下同步写MyItem[3].Write("I love you!");//同步写MyItem[2].Write(true);//同步写MyItem[1].Write(-100);//同步写MyItem[0].Write(120);//同步写              //以下同步读object ItemValues;  object Qualities; object TimeStamps;//同步读的临时变量:值、质量、时间戳MyItem[0].Read(1,out ItemValues,out Qualities,out TimeStamps);//同步读,第一个参数只能为1或2int q0 = Convert.ToInt32(ItemValues);//转换后获取item值MyItem[1].Read(1, out ItemValues, out Qualities, out TimeStamps);//同步读,第一个参数只能为1或2int q1 = Convert.ToInt32(ItemValues);//转换后获取item值MyItem[2].Read(1, out ItemValues, out Qualities, out TimeStamps);//同步读,第一个参数只能为1或2bool q2 = Convert.ToBoolean(ItemValues);//转换后获取item值MyItem[3].Read(1, out ItemValues, out Qualities, out TimeStamps);//同步读,第一个参数只能为1或2string q3 = Convert.ToString(ItemValues);//转换后获取item值,为防止读到的值为空,不用ItemValues.ToString()
Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");Console.WriteLine("0-{0},1-{1},2-{2},3-{3}",q0,q1,q2,q3);//以下为异步写//异步写时,Array数组从下标1开始而非0!int[] temp = new int[] { 0,MyItem[0].ServerHandle,MyItem[1].ServerHandle,MyItem[2].ServerHandle, MyItem[3].ServerHandle };Array serverHandles = (Array)temp;object[] valueTemp = new object[5] { "",255,520,true, "Love" };Array values = (Array)valueTemp;Array Errors;int cancelID;MyGroup.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);//第一参数为item数量//由于MyGroup2没有订阅,所以以下这句运行时将会出错!//MyGroup2.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);//以下异步读MyGroup.AsyncRead(4, ref serverHandles, out Errors, 1, out cancelID);//第一参数为item数量/*MyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byteMyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//shortMyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//boolMyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string*/Console.WriteLine("************************************** hit <return> to Disconnect...");Console.ReadLine();  //释放所有组资源
                    MyServer.OPCGroups.RemoveAll();//断开服务器
                    MyServer.Disconnect();}}//ENDConsole.WriteLine("************************************** hit <return> to close...");Console.ReadLine();  }//枚举本地OPC服务器private void GetLocalServer(){//获取本地计算机IP,计算机名称strHostName = Dns.GetHostName();//或者通过局域网内计算机名称strHostName = "TX1";//获取本地计算机上的OPCServerNametry{MyServer = new OPCServer();object serverList = MyServer.GetOPCServers(strHostName);foreach (string server in (Array)serverList){//cmbServerName.Items.Add(turn);Console.WriteLine("本地OPC服务器:{0}", server);}}catch (Exception err){Console.WriteLine("枚举本地OPC服务器出错:{0}",err.Message);}}//连接OPC服务器/// <param name="remoteServerIP">OPCServerIP</param>/// <param name="remoteServerName">OPCServer名称</param>private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName){try{MyServer.Connect(remoteServerName, remoteServerIP);//连接本地服务器:服务器名+主机名或IPif (MyServer.ServerState == (int)OPCServerState.OPCRunning){Console.WriteLine("已连接到:{0}",MyServer.ServerName);}else{//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档Console.WriteLine("状态:{0}",MyServer.ServerState.ToString());}MyServer.ServerShutDown+=ServerShutDown;//服务器断开事件
            }catch (Exception err){Console.WriteLine("连接远程服务器出现错误:{0}" + err.Message);return false;}return true;}//创建组private bool CreateGroup(){try{MyGroups = MyServer.OPCGroups;MyGroup = MyServer.OPCGroups.Add("测试");//添加组MyGroup2 = MyGroups.Add("测试2");OPCGroup MyGroup3 = MyGroups.Add("测试3");//测试删除组//以下设置组属性
                {MyServer.OPCGroups.DefaultGroupIsActive = true;//激活组。MyServer.OPCGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。MyServer.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200msMyGroup.UpdateRate = 100;//刷新频率为1秒。MyGroup.IsSubscribed = true;//使用订阅功能,即可以异步,默认false
                }       MyGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);MyGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);MyGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);//由于MyGroup2.IsSubscribed是false,即没有订阅,所以以下的DataChange回调事件不会发生!MyGroup2.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange2);MyGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete); MyServer.OPCGroups.Remove("测试3");//移除组AddGroupItems();//设置组内items
            }catch (Exception err){Console.WriteLine("创建组出现错误:{0}", err.Message);return false;}return true;}private void AddGroupItems()//添加组
        {//itmHandleServer;MyItems = MyGroup.OPCItems;MyItems2 = MyGroup2.OPCItems;//添加itemMyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byteMyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//shortMyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//boolMyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string//移除组内item
            Array Errors;      int []temp=new int[]{0,MyItem[3].ServerHandle};Array serverHandle = (Array)temp;MyItems.Remove(1, ref serverHandle, out Errors);MyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string
MyItem2[0] = MyItems2.AddItem("BPJ.Db1.dbb96", 0);//byteMyItem2[1] = MyItems2.AddItem("BPJ.Db1.dbw10", 1);//shortMyItem2[2] = MyItems2.AddItem("BPJ.Db16.dbx0", 2);//boolMyItem2[3] = MyItems2.AddItem("BPJ.Db11.S0", 3);//string
}public void ServerShutDown(string Reason)//服务器先行断开
        {Console.WriteLine("服务器已经先行断开!");}/// <summary>/// 每当项数据有变化时执行的事件/// </summary>/// <param name="TransactionID">处理ID</param>/// <param name="NumItems">项个数</param>/// <param name="ClientHandles">项客户端句柄</param>/// <param name="ItemValues">TAG值</param>/// <param name="Qualities">品质</param>/// <param name="TimeStamps">时间戳</param>1    `void GroupDataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps){Console.WriteLine("++++++++++++++++DataChanged+++++++++++++++++++++++");/*for (int i = 1; i <= NumItems; i++){Console.WriteLine("item值:{0}", ItemValues.GetValue(i).ToString());//Console.WriteLine("item句柄:{0}", ClientHandles.GetValue(i).ToString());//Console.WriteLine("item质量:{0}", Qualities.GetValue(i).ToString());//Console.WriteLine("item时间戳:{0}", TimeStamps.GetValue(i).ToString());//Console.WriteLine("item类型:{0}", ItemValues.GetValue(i).GetType().FullName);}*/}void GroupDataChange2(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps){Console.WriteLine("----------------------DataChanged2------------------");/*for (int i = 1; i <= NumItems; i++){Console.WriteLine("item2值:{0}", ItemValues.GetValue(i).ToString());//Console.WriteLine("item2质量:{0}", Qualities.GetValue(i).ToString());//Console.WriteLine("item2时间戳:{0}", TimeStamps.GetValue(i).ToString());             }*/}/// <summary>/// 异步写完成/// 运行时,Array数组从下标1开始而非0!/// </summary>/// <param name="TransactionID"></param>/// <param name="NumItems"></param>/// <param name="ClientHandles"></param>/// <param name="Errors"></param>void GroupAsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors){Console.WriteLine("%%%%%%%%%%%%%%%%AsyncWriteComplete%%%%%%%%%%%%%%%%%%%");/*for (int i = 1; i <= NumItems; i++){Console.WriteLine("Tran:{0}   ClientHandles:{1}   Error:{2}", TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString());}*/}/// <summary>/// 异步读完成/// 运行时,Array数组从下标1开始而非0!/// </summary>/// <param name="TransactionID"></param>/// <param name="NumItems"></param>/// <param name="ClientHandles"></param>/// <param name="ItemValues"></param>/// <param name="Qualities"></param>/// <param name="TimeStamps"></param>/// <param name="Errors"></param>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){Console.WriteLine("****************GroupAsyncReadComplete*******************");for (int i = 1; i <= NumItems; i++){//Console.WriteLine("Tran:{0}   ClientHandles:{1}   Error:{2}", TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString());Console.WriteLine("Vaule:{0}",Convert.ToString(ItemValues.GetValue(i)));}}}
}

转载于:https://www.cnblogs.com/qq458978/p/9789441.html

OPCDAAuto.dll的C#使用方法浅析(转载)相关推荐

  1. 在64位系统下注册OPCDAAuto.dll方法(或程序报:检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败错误)

    目录 一.下载OPCDAAuto.dll 二.复制OPCDAAuto.dll到指定路径 三.注册OPCDAAuto.all方法 一.下载OPCDAAuto.dll OPCDAAuto.dll 2.2. ...

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

    启动 Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误的解决方法! 原因1:给定目录下jvm.dll不存在. ...

  3. Windows下查看exe可执行程序或dll动态库所依赖dll动态库的方法

    Windows下查看exe可执行程序或dll动态库所依赖dll动态库的方法 如需转载请标明出处:http://blog.csdn.net/itas109 技术交流:129518033 文章目录 Win ...

  4. LR关联及web_reg_save_param方法浅析

    loadrunner关联及web_reg_save_param方法浅析 一.什么是关联 关联(correlation):脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则) ...

  5. 了解lpk.dll是什么病毒以及lpk.dll病毒专杀方法

    pk.dll病毒是当下比较流行的一类病毒,而正常系统本身也会存在lpk.dll文件,这足以说明这类病毒的危险性.系统本身的lpk.dll文件位于C:WINDOWSsystem32和C:WINDOWSs ...

  6. 让Visual Studio (VS)链接静态库(lib)及动态库(dll)文件的方法汇总

    本文为原创+转载,旨在总结一下VS链接动态链接库(dll)和静态链接库(lib)的方法. 在调试 Visual Studio 程序时,经常有一些动态链接库(即 dll 文件)需要加载到工程里,这样才能 ...

  7. api-ms-win-crt-runtime-|1-1-0.dll丢失的解决方法

    api-ms-win-crt-runtime-|1-1-0.dll丢失的解决方法 1 问题 在win7下安装Python 3.6.4的时候遇到下面这个错误 api-ms-win-crt-runtime ...

  8. msvcr120.dll丢失的解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 军海免费进销存,网址:http://www.jseanet.com/ 安装遇到问题之:msvcr120.dll丢失的解决方法 ...

  9. JS 监控页面刷新,关闭 事件的方法(转载)

    JS 监控页面刷新,关闭 事件的方法(转载) 已有 149 次阅读 2011-8-30 11:37 |个人分类:web|系统分类:创意设计|关键词:JS,刷新,关闭 都是为了学习-- onbefore ...

最新文章

  1. Unsafe工具类的一些实用技巧,通往JVM底层的钥匙
  2. 通过python建立一个web服务查看服务器上的文本、图片、视频等文件
  3. DCMTK:OFStandard中base64代码的测试程序
  4. android 处理鼠标滚轮事件 【转】
  5. html转word 图片丢失 java_Java 实现 Word 转 pdf 文档的工具来了
  6. Python机器学习(基础篇---监督学习(k近邻))
  7. Liferay中页面的权限控制
  8. 基于Simulink的转速、电流双闭环直流调速系统的建模与仿真
  9. linux下texlive的卸载,linux下安装TexLive
  10. 网络安全博客与文章分享:
  11. linux gre配置,Linux设置gre 隧道
  12. 安全专家:50% 的服务器在补丁发布后,很长时间未修复
  13. [转清华]清华,曾经是多少莘莘学子梦想中的学府……张琳
  14. 基于H5canvas和js的高斯模糊处理
  15. 双周报 1月 vol.1 | VMware 上线 DevOps 平台;白宫召开开源安全峰会
  16. 公务员行测可以用计算机吗,公务员考试可以带计算器吗
  17. AOC冠捷显示器无法保修
  18. C++软件技术与编程课程设计-图书管理系统
  19. 基于布尔莎模型的7参数计算及坐标转换
  20. Ventoy制作启动盘、刷机盘(多个系统的刷机或启动盘)

热门文章

  1. Spark 安装配置简单测试
  2. 被程序员忽视的位运算
  3. 微软社区精英计划 - 你会如何回答【6月26日】北京.Net学习活动QA时提出的问题...
  4. how to write academic english well?
  5. python script 95% interval
  6. 录播软件开始麦克风应该打开还是关闭
  7. apple给我的感受
  8. SFB 项目经验-57-Skype for business-录音系统-你拥有吗(模拟线路)
  9. html5/css3响应式页面开发总结
  10. ThinkPHP5下自己写日志