精华内容
下载资源
问答
  • OPC DA Client using C#

    2020-10-08 11:48:08
    OPC DA客户端 OPC DA客户端 OPC DA客户端OPC DA客户端 OPC DA客户端 OPC DA客户端OPC DA客户端
  • 节点红色贡献opcda客户端 可以使用该节点来读取和写入OPC DA服务器。 opcda服务器 opcda读取 opcda写 输入参数 opcda服务器 名称(可选) 要在节点中显示的OPC DA服务器的名称。 地址 OPC DA服务器的地址 域(可选...
  • opcDa3.0.pdf

    2021-07-28 15:25:47
    opcDa3.0.pdf
  • OPC DA客户端OCX控件

    2020-01-15 13:32:10
    OPCDA OPC Client客户端OCX控件,是一个封装了标准OPC Data Access客户端的OCX控件,利用该控件,可以便捷的实现对OPC DA服务器的连接,并获取由服务器提供的数据项(Item/Tag)。每个控件支持对一个OPC DA服务器的...
  • OPC Da 2.05

    2016-06-07 16:11:49
    对于OPC DA 2.0各种描述,详细描述了opc DA的各个接口的作用,也就是opc协议的定义文档
  • OPC DA 组件

    2016-08-25 10:43:53
    OPC DA 组件,OPC接口通信通用组件,已加载到.net中测试过。
  • OPC DA dcom配置

    2018-12-12 09:37:08
    OPC DA DCOM配置
  • opc DA 3.0

    2016-06-07 16:13:08
    opc DA 3.0协议描述文档
  • c#读取opcda中的数据,c#写opcclient 注意事项 确认windows系统使用的是32位系统还是64位,因为使用的动态链接库 OPCautomation.dll 是32位的,如果是使用的64位的系统则需要先进行一下动态链接库的注册,具体操作...

    c#读取opcda中的数据,c#写opcclient

    注意事项

    确认windows系统使用的是32位系统还是64位,因为使用的动态链接库 OPCautomation.dll 是32位的,如果是使用的64位的系统则需要先进行一下动态链接库的注册,具体操作可以百度

    添加引用动态链接库

    using OPCAutomation;
    

    定义变量

    定义变量,分别是opc 服务器、组列表、组、点位组、点位、opc浏览器,opcbrowser 用来枚举已连接的服务器中的点位列表

    OPCServer kepserver;
    OPCGroups kepgrops;
    OPCGroup kepgrop;
    OPCItems kepitems;
    OPCItem kepitem;
    OPCBrowser kepb;
    

    初始化

           public Form1()
            {
                InitializeComponent();
                try  //初始化变量 kepserver 如果错误,会通过catch 打印错误信息
                {
                    kepserver = new OPCServer();
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message.ToString(), "error");
                }
                textBox1.Text = "DESKTOP-I0O9U4Q";  //对textbox进行赋值,是计算机名称,我这里是本机的计算机名称。
    

    查找服务器

    使用combox组件对扫描到的opc server 进行展示,首先清空combobox,然后获取opc server列表,再通过枚举,将列表添加进combobox控件中。

    try
    {
       comboBox1.Items.Clear();   //清空combobox1 控件
       object serverlist = kepserver.GetOPCServers(textBox1.Text.ToString());  //获取opc server列表,textbox1控件中存放的是本机的计算机名
       foreach(string trun in (Array)serverlist)  //将获得的opc server列表进行枚举,添加进入combobox控件中
       {
           comboBox1.Items.Add(trun);
       }
    }
    catch(Exception err)  //如果发生错误,打印错误信息
    {
       MessageBox.Show(err.Message.ToString(), "error");
    }
    

    读取选中服务器中的点位表

    是将读取点位表数据与一个按钮的响应事件进行绑定,通过按钮的响应,将服务器中的点位表添加进入listbox 控件中,

            private void setkepservergrop() //设置opc组的函数,也没深究含义如何,复制就好
            {
                kepserver.OPCGroups.DefaultGroupIsActive = true;
                kepserver.OPCGroups.DefaultGroupDeadband = 0;
                kepgrop.UpdateRate = 500;
                kepgrop.IsActive = true;
                kepgrop.IsSubscribed = true;
            }
    
    
    
            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    listBox1.Items.Clear();
                    kepserver.Connect(comboBox1.Text, textBox1.Text);//连接服务器,前一个参数是选中的opcserver,后一个参数是计算机名称。
                    if(kepserver.ServerState != (int)OPCServerState.OPCRunning)//判断opcserver的运行状态
                    {
                        MessageBox.Show("server not run", "error");
                    }
                    else
                    {
                        kepb = kepserver.CreateBrowser(); //创建opcserver的browser,(复制就好)
                        kepb.ShowBranches();//展开“树”
                        kepb.ShowLeafs(true);//展开“叶”
                        foreach(var it in kepb)//通过枚举,将数据添加进入listbox控件中
                        {
                            listBox1.Items.Add(it);
                        }
                        kepgrops = kepserver.OPCGroups; //新建组变量
                        kepgrop = kepgrops.Add("ff");//添加组
                        setkepservergrop();//设置组的属性
                        kepgrop.DataChange += Kepgrop_DataChange; //条件datachange 即订阅的数据发生变化就触发的响应事件
                        kepgrop.AsyncReadComplete += Kepgrop_AsyncReadComplete; //调用读取函数后会触发的响应事件
                    }
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message.ToString(), "error");
                }
            }
    

    订阅点位

    还是将订阅数据绑定在一个按钮的响应事件中,会先将listbox的数据添加至listbox2中,则是选中要订阅的点位,

           private void addlistview()
            {
                listView1.Items.Clear();
                for(int i=0;i<listBox2.Items.Count;i++)
                {
                    ListViewItem ll = new ListViewItem();
                    ll.Text = listBox2.Items[i].ToString();
                    ll.SubItems.Add("0");
                    ll.SubItems.Add("bad");
                    ll.SubItems.Add("0");
                    listView1.Items.Add(ll);
                }
            }
    
    
            private void button3_Click(object sender, EventArgs e)
            {
                try
                {
                    kepitems = kepgrop.OPCItems;//新建opcitems的变量
                    List<string> itemid = new List<string>();//获取变量的名称
                    List<int> clientid = new List<int>();//对变量进行一个编号
                    itemid.Add("0");//opcitems的订阅列表是从1开始的
                    clientid.Add(0);//变量编号同样也是从列表的1开始
                    int numbitems;//订阅的变量总数
                    try
                    {
                        addlistview(); //添加了一个listview控件对订阅后的数据进行暂时,这是设置listview控件
                        numbitems = listBox2.Items.Count; //获取要读取变量的总数
                        for (int i = 0; i < numbitems; i++)//将变量名称即编号添加至对应的list列表中
                        {
                            itemid.Add(listBox2.Items[i].ToString());
                            clientid.Add(i + 1);
                        }
                        Array Itemid = itemid.ToArray();//因为函数要求变量类型必须是array  这里对变量进行一个转换
                        Array Clientid = clientid.ToArray();
                        kepitems.AddItems(numbitems, ref Itemid, ref Clientid, out serverhandle, out Error);//添加变量,这个函数是批量添加变量,获取的输出函数中的serverhandle  这个是array属性,是服务器中对变量的句柄,后去用来值写入的时候会用到
                        timer1.Start();
                    }
                    catch (Exception err)
                    {
                        MessageBox.Show(err.Message.ToString(), "error");
                    }
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message.ToString(), "error");
                }
            }
    

    datachange 数据发生变化触发的响应事件

    会在发生响应事件后,将变化的数据更新至listview控件中

            private void Kepgrop_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) //transactionid 是触发事件的编号,可以不用管,numitems是发生变化值的点位数量,clienthandles是句柄,这个与订阅变量时的clientid是对应的,通过这个的值来确定对应的变量,具体的顺序为 先确定numitems中当前值的clienthandles,然后通过clienthandles与clientid值相同来确定当前后续集合中的值对应的变量名称。itemvalues是变化后的值的集合,qualities是状态的集合,timestamps是时间的集合
            {
                try
                {
                    for(int i=1;i<NumItems;i++)
                    {
                        listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[1].Text = ItemValues.GetValue(i).ToString();//将对应的值,更新进入listview控件中,listview的items与订阅的变量顺序是一样的,所以直接使用clienthandle做索引即可。
                        if(Qualities.GetValue(i).ToString() == "192")//根据返回回来的状态,判断值的好坏。
                        {
                            listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[2].Text = "良好";
                        }
                        else
                        {
                            listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[2].Text = "bad";
                        }
                        listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[3].Text = TimeStamps.GetValue(i).ToString();//更新读取值的时间。
    
                    }
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message.ToString(), "datachange error");
                }
            }
    

    读取值

    datachange是只有当订阅的数据发生变化才会触发的响应,如果值没有发生变化,则那个值就永远不会触发datachange的响应事件,即永远不会通过datachange响应函数将数据更新值listview控件中。所以这里就要使用读取函数,定时对数据进行读取。

    //读取函数
            private void readdata(int i) //这里是将读取函数再次进行了一下封装,传递的函数为响应事件中的transactionid的值。
            {
                try
                {
                    int can;
                    kepgrop.AsyncRead(serverhandle.Length, ref serverhandle, out Error, i, out can);//对应的参数分别为读取的数量,读取的服务器句柄,serverhandle这个参数是订阅值的返回值,所以不用管,这里是全部读取。
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message.ToString(), "error");
                }
            }
    //读取函数触发的响应事件
    private void Kepgrop_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors)//transactionid的值为上诉调用读取函数的i的值,通过判断参数的值来判断是哪一个函数在调用读取函数,从而做出不同的响应,其他的就和datachange的响应函数的返回值一样了
            {
                //throw new NotImplementedException();
                string itemid, value, flag, time;
                try
                {
                    for (int i = 1; i <= NumItems; i++)
                    {
                        listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[1].Text = ItemValues.GetValue(i).ToString();
                        if (Qualities.GetValue(i).ToString() == "192")
                        {
                            listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[2].Text = "良好";
                        }
                        else
                        {
                            listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[2].Text = "bad";
                        }
                        listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[3].Text = TimeStamps.GetValue(i).ToString();
    
                    }
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message.ToString(), "error");
                }
                
            }                
    

    写入值

            private void button2_Click(object sender, EventArgs e) // 写入
            {
                int ff = 0;
                int c=0;
                List<int> itm = new List<int>();
                List<int> it = new List<int>();
                object value = new object[2] { "", textBox3.Text };//将要写入的值添加进入value中,同样,其也是从1开始
                
                itm.Add(0);
                
                
                Array Value = (Array) value;
                foreach(var v in serverhandle)//这一部分是获取要写入值的变量的serverhandle,将值与serverhandle相对应,即可实现值的写入,调用写入函数,即可实现值的写入
                {
                    it.Add(Convert.ToInt32(v));
                }
    
                for (int i=0;i<it.Count;i++)
                {
                    if(listBox2.Items[i].ToString() == listBox2.Text )
                    {
                        ff = i;
                    }
                }
    
                itm.Add(it[ff]);
                Array ss = itm.ToArray();
                kepgrop.AsyncWrite(1, ref ss, ref Value, out Error, 2009, out c);//其传递函数的类型都为array
                
            }
    

    工程文件
    在我的资源中,麻烦需要的人自己找吧。

    展开全文
  • C#版本opc da 源码

    2019-02-21 15:54:07
    C#版本opc da 源码
  • dd-opcda.ex

    2021-03-10 16:24:27
    dd-opcda.ex
  • OPC DA的DCOM配置.zip

    2021-05-20 17:27:40
    包含OPC DA的DCOM配置流程内容
  • PascalMing.OpcDA Server 2.05/3.0 OPC DA Server 2.05/3.0 Server releases。 OPC DA Server 2.05/3.0 发行版 功能:提供名称为:PascalMing.OpcDA的OPC DA服务,Tag由配置文件生成,可用于OPC Client客户端开发...

    PascalMing.OpcDA Server 2.05/3.0

    OPC DA Server 2.05/3.0 Server releases。 OPC DA Server 2.05/3.0 发行版

    功能:提供名称为:PascalMing.OpcDA的OPC DA服务,Tag由配置文件生成,可用于OPC Client客户端开发测试

    在开发OPC DA Client程序时需要用到OPC DA服务,商用的服务软件需要授权且安装庞大,可以考虑使用次服务

    数据项在OPCDA.PascalMing.config.xml文件中配置,支持多级节点。

     

    运行环境:Win10 开发环境:Visual Studio 2019 (v142)

    第一次使用需要注册,在管理员权限下,进入当前目录,执行: OPCDA.PascalMing.exe -regserver

    卸载执行:OPCDA.PascalMing.exe -unregserver

    ProgID:PascalMing.OpcDA

    托管地址:https://gitee.com/PascalMing/OPC-DA-Server-Simulation

    展开全文
  • Qt封装的OPCDA

    2017-06-30 15:04:09
    用Qt封装的OPC DA, 自己亲测可用, 颇费心力之作.可能有一些小毛病,但不妨使用. 封装了OPC DA的操作,代码比较简单,可以自行查看.
  • 测试OPC DA 通讯的工具,连接kepserver Ex , 开发
  • OPC源码,亲测可以使用,交给有缘人,打包在一起。 copcdatacallback copctransaction OPCClient opccomn Opcda OpcEnum opcerror unknownbase wldef
  • OPC DAOPC UA.pdf

    2020-08-26 15:48:45
    OPC 实时数据访问规范(OPC DA)定义了包括数据值,更新时间与数据品质信息的相关 标准。 OPC 历史数据访问规范(OPC HDA)定义了查询、分析历史数据和含有时标的数据的方 法。 OPC 报警事件访问规范(OPC AE)定义...
  • IOT开发:Kepware中OPC DA Client使用案列,详细介绍Kepware中如何进行设置新建Channel、设置Device、Kepware QC显示等3个过程
  • C#版本opc da 源码.rar

    2019-10-16 22:18:56
    C#版本opc da 源码.rar C#版本opc da 源码.rar C#版本opc da 源码.rar
  • .NET版本opc da 源码

    2019-03-21 16:44:26
    .NET版本opc da 源码
  • qt-opcda.rar

    2020-06-11 22:43:02
    开发环境:qt5.3mingw+win7x64,实现opc da 2.05的基本item的同步,异步读写,及数据变化自动上传等功能。
  • OPCOPC DAOPC UA介绍

    2021-07-20 09:01:07
    二、OPC DA介绍 1、OPC DA是什么? 2、OPC DA的本质 3、OPC DA的远程通讯 三、OPC UA介绍 1、OPC UA是什么? 2、OPC UA的本质 3、OPC UA特点 一、OPC介绍 1、OPC是什么? OPC是OLE for ProcessControl的缩写,即应用...

    一、OPC介绍

    1、OPC是什么?

    OPC是OLE for ProcessControl的缩写,即应用于过程控制,OPC就是基于COM/DCOM的数据访问的标准;

    2、OPC的本质

    OPC规范包括OPC服务器和OPC客户端两个部分。其本质是在硬件供应商和软件开发商之间建立一套完整的“规则”。

    3、OPC诞生背景

    1. OPC是在1996年前后,由几大自动化供应商组成一个工作组,负责开发基于COM和DCOM的数据访问标准,称之为OPC。这个事,和微软有关系。因为在90年代,微软的操作系统开始占据市场,并且自动化供应商也没有更好地选择。在微软推出COM和DCOM技术之后,自动化供应商在产品中开始使用这个技术。怎么说呢,因为可能在当时,没有比这更好的选择了。

    2. 但是呢,每家自动化用法不一样,有时候在一个项目或者软件里,不可能只使用一家供应商或一种设备的。为了解决这个问题,几大自动化公司就站出来说,我们来搞一套标准的吧,为了工业,为了未来。于是他们把这一套标准就称之为OPC了。96年左右。也就是Windons 95 刚出来。那时候互联网还没有发展起来,更别说物联网了。

    3. 在自动化行业,还是有数据采集需求,那采集的数据去哪里呢,就要去到上位机系统,上位机也就是Windows了,要知道那时候Windows的市场占有率多可怕。也就是在同一台电脑,又要进行数据采集,又要进行数据显示,又要应用在现场,这种电脑,很多时候往往就是工控机的角色了。

    4. 而电脑采集数据,无非就是通过串口,以太网,或者就是板卡集成到PC主机数据采集。这就为难了那个做纯软件开发,他们做的是UI的软件,也就是类似组态王之类的界面显示系统,但是每家的数据采集都不一样,没有个标准和统一,也可以理解为硬件商提供的数据采集都不一样。

    5. 也就是硬件厂商A把数据采集做好了,同时软件客户B把UI软件设计出来了,但是中间缺乏一个桥梁。UI调用数据,查阅和管理数据,按理说是可以用数据库的。在当时,可能COM和DCOM技术比使用数据库更为方便,以及更为开发者接受。所以自动化更倾向于使用COM和DCOM技术。也就是自动化供应商采集数据,封装成COM组件或服务。做UI系统的,比如组态王之类的,只需要调用COM组件或服务,就完美解决之前的数据对接桥梁问题。

    二、OPC DA介绍

    1、OPC DA是什么?

    这个D【就是Data】,这个A【就是Access】,OPC DA就是基于OPC标准的数据访问。

    2、OPC DA的本质

    1. OPC数据采集端,通过串口,以太网,板卡,采集到的数据,作为OPC服务端,以便OPC客户端来进行访问;

    2. 这里的客户端和服务端,并不是我们所说的TCP/IP里的客户端和服务器。在同一台电脑里,应用程序访问数据,是通过DOM技术来访问的。再通俗一点,比如A程序把采集到的数据写到一个指定文件里。然后B程序到指定的文件读取数据并显示出来的。所以OPCDA的数据采集,客户端和服务端的角色就是类似于A程序和B程序的角色一样。所以,我们目前见到的OPCDA数据采集,都是在同一台电脑里发生的。

    3. OPCDA不是协议。虽说OPC是一个标准,但是这个标准并不是指某个通信协议标准,而是指某种技术的使用标准和规范。

    3、OPC DA的远程通讯

    1. 既然OPCDA不是协议,更不是某种TCP协议,那是不是就意味着OPCDA不能在两台电脑之间访问呢?

    2. 也不是的。在Windows里,就存在一种两台电脑之间通信的机制或协议。叫RPC,也就是远程过程调用。简单地说,OPC DA呢,好比如电脑上的某个资源或文件之类的,而Windows的RPC,就是为了让两台电脑可以互相访问资源的。OPCDA的技术是COM技术,所以有些远程访问OPC,也看到描述为OPC COM之类的。

    3. 像这种还是基于PC到PC的。也就是纯OPCDA,如果想要支持远程访问,那就必须配置支持RPC服务等。实际上还是借助了RPC通道或服务来间接使用OPCDA的访问。而且这种应用呢,也局限于在Windows的使用。

    三、OPC UA介绍

    1、OPC UA是什么?

    OPC UA(OPC Unified Architecture)是指OPC统一体系架构,是一种基于服务的、跨越平台的解决方案。

    2、OPC UA的本质

    1. OPC UA除了约定了数据等定义规范,同时还支持了TCP/IP协议。使得远程访问不再局限于使用RPC技术。
    2. OPC UA支持跨平台,跨系统,可以在各平台,各系统进行数据通信访问。
    3. OPC UA的数据结构,存储,映射等,不再使用COM/DCOM技术,就意味着不再限制于Windows了。
    4. 信息加密,互访认证以及安全监听功能。
    5. 丰富的信息建模:可定义复杂的信息,而不再是单一的数据。

    3、OPC UA特点

    1. 扩展了OPC的应用平台。传统的基于COM/DCOM 的OPC技术只能基于Windows操作系统,OPC UA支持拓展到Linux和Unix平台。这使得基于OPC UA的标准产品可以更好地实现工厂级的数据采集和管理;
    2. 不再基于DCOM通讯,不需要进行DCOM安全设置;
    3. OPC UA定义了统一数据和服务模型,使数据组织更为灵活,可以实现报警与事件、数据存取、历史数据存取、控制命令、复杂数据的交互通信;
    4. OPC UA比OPC DA更安全。OPC UA传递的数据是可以加密的,并对通信连接和数据本身都可以实现安全控制。新的安全模型保证了数据从原始设备到MES,ERP系统,从本地到远程的各级自动化和信息化系统的可靠传递;
    5. OPC UA可以穿越防火墙,实现Internet 通讯。
    展开全文
  • opcda开发指南
  • opc da-xml

    2014-07-23 21:45:24
    OPC DA XML 的wsdl 根据编译器的不同变成自己想要的文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,124
精华内容 849
关键字:

opcda