OPC为什么添加Item错误
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后台资源没清干净,不知道哪位大佬能解决
相关推荐
C#编码OPC使用
VS2010 C# 编写的OPC服务器查看,item查看与自动添加办法
OPC DA自动化工具:opcdaauto.dll使用指南
OPC DA(OLE for Process Control Data Access)是一种基于微软OLE/COM技术的工业自动化数据访问标准,旨在解决不同工业控制系统之间的数据交换问题。它的核心价值在于提供一个统一的接口,使不同的软硬件平台能够在不直接依赖于特定厂商技术的前提下交换数据。OPC (OLE for Process Control) 技术是一套国际标准,它定义了进程控制领域中不同设备、软件之间如何进行数据交换的规范。
OPC Core Components详解:从OPC DA到OPC UA的实战指南
在工业自动化和设备互联场景中,不同品牌PLC与上位机之间往往需要一套统一的通讯规则,OPC标准因此成为数据采集与SCADA系统打通的关键。而OPC Core Components作为这套体系最底层的协议与组件基础,决定了上层应用如何与硬件高效交互。从早期基于COM/DCOM的OPC DA,到现代基于TCP和HTTPS的OPC UA,核心组件经历了从对象模型到信息模型的重构,并直接影响了KepServer配置、OPC Quick Client测试、C++接口调用等日常操作。本文从工程实践出发,讲解Server
Interop.OPCAutomation.dll及opcdaauto.dll,C#与OPC通讯使用
C# 与OPC通讯时会用到,一起提供,方便下载!
C#通过OPCdotNETLib.dll调用OPC服务源码
C#通过OPCdotNETLib.dll调用OPC服务源码 内涵OPCdotNETLib.dll源码和调用实例程序


资源
