0

我在从 BACNET IP 路由器上的设备读取属性时遇到问题。为此,我正在使用 .net 库https://github.com/ela-compil/BACnet

如果我正在与多个设备交互,每个设备都有自己的 ip 和 id(没有路由器配置),通信工作正常并且我能够读取属性。但是,一旦实现了路由器模式的设备并且所有其他设备都通过该主路由器进行通信,我将不再能够读取属性。

Main Bacnet router IP 192.168.2.222
Device 1, Ip: 192.168.1.1, ID: 10
Device 2, Ip: 192.168.1.2, ID: 11
My software is on IP 192.168.2.220

要读取我正在使用的属性:

var targetObjId = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, (uint)10);
var targetBacnetAddress = new BacnetAddress(BacnetAddressTypes.IP, "192.168.1.1");
var rez = await Bacnet_client.ReadPropertyAsync(targetBacnetAddress, targetObjId, BacnetPropertyIds.PROP_OBJECT_LIST);

这将返回:“来自设备的错误:ERROR_CLASS_SERVICES - ERROR_CODE_SERVICE_REQUEST_DENIED”。如果网络上没有使用路由器,则此代码将起作用并产生结果。所以我在寻址 bacnet 设备时一定做错了什么?

使用 Yabe 浏览器,这一切都有效。因此设备配置设置正确。实际上,当我通过功能/IP 服务/外部设备注册注册外国设备时,会发现路由器后面的设备。

4

2 回答 2

0

从 IP 地址来看,您的设备似乎位于不同的 IP 地址上。这是首先要确认的。( 192.168.1.0 和 192.168.2.0通常是不同的子网,但这取决于您的网络掩码设置)。

因此,要“跨越”并发现其他子网上的设备,可以使用 BBMD 并向其注册,就像您在 YABE 中提到的那样,BBMD 将在远端子网上分发发现广播(​​Who-Is) . 到目前为止,一切都很好。

您混淆了“BACnet 路由器”和 BBMD(BACnet 广播管理设备)的概念。在这种情况下,您应该(正在)使用 BBMD 功能,而不是 BACnet 路由器功能。

但是,以上都没有解决您的直接问题。您似乎正在创建一条直接消息(使用已知 IP 地址,不需要发现,因此不需要使用 BBMD 注册外部设备),但您收到一条错误消息。这似乎是 .Net 实现中的一个问题。Wireshark 说在端口 47808 上发送/接收了什么?

于 2021-06-30T10:27:35.997 回答
0

我猜想,一旦您激活了路由器,设备可能必须通过路由器的 IP(v4) 地址(而不是设备的 IP 地址)路由到 - 但添加了适当的 DNET(目标网络#)值和 DADR(目标地址)值来标识您的目标设备/例如尝试从中读取属性。

即IP地址标识路由器/与(Modbus?)设备通信的设备,并且DNET和DADR值的配对标识路由器将协助通信的设备( - 正如史蒂文所评论的那样)。

YABE 似乎令人困惑地将 DADR 值显示为 IP 地址(而不是 MAC 地址,即 EUI-48/MAC-48 格式);你必须修改 YABE 的源代码来解决这个问题;但如果你走那条路,最好将 I-Am 信息跟踪/输出到它的“日志”窗口 - 以便更容易查看/参考。

例如,在调用 'NPDU.Decode()' 之后 - 将新的 'IP_MAC' 值添加到 'BacnetAddressTypes' (覆盖/替换“None”的路由源的默认设置值):


    if (source != null &&
        sender.Type == BacnetAddressTypes.IP)
    {
        source.type = BacnetAddressTypes.IP_MAC;
    }

然后,您可以将处理“case”语句添加到“BacnetAddress.ToString()”方法,以输出更合适的显示。

当您说“通信有效并且我能够读取属性”时-我假设您的意思是当您直接插入设备的(MS-TP?)网络时;否则听起来你不需要路由器(/可能只处理 BACnet/IP 设备)。

“RoutedSource”是挂在“BacnetAddress”上的成员/属性,该“BacnetAddress”包含 DNET 和 DADR 值(在“NPDU.Decode()”方法中设置)。

以防万一您不知道,YABE 将(相关/父)路由器设备树节点下的所有路由到设备显示为路由器的子节点。

“DADR = 最终目的 MAC 层地址”

“DLEN = 最终目的 MAC 层地址的 1 字节长度”

“DNET = 2 字节的最终目标网络号”

于 2021-07-04T18:39:20.617 回答