-------------------------定义的OPC操作类--------------------usingOpcRcw.Da;usingOpcRcw.Comn;usingSy
-------------------------定义的OPC操作类--------------------
using OpcRcw.Da;
using OpcRcw.Comn;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace WCS_SWKJ
{
public class ClassOpcSynchro
{
public string serverName = "OPC.SimaticNET";
public IOPCServer pIOPCServer; // OPC server接口
public Object pobjGroup1; // Pointer to group object
public int nSvrGroupID; // server group handle for the added group
public System.Collections.Hashtable groupsID = new Hashtable(11); //用于记录组名和组ID号
public System.Collections.Hashtable hitemsID = new Hashtable(17); //用于记录项名和项ID号
public Guid iidRequiredInterface;
public int hClientGroup = 0; //客户组号
public int hClientItem = 0; //Item号
///
/// 创建一个OPC Server接口
///
/// 返回错误信息
/// 若为true,创建成功,否则创建失败
public bool Open(out string error)
{
///dt = new S7Connection.DataChange(DataChange);
///server = new AsynServer(S7Connection.ServerType.OPC_SimaticNET, dt);
error="";
bool success=true;
Type svrComponenttyp ;
//获取 OPC Server COM 接口
iidRequiredInterface = typeof(IOPCItemMgt).GUID;
svrComponenttyp = System.Type.GetTypeFromProgID(serverName);
try
{
//创建接口
pIOPCServer =(IOPCServer)System.Activator.CreateInstance(svrComponenttyp);
error="";
}
catch (System.Exception err) //捕捉失败信息
{
error="错误信息:"+err.Message;
success=false;
}
return success;
}
///
/// 添加组
///
/// 组名
/// /创建时,组是否被激活
/// //组的刷新频率,以ms为单位
/// 返回错误信息
/// 若为true,添加成功,否则添加失败
public bool AddGroup(string groupName, int bActive, int updateRate, out string error)
{
error = "";
int dwLCID = 0x407; //本地语言为英语
int pRevUpdateRate = 0;
float deadband = 0;
// 处理非托管COM内存
GCHandle hDeadband;
IntPtr pTimeBias = IntPtr.Zero;
hDeadband = GCHandle.Alloc(deadband, GCHandleType.Pinned);
try
{
/*
pIOPCServer.AddGroup(string szName,
int bActive,
int dwRequestedUpdateRate,
int hClientGroup,
IntPtr pTimeBias,
IntPtr pPercentDradband,
int dwLCID,
out int phServerGroup,
out int pRevisedUpdateRate,
ref Guid riid,
out object ppUnk);
*/
pIOPCServer.AddGroup(groupName, //组名 --
bActive, //创建时,组是否被激活
updateRate, //组的刷新频率,以ms为单位
hClientGroup, //客户号
pTimeBias, //这里不使用
(IntPtr)hDeadband,
dwLCID, //本地语言
out nSvrGroupID, //移去组时,用到的组ID号
out pRevUpdateRate, //返回组中的变量改变时的最短通知时间间隔
ref iidRequiredInterface,
out pobjGroup1); //指向要求的接口
hClientGroup = hClientGroup + 1;
int groupID = nSvrGroupID;
groupsID.Add(groupName, groupID);
}
catch (System.Exception err) //捕捉失败信息
{
error = "错误信息:" + err.Message;
}
finally
{
if (hDeadband.IsAllocated) hDeadband.Free();
}
if (error == "")
return true;
else
return false;
}
----------------------程序调用类库文件的代码————————————————————————
string sError = "";
bool bReturn = MyOPC.Open(out sError);
if (bReturn == false)
{
MessageBox.Show(sError);
}
else
{
MessageBox.Show("创建OPC服务器成功");
}
bReturn = MyOPC.AddGroup("groupName", 1, 250, out sError);
if (bReturn == false)
{
MessageBox.Show(sError);
}
else
{
MessageBox.Show("添加组成功!");
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
在调用这个的时候 报出错误“值不在预期范围内”
在当时各个变量的数值分别是:--后的数字
pIOPCServer.AddGroup(groupName, //组名
bActive, //创建时,组是否被激活 -- groupname
updateRate, //组的刷新频率,以ms为单位 -- 250
hClientGroup, //客户号 -- 0
pTimeBias, //这里不使用 -- 0
(IntPtr)hDeadband,
dwLCID, //本地语言 —— 1031
out nSvrGroupID, //移去组时,用到的组ID号 —— 0
out pRevUpdateRate, //返回组中的变量改变时的最短通知时间间隔 —— 0
ref iidRequiredInterface,
out pobjGroup1); //指向要求的接口 ——null
9 个解决方案
我用过,出现过类似问题。原因是用.net2005编译.net2003写的程序,可以找你支持OPC的厂家(如西门子),说你用他们的产品,让其发一份.net2005的样例给你
我也遇到了同样的问题,开发环境 c#2008,您是怎么解决的,请指点一下。
我的qq: 170727222
mail: songgb@tisco.com.cn
组的下标,从1开始的。看过OPCDAAuto-2.2.dll的源码
建议使用OPCServerClass.OPCGroups.Add(组名)来创建组.
http://www.uipower.com/bbs/thread-148235-1-1.html