This month has been a great learning month. I was able to build and complete a small water SCADA system here in Canada (thanks GlobalFlow for the opportunity!) and we made the communications work using DNP3.
So this system is built with SCADAPacks talking over a serial radio. Conveniently the master radio is at the same location as the primary reservoir which is providing the water level for our system start/stop commands. Instead of making our SCADA host perform the level logic we decided to use the SCADAPack at the reservoir. To accomplish this goal we made the reservoir SCADAPack a DNP3 master, configured address mapping and connected it to the master radio.
Address mapping is a way for a standard SCADAPacks to take DNP3 data off the wire and put it into Modbus registers locally so they can be used in logic or passed to a Modbus master. We ended up doing two things:
- Setup Binary Output address mapping for sending well pump start commands to the various water wells in town.
- Configure Binary Input mapping for getting back the well pump run status.
First off we need to configure our remote slaves. It’s fairly easy.
Set the RTU address. Add the appropriate DNP3 masters so the slave knows who to address unsolicited messages to.
Hint: I have two masters in my network; 1000=ClearSCADA, 6=Master SCADAPack with Address Mapping.
Configure the DNP3 points.
Configure storage retention.
Configure classes and unsolicited settings.
Because this is straight start/stop without any local shutdowns we are not doing any special logic in each remote SCADAPack, but we could if we wanted to. The pump output will be controlled by the master SCADAPack and the pump run status sent back for confirmation.
Next we need to configure the Master. Similarly we need to configure its address, master station, points, classes, etc. But we also need to configure the DNP3 master settings.
First we will tell it to accept Class 1 Events from the various Well RTUs.
Then we will setup the address mapping. You need to configure the DNP3 point type, remote address, remote DNP3 point and local Modbus address to read/write data from.
As near as I can tell this mapping is one way communication, depending on the point type. Outputs write out to the remotes when the local data changes. Input data is read from the DNP3 stream when the SCADAPack receives it and is put in Modbus for local use, reflecting changes on the remote. The key is making sure the SCADAPack is configured with master polling or class unsolicited acceptance, otherwise the Master SCADAPack does not know to listen for data.
For this use case I chose to simply receive the class data I knew I was mapping. No other data was required at the master SCADAPack. I did not configure regular polling because we have ClearSCADA on the other side of our master SCADAPack acting as our system dashboard. More on that configuration next time!