using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using OPCAutomation;
using RabbitMQ.Client;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
System.Timers.Timer t = new System.Timers.Timer(2000);//实例化timmer类,设置间
//隔时间为10000毫秒
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行的事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true)
t.Enabled = true;//是否执行System.Timer.Elapsed事件;
OPCServer server = new OPCServer();
//此处127.0.0.1字符串,为本地IP地址,也可别的电脑IP或者电脑名称;此处测试,就以本地IP测试;
IPHostEntry host = Dns.GetHostEntry("127.0.0.1");
//获取此电脑上的所有OPC服务器的ProgId,有了它,才能连接到OPC服务器。注意此处为一组OPC服务器集合,
//而非单个,具体数量根据实际情况而定,当然,也可以是一个,我只是想说它是一个服务器的集合。
object progIds = server.GetOPCServers(host.HostName);
string haiLin = "";
foreach (string progId in (Array)progIds)
{
if (progId == "KingView.View")
//if (progId == "海林计费.OPCSVR.1")
{
haiLin = progId;
server.Connect(haiLin);
}
}
if (haiLin == "")
{
Console.WriteLine("内部错误001002");
Console.ReadKey();
}
else
{
//此处是获得单个progId,方便后面连接。
server.Connect("KingView.View");
//server.Connect("海林计费.OPCSVR.1");
if (server.ServerState == Convert.ToInt32(OPCServerState.OPCRunning))
{
Console.WriteLine("连接 KingView.View 成功");
//此处为常规设置,group中还有许多参数没有设置,我都采取了它的默认值,我没有特殊要求,所以不用改。
OPCGroups groups = server.OPCGroups;
OPCGroup group = groups.Add("myNewGroup");
//此处必须修改,因为默认订阅功能为false;当然你也可以根据别的方式获取数据。
Console.WriteLine("There is 111");
//group.UpdateRate = 3;
group.IsActive = true;
group.IsSubscribed = true;
group.DataChange += Group_DataChange;
Console.WriteLine("There is 222" + group.LocaleID);
//此处为设定需要的ItemIds,就是你需要订阅的哪些数据。
//具体根据需求而来。
List<string> ItemIds = new List<string>()
{
#region
"计时1.Name",
#endregion
};
Console.WriteLine("There is 444----" + ItemIds);
//把需要订阅的项添加到group中
for (int i = 0; i < ItemIds.Count; i++)
{
Console.WriteLine("There is 555------" + ItemIds[i]);
OPCItem myItem = group.OPCItems.AddItem(ItemIds[i], i);
Console.WriteLine(myItem+"myItem");
}
Console.WriteLine("There is 555");
Console.WriteLine();
Console.ReadKey();
}
Console.WriteLine();
}
}
static void theout(object source, System.Timers.ElapsedEventArgs e)
{
OPCServer server = new OPCServer();
//此处127.0.0.1字符串,为本地IP地址,也可别的电脑IP或者电脑名称;此处测试,就以
//本地IP测试;
IPHostEntry host = Dns.GetHostEntry("127.0.0.1");
//获取此电脑上的所有OPC服务器的ProgId,有了它,才能连接到OPC服务器。注意此处为
//一组OPC服务器集合,
//而非单个,具体数量根据实际情况而定,当然,也可以是一个,我只是想说它是一个服务器的集合。
object progIds = server.GetOPCServers(host.HostName);
string haiLin = "";
foreach (string progId in (Array)progIds)
{
if (progId == "KingView.View")
//if (progId == "海林计费.OPCSVR.1")
{
haiLin = progId;
server.Connect(progId);
break;
}
}
if (haiLin == "")
{
Console.WriteLine("KingView.View软件连接失败,2秒后重试");
Console.ReadKey();
}
//Console.WriteLine("ok");
//MessageBox.Show("OK!");
}
private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
Console.WriteLine("There is 333");
//连接rabbitmq
var factory = new ConnectionFactory();
factory.HostName = "127.0.0.1";
factory.UserName = "guest";
factory.Password = "guest";
Console.WriteLine("There is " + NumItems + " data changed.");
//此处注意i是从1开始,因为getvalue没有0.下面输出分别为数据的ClientHandles(就是上文AddItem方法的第二个参数。),Itemvalue就是值,Qualities为质量,timestamps为时间。
for (int i = 1; i < NumItems + 1; i++)
{
//Console.WriteLine("{\"tag\":\"" + ClientHandles.GetValue(i).ToString() + "\",\"value\":\"" + ItemValues.GetValue(i).ToString() + "\",\"value_time\":\"" + TimeStamps.GetValue(i).ToString() + "\"}");
List<string> NItemIds = new List<string>()
{
#region
"计时1.Name",
#endregion
};
for (int j = 0; j < NItemIds.Count; j++)
{
if (Convert.ToInt32(ClientHandles.GetValue(i)) == j)
{
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("dire", false, false, false, null);
string message = "{\"tag\":\"" + NItemIds[j].ToString() + "\",\"value\":\"" + ItemValues.GetValue(i).ToString()
+ "\",\"value_time\":\"" + TimeStamps.GetValue(i).ToString() + "\"}";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "dire", null, body);//开启传递
Console.WriteLine("已发送: {0}", message);
Console.ReadLine();
}
}
Console.WriteLine("{\"tag\":\"" + NItemIds[j].ToString() + "\",\"value\":\"" + ItemValues.GetValue(i).ToString()
+ "\",\"value_time\":\"" + TimeStamps.GetValue(i).ToString() + "\"}");
}
}
}
}
}
}
opc客户端 添加item时 程序退出 返回值为 -2147483645
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
- dahei_comeback 2021-06-17 14:59关注
之前对接过别的 好使 然后 现在对接 新的软件 一到 OPCItem myItem = group.OPCItems.AddItem(ItemIds[i], i); 这一步 程序就退出 研究了好几天了 也是个c#的新手 知道问题代码在哪 但是不知道怎么解决
解决 无用评论 打赏 举报
悬赏问题
- ¥30 STM32 INMP441无法读取数据
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error
- ¥15 VS2022+WDK驱动开发环境