How do I use Node-RED to read Analog Input Module ED-549 with Modbus TCP?

FAQs

1. Summary

This FAQ explains different nodes inside Node-RED, which are used in creating an example for using a BB-400, with an ED-549. The end example is a flow which will be able to read the inputs of a Brainboxes ED-549.

2. Introduction

Nodes used in this FAQ

ImageDescription
Debug nodeDebug, for debugging the returned data from the nodes it’s attached to.
Modbus Read nodeModbus TCP/Serial read node. Connects to a Modbus TCP or serial to read registers/coils values with a given polling rate.
Function nodeFunction, a JavaScript block to run against the messages being received and output as a msg object.
Gauge nodeAdds a gauge type widget to the user interface.
Chart nodeAdds a chart to the user interface.

Requirements

Software/EquipmentDetails
Brainboxes BB-400BB-400
BB-Node-RED installedOn the BB-400, you must have the software package bb-node-red installed
You can check if it’s installed using bb status.version or install it with sudo apt-get install bb-node-red
Brainboxes ED-549Brainboxes ED-549

3. ED-549 Setup

A Brainboxes ED-549 comes in a default configuration using the ASCII protocol. The unit needs to be configured to use the Modbus TCP protocol instead. To do that, simply go to the ED-549 Web UI configuration, and change the protocol settings from ASCII to Modbus TCP:

ED-549 Protocol settings

For the examples used in this FAQ, we will be using the:

  • Analog input even numbers as voltage lines (using ±10V)
  • Analog input odd numbers as milliamp lines (using 4-20mA)

ED-549 Analog input

Please note that for the ED-549, you must also change the jumper configuration, which is located inside the case on the physical hardware for each of the inputs:

Jumper configuration

4. Guide

The Modbus TCP/Serial nodes come from a 3rd party NPM package known as “node-red-contrib-modbus”. It comes with many useful tools that can be used with the BB-400 to talk with, and between, other Brainboxes ED devices, but for this FAQ, the only one we need is the Modbus TCP read node:

Modbus Read nodeModbus Read node settings

For the  newmodbus-client, you need to configure your ED-549 as the new device. For example:

Modbus Client configuration

Now to add a function node. The Modbus TCP Read Node passes all the values for all the lines, and the function node will be used to split all of the values into 8 separate lanes, 1 for each input on the ED-549. Note that the ‘Outputs’ setting at the bottom has been set to 8. This expands the function node to give it 8 outputs. Each of these outputs will be for each of the input:

Function nodeSplitting inputs
return msg.payload.map(function(p) {
    return {payload: p};
});

The Modbus Read Node will be connecting to the left side of the function node.
Each of the inputs from the ED-549 will go into the split inputs, and out of the corresponding output, which is where we can display each of the inputs differently and separately:

ED Read Inputs flow

You can immediately test that you are getting a connection to the ED-549 at this point and that data is being displayed and returned correctly. Simply add a debug node to one of the function outputs (for AIn0, we will use the top most output) to see what value it returns:

ED Read Inputs test

After the flow has been deployed, Deploy button the user should immediately notice the active connection on the Modbus Read Node. When looking at the Debug tab Debug icon on the right, it will show the line value coming in on AIn0:

Modbus TCP Read NodeValue from Node-RED debugValue from ED-549 Web UI
ED Read Inputs activeValue from Node-RED debugED-549 value

In an ED-549 factory default configuration, with this Node-RED setup, 9.499 is equal to 9.499V on the AIn0 input.

Now add some UI nodes for each of the inputs, and configure them how you desire. These UI nodes will appear on your Node-RED dashboard for each of the Analog Inputs.

The examples have the Full Scale Range on the inputs configured to ±10V. That means that the UI nodes will also need to be configured to match this, and from the debug information above, it shows that the range should be between -10000 and 10000, for -10V to 10V:

Channel configuration

NodeConfiguration
Gauge nodeGauge configuration
Chart nodeChart configuration

