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

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#的新手  知道问题代码在哪 但是不知道怎么解决

    评论

报告相同问题?

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误