步骤 :引用 OPCNETAPI.DLL&&OPCNETAPI.COM.DLL

1。查询服务器      2. 连接服务器  3. 读取数据     4.写入数据

1.查询服务器 :根据IP地址进行查询

代码如下 :

//查询服务器
            try
            {
                Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20, “OPC服务器IP地址”, null);
                if (servers != null)
                {   //遍历所查询到的所有OPC服务器,将其新增到 comboBox1 下拉列表框中
                    foreach (Opc.Da.Server server in servers)
                    {
                        comboBox1.Items.Add(server.Name);
                    }
                }
                comboBox1.SelectedIndex = 0;
                listBox1.Items.Add("查询服务器成功.请选择OPC进行连接");
            }
            catch (Exception ex)
            {

listBox1.Items.Add(ex.Message);
            }

2. 连接服务器

try
                {
                    Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20, “OPCIP地址”, null);
                    if (servers != null)
                    {
                        foreach (Opc.Da.Server server in servers)
                        {
                            if (String.Compare(server.Name, comboBox1.Text, true) == 0)//为true忽略大小写
                            {
                                m_server = server;//建立连接。
                                break;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {

listBox1.Items.Add(ex.Message);
                    return;
                }
                if (m_server != null)
                {
                    try
                    {
                        m_server.Connect();
                        listBox1.Items.Add("OPC服务器连接成功,请填写变量名称进行读取数据");

}
                    catch (Exception ex)
                    {
                        listBox1.Items.Add(ex.Message);

}

}
                else
                {
                    listBox1.Items.Add("连接失败,请检查IP以及服务器对象");
                }
            }

3. 读取

try
            {

state = new Opc.Da.SubscriptionState();//组(订阅者)状态,相当于OPC规范中组的参数
                state.Name ="";//组名 可为空
                state.ServerHandle = null;//服务器给该组分配的句柄。
                state.ClientHandle = Guid.NewGuid().ToString();//客户端给该组分配的句柄。
                state.Active = true;//激活该组。
                state.UpdateRate = 1000;//刷新频率为1秒。
                state.Deadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
                state.Locale = null;//不设置地区值。
                 subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);//创建组
                string[] itemName = new string[1];
                itemName[0] = textBox2.Text; //OPC变量名称(项目代码)
                Item[] items = new Item[1];//定义数据项,即item
                items[0] = new Item();
                items[0].ClientHandle = Guid.NewGuid().ToString();//客户端给该数据项分配的句柄。
                items[0].ItemPath = null; //该数据项在服务器中的路径。
                items[0].ItemName = itemName[0]; //该数据项在服务器中的名字。
                 subscription.AddItems(items);

ItemValueResult[] values = subscription.Read(subscription.Items);
                 for (int i = 0; i < values.Length; i++)
                {
                    if (values[i].ToString() != "")
                     {
                        MessageBox.Show("4.1" + values[i].Value.ToString());
                    }
                }
 
                if (values[0].Quality.Equals(Opc.Da.Quality.Good))
                {
                     textBox3.Text = values[0].Value.ToString();//变量接收取到的值
                    listBox1.Items.Add("成功读取变量为<" + textBox2.Text + ">的数据.值为<" + textBox3.Text + ">");
                 }
               
            }
            catch (Exception ex)
            {
                 listBox1.Items.Add(ex.Message);
            }

4. 写入

state = new Opc.Da.SubscriptionState();//组(订阅者)状态,相当于OPC规范中组的参数
            state.Name = "";// textBox4.Text;//组名
            state.ServerHandle = null;//服务器给该组分配的句柄。
            state.ClientHandle = Guid.NewGuid().ToString();//客户端给该组分配的句柄。
            state.Active = true;//激活该组。
            state.UpdateRate = 1000;//刷新频率为1秒。
            state.Deadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
            state.Locale = null;//不设置地区值。 
            subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);//创建组
            string[] itemName = new string[1];
            itemName[0] =textBox7.Text;  //OPC变量名称  (项目代码)
            Item[] items = new Item[1];//定义数据项,即item
            items[0] = new Item();
            items[0].ClientHandle = Guid.NewGuid().ToString();//客户端给该数据项分配的句柄。
            items[0].ItemPath = null; //该数据项在服务器中的路径。
            items[0].ItemName = itemName[0]; //该数据项在服务器中的名字。
            subscription.AddItems(items);       
            ItemValue[] itemvalues2 = new ItemValue[3];
            listBox1.Items.Add(string.Format("subscription Items count:{0}", subscription.Items.Length));
            listBox1.Items.Add(string.Format("subscription Items[0]:{0}", subscription.Items[0].ItemName));
            ItemValue iv = new ItemValue((ItemIdentifier)subscription.Items[0]);
            iv.Value = textBox8.Text;//需要写入OPC中的值
            subscription.Write(new ItemValue[] { iv });
            subscription.RemoveItems(subscription.Items);
            m_server.CancelSubscription(subscription);//m_server前文已说明,通知服务器要求删除组。

