我用的是opcAutomation连接opc server,读取item的值,但是当我选择多个item时,
会报数组索引超出界限的异常。
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
}
}