OPC为什么添加Item错误

心翼叶少 2021-07-30 18:09:13
OPCServer MyOpcServer;//OPCServer
        OPCGroup MyOpcGroup;//
        OPCItem MyOpcItem1;
        OPCItem MyOpcItem2;
        int[] ServerHandle = new int[2];//服务器端注册句柄
        const int READASYNC_ID = 1;//异步读事务
        const int WRITEASYNC_ID = 2;//异步写事务

        bool IsConnect = false;
        //【连接】
        private void BtnConnect_Click(object sender, RoutedEventArgs e)
        {
            string serverName = "Matrikon.OPC.Simulation.1";
            string ipAddress = "127.0.0.1";
            try
            {
                if (IsConnect == false)
                {
                    MyOpcServer = new OPCServer();
                    MyOpcServer.Connect(serverName, ipAddress);
                    MessageBox.Show("服务器状态:" + MyOpcServer.ServerState);
                    if (MyOpcServer.ServerState == (int)OPCServerState.OPCRunning)
                    {
                        MessageBox.Show("连接成功");
                        IsConnect = true;
                    }
                    else
                    {
                        MessageBox.Show("连接服务器失败");
                    }
                }
                else
                {
                    MessageBox.Show("登录失败");
                    MyOpcServer.Disconnect();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("连接异常:" + ex.Message);
            }
        }
        //【添加组】
        private void BtnAddGroup_Click(object sender, RoutedEventArgs e)
        {
            MyOpcGroup = MyOpcServer.OPCGroups.Add("MyGroup1");

            MyOpcGroup.IsActive = true;
            MyOpcGroup.IsSubscribed = true;//是否异步,在采用异步读写,订阅等方式下都需要为true
            MyOpcGroup.DeadBand = 0;
            MyOpcGroup.UpdateRate = 2000;//更新速率s
            MyOpcGroup.DataChange += MyOpcGroup_DataChange;
            MyOpcItem1 = MyOpcGroup.OPCItems.AddItem("Random.Int2", 1);
            
        }

        private void MyOpcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {
            try
            {
                for (int i = 1; i < NumItems + 1; i++)
                {
                    for (int j = 1; j < 3; j++)
                    {
                        if (Convert.ToInt32(ClientHandles.GetValue(i + 1)) == j)
                        {
                            if (ItemValues.GetValue(i + 1) != null)
                            {
                                txt_R2_Value.Text = ItemValues.GetValue(i).ToString();
                                txt_R2_Quality.Text = Qualities.GetValue(i).ToString();
                                txt_R2_TimeStamp.Text = TimeStamps.GetValue(i).ToString();
                            }
                        }
                    }
                }
                //for (int i = 1; i < NumItems + 1; i++)
                //{     
                //    txt_R2_Value.Text = ItemValues.GetValue(i).ToString();
                //    txt_R2_Quality.Text = Qualities.GetValue(i).ToString();
                //    txt_R2_TimeStamp.Text = TimeStamps.GetValue(i).ToString(); 
                //}
            }
            catch (System.Exception error)
            {
                MessageBox.Show(error.Message, "Result - 订阅");
            }
        }
        //【读】
        private void BtnRead_Click(object sender, RoutedEventArgs e)
        {
            object ItemValues;
            object Qualities;
            object TimeStamps;
            try
            {
                MyOpcItem1.Read(1, out ItemValues, out Qualities, out TimeStamps);
                txt_R1_Value.Text = String.Format("{0}", ItemValues);
                // Quality
                txt_R1_Quality.Text = String.Format("{0}", Qualities);
                // Timestamp
                txt_R1_TimeStamp.Text = String.Format("{0}", TimeStamps);
            }
            catch (System.Exception error)
            {
                MessageBox.Show(error.Message, "Result - 同步读");
            }
        }
        //【关闭】
        private void BtnClose_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (MyOpcItem1 != null)
                    MyOpcItem1 = null;
                if (MyOpcItem2 != null)
                    MyOpcItem2 = null;
                if (MyOpcGroup != null)
                    MyOpcGroup = null;
                if (MyOpcServer != null)
                {
                    MyOpcServer.Disconnect();
                    MessageBox.Show("已关闭");
                }
                GC.Collect();
            }
            catch (System.Exception error)
            {
                MessageBox.Show(error.Message, "Result - 异步写");
            }
        }

添加组里添加数据项:MyOpcItem1 = MyOpcGroup.OPCItems.AddItem("Random.Int2", 1); 我调试程序,运行到这里程序直接闪退,没报任何错,但偶尔有时候又可以读取到数据,有人也说是opc后台资源没清干净,不知道哪位大佬能解决

...全文
309 1 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Xieww1994 03-22

请问楼主解决了吗?我也遇到同样的问题了

  • 打赏
  • 举报
回复
相关推荐
发帖
资源

2584

社区成员

VC/MFC 资源
社区管理员
  • 资源
加入社区
帖子事件
创建了帖子
2021-07-30 18:09
社区公告
暂无公告