用有道云笔记写的,但是没法移植,有点小坑,下面的程序说明连接能看说明,要是提示维护之类的就多进去下
界面
图片不清楚可以去有道云里面看
代码
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数据库,或者其他的通讯方式。