当前位置:首页 » 文件传输 » opc设备返回了数据访问错误
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

opc设备返回了数据访问错误

发布时间: 2022-04-20 09:43:16

Ⅰ 电脑报opc问题

提示最上边的,bmupd.exe应用程序错误,那个英文是程序名,到网上搜索一下看看是什么程序,或你在操作什么出现的?找到后卸载重装试试,还是不行,换类似的软件。如果找不出原因来,卸载出事前下载的东西,还原一下系统或重装(bmupd.exe是wifi共享精灵,有问题请你追问我)。

如果是开机出现的是程序的话,看看开机启动中是否有这个选项,如果有将其去掉,如果是系统进程不适用上面的方法。

启动项哪些可以关闭(以下几种方法都可以找到自启动项,看看下面开机启动中是否有开机提示的选项,如果有将其去掉就不弹框了)

1、下载超级兔子,选打造自己的系统/启动程序,有启动项选项,可以取消或可以在加上或彻底删除(或金山卫士、360卫士等软件也有这个功能)。

2、点击"开始"/运行/输入msconfig后回车/点击"启动"/在里面查找一下开机提示的选项,找到后将前面的勾去掉,按确定应用即可。重启电脑后,启动到桌面时会出现一个对话框,在对话框中添加对勾,确定即可。

3、去掉自启动项(上面找不到在这里找找)

开始/运行输入regedit回车打开注册表编辑器,依次展开

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]在右侧,

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]在右侧,

看看有没有你要找的选项,如果有删除,重启电脑即可。

Ⅱ OPC Client访问服务器,出现提示配置类型不正确,系统无法开始服务器进程,请检查用户名和密码

只能猜测一下:
应该是服务器端的原有网络连接未能正常终止,导致再次连接不能成功。

检查服务器端系统对网络控制,尤其是用户管理。
WICC本身应该不用查。

Ⅲ 如何在C#中实现OPC数据访问64

1、 配置OPC服务器
对于服务器的配置与同步通讯的配置一样,这里不需再讲解,若有不清楚的,可以参阅之前发布的<运用VC#编程通过OPC方式实现PC机与西门子PLC通讯>

2、 OPC编程
变量组、项的命名规则与同步通讯的一样,这里不再描叙,下面主要就开发一个异步通讯类 AsynServer来讲解如何编程。

<1>、引用
在VC#开发环境中添加对OpcRcw.Da库以及OpcRcw.Comn库的引用,该库属于.NET库,不属于COM库,西门子虽然编写了类库,以提供对.NET平台的支持,但这些类库仍然难于编程,里面包含了大量的在托管和非托管区传输数据,因此我们需要在它的基础上再开发一个类库,以简化以后的编程,首先在类的开头使用命名空间:
using OpcRcw.Comn;
using OpcRcw.Da;
using System.Runtime.InteropServices;
using System.Collections;

<2>、编程
异步编程的原理就是在OPC服务器那边检测当前活动的变量组,一但检测到某一个变量,譬如变量Q0.0从1变成0,就会执行一个回调函数,以实现针对变量发生变化时需要实现的动作,在这里可以采用委托来实现该功能。

1、 在命名空间的内部、类 AsynServer声明之前添加委托的申明:
// 定义用于返回发生变化的项的值和其对应的客户句柄
public delegate void DataChange(object[] values,int[] itemsID);

2、 该类继承于西门子提供的库接口IOPCDataCallback
public class AsynServer:IOPCDataCallback
在类的开头部分声明变量:
struct groupStru
{
public int groupID;
public object groupObj;
}
internal const int LOCALE_ID = 0x407; //本地语言
private Guid iidRequiredInterface;
private string serverType="";
private int hClientGroup = 0; //客户组号
private int nSvrGroupID; // server group handle for the added group
private Hashtable hashGroup; //用于把组收集到一起
private int hClientItem=0; //Item号

