dahei_comeback 2021-06-17 14:56 采纳率: 0%
浏览 336

opc客户端 添加item时 程序退出 返回值为 -2147483645

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() + "\"}");

                }
            }

        }
    }
}
}
  • 写回答

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驱动开发环境