问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

200smart和wincc是怎么通过pc access通信的

发布网友 发布时间:2022-04-14 20:18

我来回答

2个回答

懂视网 时间:2022-04-15 00:39

最近做上位机开发,需要与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.OPCServer


/*初始化COM库*/
if (FAILED(::CoInitialize(NULL)))
{
AfxMessageBox("Error during CoInitialize", MB_OK );
return FALSE;
}

/*查找OPC服务*/
hr = CLSIDFromProgID( strServer.AllocSysString(), &clsid );
if( FAILED(hr))
{
AfxMessageBox("Error during CLSIDFromProgID", MB_OK);
return FALSE;
}

/*创建OPC服务器对象*/
LPUNKNOWN pUnkn = NULL;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER , IID_IOPCServer, (void**)&m_IOPCServer); //CLSCTX_LOCAL_SERVER CLSCTX_ALL
if( FAILED(hr) || m_IOPCServer == NULL)
{
AfxMessageBox("Error during CoCreateInstance", MB_OK);
return FALSE;
}


/*添加组到OPC服务器*/
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 < COUNT; i++)
{
pcItem = new Item;
pcItem->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;
}

/*保存item对应的服务句柄*/
pdwServerHandles = new DWORD[COUNT];
for(i = 0; i < COUNT; i++)
{
pdwServerHandles[i] = pOPCResults[i].hServer;
if(pOPCErrors[i]= S_OK)
{
pdwServerHandles[i] = pOPCResults[i].hServer;
}
}


/*获取同步IO口*/
hr = m_IOPCItemMgt->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 items
pValues, // 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;
}

 




                                        

热心网友 时间:2022-04-14 21:47

PC access 通过西门子内部协议与PLC通信,并作为OPC服务器。wincc作为OPC客户端获取服务器中的数据。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 资方让去签风控合同了融资成功率有多少 资方让去签风控协议了融资会成功了吗 风控合同是什么意思? 荣耀20如何停播流量 经常饮酒者的保肝护肝中药有哪些? 好神拖墩布甩干时不好用了怎么办 好神拖的甩干桶不回转是怎么回事 手压式好神拖,下面那个桶不转了,怎么修?回答其原理及维修方法,别说让我自己看! 共产国际是否有理笠山这个人? 和他的事迹 1900年左右,美国的整体生活水平,社会环境是什么?急!! 杰西·杰克逊的黑人宣言 在罗斯福新政中最主要的影响?兴办工共工程意义? 美国总统竞选宣言有哪些 希拉里的竞选宣言文字材料 华为平板c5支持指纹吗? 收奥比岛的东西 COS&quot;Chobits&quot;双叽的注意事项。 奇迹暖暖第五章第二关茶餐厅寻人怎么过 古中国有“裹脚”古欧洲有“束腰”,相比之下为何有人说束腰最残忍? 首次提出&quot;在新中国成立一百年时建成富强民主文明和谐的社会主义现代化国家是在十八大吗 雅安高山红心猕猴桃,好吃得很,你们有喜欢吃雅安红心猕猴桃的吗? 红心猕猴桃招商 刀剑 双开师徒任务 Excel中怎样把数字转化为时间,例如输入数字158变成有实际意义的1&#39;58&quot;后续还需要时间加减。 请帮我查一下这个IP(218。58。57。130:63537 cs1.6弹道难控制``` 腿长90cm,身高1:58-159左右,79斤——80左右,算腿长吗? 我想在轻松筹求助,请问我要准备什么材料? 121.201.98.50:50080和121.201.101.5:50220是同一个ip吗 如果高中女生1米58,108斤胸围是96,那算不算比较大?因为学校经常有些男生在笑觉得很不舒服 58.com上面的信用度一直删 删到最后是什么样子啊 有没有个人指点一下 丝肽液是什么 有人用肽,治疗好癌症的列子吗? 大牙松动,怎么办 淡水鱼活性多肽真的能抗衰老吗??? 牙齿轻微松动 请问牙齿稍微有点松动了怎么办 VC++ MFC组态王opc服务器 佳能E618 请问墨盒可以自己加墨水的吗 我们党提出到新中国成立100年时什么实现现代化