Tuesday, September 28, 2010

How to read large BACnet Arrays

There's some very active discussion going on in the BACNET-L mailing list about how to read arrays that are too large to fit in a single APDU when segmentation isn't supported. The solution, as Frank Schubert pointed out this morning, is to be found in the BTL Implementation Guidelines (for download), to wit:

3.4 Be prepared to read the Object_List array element by element

Some small devices that do not support segmentation have Object_List properties that are too large to transmit unsegmented. If a device needs to read another’s Object_List property, be prepared to read it array element by array element.

This could be a little slow for clients reading the Object_List of devices with thousands of aobjects, however. There was discussion of a proposal before the committee to use ReadRange to read the array in "chunks", rather a bit less tedious, but a little quick research revealed that the committee tabled that proposal (vote: 1-8-4) in the spring meeting last May.

But the initial question that started this discussion posed a thornier problem: a physical access control device with hundreds of thousands of objects. Even segmentation will not help here because the segmentation counter would have to wrap. (Perhaps someone can research the language change that would allow that to occur?)

Reading the Object_List of one of these devices, array element by array element, would take quite some time. Using ReadPropertyMultiple to read by "chunks" would seem to be the best available solution at this time. At least unless and until the tabled proposal is brought back up.

(Note to implementers of such large server devices: be sure you can locate the last element of the Object_List quickly -- I have seen implementations fail to respond to such read requests before the client timed out because the server's linear search algorithm took too long.)

No comments:

Post a Comment