3、编写构造函数,接收委托参数已确定当数据发生变化时需要执行的方法入口点:
//创建服务器
//svrType 服务器类型的枚举
//dataChange 提供用于在数据发生变化时需要执行的函数入口
public AsynServer(ServerType svrType,DataChange dataChange)
{
switch(svrType)
{
case ServerType.OPC_SimaticHMI_PTPRO:
serverType="OPC.SimaticHMI.PTPro";break;
case ServerType.OPC_SimaticNET:
serverType="OPC.SimaticNET";break;
case ServerType.OPC_SimaticNET_DP:
serverType="OPC.SimaticNET.DP";break;
case ServerType.OPC_SimaticNET_PD:
serverType="OPC.SimaticNET.PD";break;
case ServerType.OPCServer_WinCC:
serverType="OPCServer.WinCC";break;

}
hashGroup=new Hashtable(11);
dtChange=dataChange;
}

4、创建服务器
// 创建一个OPC Server接口
//error 返回错误信息
//若为true,创建成功,否则创建失败
public bool Open(out string error)
{
error="";bool success=true;
Type svrComponenttyp ;
//获取 OPC Server COM 接口
iidRequiredInterface = typeof(IOPCItemMgt).GUID;
svrComponenttyp = System.Type.GetTypeFromProgID(serverType);
try
{
//创建接口
pIOPCServer =(IOPCServer)System.Activator.CreateInstance(svrComponenttyp);
error="";
}
catch (System.Exception err) //捕捉失败信息
{
error="错误信息:"+err.Message;success=false;
}
return success;
}

5、 编写添加Group的函数
///
/// 添加组
///
///
///
///
///
/// 若为true,添加成功,否则添加失败
public bool AddGroup(string groupName,int bActive,int updateRate,out string error)
{
error="";bool success=true;
int dwLCID = 0x407; //本地语言为英语
int pRevUpdateRate;
float deadband = 0;
// 处理非托管COM内存
GCHandle hDeadband;
IntPtr pTimeBias = IntPtr.Zero;
hDeadband = GCHandle.Alloc(deadband,GCHandleType.Pinned);
try
{
pIOPCServer.AddGroup(groupName, //组名
bActive, //创建时,组是否被激活
updateRate, //组的刷新频率,以ms为单位
hClientGroup, //客户号
pTimeBias, //这里不使用
(IntPtr)hDeadband,
dwLCID, //本地语言
out nSvrGroupID, //移去组时,用到的组ID号
out pRevUpdateRate, //返回组中的变量改变时的最短通知时间间隔
ref iidRequiredInterface,
out pobjGroup1); //指向要求的接口
hClientGroup=hClientGroup+1;
groupStru grp=new groupStru();
grp.groupID=nSvrGroupID;grp.groupObj=pobjGroup1;
this.hashGroup.Add(groupName,grp);//储存组信息
// 对异步操作设置回调,初始化接口
pIConnectionPointContainer = (IConnectionPointContainer)pobjGroup1;
Guid iid = typeof(IOPCDataCallback).GUID;
pIConnectionPointContainer.FindConnectionPoint(ref iid,out pIConnectionPoint);
pIConnectionPoint.Advise(this,out dwCookie);
}
catch (System.Exception err) //捕捉失败信息
{
error="错误信息:"+err.Message;success=false;
}
finally
{
if (hDeadband.IsAllocated) hDeadband.Free();
}
return success;
}

6、 编写激活、或者取消激活组的函数

