當前位置:首頁 » 文件傳輸 » 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、為上下位的數據通訊提供透明的通道