2584
社区成员
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后台资源没清干净,不知道哪位大佬能解决
请问楼主解决了吗?我也遇到同样的问题了