在同步编程中对于组的激活或者取消激活没有实质的意义,但在异步通讯编程中却异常重要,这是因为OPC服务器只对当前处于活动状态的组中的变量进行监控,同时这也是很有必要的,因为我们可以把不同界面中的变量编程不同的组,即同一界面中的变量规成一个组,而在某一时刻提供给用户的只有一个界面,让该界面中用到的组处于活动状态,这样执行委托调用时只会执行于该界面中有关的变量检测,而如果让所有的组处于活动状态,则当前没有显示给用户的界面用到的变量若发生变化也会触发对委托函数的调用,这根本是没有必要的,同时会大大降低程序的性能,请严格控制组的激活。
///
/// 激活或者取消激活组
///
///
///
///
/// 若为true,添加成功,否则添加失败
public bool AciveGroup(string groupName,bool toActive,out string error)
{
error="";bool success=true;
//通过名称获取组
object grp=((groupStru)hashGroup[groupName]).groupObj;
IOPCGroupStateMgt groupStateMgt=(IOPCGroupStateMgt)grp;
//初始化传递参数
IntPtr pRequestedUpdateRate = IntPtr.Zero; //由客户指定的Item更新间隔时间
int nRevUpdateRate = 0; //由服务器返回的能够更新的最短时间间隔
IntPtr hClientGroup = IntPtr.Zero; //客户组
IntPtr pTimeBias = IntPtr.Zero;
IntPtr pDeadband = IntPtr.Zero;
IntPtr pLCID = IntPtr.Zero;

// 激活或者取消激活组
int nActive = 0;
GCHandle hActive = GCHandle.Alloc(nActive,GCHandleType.Pinned);
if(toActive)
hActive.Target = 1;
else
hActive.Target = 0;
try
{
groupStateMgt.SetState(pRequestedUpdateRate,out nRevUpdateRate,hActive.AddrOfPinnedObject(),pTimeBias,pDeadband,pLCID,hClientGroup);
}
catch(System.Exception err)
{
error="错误信息:"+err.Message;success=false;
}
finally
{
hActive.Free();
}
return success;
}

7、 向指定的组中添加变量的函数
///
/// 向指定的组添加一系列项
///
///
///
///
/// 无错误,返回true,否则返回false
public bool AddItems(string groupName,string[] itemsName,int[] itemsID)
{
bool success=true;
OPCITEMDEF[] ItemDefArray=new OPCITEMDEF[itemsName.Length];
for(int i=0;i {
hClientItem=hClientItem+1; //客户项自动加1
ItemDefArray[i].szAccessPath = ""; // 可选的通道路径,对于Simatiic Net不需要。
ItemDefArray[i].szItemID = itemsName[i]; // ItemID, see above
ItemDefArray[i].bActive = 1; // item is active
ItemDefArray[i].hClient = hClientItem; // client handle ,在OnDataChange中会用到
ItemDefArray[i].dwBlobSize = 0; // blob size
ItemDefArray[i].pBlob = IntPtr.Zero; // pointer to blob
ItemDefArray[i].vtRequestedDataType = 4; //DWord数据类型
}
//初始化输出参数
IntPtr pResults = IntPtr.Zero;
IntPtr pErrors = IntPtr.Zero;
try
{
// 添加项到组
object grp=((groupStru)hashGroup[groupName]).groupObj;
((IOPCItemMgt)grp).AddItems(itemsName.Length,ItemDefArray,out pResults,out pErrors);

int[] errors = new int[itemsName.Length];
IntPtr pos = pResults;
Marshal.Copy(pErrors, errors, 0,itemsName.Length);
for(int i=0;i<itemsname.length;i++) 循环检查错误 {
if (errors[i] == 0)
{
OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT));
itemsID[i] = result.hServer;
pos = new IntPtr(pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT)));
}
else
{
String pstrError;
pIOPCServer.GetErrorString(errors[0],0x407,out pstrError);
success=false;
break;
}
}
SetItenClient(groupName,itemsID,itemsID); //要求始终只有一个组被激活,才不会引起冲突。
}
catch (System.Exception err) // catch for error in adding items.
{
success=false;
//error="错误信息:"+error+err.Message;
}
finally
{
// 释放非托管内存
if(pResults != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(pResults);
pResults = IntPtr.Zero;
}
if(pErrors != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(pErrors);
pErrors = IntPtr.Zero;
}
}
return success;
}

说明:使用该函数时,在类的开头,应该先声明整数数据,以用于保存由本函数返回的服务器对每一项分配的Item ID号:

8、 下面编写的是一个最重要的重载函数,当检测到当前活动组中的某个变量发生变化时,就会调用委托。

//数据变化时处理的问题
public virtual void OnDataChange ( Int32 dwTransid ,
Int32 hGroup ,
Int32 hrMasterquality ,
Int32 hrMastererror ,
Int32 dwCount ,
int[] phClientItems ,
object[] pvValues ,
short[] pwQualities ,
OpcRcw.Da.FILETIME[] pftTimeStamps ,
int[] pErrors )
{
dtChange(pvValues,phClientItems);

}
该函数的代码只有一句,即调用委托函数。
以上编写的是需要实现监控的最重要的方法,当然不完善,还有许多方法和重载函数可以编写,这里就不详细介绍。

