<< 点击显示目录 >> 主页 PVI通信 > 应用例程 > Windows > PVICOM_C++ > PVIDemo例程说明 |
例子为 VC++ 6.0(*.dsw 文件)或 VS2008 (*.sln 文件).
在: “C:\BrAutomation\PVI\V4.10\Samples\PVI\Vc\PviDemo” 目录下.
1. 项目文件说明
所有的 PVI 通讯操作放在”PviDemoDlg.cpp” 以及”PviDemoDlg.h”里面.
File |
Description |
PviDemo.dsp, PviDemo.dsw |
Workspace and project file for Visual C++ 6.0. (32-bit PVI). |
PviDemo.vcproj, PviDemo.sln |
Solution and project file for Visual C++ 2008. (32 and 64-bit PVI). |
PviDemo.cpp, PviDemo.h |
Class CPviDemoApp (Windows application object) and help class CExString. |
PviDemoDlg.cpp, PviDemoDlg.h |
Class CPviDemoDlg. Main dialog box object in the sample program. All PVI communication takes place using this object. |
PviConnectDlg.cpp, PviConnectDlg.h |
Class CPviConnectDlg. Dialog object for setting the PVI connection configuration and for reading/writing the PVI connection parameters to/from the INI file. |
PviObjectsDlg.cpp, PviObjectsDlg.h |
Class PviObjectsDlg. Dialog object for setting the PVI object configuration and for reading/writing the PVI object parameters to/from the INI file. |
PviDemoCE.vcproj, PviDemoCE.sln |
Solution and project file for Visual C++ 2008, Windows CE version. A requirement for using the Windows CE version is that you install SDK for the respective Windows CE platform. |
Profile.cpp, Profile.h |
The files contain functions for emulating the Windows Profile API functions. Instead of the INI file, the settings are read from or written to the Windows registry. These files are only required for the Windows CE version of the programming example. |
2. 消息映射
BEGIN_MESSAGE_MAP(CPviDemoDlg, CDialog)
//{{AFX_MSG_MAP(CPviDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_BN_CLICKED(IDC_OBJECTS, OnObjects)
ON_EN_SETFOCUS(IDC_PVAR1, OnSetfocusPvar1)
ON_EN_SETFOCUS(IDC_PVAR2, OnSetfocusPvar2)
ON_EN_SETFOCUS(IDC_PVAR3, OnSetfocusPvar3)
ON_EN_SETFOCUS(IDC_PVAR4, OnSetfocusPvar4)
ON_EN_KILLFOCUS(IDC_PVAR1, OnKillfocusPvar1)
ON_EN_KILLFOCUS(IDC_PVAR2, OnKillfocusPvar2)
ON_EN_KILLFOCUS(IDC_PVAR3, OnKillfocusPvar3)
ON_EN_KILLFOCUS(IDC_PVAR4, OnKillfocusPvar4)
ON_BN_CLICKED(IDC_ACTIVE, OnActive)
ON_BN_CLICKED(IDC_IDLE, OnIdle)
ON_BN_CLICKED(IDC_WRITE, OnWrite)
//}}AFX_MSG_MAP
// Messages for pvi: 主要PVI通讯相关的消息在这儿
ON_MESSAGE (WM_PVI_GLOBAL_EVENT, OnPviGlobalEvent)
ON_MESSAGE (WM_PVI_CPU_EVENT, OnPviCpuEvent)
ON_MESSAGE (WM_PVI_PVAR_EVENT, OnPviPvarEvent)
ON_MESSAGE (WM_PVI_CREATE_RESP, OnPviCreateResp)
ON_MESSAGE (WM_PVI_WRITE_RESP, OnPviWriteResp)
END_MESSAGE_MAP()
3. 调用的函数和参数
3.1 函数之间的互动关系
3.1.1 建立和 PVI manager 服务器的连接
在函数void CPviDemoDlg::CreateConnection (CPviConnectDlg&Connect)下
// initialize the pvi library instance and
// establish the communication to pvi manager:
ErrCode = PviInitialize (0, 0, InitParam, NULL);
if (ErrCode != 0)
{
DisplayDemoMessage (_T("Can't initialize PVI (%d)"), ErrCode); return;
}
// set global pvi events to watch the connection to pvi:
PviSetGlobEventMsg (POBJ_EVENT_PVI_CONNECT, CWnd::m_hWnd,WM_PVI_GLOBAL_EVENT, 0);
PviSetGlobEventMsg (POBJ_EVENT_PVI_DISCONN, CWnd::m_hWnd, WM_PVI_GLOBAL_EVENT, 0);
PviSetGlobEventMsg (POBJ_EVENT_PVI_ARRANGE, CWnd::m_hWnd, WM_PVI_GLOBAL_EVENT, 0);
3.1.2 创建 PVI 对象
在函数void CPviDemoDlg::CreateDemoObjects (CPviObjectsDlg&Objects)下面
// create a temporary variable object and a link object:
ErrCode = PviCreateRequest (PObjPvName, POBJ_PVAR, PObjDesc,CWnd::m_hWnd,
WM_PVI_PVAR_EVENT, lParam, LinkDesc,
CWnd::m_hWnd, WM_PVI_CREATE_RESP, lParam); }
……
共有 9 次调用:
-Line
-Device
-Station
-CPU
-Task
-Pvar1
-Pvar2
-Pvar3
-Pvar4
说明: 每次 pvi 对象的创建, Pvi manager 会把反馈信息放缓冲区, 然后发一个 WM_PVI_CREATE_RESP 消息给当前应用实例, 当前应用收到消息后, 去缓冲区取数据, 同时清除当前缓冲.
3.1.3 全局 PVI 事件的处理
在函数 LRESULT CPviDemoDlg::OnPviGlobalEvent (WPARAM wParam, LPARAM lParam) 下
T_RESPONSE_INFO Info;
INT ErrCode;
// get event informations:
ErrCode = PviGetResponseInfo (wParam, NULL, NULL, &Info, sizeof (Info));
if (ErrCode != 0)
return (0);
// confirm global event message:
ErrCode = PviReadResponse (wParam, NULL, 0);
// interprete pvi global event:
switch (Info.nType)
{
case POBJ_EVENT_PVI_CONNECT: // connection to pvi Manager established
{
m_PviConnection = CONN_STATE_CONNECTED;
// display connection state in dialog frame control:
DisplayConnectionState ();
break;
}
case POBJ_EVENT_PVI_DISCONN: // connection to pvi Manager lost
{
m_PviConnection = CONN_STATE_DISCONNECTED;
m_PviErrCode = ErrCode;
m_CpuConnection = CONN_STATE_UNDEFINED;
// display connection state in dialog frame control:
DisplayConnectionState ();
break;
}
case POBJ_EVENT_PVI_ARRANGE: // demand to create pvi objects
{
CPviObjectsDlg ObjectsDlg;
// load the pvi object parameter from the INI file:
ObjectsDlg.LoadParam();
// create new pvi Objects:
CreateDemoObjects (ObjectsDlg);
}
}
3.1.4 读取 CPU 状态
每当 CPU 连接变化时, Pvi Manager 会把变化内容放入缓冲区, 同时向申请创建的实例发一个WM_PVI_PCPU_EVENT 消息, 该消息关联以下函数:
LRESULT CPviDemoDlg::OnPviCpuEvent (WPARAM wParam, LPARAM lParam)
当前实例收到WM_PVI_PCPU_EVENT消息后,调用函数
ErrCode = PviReadResponse (wParam, NULL, 0);
读取CPU连接状态.
3.1.5 读变量状态
每当 Pvarx 变化时, Pvi Manager 会把变化内容放入缓冲区, 同时向申请创建的实例发一个
WM_PVI_PVAR_EVENT 消息, 该消息关联以下函数:
LRESULT CPviDemoDlg::OnPviPvarEvent (WPARAM wParam, LPARAM lParam)
当前实例收到WM_PVI_PVAR_EVENT消息后,调用函数
ErrCode = PviReadResponse (wParam, szReadDataBf, PVI_STRDATA_MAXLEN * sizeof (TCHAR));
读取变量变化内容.
3.1.6 写变量值
在函数 CPviDemoDlg::OnKillfocusPvar1/2/3/4 下:
void CPviDemoDlg::OnKillfocusPvar1()
{
// get dialog input:
GetDlgItemText (IDC_PVAR1, m_szWriteDataBf, PVI_STRDATA_MAXLEN + 1 );
if (m_bEventActive)
// adjust active state for variable 1:
PviWriteRequest (m_PviPvarObj1.LinkID, POBJ_ACC_EVMASK, "ed",3, NULL, 0, 0);
}
说明: PviWriteRequest()会向 Pvi Manager 发一个写请求, Pvi Manager 会把反馈内容放指定缓冲,反馈一个WM_PVI_WRITE_RESP 消息.
3.1.7 读写操作响应
当程序收到从 Pvi Manager 反馈的消息 WM_PVI_WRITE_RESP 时,调用
LRESULT CPviDemoDlg::OnPviWriteResp (WPARAM wParam, LPARAM lParam)
{
//////////////////////////////////////////////////////////////////////////
// Pvi variable data write response received:
T_PVIOBJ_CTRL * pPviObjCtrl = (T_PVIOBJ_CTRL*) lParam;
INT ErrCode;
// confirm write response message and analyse write result:
ErrCode = PviWriteResponse (wParam);
if (ErrCode != 0)
DisplayDemoMessage (_T("Write error on %s (%d)"), pPvi- ObjCtrl->pNameID, ErrCode);
return (0);
}
说明,收到WM_PVI_WRITE_RESP后,调用PviWriteResponse (wParam);函数,把状态读出来.
3.1.8 释放 PVI 对象
在函数 void CPviDemoDlg::FreeDemoObjects ()下
// Free all existing pvi link objects and the corresponding
// temporary pvi process objects for the demo dialog
window. PviUnlinkAll (PVI_HMSG_NIL);
PviUnlinkAll (CWnd::m_hWnd);
3.1.9 断开和 PVI manager 服务器的连接
在函数 void CPviDemoDlg::FreeConnection ()下面
// Frees the pvi connection.
// free all created pvi objects:
FreeDemoObjects ();
// deinitialize pvi library instance:
PviDeinitialize ();
3.1.10 PviPvarLock 和 PviPvarUnlock
有时在可读可写的输入框改值, 不希望被下面的值刷新, 就需要对该变量 PviPvarLock 锁住, 不让其变.
void CTchjView::LockPvi()
{
PviWriteRequest (hPvar1, POBJ_ACC_EVMASK, NULL, 0, NULL, 0, 0);
PviWriteRequest (hPvar2, POBJ_ACC_EVMASK, NULL, 0, NULL, 0, 0);
PviWriteRequest (hPvar3, POBJ_ACC_EVMASK, NULL, 0, NULL, 0, 0);
PviWriteRequest (hPvar4, POBJ_ACC_EVMASK, NULL, 0, NULL, 0, 0);
}
离开该输入框焦点后, PviPvarUnLock 解锁该变量, 让它自动刷新.
LRESULT CTchjView::OnPviWriteResp(WPARAM wParam, LPARAM lParam)
{
// interprete PVI response of a variable write request:
int ErrCode = PviWriteResponse (wParam);
switch (lParam)
{
case IDC_PVAR1:
if (ErrCode != NULL)
DemoMessage ("Error on write response PV1 (%u)", ErrCode);
// unlock PVI event message:
PviWriteRequest (hPvar1, POBJ_ACC_EVMASK, "ed", 2, NULL, 0, 0);
break;
}
}
3.2 关键参数定义
Pvi 对象都是保存在 PviDemo.ini 文件中.