opc的问题

ylj718 2009-11-17 11:48:01
我是用组态王做为OPC服务器 KingView.View.1
在创建组的时候总是报错:
无法将类型为“OPCAutomation.OPCServerClass”的对象强制转换为类型“OPCAutomation.IOPCGroups
查了很长时间也没有解决?请高手帮忙!
...全文
1395 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lytton_jing 2011-06-08
  • 打赏
  • 举报
回复
我现在正调试opc这方面的程序有谁用过vb6+wincc现在老出问题
我用下面代码加入到opc时出现的错误,
opc出错,错误号mlngErrorsTm为 -1073479672
OPCGroupTm.OPCItems.AddItems mlngUnitNo, mstrAddrTm, mlngClientHandlesTm, mlngServerHandlesTm, mlngErrorsTm

有那位高人知道的回帖谢谢
http://topic.csdn.net/u/20110608/09/d3e12ace-05b9-4922-8a17-b317bc0493b4.html
comon1981 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 orochiori 的回复:]
http://kepware.cn/Products/products_download.html
下载第一个就可以了 安装上 驱动就自动安上了 如果不想留着开普华的OPC 那卸载掉就可以了 驱动是不会掉的
[/Quote]


我安装完还是报同样的异常啊......
OROCHIORI 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ylj718 的回复:]
谢谢大家的帮助。TO OROCHIORI,我的代码和你给的几乎一样,就是报错!
缺少驱动,组态王的需要驱动吗?找不到开普华的OPC 啊
[/Quote]
我的代码能调试过,你代码要和我的一样那应该不是代码问题了
OROCHIORI 2009-11-18
  • 打赏
  • 举报
回复
http://kepware.cn/Products/products_download.html
下载第一个就可以了 安装上 驱动就自动安上了 如果不想留着开普华的OPC 那卸载掉就可以了 驱动是不会掉的
lzuchina 2009-11-18
  • 打赏
  • 举报
回复
不懂!等待高手!
ylj718 2009-11-18
  • 打赏
  • 举报
回复
分少了点,谢谢,结贴!
ylj718 2009-11-18
  • 打赏
  • 举报
回复
哈哈,谢谢高手指点,就是因为缺少驱动的问题!谢谢
ylj718 2009-11-18
  • 打赏
  • 举报
回复
OK,让我试试,估计就是因为缺少驱动!谢谢
OROCHIORI501 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ylj718 的回复:]
你的OPC服务器是组态王 KingView.View.1吗?我的代码确实和你的几乎一样,难道还需要做什么配置吗?
[/Quote]
组态王也连过 没有问题的 我连的是一个厂商项目给的OPC服务器,没做什么配置啊
之前出现你的错误提示 装个开普华的OPC服务器后 就能连上了不管是啥服务器
下班了!!
ylj718 2009-11-18
  • 打赏
  • 举报
回复
你的OPC服务器是组态王 KingView.View.1吗?我的代码确实和你的几乎一样,难道还需要做什么配置吗?
ylj718 2009-11-17
  • 打赏
  • 举报
回复
ylj718 2009-11-17
  • 打赏
  • 举报
回复
BuilderC的代码在研究,谢谢
ylj718 2009-11-17
  • 打赏
  • 举报
回复
谢谢大家的帮助。TO OROCHIORI,我的代码和你给的几乎一样,就是报错!
缺少驱动,组态王的需要驱动吗?找不到开普华的OPC 啊
OROCHIORI 2009-11-17
  • 打赏
  • 举报
回复
你安装一下开普华的OPC 里面带驱动的 你的问题提示是缺少驱动
OROCHIORI 2009-11-17
  • 打赏
  • 举报
回复

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;
namespace opctest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public class iteminfo

{
public string clientHandle;
public int serverHandle;
public string itemValue;
}
public class Items
{
public static iteminfo A = new iteminfo();
public static iteminfo B = new iteminfo();
}


#region 私有变量

/// <summary>
/// OPCServer Object
/// </summary>
OPCServer S7Server;
/// <summary>
/// OPCGroups Object
/// </summary>
OPCGroups S7Groups;
/// <summary>
/// OPCGroup Object
/// </summary>
OPCGroup S7Group;
/// <summary>
/// OPCItems Object
/// </summary>
OPCItems S7Items;
/// <summary>
/// OPCItem Object
/// </summary>
OPCItem S7Item,S7Item1;

