<< 点击显示目录 >> 主页 PVI通信 > 应用例程 > Windows > PVICOM_C++ > PviSimple例程说明 |
例子为 VC++ 6.0(*.dsw 文件)或 VS2008 (*.sln 文件).
在: “C:\BrAutomation\PVI\V4.10\Samples\PVI\Vc\PviSimple” 目录下.
1. 项目文件说明
所有的 PVI 通讯操作放在”PviSimpleDlg.cpp” 以及”PviSimpleDlg.h”里面.
2. 消息映射
BEGIN_MESSAGE_MAP(CPviSimpleDlg, CDialog)
//{{AFX_MSG_MAP(CPviSimpleDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CLOSE()
//}}AFX_MSG_MAP
// Messages for pvi 通讯:
ON_MESSAGE (WM_PVI_ARRANGE_EVENT, OnPviArrangeEvent) ON_MESSAGE (WM_PVI_DISCONN_EVENT, OnPviDisconnEvent) ON_MESSAGE (WM_PVI_DATA_EVENT, OnPviDataEvent) ON_MESSAGE (WM_PVI_CREATE_RESPONSE, OnPviCreateResponse)
END_MESSAGE_MAP()
3. 调用的函数
如果 PVI Manager(服务器)向 PVICOM 通信实例(客户端, PviSimple 程序)发送响应或事件数据,那么该数据将被暂时存储在客户端,并以用户消息的方式通知应用程序。
然后,应用程序必须对用户消息作出反应,并调用相应的 PVICOM 响应函数(除了用户消息作为数据的回调)。一旦发生这种情况,数据被读取,客户端的数据内存区域被释放。如果应用程序 "忘记 "调用响应函数,那么数据就会保留并占用通信实例中的内存。
Function/Variable |
Description |
PviInitialize (0, 0, g_PviInitDesc, NULL); |
将当前程序实例登记为 Pvi Manager 的客户端,登记成功会触发 WM_PVI_ARRANGE_EVENT 消息 |
g_PviInitDesc[] = "LM=100 COMT=5"; |
LM(number of message), COMT(communication timeout(ms)) |
PviSetGlobEventMsg (POBJ_EVENT_PVI_DISCONN, CWnd::m_hWnd, WM_PVI_DISCONN_EVENT, 0); |
WM_PVI_DISCONN_EVENT 映射到 OnPviDisconnEvent()函数, 该消 息由 PviDeinitialize ()成功后触发 |
PviSetGlobEventMsg (POBJ_EVENT_PVI_ARRANGE, CWnd::m_hWnd, WM_PVI_ARRANGE_EVENT, 0); |
WM_PVI_ARRANGE _EVENT 映射到 OnPviArrangeEvent()函数.该 消息由 PviInitialize ()成功后触发. |
PviCreateRequest (pPviObj->pName, pPviObj->nType, pPviObj->pPro- cessDesc, CWnd::m_hWnd, WM_PVI_DATA_EVENT, lParam, pPviObj->pLinkDesc, CWnd::m_hWnd, WM_PVI_CREATE_RESPONSE, lParam); |
向 Pvi manager 请求创建 Pvi 对象, 触发 WM_PVI_CREATE_RESPONSE 消息 |
PviReadResponse (wParam, DataBf, (sizeof (DataBf) - 1)); |
收到消息后, 读消息内容, 同时清一条缓冲. |
PviCreateResponse (wParam, &LinkId); |
向 Pvi manager 请求后, 会从 Pvi manager 收到一条相应 消息, 该函数读取一条消息, 同时清一条缓冲 |
PviDeinitialize (); |
断开当前程序与 Pvi manager 的连接, 清除 PVI 对象 |
3.1 Pvi 对象的定义
// stucture to configure a pvi object and define the assigned dialog controls: typedef struct t_pviobj_config
{
const char* pName; // object path name
T_POBJ_TYPE nType; // object type
const char* pProcessDesc; // process object descriptor
const char* pLinkDesc; // link object descriptor
int NameCtrlId; // != NULL -> identifier for name control
int DataCtrlId; // != NULL -> identifier for data control
} T_PVIOBJ_CONFIG;
3.2 数组
static const T_PVIOBJ_CONFIG g_PviObjList[] = {
// line object:
{ "@Pvi/PviSimple", POBJ_LINE, "CD=LnIna2", "EV=", NULL, NULL },
// device object:
{ "@Pvi/PviSimple/ARsim", POBJ_DEVICE, "CD=\"/IF=tcpip /SA=1\"", "EV=", NULL,NULL },
// cpu object:
{ "@Pvi/PviSimple/ARsim/Cpu", POBJ_CPU, "CD=\"/DAIP=127.0.0.1 /REPO=11160 /RT=1000\"", "EV=e", NULL, IDC_PVI_STATE_CPU },
// task object:
{ "@Pvi/PviSimple/ARsim/Cpu/Brewing", POBJ_TASK, "CD=brewing", "EV=",NULL, NULL },
// variable object 1:
{ "@Pvi/PviSimple/ARsim/Cpu/Brewing/RecipeCoffee", POBJ_PVAR, "CD=gMainLogic.par.recipe.coffee RF=250", "VT=string VL=40 EV=ed", IDC_PVI_NAME_PVAR1, IDC_PVI_DATA_PVAR1 },
// variable object 2:
{ "@Pvi/PviSimple/ARsim/Cpu/Brewing/RecipeCream", POBJ_PVAR, "CD=gMainLogic.par.recipe.milk RF=250", "VT=string VL=40 EV=ed", IDC_PVI_NAME_PVAR2, IDC_PVI_DATA_PVAR2 },
// variable object 3:
{ "@Pvi/PviSimple/ARsim/Cpu/Brewing/RecipeWater", POBJ_PVAR, "CD=gMainLogic.par.recipe.water RF=250", "VT=string VL=40 EV=ed", IDC_PVI_NAME_PVAR3, IDC_PVI_DATA_PVAR3 },
// variable object 4:
{ "@Pvi/PviSimple/ARsim/Cpu/Brewing/RecipeSugar", POBJ_PVAR, "CD=gMainLogic.par.recipe.sugar RF=250", "VT=string VL=40 EV=ed", IDC_PVI_NAME_PVAR4, IDC_PVI_DATA_PVAR4 },
{ NULL } }; // -> end of list indicator
说明
初始化参数 LM 可以用来限制每个通信实例的用户信息数量。如果限制被启用(限制值>0),那么这并不意味着用户消息会丢失。相反,它指的是它们在时间上的分布方式。设置为 "LM=100 "意味着 PVICOM最多向应用程序发送 100 条用户信息。
只有当应用程序对已经发送的用户信息做出反应并调用相应的 PVICOM 响应函数时,才会再发送一条用户信息。如果设置为 "LM=1",每条新的用户信息只有在前一条用户信息被处理后才会发送。如果应用程序 " 忘记 "调用响应函数,那么该应用程序就不会再收到任何用户信息。
因此,设置 "LM=1 "非常适用于测试应用程序。由于这个原因,这是 PVI 接口默认使用的设置。然而,其缺点是用户信息被延迟了.