科技知識動態:VC++與OPC(pc access)通訊

導讀 跟大家講解下有關VC++與OPC(pc access)通訊,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說VC++與OPC(pc access)通訊,小

跟大家講解下有關VC++與OPC(pc access)通訊,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說VC++與OPC(pc access)通訊,小編也收集到了有關VC++與OPC(pc access)通訊的相關資料,希望大家看到了會喜歡。

最近做上位機開發,需要與PLC 通訊 。以前不知道以為要與PLC程序配合寫 通訊 程序,后來聯系西門子客服才知道這個問題早被解決了。網上《OPC_client_在VC環境下編程.doc》比較適合我(適合你的是最好的),表示感謝作者。在這篇的基礎上我添加了一下自己的東

最近做上位機開發,需要與PLC通訊。以前不知道以為要與PLC程序配合寫通訊程序,后來聯系西門子客服才知道這個問題早被解決了。網上《OPC_client_在VC環境下編程.doc》比較適合我(適合你的是最好的),表示感謝作者。在這篇的基礎上我添加了一下自己的東西。具體的Demo在http://download.csdn.net/detail/yuanhaosh/8098867下載

在這之前需要添加幾個OPC相關的文件 opccomn_i.c ,opccomn.h, opcda.h, opcda_i.c, opcerror.h,已經包含在demo中了

這部分是初始化OPC的部分。