/// <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
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();
S7Server = new OPCServer();
}

/// <summary>
/// 创建组
/// </summary>
private bool CreateGroup()
{
try
{
S7Groups = S7Server.OPCGroups;
S7Group = S7Groups.Add("DB1");
SetGroupProperty();
S7Group.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(S7Group_DataChange);
// S7Group.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(S7Group_AsyncWriteComplete);
S7Items = S7Group.OPCItems;

}
catch (Exception err)
{
MessageBox.Show("创建组出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
return true;
}
/// <summary>
/// 设置组属性
/// </summary>
private void SetGroupProperty()
{
S7Server.OPCGroups.DefaultGroupIsActive = Convert.ToBoolean(true);
S7Server.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(0);
S7Group.UpdateRate = Convert.ToInt32(250);
S7Group.IsActive = Convert.ToBoolean(true);
S7Group.IsSubscribed = Convert.ToBoolean(true);
}

private void Form1_Load(object sender, EventArgs e)
{
GetLocalServer();
try
{
if (!ConnectRemoteServer(strHostIP, "CSharpServer"))
{
return;

}

// RecurBrowse(S7Server.CreateBrowser());

if (!CreateGroup())
{
return;
}
}
catch (Exception err)
{
MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
S7Item = S7Items.AddItem("40001",1);
S7Item1 = S7Items.AddItem("40002", 2);



}

private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName)
{
try
{
S7Server.Connect(remoteServerName, remoteServerIP);
}
catch (Exception err)
{
MessageBox.Show("连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
return true;

}
/// <summary>
/// 写入TAG值时执行的事件
/// </summary>
/// <param name="TransactionID"></param>
/// <param name="NumItems"></param>
/// <param name="ClientHandles"></param>
/// <param name="Errors"></param>
//void S7Group_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
//{
// //lblState.Text = "";
// //for (int i = 1; i <= NumItems; i++)
// //{
// // lblState.Text += "Tran:" + TransactionID.ToString() + " CH:" + ClientHandles.GetValue(i).ToString() + " Error:" + Errors.GetValue(i).ToString();
// //}
//}
/// <summary>
/// 每当数据有变化的时候的处理
/// </summary>
/// <param name="TransactionID"></param>
/// <param name="NumItems"></param>
/// <param name="ClientHandles"></param>
/// <param name="ItemValues"></param>
/// <param name="Qualities"></param>
/// <param name="TimeStamps"></param>
void S7Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{

for (int i = 1; i <= NumItems; i++)
{
switch (Convert.ToInt32(ClientHandles.GetValue(i)))
{
case 1:
textBox1.Text = ItemValues.GetValue(i).ToString();
Items.A.serverHandle = S7Item.ServerHandle;

break;
case 2:
textBox2.Text = ItemValues.GetValue(i).ToString();
Items.B.serverHandle = S7Item1.ServerHandle;

break;
}

}


}

private void button2_Click(object sender, EventArgs e)
{

//OPCItem bItem = S7Items.GetOPCItem(itmHandleServer);
int[] temp = new int[2] { 0, Items.A.serverHandle };
Array serverHandles = (Array)temp;
object[] valueTemp = new object[2] { "", textBox3.Text };
Array values = (Array)valueTemp;
Array Errors;
int cancelID;
S7Group.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
int[] temp1 = new int[2] { 0, Items.B.serverHandle };
Array serverHandles1 = (Array)temp1;
object[] valueTemp1 = new object[2] { "", textBox4.Text };
Array values1 = (Array)valueTemp1;
S7Group.AsyncWrite(1, ref serverHandles1, ref values1, out Errors, 2009, out cancelID);

GC.Collect();





}
}
}
trentliu 2009-11-17
  • 打赏
  • 举报
回复
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 System.Collections.ObjectModel;
using PublicData;
using System.Data.Sql;
using SqlDataBase;
using System.Runtime.InteropServices;
using System.Collections;
using Opc;
using Opc.Da;
using OpcCom;
using System.Net;
using System.Threading;

namespace OPCClient
{
public partial class OPCClientControl : UserControl
{
#region PROPERTIES

Collection<string> itemIDs = new Collection<string>();
private Opc.Da.Server m_server = null;//定义数据存取服务器
private Opc.Da.Subscription subscription = null;//定义组对象(订阅者)
private Opc.Da.SubscriptionState state = null;//定义组(订阅者)状态,相当于OPC规范中组的参数
private Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();//定义枚举基于COM服务器的接口,用来搜索所有的此类服务器。

#endregion


public OPCClientControl()
{
InitializeComponent();

comboBox1.Items.Add(GlobalSysType.XMZ);
comboBox1.Items.Add(GlobalSysType.YQA);
comboBox1.Items.Add(GlobalSysType.YQB);
comboBox1.Items.Add(GlobalSysType.ZTW);
}

private void OPCClientControl_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 3;
}

private void button_Start_Click(object sender, EventArgs e)
{
start_opc();
}

private void start_opc()
{

//查询服务器
Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20, textBox_Address.Text, null);
//daver表示数据存取规范版本,Specification.COMDA_20等于2.0版本。
//host为计算机名,null表示不需要任何网络安全认证。
if (servers != null)
{
foreach (Opc.Da.Server server in servers)
{
//server即为需要连接的OPC数据存取服务器。
if (String.Compare(server.Name, textBox_ServerName.Text.ToString(), true) == 0)//为true忽略大小写
{
m_server = server;//建立连接。
break;
}
}
}

if (m_server != null)//非空连接服务器
{
m_server.Connect();


//设定组状态
state = new Opc.Da.SubscriptionState();//组(订阅者)状态,相当于OPC规范中组的参数
state.Name = "测试";//组名
state.ServerHandle = null;//服务器给该组分配的句柄。
state.ClientHandle = Guid.NewGuid().ToString();//客户端给该组分配的句柄。
state.Active = true;//激活该组。
state.UpdateRate = 100;//刷新频率为1秒。
state.Deadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
state.Locale = null;//不设置地区值。


//添加组
subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);//创建组
//定义Item列表
//对应类型为:{Byte,Byte,Char,Short,String,Word,Boolean}

string[] itemName;

using (SqlDataContext dbDataContext = new SqlDataContext())
{

Collection<string> itemIDs = new Collection<string>();

GlobalSysType selectedType = (GlobalSysType)comboBox1.SelectedItem;

itemIDs = dbDataContext.GetItemIDs(((int)selectedType), 0);

itemName = new string[itemIDs.Count];

for (int i = 0; i < itemIDs.Count; i++)
{
itemName[i] = itemIDs[i];
}

//定义item列表
Item[] items = new Item[itemIDs.Count];
for (int i = 0; i < items.Length; i++)
{
items[i] = new Item();
items[i].ClientHandle = Guid.NewGuid().ToString();
items[i].ItemPath = null;
items[i].ItemName = itemName[i];
}

//添加Item
subscription.AddItems(items);

}


//开始定时读区
timer1.Interval = (int)(numericUpDown1.Value * 1000);
timer1.Enabled = true;

}
else
{
MessageBox.Show("未能找到OPC服务器");
}
}

private void button_End_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}

private void timer1_Tick(object sender, EventArgs e)
{
try
{

listBox1.Items.Clear();

listBox1.Items.Add("OPC 读取点数:" + subscription.Items.Length.ToString());

Item[] r_items = new Item[subscription.Items.Length];
for (int i = 0; i < subscription.Items.Length; i++)
{
r_items[i] = subscription.Items[i];
}
ItemValueResult[] values = subscription.Read(r_items);

listBox1.Items.Add(DateTime.Now.ToString() + " 读取..");

using (SqlDataContext dbContext = new SqlDataContext())
{
foreach (ItemValueResult item in values)
{
dbContext.UpdateData(item.ItemName, item.Value.ToString());
}

}

listBox1.Items.Add(DateTime.Now.ToString() + " 写入..");

r_items = null;
values = null;

listBox1.Items.Add("内存占用:" + GC.GetTotalMemory(false).ToString());


}
catch (Exception)
{
timer1.Enabled = false;
}
}

}
}
ylj718 2009-11-17
  • 打赏
  • 举报
回复
救命
ylj718 2009-11-17
  • 打赏
  • 举报
回复
帮忙啊,在线等着呢
ylj718 2009-11-17
  • 打赏
  • 举报
回复
没人会吗?

110,539

社区成员

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

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

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