Extending Wonderware with RabbitMQ

Wonderware makes excellent HMIs (computer displays in an industrial environment), but what if you have a large legacy C# application that you want to use with Wonderware without paying for more licenses? I ran into this situation recently, and I came up with the following solution: create an "adapter" program that provides RabbitMQ functionality inside the Wonderware galaxy.

Specifically, load the MX Access Toolkit DLL and the RabbitMQ.NET client, and translate messages in between them. So if you get a RabbitMQ message that says "change Wonderware attribute X to a new value Y", then the adapter does the equivalent operation in the Galaxy using the MX Access Toolkit. If a Wonderware attribute changes value (using MX Access subscribe()), then post a RabbitMQ message indicating the updated value to non-Wonderware clients who read messages from RabbitMQ. I used JSON for the message format because it's simple, universally supported, and not too big.

This approach provides bi-directional communication between everything in Wonderware and everything outside Wonderware, using RabbitMQ as the universal platform for exchanging messages. RabbitMQ is free (but commercial support is available from Pivotal), fast, and very reliable. RabbitMQ can also reach web applications using WebSTOMP (i.e., Javascript) and non-C# applications using the other client libraries (Java, C++, Python, etc.).

Limitations of this approach: Wonderware is expensive, so if you just want a PLC communication library, you should use Kepware. Obviously, you're not going get tech support for extending Wonderware in this way, and since you're avoiding a lot of license fees per computer (Platform, ArchestrA license), you won't get any help from the sales department either. Also, Wonderware now includes its own webserver, so you could just use that for your web applications.

For more details, see the source code at https://github.com/znoop333/RMQWonderwareAdapter