BOOL COPCDEMODlg::InitOPCServer(){ CLSID clsid;HRESULT hr = S_OK;CString strServer ="S7200.OPCServer"; //OPC.SimaticNET S7200.OPCServerif (FAILED(::CoInitialize(NULL))) {AfxMessageBox("Error during CoInitialize", MB_OK ); return FALSE;}hr = CLSIDFromProgID( strServer.AllocSysString(), &clsid );if( FAILED(hr)){ AfxMessageBox("Error during CLSIDFromProgID", MB_OK); return FALSE;}LPUNKNOWN pUnkn = NULL; hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER , IID_IOPCServer, (void**)&m_IOPCServer); //CLSCTX_LOCAL_SERVER CLSCTX_ALLif( FAILED(hr) || m_IOPCServer == NULL){ AfxMessageBox("Error during CoCreateInstance", MB_OK); return FALSE;}FLOAT PercentDeadband = 0.0;DWORD RevisedUpdateRate;hr = m_IOPCServer->AddGroup(L"group", //[in] 組名 TRUE, //[in] 活動狀態 500, //[in] 向服務器發送請求的刷新率 1, //[in] 客戶端的操作句柄 NULL, //[in] 與標準時間的校正值 &PercentDeadband, //[in] 要舍棄的數據 0, //[in] 服務器使用的語言 &m_GrpSrvHandle, //[out] 添加組以后服務器返回的組句柄 &RevisedUpdateRate, //[out] 服務器的數據刷新率 IID_IOPCItemMgt, //[in] 添加組的接口類型 (LPUNKNOWN*)&m_IOPCItemMgt); //[out] 服務器返回的接口對象指針if( FAILED(hr) ){ LPWSTR pErrString; AfxMessageBox("Error during AddGroup", MB_OK);hr = m_IOPCServer->GetErrorString(hr, LOCALE_SYSTEM_DEFAULT, &pErrString);if(SUCCEEDED(hr)){//輸出錯誤信息}else{//添加組失敗;}m_IOPCServer->Release();m_IOPCServer=NULL;CoUninitialize(); return FALSE;}Item* pcItem ;OPCITEMDEF *m_Items = new OPCITEMDEF[COUNT]; //項的存取路徑, 定義和被請求的數據類等for(int i = 0; i quality = QUAL_BAD;//pcItem->name = _T(""+ TableStr[i]); //設置opc節點 Microwin.NewPLC.group.pcItem->name = _T("Microwin.NewPLC.group.NewItem1"); //這里的字符串填寫你的item就行m_Items[i].szItemID = pcItem->name.AllocSysString();m_Items[i].dwBlobSize = 0;m_Items[i].pBlob = NULL;m_Items[i].bActive = TRUE;m_Items[i].hClient = (OPCHANDLE)pcItem;m_Items[i].szAccessPath = pcItem->cAccessPath.AllocSysString();; //pcItem->cAccessPath.AllocSysString();m_Items[i].vtRequestedDataType = VT_EMPTY; //VT_EMPTY;} OPCITEMRESULT *pOPCResults = NULL;HRESULT *pOPCErrors = NULL; hr = m_IOPCItemMgt->AddItems(COUNT, m_Items,&pOPCResults, &pOPCErrors);if(FAILED(hr)){LPWSTR pErrString; AfxMessageBox("Error during AddGroup", MB_OK);hr = m_IOPCServer->GetErrorString(hr, LOCALE_SYSTEM_DEFAULT, &pErrString);if(SUCCEEDED(hr)){//輸出錯誤信息}else{//pErrString ="添加組失敗.";}m_IOPCServer->Release();m_IOPCServer=NULL;CoUninitialize(); return FALSE;}pdwServerHandles = new DWORD[COUNT];for(i = 0; i QueryInterface(IID_IOPCSyncIO, (void**)&m_IOPCSyncIO); if(FAILED(hr)){LPWSTR pErrString; AfxMessageBox("獲取IO口失敗", MB_OK);hr = m_IOPCServer->GetErrorString(hr, LOCALE_SYSTEM_DEFAULT, &pErrString);if(SUCCEEDED(hr)){//輸出錯誤信息}else{//pErrString ="獲取IO口失敗.";}m_IOPCServer->Release();m_IOPCServer=NULL;CoUninitialize(); return FALSE;}// delete[] pdwServerHandles; 會出現異常報錯請使用者再次檢查原因,防止內存泄露// delete[] m_Items;// delete pcItem;return TRUE; //初始化完成,可以開始查詢.}

/*************************************************************************************************** 讀取OPC服務器中的狀態信息* phServe: 讀取項的句柄 * dwSource: 狀態獲取來源,緩存、內存 ****************************************************************************************************/BOOL COPCDEMODlg::ReadOPCServe(OPCITEMSTATE **pValues, OPCHANDLE *phServe, OPCDATASOURCE dwSource){HRESULT hr = S_OK; OPCHANDLE *phserve = phServe;LPWSTR pErrString; //記錄錯誤信息字符串HRESULT *pErrors= new HRESULT;try {hr = m_IOPCSyncIO->Read(dwSource, // OPC_DS_CACHE, Source (device or cache)1, // Item count(OPCHANDLE*)phServe,// Array of server handles for itemspValues, // Array of values&pErrors); // Array of errors if(FAILED(hr)) { AfxMessageBox("Error during ReadOPC", MB_OK); hr = m_IOPCServer->GetErrorString(hr, LOCALE_SYSTEM_DEFAULT, &pErrString); if(SUCCEEDED(hr)) { //pErrString輸出錯誤信息 } else { //pErrString ="讀取失敗."; } m_IOPCServer->Release(); m_IOPCServer=NULL; CoUninitialize(); return FALSE; }}catch(...){} //delete pErrors; 會出現異常報錯請使用者再次檢查原因,防止內存泄露return TRUE;}/****************************************************************************************** 寫入OPC服務器中的狀態信息* 后續需要再寫 OPCITEMSTATE **pValues, OPCHANDLE *phServe, OPCDATASOURCE dwSource******************************************************************************************/BOOL COPCDEMODlg::WriteOPCServe(OPCHANDLE *phServe, BYTE Values) {HRESULT hr = S_OK;VARIANT *pItemValues = new VARIANT;OPCHANDLE *phserve = phServe;HRESULT *pErrors= new HRESULT;LPWSTR pErrString; VariantClear(pItemValues);memset(pItemValues, 0, sizeof(VARIANT)); pItemValues->vt = VT_I2;short value = Values; pItemValues->bVal = value;try{ hr = m_IOPCSyncIO->Write(1, phserve, pItemValues, &pErrors);if(FAILED(hr)) { hr = m_IOPCServer->GetErrorString(hr, LOCALE_SYSTEM_DEFAULT, &pErrString); if(SUCCEEDED(hr)) { //pErrString輸出錯誤信息 } else { //pErrString ="寫入失敗."; } m_IOPCServer->Release(); m_IOPCServer=NULL; CoUninitialize(); return FALSE; }}catch(...){} //delete pErrors; 會出現異常報錯請使用者再次檢查原因,防止內存泄露return TRUE;}

來源:php中文網

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!