9、 编写基本的测试程序,用于检测上面编写的异步类AsynServer

<1>、 重新创建一个工程,添加对上面编写的异步类的引用,并在类的开头部分添加变量声明:
//声明委托
private S7Connection.DataChange dt;
//声明服务器
S7Connection.AsynServer server;

<2>、初始化服务器数据
dt=new S7Connection.DataChange(DataChange);
server =new AsynServer(S7Connection.ServerType.OPC_SimaticNET,dt);
string err;
server.Open(out err);
server.AddGroup("maiker",1,300,out err);
server.AddItems("maiker",m1,nt1);
server.AddGroup("maiker1",1,300,out err);
server.AddItems("maiker1",m2,nt2);
nt[0]=nt1[0];nt[1]=nt1[1];

<3>、添加两个单选按钮,用于选择某个组,并编写相应的程序
string err,err1;
if(server==null) return;
if(radioButton1.Checked)
{ nt[0]=nt1[0];nt[1]=nt1[1];
server.AciveGroup("maiker",true,out err);
server.AciveGroup("maiker1",false,out err1);

}
else
{
nt[0]=nt2[0];nt[1]=nt2[1];
server.AciveGroup("maiker1",true,out err);
server.AciveGroup("maiker",false,out err1);

}

<4>、添加文本框、按钮等,并编写委托执行函数:
private void DataChange(object[] obj,int[] itemsID)
{
for(int j=0;j {
if(itemsID[j]==nt[0])
this.textBox1.Text=obj[j].ToString();
if(itemsID[j]==nt[1])
this.textBox4.Text=obj[j].ToString();
}
}

其中参数obj用于返回当前发生变化的变量的结果值,而itemsID返回当前发生变化的变量的ID号,其与添加变量时服务器返回的ID号对应。以上就是一个基本的测试函数,其相对同步编程来说,应该还简单一些。

3、 同步编程与异步编程的使用场合

一般来讲,同步编程需要使用定时器来循环检测变量,而异步编程则不需要,当服务器检测到数据发生变化时,可以直接调用传入的函数,从这方面来讲,使用异步编程更简单一些,但同步编程使用外部的定时器控制,编程则会更加灵活,一般只监控变量时可以使用异步编程,而当需要写入数据时可以使用同步编程,但这也不是绝对的,我曾编写了一个标准监控程序,没有使用异步编程。

4、 关于开发监控界面的说明

毫无疑问,我们应该开发一系列控件,用于简化界面的设计,否则工作量会异常大。设计一个标准模块,用于第一次运行监控软件时添加变量,并可以设定当前已经组态的界面中的各控件元素与之关联,这样在以后再运行该软件时,不需要再设定,就可以直接连接变量,并进行相应的变化。否则若在编程时编写代码进行关联,其工作量将会异常大。

其实该类我早已经开发了,但一直没有时间写成文章,本来想开发一系列标准控件和标准模块,但由于换到上海工作,可能不会再有时间搞这方面的研究了。

Ⅳ 串口发送数据,接收设备数据显示正常,但该设备返回数据不正确,请问是怎么回事

检查下接收时按ASCII码接收还是按二进制方式接收。其它请参阅如下网址本人的答复:
http://..com/question/12535506.html
http://..com/question/12522809.html
http://..com/question/11725744.html
http://..com/question/11040704.html
http://..com/question/10941227.html

Ⅳ 从opc服务器取数据,现在遇到的问题是opcquickclient 可以连接上服务器,却取不到数据,求大神解答,谢谢

DCOM配置问题,
opcquickclient不需要opcenum ,而服务需要配置opcenum及DCOM配置,请确认opcenum是否正常启动以及DCOM是否正确

Ⅵ OPC 软件问题

软件都是编写出来的,具体什么功能要看运行软件才知道。不过事先先要了解OPC是干嘛的,OPC是工业采用的通信中间件。最常见的是编写设备驱动,因为各个设备通信协议都不一样,组态软件不可能都有对应的驱动,一般都是用C++开发对应的设备的OPC程序,把设备数据转化成组态可以是别的OPC设备。本人就是从事这一块的开发。从字面意思看,这四个软件是用来模拟OPC设备运行的,本人也写过,simulator OPC Configgurator用来配置OPC服务器的,simulator OPC Admin用来管理OPC服务器,Sample OPC Client用来连接OPC客户端软件,OPC DataSpy应该是用来数据显示的。

Ⅶ OPC 异步读取返回值0x80040200 C++

使用C++来访问OPC Server, 相对于使用自定义接口来说,自动化接口要简单很多,因为这和Visual Basic使用的是同一个接口,使用过Visual Basic来访问OPC Server的朋友一定能有这个体会。首先是准备好开发环境,一般测试是在模拟环境中进行,这样比较保险,可以使用一些免费的模拟OPC Server。

Ⅷ 通过普通100M网卡,利用simatic net opc 访问s7-300数据时出错

第一次最好用MPI,不过我第一次下载程序的时候直接用的网线,不过第一次你先要给CP模块一个IP地址,前面我们讨论过这个问题,你可以去看一下.

Ⅸ 调用OPC时出错对COM 组件的调用返回了错误 HRESULT E_FAIL

是什么操作系统?

如果是WIN7, 需要点击 右键 以管理员方式运行编程环境,我碰到过这种类似的现象;
另外,将CPU调整为X86模式编译一下试试看。

Ⅹ opc的解决问题

OPC诞生以前,硬件的驱动器和与其连接的应用程序之间的接口并没有统一的标准。例如,在FA(FactoryAutomation)——工厂自动化领域,连接PLC(Programmable Logic Controller)等控制设备和SCADA/HMI软件,需要不同的FA网络系统构成。根据某调查结果,在控制系统软件开发的所需费用中,各种各样机器的应用程序设计占费用的7成,而开发机器设备间的连接接口则占了3成。此外,在PA(Process Automation)——过程自动化领域,当希望把分布式控制系统(DCS——Distributed Control System)中所有的过程数据传送到生产管理系统时,必须按照各个供应厂商的各个机种开发特定的接口,例如,利用C语言DLL(动态链路数据库)连接DDE(动态数据交换)服务器或者利用FTP(文件传送协定)的文本等设计应用程序。如由4种控制设备和与其连接的监视、趋势图以及表报3种应用程序所构成的系统时,必须花费大量时间去开发分别对应设备A,B,C,D的监视,趋势图以及表报应用程序的接口软件共计要用12种驱动器。同时由于系统中共存各种各样的驱动器,也使维护运转环境的稳定性和信赖性更加困难。
而OPC是为了不同供应厂商的设备和应用程序之间的软件接口标准化,使其间的数据交换更加简单化的目的而提出的。作为结果,从而可以向用户提供不依靠于特定开发语言和开发环境的可以自由组合使用的过程控制软件组件产品。
利用OPC的系统,是由按照应用程序(客户程序)的要求提供数据采集服务的OPC服务器,使用OPC服务器所必需的OPC接口,以及接受服务的OPC应用程序所构成。OPC服务器是按照各个供应厂商的硬件所开发的,使之可以吸收各个供应厂商硬件和系统的差异,从而实现不依存于硬件的系统构成。同时利用一种叫做Variant的数据类型,可以不依存于硬件中固有数据类型,按照应用程序的要求提供数据格式。
利用OPC使接口标准化可以不依存于各设备的内部结构及它的供应厂商来选用监视,趋势图以及表报应用程序。
为什么开发自主OPC Server和OPC Gateway?
1、国外原厂商的高价格
2、国外原厂商面对项目的不灵活性
3、国内项目中子系统的多样性难以提供DRIVER
4、自主OPC服务器追求的是稳定、实时、迅速。
5、众多子系统的不规范性
6、总包项目在投标前后可能出现的不一致性
7、价格昂贵的原厂平台服务器软件
8、总包商集成是否投入大量的人力开发
9、平台和子系统的兼容性
10、建立了OPC平台和子系统的互通
11、解决厂商和集成商在项目集成的烦恼
12、解决厂商和集成商分散资源进行二次开发
13、解决项目中子系统厂商的困扰
14、为上下位的数据通讯提供透明的通道