c# opcda数据采集mqtt数据转发,

用有道云笔记写的,但是没法移植,有点小坑,下面的程序说明连接能看说明,要是提示维护之类的就多进去下

程序说明

界面

在这里插入图片描述
图片不清楚可以去有道云里面看

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OPCAutomation;
using HslCommunication.MQTT;


namespace opctcp
{
    public partial class Form1 : Form
    {
        OPCServer kepserver = new OPCServer();
        OPCGroups kepgrops;
        OPCGroup kepgrop;
        OPCItems kepitems;
        OPCItem kepitem;
        int itmHandleServer = 0;

        private OPCBrowser kepb;
        string[] items = new string[] { };
        string computername = "DESKTOP-I0O9U4Q";
        List<string> value = new List<string>();
        private Array serverhandle;
        Array Error;

        string mqttaddress = "121.37.160.223";
        int mqttport = Convert.ToInt32("1883");
        string topic = "c";
        string clientid = "win10";
        MqttCredential us = new MqttCredential("admin", "public");

        string valuestring;

        public Form1()
        {
            InitializeComponent();
            //textBox1.Text = computername;
            //timer1.Start();
            mm = new MqttClient(new MqttConnectionOptions()
            {
                ClientId = clientid,
                IpAddress = mqttaddress,
                Port = mqttport,
                Credentials = us
            }) ;
            mm.ConnectServer();
        }

        

        private void setkepservergrop()
        {
            kepserver.OPCGroups.DefaultGroupIsActive = true;
            kepserver.OPCGroups.DefaultGroupDeadband = 0;
            kepgrop.UpdateRate = 500;
            kepgrop.IsActive = true;
            kepgrop.IsSubscribed = true;
        }

        private MqttClient mm = null;

        private void button4_Click(object sender, EventArgs e)  //查找opcserver
        {
            try
            {
                comboBox1.Items.Clear();
                object serverlist = kepserver.GetOPCServers(textBox1.Text.ToString());
                foreach (string turn in (Array)serverlist)
                {
                 comboBox1.Items.Add(turn);
                }
                
            }
            catch (Exception etion)
            {
                MessageBox.Show(etion.Message.ToString(),"error");
            }
            
        }

        private void button1_Click(object sender, EventArgs e)  //连接服务器,读取变量
        {
            try
            {
                listBox1.Items.Clear();
                kepserver.Connect(comboBox1.Text, textBox1.Text);
                if (kepserver.ServerState != (int)OPCServerState.OPCRunning)
                {
                    MessageBox.Show("server not run", "error");
                }
                else
                {
                    kepb = kepserver.CreateBrowser();
                    kepb.ShowBranches();
                    kepb.ShowLeafs(true);
                    foreach (var item in kepb)
                    {
                        listBox1.Items.Add(item);
                    }

                    kepgrops = kepserver.OPCGroups;
                    
                    kepgrop = kepgrops.Add("ff");
                    setkepservergrop();
                    kepgrop.DataChange += Kepgrop_DataChange;
                    kepgrop.AsyncReadComplete += Kepgrop_AsyncReadComplete;
                    
                    
                }
            }
            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)
        {
            //throw new NotImplementedException();
            string status;
            for(int i=1;i<=NumItems;i++)
            {
                valuestring = valuestring+ listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].Text + "=" +"\"" +  ItemValues.GetValue(i).ToString()+"\""+",";
            }
            mm.PublishMessage(new MqttApplicationMessage()
            {
                Topic = topic,
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
                Payload = Encoding.UTF8.GetBytes(valuestring),
                Retain = false,
            });
            valuestring = "";
        }

        private void addlistview()
        {
            listView1.Items.Clear();

            for (int ii = 0; ii < listBox2.Items.Count; ii++)
            {
                ListViewItem ll = new ListViewItem();
                ll.Text = listBox2.Items[ii].ToString();
                ll.SubItems.Add("0");
                ll.SubItems.Add("bad");
                ll.SubItems.Add("0");
                listView1.Items.Add(ll);
            }
        }

