c# 通过OPCAutomation 开发OPC

qq_34213687 2016-09-05 11:59:36
代码连接服务器成功,可以读取到服务器节点,但是调用SyncRead读取数据的方法时报错 找了好多资料都找不到错误点在哪,求各位大神支招。附代码
public void kepProcess()
{
KepGroup = KepGroups.Add("Group0");
KepGroup.UpdateRate = 250;
KepGroup.IsActive = true;
KepGroup.IsSubscribed = true;

//当KepGroup中数据发生改变的触发事件
KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
KepItems = KepGroup.OPCItems;
int[] temp = new int[2];
temp[0] = 0;
KepItems.AddItem("Random Int1", 1);
OPCItem bItem = KepItems.Item(1);
Array serverHandles = (Array)temp;
Array values;
Array Errors;
Object cancel;
Object Qualities;
KepGroup.SyncRead((short)OPCAutomation.OPCDataSource.OPCCache, serverHandles.Length, ref serverHandles, out values, out Errors, out Qualities, out cancel);
}
...全文
771 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
趙小雲 2020-10-13
  • 打赏
  • 举报
回复
读取出错一般都是在建立handle的时候有问题,注意handle的第一位要是0,从第二位再开始赋值,这样就不会出问题了。
水宁墨 2020-09-21
  • 打赏
  • 举报
回复
private void OPCUAStart_Click(object sender, EventArgs e){ //KepServer = new OPCServer(); _OpcTaskEnd = false; try{ KepServer.Connect("Techmation.OPC.Server.V1"); //需要修改设置OPCDA服务器名 //KEPware.KEPServerEx.V4 if (KepServer.ServerState == (int)OPCServerState.OPCRunning){ //海天OPC初始化,需要 KepServer连接上服务器才能初始化 InitializeOPC(); OPCUAStatusTxt.Text = "已连接上"; OPUDAStartBt.Enabled = false; OPCUAStopBt.Enabled = true; Task.Run(() =>{ while (_OpcTaskEnd == false){ try{ //读OPC变量 //批量读 KepGroup.SyncRead((short)OPCAutomation.OPCDataSource.OPCCache, 27, ServerHandles, out Values, out Errors, out Qualities, out TimeStamps); //更新HMI界面 Invoke(new Action(() =>{ .................. .................. .............. } catch (Exception ex1) { MessageBox.Show(ex1.Message ); if (_OpcTaskEnd == true) return; } })); Thread.Sleep(500); } catch (Exception) { } } }); } else { OPCUAStatusTxt.Text = "未连接"; OPUDAStartBt.Enabled = true; OPCUAStopBt.Enabled = false; } } catch (Exception ex1) { MessageBox.Show(ex1.Message); } } private void InitializeOPC(){ KepGroups = KepServer.OPCGroups; KepGroup = KepGroups.Add("Group1"); //需要修改设置组名 KepGroup.UpdateRate = 250; KepGroup.IsActive = true; KepGroup.IsSubscribed = false; KepItems = KepGroup.OPCItems; //string OpcDaPath = System.Configuration.ConfigurationManager.AppSettings["HT_OPC_IP"]; //"192_168_100_1."; //需要修改变量前的路径名 // "Channel1.Device1.Group1."; ServerHandles[1] = KepItems.AddItem(OpcDaPath + "tmTemp1_Current", 1).ServerHandle; //需要修改设置变量名 ServerHandles[2] = KepItems.AddItem(OpcDaPath + "tmTemp2_Current", 2).ServerHandle; //设置的变量名要和设备的一样的 OpcDaPath 是IP地址 这样获取对应设备下的数据 ServerHandles[3] = KepItems.AddItem(OpcDaPath + "tmTemp3_Current", 3).ServerHandle; ServerHandles[4] = KepItems.AddItem(OpcDaPath + "tmTemp4_Current", 4).ServerHandle; ServerHandles[5] = KepItems.AddItem(OpcDaPath + "tmTemp5_Current", 5).ServerHandle; ServerHandles[6] = KepItems.AddItem(OpcDaPath + "tmChargePress1", 6).ServerHandle; ................... ..................... ............................. }
qq_42065251 2019-04-03
  • 打赏
  • 举报
回复
菜鸟一枚,学习啦
yang1216 2016-09-05
  • 打赏
  • 举报
回复
serverHandles要赋值好像。
by_封爱 版主 2016-09-05
  • 打赏
  • 举报
回复
我写过类似的,但是没用到你那个代码.. 注册完datachange之后 就可以了啊 你后面的方法是干嘛的?
yang1216 2016-09-05
  • 打赏
  • 举报
回复
引用 2 楼 qq_34280999 的回复:
我上面不是赋值了吗
从1开始啊
qq_34280999 2016-09-05
  • 打赏
  • 举报
回复
我上面不是赋值了吗

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