一、准备工作:
1、安装BACnet模拟器【Yabe】
2、启动模拟器【Room Control Simulator】


二、在AIoTedge中BACnet读写【固定值实现】
1、读写AnalogValue【模拟值】示例【单个参数】
PS:导入示例代码
示例代码:
[{"id":"863b5c82.8792c","type":"debug","z":"b387cb.56722838","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":730,"y":320,"wires":[]},{"id":"34f61fc019d1a72e","type":"BACnet-Write","z":"b387cb.56722838","name":"写AV-1","objectType":"2","instance":"ef226397.1987f","valueTag":"4","valueValue":"25.59","propertyId":"85","priority":"16","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleWrite":false,"x":490,"y":340,"wires":[["863b5c82.8792c"]]},{"id":"c7ec07f506bade9d","type":"inject","z":"b387cb.56722838","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":270,"y":340,"wires":[["34f61fc019d1a72e"]]},{"id":"78bc17d80fea8272","type":"inject","z":"b387cb.56722838","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":270,"y":280,"wires":[["289cff1e8c6a2b04"]]},{"id":"289cff1e8c6a2b04","type":"BACnet-Read","z":"b387cb.56722838","name":"读 AV-1","objectType":"2","instance":"ef226397.1987f","propertyId":"85","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleRead":false,"x":500,"y":280,"wires":[["863b5c82.8792c"]]},{"id":"45f1cc2759460290","type":"comment","z":"b387cb.56722838","name":"单个读写AV","info":"","x":290,"y":220,"wires":[]},{"id":"ef226397.1987f","type":"BACnet-Instance","name":"Temperature Water-1","instanceAddress":"1"},{"id":"7adbdd83.bce224","type":"BACnet-Device","name":"Windows VM","deviceAddress":"192.168.1.5"},{"id":"e0bf099a.ee8468","type":"BACnet-Client","name":"Client-47","adpuTimeout":"3000","port":"47808","interface":"192.168.1.47","broadcastAddress":"192.168.1.255"}]
2、详细介绍读写节点
2-1、BACnet-Read节点介绍

【type】——BACnet寄存器类型
下列为:常用寄存器类型:
寄存器类型 | 行业简写 | 组件中数字替换 |
ANALOG_INPUT | AI | 用【数字0】代表 |
ANALOG_OUTPUT | AO | 用【数字1】代表 |
ANALOG_VALUE | AV | 用【数字2】代表 |
BINARY_INPUT | BI | 用【数字3】代表 |
BINARY_OUTPUT | BO | 用【数字4】代表 |
BINARY_VALUE | BV | 用【数字5】代表 |
MULTI_STATE_INPUT | MSI | 用【数字13】代表 |
MULTI_STATE_OUTPUT | MSO | 用【数字14】代表 |
MULTI_STATE_VALUE | MSV | 用【数字19】代表 |
【Instance】——BACnet寄存器地址
【Property Id】——BAC指定对象的属性ID
常用ID: 用数字【85】代表【PRESENT_VALUE】
【其他对象的属性ID】:
数字代表 | BAC指定对象的属性ID【含义】 |
0 | 【ACKED_TRANSITIONS】 |
1 | 【ACK_REQUIRED】 |
2 | 【ACTION】 |
3 | 【ACTION_TEXT】 |
4 | 【ACTIVE_TEXT】 |
5 | 【ACTIVE_VT_SESSIONS】 |
6 | 【ALARM_VALUE】 |
7 | 【ALARM_VALUES】 |
8 | 【ALL】 |
9 | 【ALL_WRITES_SUCCESSFUL】 |
10 | 【APU_SEGMENT_TIMEOUT】 |
…… | …… |
85 | 【PRESENT_VALUE】 |
【Device】——代表访问的BACnet设备

【Client】——客户端,即自己

2-2、BACnet-Write节点介绍

