summerJS 2017-06-06 02:13 采纳率: 0%
浏览 4661

OPC client一次性读取多个item值报错

我用的是opcAutomation连接opc server,读取item的值,但是当我选择多个item时,
会报数组索引超出界限的异常。
图片说明
图片说明

  • 写回答

1条回答 默认 最新

  • summerJS 2017-06-06 02:14
    关注

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Collections;
    using OPCAutomation;
    using MySql.Data.MySqlClient;

    namespace OPC测试通过
    {
    public partial class MainFrom : Form
    {
    public MainFrom()
    {
    InitializeComponent();
    }

        #region 私有变量
        /// <summary>
        /// OPCServer Object
        /// </summary>
        OPCServer KepServer;
        /// <summary>
        /// OPCGroups Object
        /// </summary>
        OPCGroups KepGroups;
        /// <summary>
        /// OPCGroup Object
        /// </summary>
        OPCGroup KepGroup;
        /// <summary>
        /// OPCItems Object
        /// </summary>
        OPCItems KepItems;
        /// <summary>
        /// OPCItem Object
        /// </summary>
        OPCItem KepItem;
        /// <summary>
        /// 主机IP
        /// </summary>
        string strHostIP = "";
        /// <summary>
        /// 主机名称
        /// </summary>
        string strHostName = "";
        /// <summary>
        /// 连接状态
        /// </summary>
        bool opc_connected = false;
        /// <summary>
        /// 客户端句柄
        /// </summary>
        int itmHandleClient = 0;
        /// <summary>
        /// 服务端句柄
        /// </summary>
        int itmHandleServer = 0;
        #endregion
    
        #region 方法
        /// <summary>
        /// 枚举本地OPC服务器
        /// </summary>
        private void GetLocalServer()
        {
            //获取本地计算机IP,计算机名称
            IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);
            if (IPHost.AddressList.Length > 0)
            {
                strHostIP = IPHost.AddressList[0].ToString();
            }
            else
            {
                return;
            }
            //通过IP来获取计算机名称,可用在局域网内
            IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);
            strHostName=ipHostEntry.HostName.ToString();
    
            //获取本地计算机上的OPCServerName
            try
            {
                KepServer = new OPCServer();
                object serverList = KepServer.GetOPCServers(strHostName);
    
                foreach (string turn in (Array)serverList)
                {
                    cmbServerName.Items.Add(turn);
                }
    
                cmbServerName.SelectedIndex = 5;
                btnConnServer.Enabled = true;
            }
            catch(Exception err)
            {
                MessageBox.Show("枚举本地OPC服务器出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            }
    
        }
        /// <summary>
        /// 创建组
        /// </summary>
        private bool CreateGroup()
        {
            try
            {
                KepGroups = KepServer.OPCGroups;
                KepGroup = KepGroups.Add("mygroup");
                SetGroupProperty();
                KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
    
                KepItems = KepGroup.OPCItems;
            }
            catch (Exception err)
            {
                MessageBox.Show("创建组出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                return false;
            }
            return true;
        }
        /// <summary>
        /// 设置组属性
        /// </summary>
        private void SetGroupProperty()
        {
            KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive.Text);
            KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text);
            KepGroup.UpdateRate = Convert.ToInt32(txtUpdateRate.Text);
            KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text);
            KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text);
        }
        /// <summary>
        /// 列出OPC服务器中所有节点Item
        /// </summary>
        /// <param name="oPCBrowser"></param>
        private void RecurBrowse(OPCBrowser oPCBrowser)
        {
            //展开分支
            oPCBrowser.ShowBranches();
            //展开叶子
            oPCBrowser.ShowLeafs(true);
            foreach (object turn in oPCBrowser)
            {
                comboBox1.Items.Add(turn.ToString());
                comboBox2.Items.Add(turn.ToString());
                comboBox3.Items.Add(turn.ToString());
            }
            comboBox1.SelectedIndex = 0;
            comboBox2.SelectedIndex = 0;
            comboBox3.SelectedIndex = 0;
            button1.Enabled = true;
        }
        /// <summary>
        /// 获取服务器信息,并显示在窗体状态栏上
        /// </summary>
        private void GetServerInfo()
        {
            tsslServerStartTime.Text ="开始时间:"+ KepServer.StartTime.ToString()+"    ";
            tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToString()+"."+KepServer.BuildNumber.ToString();
        }
        /// <summary>
        /// 连接OPC服务器
        /// </summary>
        /// <param name="remoteServerIP">OPCServerIP</param>
        /// <param name="remoteServerName">OPCServer名称</param>
        private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName)
        {
            try
            {
                KepServer.Connect(remoteServerName, remoteServerIP);
    
                if (KepServer.ServerState == (int)OPCServerState.OPCRunning)
                {
                    tsslServerState.Text = "已连接到-" + KepServer.ServerName + "   ";
                }
                else
                {
                    //这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
                    tsslServerState.Text = "状态:" + KepServer.ServerState.ToString() + "   ";
                }
            }
            catch (Exception err)
            {
                MessageBox.Show("连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            return true;
        }
        #endregion
    
        #region 事件
        /// <summary>
        /// 写入TAG值时执行的事件
        /// </summary>
        /// <param name="TransactionID"></param>
        /// <param name="NumItems"></param>
        /// <param name="ClientHandles"></param>
        /// <param name="Errors"></param>
    
        /// <summary>
        /// 连接数据库
        /// </summary>
        MySqlConnection connectMySql()
        {
            MySqlConnection conn;
            string constr = "server=localhost;User Id=root;password=123;Database=aotewei";
            conn = new MySql.Data.MySqlClient.MySqlConnection(constr);
            return conn;
        }
        /// <summary>
        /// 每当项数据有变化时执行的事件
        /// </summary>
        /// <param name="TransactionID">处理ID</param>
        /// <param name="NumItems">项个数</param>
        /// <param name="ClientHandles">项客户端句柄</param>
        /// <param name="ItemValues">TAG值</param>
        /// <param name="Qualities">品质</param>
        /// <param name="TimeStamps">时间戳</param>
        void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {
            MySqlConnection conn = connectMySql();
            MySqlCommand cmd;
            conn.Open();
            //为了测试,所以加了控制台的输出,来查看事物ID号
            //Console.WriteLine("********"+TransactionID.ToString()+"*********");
    
                this.txtTimeStamps1.Text = TimeStamps.GetValue(1).ToString();
                this.txtTagValue1.Text = ItemValues.GetValue(1).ToString();
                this.txtQualities1.Text = Qualities.GetValue(1).ToString();
                this.txtTagValue2.Text = ItemValues.GetValue(2).ToString();
                //cmd = conn.CreateCommand();
                //cmd.CommandText = "insert into test2(list1,list2,list3)VALUES(@list1,@list2,@list3)";
                //cmd.Parameters.AddWithValue("@list1", ItemValues.GetValue(i).ToString());
                //cmd.Parameters.AddWithValue("@list2", Qualities.GetValue(i).ToString());
               // cmd.Parameters.AddWithValue("@list3", TimeStamps.GetValue(i).ToString());
                //cmd.ExecuteNonQuery();
                //conn.Close();
    
        }
        /// <summary>
        /// 选择列表项时处理的事情
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
    
        /// <summary>
        /// 载入窗体时处理的事情
        /// </summary>
        private void MainFrom_Load(object sender, EventArgs e)
        {
            GetLocalServer();
        }
        /// <summary>
        /// 关闭窗体时处理的事情
        /// </summary>
        private void MainFrom_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!opc_connected)
            {
                return;
            }
    
            if (KepGroup != null)
            {
                KepGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
            }
    
            if (KepServer != null)
            {
                KepServer.Disconnect();
                KepServer = null;
            }
    
            opc_connected = false;
        }
        /// <summary>
        /// 【按钮】设置
        /// </summary>
        private void btnSetGroupPro_Click(object sender, EventArgs e)
        {
            SetGroupProperty();
        }
        /// <summary>
        /// 【按钮】连接OPC服务器
        /// </summary>
        private void btnConnLocalServer_Click(object sender, EventArgs e)
        {
            try
            {
                if (!ConnectRemoteServer(txtRemoteServerIP.Text,cmbServerName.Text))
                {
                    return;
                }
    
                btnSetGroupPro.Enabled = true;
    
                opc_connected = true;
    
                GetServerInfo();
    
                RecurBrowse(KepServer.CreateBrowser());
    
                if (!CreateGroup())
                {
                    return;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        /// <summary>
        /// 【按钮】选择item
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            itmHandleClient = 1234;
            KepItems.AddItem(comboBox1.SelectedItem.ToString(), itmHandleClient);
            itmHandleClient++;
            KepItems.AddItem(comboBox2.SelectedItem.ToString(), itmHandleClient);
           itmHandleClient++;
          KepItems.AddItem(comboBox3.SelectedItem.ToString(), itmHandleClient);
           // itmHandleClient++;
           // KepItems.AddItem(comboBox4.SelectedItem.ToString(), itmHandleClient);
           // itmHandleClient++;
           // KepItems.AddItem(comboBox5.SelectedItem.ToString(), itmHandleClient);
           // itmHandleClient++;
           // KepItems.AddItem(comboBox6.SelectedItem.ToString(), itmHandleClient);
        }
        #endregion
    
    
    }
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R