        private void Kepgrop_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        // numitems  值变化的标签数量    clienthandles   句柄   itemvalues  值   qualities  状态位
        {
            //throw new NotImplementedException()
            try
            {

                
                for (int i = 1; i <= NumItems; i++)
                {
                textBox3.Text = Qualities.GetValue(i).ToString();
                    
                    listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[1].Text = ItemValues.GetValue(i).ToString();
                    listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[3].Text = TimeStamps.GetValue(i).ToString();
                    listView1.Items[Convert.ToInt32(ClientHandles.GetValue(i).ToString()) - 1].SubItems[2].Text = Qualities.GetValue(i).ToString();
                    
                }
            }
            catch(Exception emm)
            {
                MessageBox.Show(emm.Message.ToString(), "error");
            }
            
        }
      
        private void ff(object sender, EventArgs e)
        {
            if(!listBox2.Items.Contains(listBox1.Text))
            {
                listBox2.Items.Add(listBox1.Text);
            }
        }

        

        private void button3_Click(object sender, EventArgs e)  //确定添加点位
        {
            kepitems = kepgrop.OPCItems;
            List<string> itemid = new List<string>();
            List<int> clienthandle = new List<int>();
            itemid.Add("0");
            clienthandle.Add(0);
            int numbitems;

            try
            {
                addlistview();
                //for (int i = 0; i < listBox2.Items.Count; i++)
                //{
                //kepitem = kepitems.AddItem(listBox2.Items[i].ToString(), (i+1));
                //listBox3.Items.Add(listBox2.Items[i].ToString() + (i + 1).ToString());
                //}

                numbitems = listBox2.Items.Count;

                for(int i=0;i<numbitems;i++)
                {
                    itemid.Add(listBox2.Items[i].ToString());
                    clienthandle.Add(i + 1);
                }

                Array Itemid = itemid.ToArray();
                Array Cliendhandle = clienthandle.ToArray();
                kepitems.AddItems(numbitems, ref Itemid, ref Cliendhandle, out serverhandle, out Error);
            }
            finally
            {
                
            }
            //kepitem = kepitems.AddItem("m.m.dd", 1);
            //kepitem = kepitems.AddItem("m.m.jj", 2);

            timer1.Start();
        }

        

        

        

        private void delet1(object sender, EventArgs e)
        {
            listBox2.Items.RemoveAt(listBox2.Items.IndexOf(listBox2.Text));
            
        }

        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 };
            
            itm.Add(0);
            
            
            Array Value = (Array) value;
            foreach(var v in 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);
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int tran=0, can;
            kepgrop.AsyncRead(serverhandle.Length, ref serverhandle, out Error, tran, out can);
            
        }
    }
}

测试环境是已经完成了,就是会需要针对自己的计算机修改一下 里面的参数,如果说自己跑有问题,读取不成功的话可以留言,我看能不能直接挂工程。

也可以直接在mqtt发送数据的那个代码那,直接替换,将数据写入mysql数据库,或者其他的通讯方式。

C#中,可以使用OPCDA(OLE for Process Control Data Access)接口实现数据采集。下面是一个简单的示例代码: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OPCAutomation; namespace OPCDATest { class Program { static void Main(string[] args) { OPCServer opcServer = new OPCServer(); OPCGroups opcGroups; OPCGroup opcGroup; OPCItems opcItems; OPCItem opcItem; Array itemValues; try { opcServer.Connect("Matrikon.OPC.Simulation.1"); Console.WriteLine("OPC server connected."); opcGroups = opcServer.OPCGroups; opcGroup = opcGroups.Add("Group1"); opcGroup.UpdateRate = 500; opcGroup.IsActive = true; opcItems = opcGroup.OPCItems; opcItem = opcItems.AddItem("Random.Real4", 1); opcItem.Read(1, out itemValues); Console.WriteLine("Value of Random.Real4: {0}", itemValues.GetValue(1)); opcGroup.IsActive = false; opcGroups.Remove(opcGroup); opcServer.Disconnect(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } } } ``` 在上述示例中,首先创建了一个 `OPCServer` 对象,并使用 `Connect()` 方法连接到 OPC 服务器。然后创建了一个 `OPCGroup` 对象,并设置了 `UpdateRate` 属性为 500 毫秒,并将其激活。接着创建了一个 `OPCItem` 对象,并使用 `AddItem()` 方法添加了一个项,该项对应了一个 OPC 服务器中的标签 "Random.Real4"。最后使用 `Read()` 方法获取该项的值,并输出到控制台上。 需要注意的是,上述示例中使用了Matrikon.OPC.Simulation.1这个OPC服务器进行示例演示,你可以根据实际情况修改连接的OPC服务器的名称。同时,还需要在项目中引用 `OPCAutomation` 这个 COM 组件。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值