【type】——BACnet寄存器类型【同上】
【Instance】——BACnet寄存器地址【同上】
【App-Tag】写入数据类型
数字代表 | 写入数据类型 |
0 | 代表NULL |
1 | 代表BOOLEAN |
2 | 代表UNSIGNED_INTEGER |
3 | 代表SIGNED_INTEGER |
4 | 代表REAL |
5 | 代表DOUBLE |
6 | 代表OCTET_STRING |
7 | 代表CHARACTER_STRING |
8 | 代表BIT_STRING |
9 | 代表ENUMERATED |
10 | 代表DATE |
11 | 代表TIME |
【Value】写入数据值
【Property Id】——BAC指定对象的属性ID【同上】
【Priority】优先权等级,常用16
数字代表 | 优先权等级名称 |
1 | manual-life-safety |
2 | automatic-life-safety |
3 | available-3 |
4 | available-4 |
5 | cnitical-equipment-control |
6 | minimum-on/off |
7 | available-7 |
8 | manual-operator |
9 | available-9 |
10 | available-10 |
11 | available-11 |
12 | available-12 |
13 | available-13 |
14 | external-value |
15 | algorithm-value |
16 | available-16 |
3、读写效果图
3-1、第一次读取效果

3-2、修改写入参数,并执行

执行写入
注意:修改节点的写入值,需要单击【部署】按钮,方可生效。

3-3、第二次读取效果

三、BACnet读写单个【动态数据实现】
效果图如下:


