C++开发BacnetIP主站程序
时间:2013-08-06 阅读:1514
C++开发BacnetIP主站程序 |
这里要说的方法就是调用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、关闭程序释放创建的资源 zui后还有几个辅助的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); |