Issue
- How do I share data between standard Continuum controllers and Continuum BACnet controllers?
- What communication method is used (COV, Import/export, or point to point)?
- What problems can I encounter?
Product Line
Andover Continuum
Environment
- Continuum Controllers (CX9200, CX9400, CX9900,CX9702, CX9680, bCX9640, ACX5720, ACX5740)
- Continuum BACnet Controllers (b4920, bCX4040)
Cause
All communication between Continuum controllers and Continuum BACnet controllers is done using point to point protocol. Since BACnet controllers do not support Import/export and Continuum controllers do not support COV, point to point is the only common method to communicate.
Resolution
The method of programming the data sharing can be the same as standard Continuum programming, however because of the point to point protocol a specific method should be used. Using typical Continuum programming techniques, you would create a mirrored point in the BACnet controller (a BCX for instance). You would then write a PE program in the BCX that mirrors the point, for instance:
Line Mirror BCX DataPoint1 = CX/Infinet/DataPoint1 goto Mirror Line E: goto mirror
This method would perform a point to point communication every BCX scan and retrieve the data whether it has changed or not. It will create a lot of unnecessary network traffic and slow the scans of both controllers. The line E is necessary because with a point to point communication, the program will disable if the target controller temporarily goes offline.
Now consider if you were mirroring many points between the systems for instance you were using the BCX as a BACnet gateway for the Continuum system. That same program would have many points that are being transferred. You would also write multiple programs because of the number of points being polled. The net result of this programming method would be that the entire system would be brought to its knees! Extremely slow scan rates in both controllers because these point to point data requests have to be completed end to end during the scan. Congested Infinet communications because to get the Infinet points we go all the way down the 19.2K Baud Infinet to get the data. The system would just plain no longer function correctly.
The only reasonable method to accomplish this type of data transfer would be for the owner of the data that you want to transfer to the other controller sends the data to that controller, and only on an as needed basis, such as a change in its value. Therefore in the scenario described above where you want to mirror points in a BACnet BCX from a Continuum system, you would write the transfer program(s) in the CX controller, and within that program use a local variable for each transferred point to allow you to know if its value has changed since the last transfer, and not retransmit if the value is the same, thereby significantly decreasing network traffic and burden on the system. This method has the added benefit of eliminating the need to clog up the Infinet network, because the program in the CX automatically creates an import/export relationship between the CX and the Infinet controller's points so the normal export broadcast will transfer the data to the CX. One example of the program in the CX to perform the data transfer is as follows:
Numeric num1 Line Mirror If num1<>CX/Infinet/datapoint1 then set BCX dataPoint1 to CX/Infinet/datapoint1 num1 = CX/Infinet/datapoint1 endif goto Mirror
Line E:
if TS>5 then goto Mirror
You could also streamline the programs using such methods as creating an InfinityFunction that would be called to minimize the redundant portions of the data comparison and transfer in the programs for multiple point transfers. The function could be named “Exporter” look like this:
Arg 1 RemotePoint Arg 2 LocalPoint Arg 3 TestPoint If TestPoint<> LocalPoint then Set RemotePoint to LocalPoint TestPoint= LocalPoint endif Return
And now any point that you want to be exported would call this function so the above program would be reduced to:
Numeric num1, ..... numX Line Mirror Exporter (BCX dataPoint1, CX/Infinet/datapoint1, num1) . . Exporter (BCX dataPointX, CX/Infinet/datapointX, numX) goto Mirror Line E: if TS>5 then goto mirror
After the initial scan when we send all the current data to the BCX, only changed data would be sent thereafter. This syntax would be repeated for each point that you wanted to mirror. This program is setup to be looping. You could create a similar program to be fallthru and trigger it from a minute or seconds system variable. If kept looping it would be recommended to go to a delay line between scans if there was a lot of data transfer going on. There should also be many programs like this if there is a lot of data to be transferred for a couple of reasons. First, if for some reason one of the points could not be transferred due to a temporary comm loss, the program would disable, go to line E and restart from the beginning, not executing any data transfer on the points below the one that failed. Second, if you were transferring many points, you would most likely exceed the maximum file size.
Always be cautious as to how much data you try to transfer, and how often. There is no fixed limit per controller, but system performance will degrade proportionally to the speed and amount of data being transferred.
As an additional note, it would also be extremely beneficial to put thresholds on the exported points to decrease un-necessary traffic.