這里要說的方法就是調用Bacnet IP主站快速開發工具OMBacnetIPMaster.dll。
步驟1、引用頭文件和LiB文件
#include "OM_BacnetIP_API.h"
#pragma comment (lib, "OMBacnetIPMaster.lib")
把OMBacnetIPMaster.dll放到新建的VC++工程的同一個文件夾
步驟2、創建通道,通道管理所有的Bacnet屬性對象
void CBacnetDemoDlg::OnBtnCreateChannel()
{
UpdateData(TRUE);
m_hChannel = CreateChannel(m_strIP, m_nPort);
}
步驟3、創建要訪問的屬性對象。一些是訪問Analog Output 1的當前值屬性。
void CBacnetDemoDlg::OnBtnBacnetObject()
{
if (m_hChannel && !m_hBacnetObj)
{
m_hBacnetObj = CreateBacnetObject(m_hChannel, OBJECT_ANALOG_OUTPUT, 1, PROP_PRESENT_VALUE);
}
}
步驟4、讀寫屬性對象的值
void CBacnetDemoDlg::OnBtnReadObject()
{
if (m_hBacnetObj && m_hBacnetObj)
{
VARIANT variant;
VariantInit(&variant);
BOOL bIsOK = ReadBacnetObject(m_hBacnetObj, &variant);
m_strPV.Format("%f", variant.fltVal);
VariantClear(&variant);
UpdateData(FALSE);
}
}
寫1000到Analog Output 1
void CBacnetDemoDlg::OnBtnWriteObject()
{
if (m_hBacnetObj)
{
VARIANT variant;
VariantInit(&variant);
variant.vt = GetBacnetObjType(m_hBacnetObj);
variant.fltVal = 1000;
BOOL bIsOK = WriteBacnetObject(m_hBacnetObj, &variant);
VariantClear(&variant);
}
}
步驟4、關閉程序釋放創建的資源
最后還有幾個輔助的API函數,可以選擇性地使用。
具體的頭文件申明如下:
typedef VOID (CALLBACK *ERRORHANDLERPROC)(LPCTSTR lpErrorMsg);
typedef VOID (CALLBACK *ABORTHANDLERPROC)(LPCTSTR lpAbortMsg);
typedef VOID (CALLBACK *REJECTHANDLERPROC)(LPCTSTR lpRejectMsg);
#ifdef __cplusplus
extern "C" {
#endif
//通道管理用于創建、修改、刪除通道。創建通道以后,才能創建Bacnet屬性對象
//創建一個通道對象只要是為了設置不同設備的IP地址和端口號。網絡超時等待時間默認是100毫秒
//同時管理通道下的Bacnet屬性對象
//參數 hChannel 為通道對象的句柄
HANDLE OMOPCSVRAPI WINAPI CreateChannel(LPCTSTR lpIP, WORD wPort, DWORD dwTimeOut =100);
BOOL OMOPCSVRAPI WINAPI ConfigureChannel(HANDLE hChannel, LPCTSTR lpIP, WORD wPort, DWORD dwTimeOut=100);
BOOL OMOPCSVRAPI WINAPI RemoveChannel (HANDLE hChannel);
//Bacnet對象管理,創建、修改、刪除
//參數 eObjType 為Bacent屬性對象的類型ID,譬如0表示 Analog Input,1表示Analog Output
//參數 wInstanceNum 為指明哪一個對象,譬如要訪問Analog Input 1。則 nInstanceNum為1
//參數 ePropID 為要訪問屬性的ID,譬如當前值的屬性ID是85
//參數 hBacnetObj 為Bacnet對象的句柄
HANDLE OMOPCSVRAPI WINAPI CreateBacnetObject(HANDLE hChannel, BACNET_OBJECT_TYPE eObjType, WORD wInstanceNum, BACNET_PROPERTY_ID ePropID = PROP_PRESENT_VALUE );
BOOL OMOPCSVRAPI WINAPI ConfigureBacnetObject(HANDLE hBacnetObj, BACNET_OBJECT_TYPE eObjType, WORD wInstanceNum, BACNET_PROPERTY_ID ePropID);
BOOL OMOPCSVRAPI WINAPI RemoveBacnetObject (HANDLE hBacnetObj);
// Bacnet對象屬性值讀寫
//參數 eTegNumber 為Bacnet對象的Tag Number。也就是要寫的對象屬性的數據類型。當操作過ReadBacnet以后,這個參數可以為空。
//當只寫操作的時候,則需要用戶自己指明是什么數據類型。譬如Analog Output為4.也就是單精度浮點型。
BOOL OMOPCSVRAPI WINAPI ReadBacnetObject(HANDLE hBacnetObj, VARIANT *pValue);
BOOL OMOPCSVRAPI WINAPI WriteBacnetObject(HANDLE hBacnetObj,VARIANT* pValue, BACNET_APPLICATION_TAG eTegNumber = BACNET_APPLICATION_TAG_NULL);
//以下是輔助函數,可以選擇性使用
//設置寫操作的優先等級
BOOL OMOPCSVRAPI WINAPI SetBacnetPriority(HANDLE hBacnetObj, WORD wPriority);
//返回Bacnet對象屬性的數據類型,一般用于寫操作
VARTYPE OMOPCSVRAPI WINAPI GetBacnetObjType(HANDLE hBacnetObj);
//通信故障狀況回調函數
BOOL OMOPCSVRAPI WINAPI EnableErrorMsgNofity(ERRORHANDLERPROC fnCallback);