Another good example would be the configuration used for one of the milliamp gauge and charts:

Milliamp Channel configuration

Further Milliamp Channel configuration

NodeConfiguration
Gauge nodeGauge Milliamp configuration
Chart nodeChart Milliamp configuration

All of these configuration settings can be changed to how you see fit. The colours can change depending on what range it is, or make the chart/gauge record across an hourly or daily basis. The choice is yours!:

ED Read Inputs flow

After you have completed everything and tied everything together, Deploy button it and test it out:

Input receiving data

When you have copied it across and created UI for each of your Analog Inputs, you’ll be able to see everything that is going on:

All inputs registering data

5. Full Flow

Show full flow example

[
    {
        "id": "14a1a272.213d1e",
        "type": "tab",
        "label": "[ED-Analog] Modbus",
        "disabled": true,
        "info": "# Modbus ExamplenThis flow gives you an example on how you can use Modbus in Node-RED, talking to a Brainboxes ED device from a BB-400.nnFor this flow to work:n* Your Brainboxes ED device needs to be configured to use the Modbus TCP protocol.n* The IP address for your Brainboxes ED device, needs to be configured inside each of the Modbus nodes found on this flow.nn# **Brainboxes Node-RED FAQ**nNeed more help or tutorials on using Node-RED? Go to: nhttps://www.brainboxes.com/faqs/search/Node-RED"
    },
    {
        "id": "d679e58.f1a9618",
        "type": "function",
        "z": "14a1a272.213d1e",
        "name": "Split Inputs",
        "func": "// Split the payload from an array of 8n// analog input values into 8 messages withn// a value and an IO numbernreturn msg.payload.map(function(ioValue, ioNumber) {n    ioValue=ioValue/1000n    return {payload: ioValue, topic: ioNumber};n});",
        "outputs": 8,
        "noerr": 0,
        "x": 350,
        "y": 320,
        "wires": [
            [
                "9b83d68f.cf96c8",
                "ebf90e0.f7cfdf"
            ],
            [
                "b66633bd.cdd2",
                "5b3c27bc.144ae8"
            ],
            [
                "f688dfb6.e3cfd",
                "7edebe57.3b68f"
            ],
            [
                "88343792.2dc368",
                "ecefc57.4a1fa38"
            ],
            [
                "db3217b7.2add48",
                "a33f73d.ca3169"
            ],
            [
                "2c38e77a.0c1e98",
                "46574b7f.95f124"
            ],
            [
                "22ba140a.3f746c",
                "81d84239.f8c86"
            ],
            [
                "220b0459.f1d5bc",
                "8c187e97.a20fe"
            ]
        ]
    },
    {
        "id": "2f11f8a2.756e28",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "2. Then make sure to DEPLOY this flow by clicking the button located in the top right",
        "info": "",
        "x": 310,
        "y": 60,
        "wires": []
    },
    {
        "id": "f327cd5d.30dc9",
        "type": "modbus-read",
        "z": "14a1a272.213d1e",
        "name": "ED Read Inputs",
        "topic": "",
        "showStatusActivities": false,
        "logIOActivities": false,
        "showErrors": false,
        "unitid": "",
        "dataType": "HoldingRegister",
        "adr": "0",
        "quantity": "8",
        "rate": "1000",
        "rateUnit": "ms",
        "delayOnStart": false,
        "startDelayTime": "",
        "server": "447f3ae2.d53104",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "x": 120,
        "y": 280,
        "wires": [
            [
                "d679e58.f1a9618",
                "499aea89.6c06d4"
            ],
            []
        ]
    },
    {
        "id": "9b83d68f.cf96c8",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn0",
        "group": "6838a81b.c3bbc8",
        "order": 1,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn0",
        "label": "V",
        "format": "{{value}}",
        "min": "-10",
        "max": "10",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "2",
        "seg2": "5",
        "x": 550,
        "y": 160,
        "wires": []
    },
    {
        "id": "b66633bd.cdd2",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn1",
        "group": "6838a81b.c3bbc8",
        "order": 2,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn1",
        "label": "mA",
        "format": "{{value}}",
        "min": "4",
        "max": "20",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "10",
        "seg2": "16",
        "x": 550,
        "y": 360,
        "wires": []
    },
    {
        "id": "f688dfb6.e3cfd",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn2",
        "group": "6838a81b.c3bbc8",
        "order": 3,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn2",
        "label": "V",
        "format": "{{value}}",
        "min": "-10",
        "max": "10",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "2",
        "seg2": "5",
        "x": 550,
        "y": 200,
        "wires": []
    },
    {
        "id": "88343792.2dc368",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn3",
        "group": "6838a81b.c3bbc8",
        "order": 4,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn3",
        "label": "mA",
        "format": "{{value}}",
        "min": "4",
        "max": "20",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "10",
        "seg2": "16",
        "x": 550,
        "y": 400,
        "wires": []
    },
    {
        "id": "ebf90e0.f7cfdf",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "dc5d43e0.5931",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn0",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "-10",
        "ymax": "10",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 163,
        "wires": [
            []
        ]
    },
    {
        "id": "5b3c27bc.144ae8",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "dc5d43e0.5931",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn1",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "4",
        "ymax": "20",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 363,
        "wires": [
            []
        ]
    },
    {
        "id": "7edebe57.3b68f",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "dc5d43e0.5931",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn2",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "-10",
        "ymax": "10",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 203,
        "wires": [
            []
        ]
    },
    {
        "id": "ecefc57.4a1fa38",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "dc5d43e0.5931",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn3",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "4",
        "ymax": "20",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 403,
        "wires": [
            []
        ]
    },
    {
        "id": "9a9773d5.737c4",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "3. Visit your dashboard! http://bb400-xxxx:1880/ui (where bb400-xxxx is your BB-400 hostname or IP address)",
        "info": "",
        "x": 390,
        "y": 800,
        "wires": []
    },
    {
        "id": "2c38e77a.0c1e98",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn5",
        "group": "20aa9b2a.7dab04",
        "order": 2,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn5",
        "label": "mA",
        "format": "{{value}}",
        "min": "4",
        "max": "20",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "10",
        "seg2": "16",
        "x": 550,
        "y": 440,
        "wires": []
    },
    {
        "id": "22ba140a.3f746c",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn6",
        "group": "20aa9b2a.7dab04",
        "order": 3,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn6",
        "label": "V",
        "format": "{{value}}",
        "min": "-10",
        "max": "10",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "2",
        "seg2": "5",
        "x": 550,
        "y": 280,
        "wires": []
    },
    {
        "id": "220b0459.f1d5bc",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn7",
        "group": "20aa9b2a.7dab04",
        "order": 4,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn7",
        "label": "mA",
        "format": "{{value}}",
        "min": "4",
        "max": "20",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "10",
        "seg2": "16",
        "x": 550,
        "y": 480,
        "wires": []
    },
    {
        "id": "db3217b7.2add48",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "a2c176bc.cade88",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn4",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "-10",
        "ymax": "10",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "46574b7f.95f124",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "a2c176bc.cade88",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn5",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "4",
        "ymax": "20",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 443,
        "wires": [
            []
        ]
    },
    {
        "id": "81d84239.f8c86",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "a2c176bc.cade88",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn6",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "-10",
        "ymax": "10",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 283,
        "wires": [
            []
        ]
    },
    {
        "id": "8c187e97.a20fe",
        "type": "ui_chart",
        "z": "14a1a272.213d1e",
        "name": "",
        "group": "a2c176bc.cade88",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "AIn7",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "4",
        "ymax": "20",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 670,
        "y": 483,
        "wires": [
            []
        ]
    },
    {
        "id": "499aea89.6c06d4",
        "type": "modbus-response",
        "z": "14a1a272.213d1e",
        "name": "",
        "registerShowMax": "8",
        "x": 170,
        "y": 380,
        "wires": []
    },
    {
        "id": "f2d8dc6e.c17c6",
        "type": "function",
        "z": "14a1a272.213d1e",
        "name": "Modbus Payload",
        "func": "msg.payload = { n    value: msg.payload, n    'fc': 6, n    'unitid': 255, n    'address': msg.topic, n    'quantity': 1 n} nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 850,
        "y": 600,
        "wires": [
            [
                "93c3d451.6fba78"
            ]
        ]
    },
    {
        "id": "93c3d451.6fba78",
        "type": "modbus-flex-write",
        "z": "14a1a272.213d1e",
        "name": "Set Output",
        "showStatusActivities": true,
        "showErrors": true,
        "server": "e0dfcc8.bcc183",
        "x": 870,
        "y": 640,
        "wires": [
            [],
            []
        ]
    },
    {
        "id": "704df223.3d476c",
        "type": "modbus-read",
        "z": "14a1a272.213d1e",
        "name": "ED Read Outputs",
        "topic": "",
        "showStatusActivities": false,
        "logIOActivities": false,
        "showErrors": false,
        "unitid": "",
        "dataType": "HoldingRegister",
        "adr": "0",
        "quantity": "4",
        "rate": "1000",
        "rateUnit": "ms",
        "delayOnStart": false,
        "startDelayTime": "",
        "server": "2d38213a.e96ace",
        "useIOFile": false,
        "ioFile": "",
        "useIOForPayload": false,
        "x": 120,
        "y": 580,
        "wires": [
            [
                "86f63f9e.d5e25"
            ],
            []
        ]
    },
    {
        "id": "a16d6e33.57ff8",
        "type": "ui_slider",
        "z": "14a1a272.213d1e",
        "name": "",
        "label": "AOut0",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 5,
        "width": 0,
        "height": 0,
        "passthru": true,
        "outs": "end",
        "topic": "0",
        "min": 0,
        "max": "10000",
        "step": "50",
        "x": 550,
        "y": 540,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "93c9a3f6.5d54a",
        "type": "ui_slider",
        "z": "14a1a272.213d1e",
        "name": "",
        "label": "AOut1",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 6,
        "width": 0,
        "height": 0,
        "passthru": true,
        "outs": "end",
        "topic": "1",
        "min": 0,
        "max": "10000",
        "step": "100",
        "x": 550,
        "y": 580,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "c98ef5f6.8ab388",
        "type": "ui_slider",
        "z": "14a1a272.213d1e",
        "name": "",
        "label": "AOut2",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 7,
        "width": 0,
        "height": 0,
        "passthru": true,
        "outs": "end",
        "topic": "2",
        "min": 0,
        "max": "10000",
        "step": "100",
        "x": 550,
        "y": 620,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "f0a00f55.de487",
        "type": "ui_slider",
        "z": "14a1a272.213d1e",
        "name": "",
        "label": "AOut3",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 8,
        "width": 0,
        "height": 0,
        "passthru": true,
        "outs": "end",
        "topic": "3",
        "min": 0,
        "max": "10000",
        "step": "100",
        "x": 550,
        "y": 660,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "86f63f9e.d5e25",
        "type": "function",
        "z": "14a1a272.213d1e",
        "name": "Split Outputs",
        "func": "return msg.payload.map(function(ioValue, ioNumber) {n    return {payload: ioValue, topic: ioNumber};n});",
        "outputs": 4,
        "noerr": 0,
        "x": 350,
        "y": 600,
        "wires": [
            [
                "a16d6e33.57ff8",
                "54554ea3.a62c4"
            ],
            [
                "93c9a3f6.5d54a",
                "818e6e99.e6d8c"
            ],
            [
                "c98ef5f6.8ab388",
                "3bf9da0c.610996"
            ],
            [
                "f0a00f55.de487",
                "27f0093b.e7d126"
            ]
        ]
    },
    {
        "id": "54554ea3.a62c4",
        "type": "ui_text_input",
        "z": "14a1a272.213d1e",
        "name": "AOut0",
        "label": "AOut0",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 16,
        "width": 0,
        "height": 0,
        "passthru": true,
        "mode": "text",
        "delay": "0",
        "topic": "0",
        "x": 670,
        "y": 540,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "818e6e99.e6d8c",
        "type": "ui_text_input",
        "z": "14a1a272.213d1e",
        "name": "AOut1",
        "label": "AOut1",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 16,
        "width": 0,
        "height": 0,
        "passthru": true,
        "mode": "text",
        "delay": "0",
        "topic": "1",
        "x": 670,
        "y": 580,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "3bf9da0c.610996",
        "type": "ui_text_input",
        "z": "14a1a272.213d1e",
        "name": "AOut2",
        "label": "AOut2",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 16,
        "width": 0,
        "height": 0,
        "passthru": true,
        "mode": "text",
        "delay": "0",
        "topic": "2",
        "x": 670,
        "y": 620,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "27f0093b.e7d126",
        "type": "ui_text_input",
        "z": "14a1a272.213d1e",
        "name": "AOut3",
        "label": "AOut3",
        "tooltip": "{{value}}",
        "group": "d7e21aab.3b8a28",
        "order": 16,
        "width": 0,
        "height": 0,
        "passthru": true,
        "mode": "text",
        "delay": "0",
        "topic": "3",
        "x": 670,
        "y": 660,
        "wires": [
            [
                "f2d8dc6e.c17c6"
            ]
        ]
    },
    {
        "id": "a33f73d.ca3169",
        "type": "ui_gauge",
        "z": "14a1a272.213d1e",
        "name": "AIn4",
        "group": "20aa9b2a.7dab04",
        "order": 1,
        "width": 0,
        "height": 0,
        "gtype": "donut",
        "title": "AIn4",
        "label": "V",
        "format": "{{value}}",
        "min": "-10",
        "max": "10",
        "colors": [
            "#00a800",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "2",
        "seg2": "5",
        "x": 550,
        "y": 237,
        "wires": []
    },
    {
        "id": "f561bd3c.32d82",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "milliAmps (4-20mA)",
        "info": "",
        "x": 590,
        "y": 320,
        "wires": []
    },
    {
        "id": "d5fd82d1.ed8bc",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "Voltage (±10V)",
        "info": "",
        "x": 580,
        "y": 120,
        "wires": []
    },
    {
        "id": "6472c7a0.8808d8",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "Brainboxes ED-549 8x Analog Inputs",
        "info": "[Brainboxes ED-549 8 Analogue Inputs](http://www.brainboxes.com/product/ed-549/ethernet-to-8-analogue-inputs-rs485-gateway)nn[Brainboxes ED-560 4 Analogue Outputs](http://www.brainboxes.com/product/ed-560/ethernet-to-4-analogue-outputs-rs485-gateway)n![image.png](http://www.brainboxes.com/files/catalog/product/ED/ED-549/img/analogue-range.jpg)",
        "x": 170,
        "y": 240,
        "wires": [],
        "icon": "font-awesome/fa-lightbulb-o"
    },
    {
        "id": "97235015.23152",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "Brainboxes ED-560 4x Analogue Outputs",
        "info": "[Brainboxes ED-560 4x Analogue Outputs](http://www.brainboxes.com/product/ed-549/ethernet-to-8-analogue-inputs-rs485-gateway)n",
        "x": 180,
        "y": 540,
        "wires": [],
        "icon": "font-awesome/fa-lightbulb-o"
    },
    {
        "id": "3e31efe4.c4f5e",
        "type": "ui_template",
        "z": "14a1a272.213d1e",
        "group": "d7e21aab.3b8a28",
        "name": "",
        "order": 2,
        "width": 0,
        "height": 0,
        "format": "",
        "storeOutMessages": false,
        "fwdInMessages": false,
        "templateScope": "local",
        "x": 100,
        "y": 20,
        "wires": [
            []
        ]
    },
    {
        "id": "f76734f4.d9dd28",
        "type": "comment",
        "z": "14a1a272.213d1e",
        "name": "1. Enable this flow by double clicking "[ED-Analogue] Modbus" above",
        "info": "",
        "x": 260,
        "y": 20,
        "wires": []
    },
    {
        "id": "447f3ae2.d53104",
        "type": "modbus-client",
        "z": "",
        "name": "Analogue Inputs",
        "clienttype": "tcp",
        "bufferCommands": true,
        "stateLogEnabled": false,
        "tcpHost": "192.168.127.254",
        "tcpPort": "502",
        "tcpType": "DEFAULT",
        "serialPort": "/dev/ttyUSB",
        "serialType": "RTU-BUFFERD",
        "serialBaudrate": "9600",
        "serialDatabits": "8",
        "serialStopbits": "1",
        "serialParity": "none",
        "serialConnectionDelay": "100",
        "unit_id": 255,
        "commandDelay": 1,
        "clientTimeout": 2000,
        "reconnectTimeout": 2000
    },
    {
        "id": "6838a81b.c3bbc8",
        "type": "ui_group",
        "z": "",
        "name": "Gauge (0-3)",
        "tab": "f17a1f08.c1195",
        "order": 2,
        "disp": false,
        "width": "5",
        "collapse": false
    },
    {
        "id": "dc5d43e0.5931",
        "type": "ui_group",
        "z": "",
        "name": "Chart (0-3)",
        "tab": "f17a1f08.c1195",
        "order": 3,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "20aa9b2a.7dab04",
        "type": "ui_group",
        "z": "",
        "name": "Gauge (4-7)",
        "tab": "f17a1f08.c1195",
        "order": 4,
        "disp": false,
        "width": "5",
        "collapse": false
    },
    {
        "id": "a2c176bc.cade88",
        "type": "ui_group",
        "z": "",
        "name": "Chart (4-7)",
        "tab": "f17a1f08.c1195",
        "order": 5,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "e0dfcc8.bcc183",
        "type": "modbus-client",
        "z": "",
        "name": "Digital Outputs",
        "clienttype": "tcp",
        "bufferCommands": true,
        "stateLogEnabled": false,
        "tcpHost": "192.168.127.254",
        "tcpPort": "502",
        "tcpType": "DEFAULT",
        "serialPort": "/dev/ttyUSB",
        "serialType": "RTU-BUFFERD",
        "serialBaudrate": "9600",
        "serialDatabits": "8",
        "serialStopbits": "1",
        "serialParity": "none",
        "serialConnectionDelay": "100",
        "unit_id": 1,
        "commandDelay": 1,
        "clientTimeout": 2000,
        "reconnectTimeout": 2000
    },
    {
        "id": "2d38213a.e96ace",
        "type": "modbus-client",
        "z": "",
        "name": "Analogue Outputs",
        "clienttype": "tcp",
        "bufferCommands": true,
        "stateLogEnabled": false,
        "tcpHost": "192.168.127.254",
        "tcpPort": "502",
        "tcpType": "DEFAULT",
        "serialPort": "/dev/ttyUSB",
        "serialType": "RTU-BUFFERD",
        "serialBaudrate": "9600",
        "serialDatabits": "8",
        "serialStopbits": "1",
        "serialParity": "none",
        "serialConnectionDelay": "100",
        "unit_id": 255,
        "commandDelay": 1,
        "clientTimeout": 2000,
        "reconnectTimeout": 2000
    },
    {
        "id": "d7e21aab.3b8a28",
        "type": "ui_group",
        "z": "",
        "name": "Sliders [&] Numbers",
        "tab": "f17a1f08.c1195",
        "order": 1,
        "disp": false,
        "width": "8",
        "collapse": false
    },
    {
        "id": "f17a1f08.c1195",
        "type": "ui_tab",
        "z": "",
        "name": "Modbus: Brainboxes ED-Analogue",
        "icon": "dashboard",
        "order": 5,
        "disabled": false,
        "hidden": false
    }
]

6. Modbus Registers & Value Encoding

ED-549 Registers

Modbus access typeModbus function codesLogical address984 style addressIEC 61131 address
Analogue inputs (as integer)Holding register30x0000 – 740001 – 8%MW0 – 7
Analogue inputs (as integer)Input register40x0000 – 730001 – 8N/A
Analogue inputs (as float)Holding register30x0020 – 740033 – 40%MF32 – 39
Analogue inputs (as float)Input register40x0020 – 730033 – 40N/A
Input error flagsDiscrete input20x0400 – 711025 – 1032N/A
Input error flagsInput register40x040031025N/A
Input error flagsHolding register30x040041025%MW1024
Input channel enableHolding register3, 6, 160x004040065%MW64
Input channel enableCoil1, 5, 150x0040 – 700065 – 72%M64 – 71
Input type/rangeHolding register3, 6, 160x0060 – 740097 – 104%MW96 – 103
Integer formatHolding register3, 6, 160x008040129%MW128
Integer formatCoil1, 5, 150x0080129%M128

Brainboxes Value Encoding

Integer values are encoded in one of two formats, depending on the integer format setting.

  • “Hexadecimal” (integer format register = 0, integer format coil OFF): the input range is scaled to fill the range of a 16-bit integer value, either as a 2’s complement number for ranges which extend to negative values, or as an unsigned number for ranges which do not go below zero.
  • “Engineering units” (integer format register = 1, integer format coil ON): the measurement, in mA, mV or V, is scaled up to as high a power of 10 as possible while allowing the full range of values to fit in a 16-bit integer. For example, the ±2.5V range is expressed as the reading in Volts multiplied by 10000: if it were multiplied by 100000 then some values would be too large to fit in a 16-bit register.

Floating-point values are encoded according to the IEEE 754 standard for 32-bit floating-point numbers. Each value takes two sequential 16-bit Modbus registers, with the least-significant bits of the 32-bit value being held in the lower register address (“little-endian” format). Both Modbus registers must be read in the same Modbus request. The units of the float values are Volts or milliAmps.

Under-range inputs result in a reading equal to the –Full Scale value, and over-range inputs result in a reading equal to the +Full Scale value. The type/range codes which can be set using Modbus, and the data ranges they result in, are tabulated below. The codes are the same as for the ASCII protocol.

Type CodeInput TypeData Format+ Full Scale– Full Scale
05±2.5VFloat engineering unit+2.5-2.5
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit25000-25000
06 or 0D±20mAFloat engineering unit+20.0-20.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit-2000020000
07+4 to +20mAFloat engineering unit+20.0+4.0
Integer hexadecimal0xFFFF = 655360x0000 = 0
Integer engineering unit400020000
08±10VFloat engineering unit+10.0-10.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit10000-10000
09±5VFloat engineering unit+5.0-5.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit5000-5000
04 or 0A±1VFloat engineering unit+1.0-1.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit10000-10000
03 or 0B±500mVFloat engineering unit+500.0-500.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit5000-5000
0C±150mVFloat engineering unit+150.0-150.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit15000-15000
1A0 to +20mAFloat engineering unit+20.0+0.0
Integer hexadecimal0xFFFF = 655360x0000 = 0
Integer engineering unit200000
3A±75mVFloat engineering unit+75.0-75.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit7500-7500
3B±250mVFloat engineering unit+250.0-250.0
Integer hexadecimal0x7FFF = 327670x8000 = -32768
Integer engineering unit25000-25000
FAQs