const int NETERR_OK = 0;
const int INVALIDITEMTYPE = -2;
const int PNAMELENGTH = 12; // 点名长度
const int INAMELENGTH = 2; // 项名长度
struct DB_Read_Request_Head
{
short shPointNum; // 点数
};
struct DB_Read_Request_Body
{
CString strPointName; // 点名
CString strItemName; // 项名
};
struct DB_Read_Reply_Head
{
short shPointNum; // 点数
};
struct DB_Read_Reply_Body
{
short shItemType; // 项类型
short shItemLength; // 项长度
};
// 实时数据库多点多项读接口
int RTDB_Read(char* pRequestBuf, int nRequestBufLen, char* pReplyBuf, int nReplyBufLen,
int nTimedOut = -1);
/*
Function: RTDB_ReadMultiItemMUMDWrap
Identifier:
Description: 读取数据库点的当前值、量程上下限
Input: strPointName: 点名
strItemName: 项名
Output: lpCurVal: 当前值
lpMU: 量程上限值
lpMD: 量程下限值
Return: TRUE: 成功
FALSE: 失败
Others:
Revision: Created by Leo on Aug 20, 2009
*/
BOOL RTDB_ReadMultiItemMUMDWrap(CString strPointName,
CString strItemName,
LPVOID lpCurVal,
LPVOID lpMU,
LPVOID lpMD
)
{
BOOL bRetVal = FALSE;
int nRequestBufLen = sizeof(DB_Read_Request_Head) + sizeof(DB_Read_Request_Body);
char* pRequestBuf = new char[nRequestBufLen];
DB_Read_Request_Head* pRequestHead = (DB_Read_Request_Head*)pRequestBuf;
DB_Read_Request_Body* pRequestBody = (DB_Read_Request_Body*)(pRequestHead + 1);
pRequestHead->shPointNum = 3;
// Current Value
memcpy(pRequestBody->strPointName, strPointName, PNAMELENGTH);
memcpy(pRequestBody->strItemName, strItemName, INAMELENGTH);
pRequestBody++;
// MU
memcpy(pRequestBody->strPointName, strPointName, PNAMELENGTH);
memcpy(pRequestBody->strItemName, _T("MU"), INAMELENGTH);
pRequestBody++;
// MD
memcpy(pRequestBody->strPointName, strPointName, PNAMELENGTH);
memcpy(pRequestBody->strItemName, _T("MD"), INAMELENGTH);
// Assume all three values are of float type
int nReplyBufLen = sizeof(DB_Read_Reply_Head) + 3 * (sizeof(DB_Read_Reply_Body) + sizeof(float));
char* pReplyBuf = new char[nReplyBufLen];
DB_Read_Reply_Head* pReplyHead = (DB_Read_Reply_Head*)pReplyBuf;
DB_Read_Reply_Body* pReplyBody = (DB_Read_Reply_Body*)(pReplyHead + 1);
int nRetVal = RTDB_Read(pRequestBuf, nRequestBufLen, pReplyBuf, nReplyBufLen);
if (nRetVal != NETERR_OK)
{
// Error message goes here...
bRetVal = FALSE;
}
else
{
char* pVal = (char*)(pReplyBody + 1);
if (pReplyBody->shItemType != INVALIDITEMTYPE)
{
memcpy(lpCurVal, pVal, sizeof(float));
}
pReplyBody = (DB_Read_Reply_Body*)(pVal + pReplyBody->shItemLength);
pVal = (char*)(pReplyBody + 1);
if (pReplyBody->shItemType != INVALIDITEMTYPE)
{
memcpy(lpMU, pVal, sizeof(float));
}
pReplyBody = (DB_Read_Reply_Body*)(pVal + pReplyBody->shItemLength);
pVal = (char*)(pReplyBody + 1);
if (pReplyBody->shItemType != INVALIDITEMTYPE)
{
memcpy(lpMD, pVal, sizeof(float));
}
bRetVal = TRUE;
}
// Cleaning up goes here...
delete[] pRequestBuf;
pRequestBuf = NULL;
delete[] pReplyBuf;
pReplyBuf = NULL;
return bRetVal;
}