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

求助,关于PC Access 和WinCC OPC 通讯问题

发布网友 发布时间:2022-04-24 09:22

我来回答

2个回答

懂视网 时间:2022-05-07 01:37

最近做上位机开发,需要与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-05-06 22:45

由于WINCC并未提供与S7-200直接通讯的驱动,SIEMENS提供了专用于S7-200的OPC软件PC ACCESS,可以用于PC上位软件与S7-200通讯时OPC协议做中间转换,WINCC自然也可以使用。
软件和硬件列表 
1、S7-200 CPU,实验型号:CPU224XP CN 
2、笔记本电脑,已经安装好STEP7 MicroWin和WINCC V6.2 
3、编程适配器PC ADAPTER 订货号:6ES7-972-0CB20-0XA0
4、PC ACCESS V1.01 软件,并安装到电脑上。
如果 CPU是SMART 200, 那么编程软件和PC ACCESS 软件版本相应升级,按操作过程是一样的。 
WINCC通过PC ACCESS OPC与S7-200(SMART 200)通讯步骤
首先,通过设定通讯接口道PC ADAPTER(PPI),联机搜索到CPU 
更新项目中的plc类型。 
建立符号表变量,连接到 MW0。另外将符号表的原中文表名改为英文。后面可以多次看到这个英文名,如果中文,这些地方都有可能产生不兼容错误。所以尽量避免。 包括变量名也尽量躲开使用中文命名。 
编制简单的累加程序。然后项目保存为S7-200.MWP, 并下装到CPU。    

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Canada's premiers (the leaders of provincial governments),if th... 我家的文竹从根部长出两根茎长的很快而且不长叶子,可以剪掉吗?_百度... 宝宝伊可新吃多了怎么办,会不会有事 ...一个好的一个坏,然后在两个世界扮演好人和坏人,坏人第一个是小丑... 老公得牛皮癣怎么医断根? 牛皮癣能治断根吗 三十年的牛皮癣了,能治好吗,能断根吗_百度拇指医生 意大利入籍条件汇总你适合哪一种 移民意大利申请永久居留和国籍的条件是什么 意大利移民申请国籍攻略 4月的贵州天气如何? 发动机号为cpdk39241是大众哪款车 4月份,贵州贵阳天气如何?穿什么衣服呢? 四月份温度大概多少度? 天津市创新服装服饰有限公司怎么样? 大家知道这个配置怎么样 多少钱能配到,能否玩大型单机游戏 贵州到四月份天气还会冷吗? 请帮忙查一下,中国邮政国际包裹:空运水陆路到法国,编号:CP 241 247 123CN 1月25日上海寄出!多谢! 中国邮政给据国际邮件跟踪查询系统打不开 请帮查下CP241508495CN包裹到哪里了。多谢! 西门子PLC工控以太网,和普通工厂用的局域网,是一样的吗? 桃子有哪些分类 桃子的种类 桃子落果好多是为什么?怎么办呢? 桃子的果实是由桃花结构中的哪一部分发育成的(  )A.子房B.胚珠C.子房壁D.珠 桃子肉美多汁老少皆宜,桃子的果熟季节是什么时候? 桃子的果实包括(  ) A.果皮,果肉,种子 B.果皮,种子 C.果肉,种子 D.果皮,胚,胚乳 桃类水果有哪些 水蜜桃的果实是怎样形成的 桃子的果实是由雌蕊和雄蕊中的什么发育来的? 桃子果实怎么辨别成熟度? 桃树的果实怎么形容? 贵阳4月份天气如何,大概穿什么衣服比较合适? 世界上有哪些著名的「景点 CP」? 4月份贵州旅游天气怎么样 西门子200系列plc的通讯方式有哪些 请问四月24到4月29号贵州贵阳的天气气温是多少度? 暑假想长途自驾游?推荐这5款7座SUV,空间大品质可靠 贵州几月份的天气最热,最高温度是多少? 海贼王路飞打Gp9救罗宾 的时候动画是哪一集? 3Dmax怎么注册不了 贵州四月的气候 海贼王水之都大概讲什么事?详细一点的 2020年4月贵阳天气冷? 10018的CP是怎么出现的 贵州在几月份的时候是最冷的? 贵州一年平均温度是多少度? 海贼王 水之七岛大约是多少集 4月温度大概是多少 海贼王里的人物分别都出现在哪集? 急求高一《橙色寒假》化学答案,江苏美术出版社。745170004@qq.com 请问四月中下旬贵州黔东南的天气如何?要穿毛衣吗?雨水多不多?谢谢