OPS调用RTDB接口示例

该示例展示了如何使用RTDB_Read接口读取数据库中的点的当前值、量程上限值和下限值。通过创建请求缓冲区,设置点名和项名,然后调用RTDB_Read接口,解析回复缓冲区获取浮点值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值