PviSimple例程说明

<< 点击显示目录 >>

主页  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”里面.

clip0316

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 接口默认使用的设置。然而,其缺点是用户信息被延迟了.