示例代码如下:
[{"id":"e796f1095da2016c","type":"group","z":"c0df05c4edaff7ac","style":{"stroke":"#bbbbbb","stroke-opacity":"1","fill":"#f3f3f3","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#555555"},"nodes":["351ab70ba4608e64","ec34d15c93f39eea","652ef61d49d7a2d5","55edefcac90f2a25","54f36b55694a1008","850808d0198ed7f4","c4fd8db46d51c3a5","5addca8f66dc9104","66507a1fa997813b","6adbd8cdaa7c5d33","ac589a606b3acf4f"],"x":14,"y":179,"w":872,"h":262},{"id":"351ab70ba4608e64","type":"inject","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":260,"wires":[["55edefcac90f2a25"]]},{"id":"ec34d15c93f39eea","type":"BACnet-Read","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"BACnet读 AV-1","objectType":"2","instance":"ef226397.1987f","propertyId":"85","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleRead":false,"x":460,"y":260,"wires":[["54f36b55694a1008"]]},{"id":"652ef61d49d7a2d5","type":"comment","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"通过传递配置数据,单个读写AnalogValue-1","info":"","x":210,"y":220,"wires":[]},{"id":"55edefcac90f2a25","type":"function","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"读取单个【AV-1】","func":"msg.payload = { requestArray: [] }\n\n//AV-1\nmsg.payload.requestArray = [\n //AV--type=2\n {\n objectId: { type: 2, instance: 1 },//type代表寄存器类型,instance代表寄存器地址\n properties: [{ id: 85 }]\n }\n \n]\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":270,"y":260,"wires":[["ec34d15c93f39eea"]]},{"id":"54f36b55694a1008","type":"function","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"处理数据","func":"var array = msg.payload.values;\nlet jsonObject = {};\n\n//1、判断是否有查询结果\nif(array.length>0){ \n //定义name\n let newKey = \"Setpoint1\";//填写您的标识符,如:shidu,wendu……\n //定义value\n let newValue = array[0].value;\n if (newValue+\"\".indexOf(\".\") != -1){ \n //为真,作用保留2位小数\n newValue = newValue.toFixed(2);\n }\n jsonObject[newKey] = newValue;\n}\n\nmsg.payload = jsonObject;\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":260,"wires":[["850808d0198ed7f4"]]},{"id":"850808d0198ed7f4","type":"debug","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":260,"wires":[]},{"id":"c4fd8db46d51c3a5","type":"inject","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"11.11","payloadType":"num","x":110,"y":360,"wires":[["5addca8f66dc9104"]]},{"id":"5addca8f66dc9104","type":"function","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"函数处理","func":"//将上一个节点传递过来的payload值,push到节点的values中\nlet values = {type:4,value:msg.payload}\nmsg.payload = { propertyId:85,values:[]}\nmsg.payload.values.push(values)\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":380,"wires":[["6adbd8cdaa7c5d33"]]},{"id":"66507a1fa997813b","type":"inject","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"12.12","payloadType":"num","x":110,"y":400,"wires":[["5addca8f66dc9104"]]},{"id":"6adbd8cdaa7c5d33","type":"BACnet-Write","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"BACnet写 AV-1","objectType":"2","instance":"ef226397.1987f","valueTag":"4","valueValue":"","propertyId":"85","priority":"","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleWrite":false,"x":460,"y":380,"wires":[["ac589a606b3acf4f"]]},{"id":"ac589a606b3acf4f","type":"debug","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":380,"wires":[]},{"id":"ef226397.1987f","type":"BACnet-Instance","name":"SetPoint-1","instanceAddress":"1"},{"id":"7adbdd83.bce224","type":"BACnet-Device","name":"Windows VM","deviceAddress":"192.168.1.5"},{"id":"e0bf099a.ee8468","type":"BACnet-Client","name":"Client-47","adpuTimeout":"3000","port":"47808","interface":"192.168.1.47","broadcastAddress":"192.168.1.255"}]
四、BACnet读多个【通过数据传递实现】
效果图如下:

代码如下:
[{"id":"6a698d10f0260490","type":"group","z":"f217c08a9f80deb4","style":{"stroke":"#bbbbbb","stroke-opacity":"1","fill":"#f3f3f3","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#555555"},"nodes":["f9637ba082d051f0","ca7dcc1fbb0777cd","7639ecced9ebb4d5","3c07ea56c14a9820","2b387417cc39df87","06171f3e81fb9933"],"x":54,"y":239,"w":812,"h":142},{"id":"f9637ba082d051f0","type":"function","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"读取多个","func":"msg.payload = { requestArray: [] }\n//AI-0\n//AI-1\n//AI-2\n//AV-0\n//AV-1\nmsg.payload.requestArray = [\n //AI--type=0\n {\n objectId: { type: 0, instance: 0 },\n properties: [{ id: 85 }]\n },\n {\n objectId: { type: 0, instance: 1 },\n properties: [{ id: 85 }]\n },\n {\n objectId: { type: 0, instance: 2 },\n properties: [{ id: 85 }]\n },\n //AV--type=2\n {\n objectId: { type: 2, instance: 0 },\n properties: [{ id: 85 }]\n },\n {\n objectId: { type: 2, instance: 1 },\n properties: [{ id: 85 }]\n },\n {\n objectId: { type: 2, instance: 2 },\n properties: [{ id: 85 }]\n }\n]\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":340,"wires":[["7639ecced9ebb4d5"]]},{"id":"ca7dcc1fbb0777cd","type":"comment","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"读取多个对象","info":"","x":150,"y":280,"wires":[]},{"id":"7639ecced9ebb4d5","type":"BACnet-Read","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"","objectType":"8","instance":"ef226397.1987f","propertyId":"85","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleRead":true,"x":440,"y":340,"wires":[["06171f3e81fb9933"]]},{"id":"3c07ea56c14a9820","type":"debug","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":760,"y":340,"wires":[]},{"id":"2b387417cc39df87","type":"inject","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":340,"wires":[["f9637ba082d051f0"]]},{"id":"06171f3e81fb9933","type":"function","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"处理数据","func":"var array = msg.payload.values;\nlet jsonObject = {};\n\n// AI——type: 0\t 【0,1,2】\n// AV——type: 2\t 【0,1, 2】\n\n//定义查询对象\nvar selectDataArray = [\n{ type: 0, instance: 0, name: \"室内温度\" },\n{ type: 0, instance: 1, name: \"水箱温度\" },\n{ type: 0, instance: 2, name: \"室外温度\" },\n\n{ type: 2, instance: 0, name: \"设定值\" },\n{ type: 2, instance: 1, name: \"设定值1\" },\n{ type: 2, instance: 2, name: \"设定值2\" }];\n\n//1、遍历查询出来的结果\nfor(let i =0;i< array.length;i++){\n var obj = array[i];\n\n //2、遍历所需查询对象\n for (let j = 0; j < selectDataArray.length; j++) {\n var json = selectDataArray[j];\n if (obj.objectId.type == json.type && obj.objectId.instance == json.instance) {\n //定义key\n let newKey = json.name;\n //定义value\n let newValue = obj.values[0].value[0].value;\n if (newValue+\"\".indexOf(\".\") != -1){ \n //为真\n newValue = newValue.toFixed(2);\n }\n jsonObject[newKey] = newValue;\n }\n } \n}\n\nmsg.payload = jsonObject;\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":340,"wires":[["3c07ea56c14a9820"]]},{"id":"ef226397.1987f","type":"BACnet-Instance","name":"SetPoint-1","instanceAddress":"1"},{"id":"7adbdd83.bce224","type":"BACnet-Device","name":"Windows VM","deviceAddress":"192.168.1.5"},{"id":"e0bf099a.ee8468","type":"BACnet-Client","name":"Client-47","adpuTimeout":"3000","port":"47808","interface":"192.168.1.47","broadcastAddress":"192.168.1.255"}]