紧急求教 C#连接OPC 报错“值不在预期范围内” 谢谢!

guliande 2016-04-08 03:31:22
请教熟悉C#的朋友们一个OPC连接问题,
我在网上找了一端C#连接OPC Server的代码,调试后可以连接,但是报错“值不在预期范围内”,请问是怎么回事?谢谢。
报错及代码如下:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OPCAutomation;
using System.Threading;

namespace OPCtestgulian
{
public partial class Form1 : Form
{
OPCServer KepServer;
OPCGroups KepGroups;
OPCGroup KepGroup;
OPCItems KepItems;
OPCItem KepItem;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
try
{
String serIp = "192.168.5.31";//服务器的IP地址
String serverName = "BACHMANN.OPCStandardServer";//OPC服务器名称
KepServer = new OPCServer();
//连接OPC服务器,opc服务名,ip
KepServer.Connect(serverName, serIp);
//判断连接状态
if (KepServer.ServerState == (int)OPCServerState.OPCRunning)
{
textBox1.Text = "已连接到-" + KepServer.ServerName + " ";
}
else
{
//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
textBox1.Text = "状态:" + KepServer.ServerState.ToString() + " ";
return;
}
KepGroups = KepServer.OPCGroups;
Thread t1; // 开1个线程用于读取数据
t1 = new Thread(new ThreadStart(kepProcess));
t1.Start();
}catch(Exception ex){
textBox1.Text = ex.Message;
}
}
public void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
listBox1.Items.Add(ItemValues.GetValue(1));//取到改变的值
}
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);
}
//关闭连接
private void button2_Click(object sender, EventArgs e)
{
label6.Text = KepServer.CurrentTime.ToString();
KepServer.Disconnect();//关闭连服务器

textBox1.Text = "未连接 ";
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

...全文
2298 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
downerxl 2016-11-19
  • 打赏
  • 举报
回复
引用 8 楼 weixin_35856134 的回复:
楼主有没有解决问题,遇到的是相同的问题,求教啊
看这里
downerxl 2016-11-19
  • 打赏
  • 举报
回复
解决了吗 把后来你报错那句“syncread”注释掉就好了 并不需要那一句。
HEHEANDHEHEHE 2016-09-01
  • 打赏
  • 举报
回复
楼主有没有解决问题,遇到的是相同的问题,求教啊
shuiyueitan 2016-07-28
  • 打赏
  • 举报
回复
楼上正解,不过我的是SyncRead出现这个错误,能不能帮我看看。
xingyihermit 2016-06-04
  • 打赏
  • 举报
回复
KepItems.AddItem("Random Int1", 1); OPCItem bItem = KepItems.Item(1); 第一行的Random int 1,改为你的工控系统中定义的实际变量。如果你不确认变量是否有效,可以先用OPC客户端工具读取一下。 第二行的Item(1)不要变,因为OPC标准就是从1开始的。 好多人自己都不明白的技术领域,却以大师的姿态去教训别人,真是无语了。
赵4老师 2016-04-11
  • 打赏
  • 举报
回复
光标放在Item上点鼠标右键,选转到定义,看看Item是否接收整型常量作为参数。
guliande 2016-04-08
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
Item(0) ?
谢谢朋友,还是不行。
赵4老师 2016-04-08
  • 打赏
  • 举报
回复
Item(0) ?
guliande 2016-04-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
请问您具体意思?
赵4老师 2016-04-08
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?

111,131

社区成员

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

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

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