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