C#l连接OPC进行数据交互的更多相关文章

  1. C# 移动端与PC端的数据交互

    小记:针对目前功能越来越强大的智能手机来说,在PC端支持对手机中的用户数据作同步.备份以及恢复等保护措施的应用已经急需完善.不仅要对数据作保护,而且用户更希望自己的手机跟PC能够一体化,以及和远程服务 ...

  2. Django学习笔记(8)——前后台数据交互实战(AJAX)

    这里将自己这段时间学习的关于前后台数据交互的笔记写在这里,这里包含了Django传输数据给JS,AJAX的相关问题,跨域问题,如何解决AJAX的跨域问题等等.比较凌乱,请看到这篇博客的盆友见谅,如果我 ...

  3. Python 进程间数据交互

    进程间通信:进程之间必须需要中间件. 不同进程间内存是不共享的,要想实现两个进程间的数据交换     Queues:实现传输两个进程的数据 线程queue,访问数据只能在一个进程内进行线程与线程之间的 ...

  4. 【python】-- 多进程的基本语法 、进程间数据交互与共享、进程锁和进程池的使用

    多进程 进程之间是相互独立的,python是启动进程的时候,是启动的是原生进程.进程是没有GIL锁的,而且不存在锁的概念,进程之间的数据式不能共享的,而线程是可以的. 1.进程的定义 用mulipro ...

  5. JSP数据交互

    JSP数据交互   一.jsp中java小脚本 1.<% java代码段%> 2.<% =java表达式%>不能有分号 3.<%!成员变量和函数声明%>二.注释 1 ...

  6. android中的HttpURLConnection和HttpClient实现app与pc数据交互

    自学android的这几天很辛苦,但是很满足,因为每当学到一点点知识点都会觉得很开心,觉得今天是特别有意义的,可能这个就是一种莫名的热爱吧. 下面来说说今天学习的HttpURLConnection和H ...

  7. TCP移动端跟服务器数据交互

    同一台笔记本下的客户端和服务端 TCPClient 客户端: //  RootViewController.h#import <UIKit/UIKit.h>#import "As ...

  8. X-Plane数据交互

    要用X-Plane进行二次开发,免不了需要进行参数的传递,下面我们来看看与X-Plane进行数据交互都有哪些方式. 与FSX和Flightgear基本一样,X-Plane支持插件,自然也支持通过插件进 ...

  9. Android开发周报:Android L默认加密用户数据

    Android开发周报:Android L默认加密用户数据 新闻 <iCloud前车之鉴,Android L默认开启加密功能>:iCloud 艳照风波再起,第二波女星照片流出,大量女星的裸 ...

随机推荐

  1. 查看Linux操作系统版本

      1.查看内核版本命令: [root@server1 Desktop]# cat /proc/version Linux version 2.6.32-358.el6.x86_64 (mockbui ...

  2. sql server去除重复信息,

    SELECT st_id FROM ( SELECT *,ROW_NUMBER() OVER( PARTITION BY st_code ORDER BY st_code ) AS num FROM ...

  3. Visual Studio 使用技巧

    整理备用: 1. 键入prop后,连续按两下tab,  可以自动生成属性,然后输入类型和名称. 类似的还有: propg, 生成private set的属性 propfull,生成私有字段,和相应属性 ...

  4. 2014年1月24日 Oracle 事务导读

    形象举例:  从 A 账户向 B 账户转账 10000 元 步骤: 1. A - 10000 2. B + 10000 事务的作用就是确保这两步无误执行后提交,若有一个执行不成功则失败. 结束事务的5 ...

  5. HDU 1055 - Color a Tree

    一棵树,结点树为n,根结点为r.每个结点都有一个权值ci,开始时间为0,每染色一个结点需要耗时1,每个结点的染色代价为ci*ti(ti为当前的时间),每个结点只有在父结点已经被染色的条件下才能被染色. ...

  6. VB 基础语法以及教学视频

    以下是我找到的几个视频和基础知识地址,我感觉比较不错的,现在分享给大家,你们都可以去借鉴以下 视频地址1:http://www.kcch.cn/excel2007_825.html 视频地址2:htt ...

  7. Android 有用的快捷键

    The powerful Android Studio 08 Jun 2016 Android Studio is the official tool for Android development ...

  8. HTML5 canvas 在线画笔绘图工具(三)

    组装画板(TDrawBuilder) 在这一小节中我们要把工具条和画板组装起来,让他们可以协同进行工作. 画板通过一个命名为TDrawBuilder来进行组装.在详细讲解TDrawBuilder对象之 ...

  9. Android系统信息

    前提:获取的都是AndroidMainfest.xml下的信息 一.PackageManager 负责管理所有已安装的App 二.ActivityInfo 封装了Mainifest中的<acti ...

  10. encoding(hdoj1020)

    Problem Description Given a string containing only 'A' - 'Z', we could encode it using the following ...