Modbus TCP collector examples
  • 07 Oct 2021
  • 5 Minutes to read
  • Contributors
  • Dark
    Light
  • PDF

Modbus TCP collector examples

  • Dark
    Light
  • PDF

Article Summary

The purpose of this article is to show some examples of MODBUS TCP collectors.

{
  "ConfigName": "Modbus",
  "ConfigDescription": "Example configuration for Modbus",
  "CheckpointInterval": 600,
  "Collectors": [
    {
      "CollectorName": "ModbusDevice",
      "CollectorDescription": "My first modbus",
      "Protocol": "ModBus/TCP",
      "ConnectRetryMin": 2,
      "ConnectRetryMax": 240,
      "ModbusAccess": {
        "ModbusFCs": [
          {
            "ModbusFCID": 1,
            "ModbusFCSlaveAddress": 1,
            "ModbusFC": "holding-registers",
            "ModbusFCStart": 0,
            "ModbusFCCount": 5,
            "ModbusFCSampleInterval": 2
          }
        ],
        "ModbusTimeout": 1000
      },
      "SamplePoints": [
        {
          "SampleName": "Value1",
          "SampleDescription": "Sample value1",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "SampleUnit": "RawNumber",
          "ModbusValue": {
            "FCREF": 1,
            "FCOffset": 0
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Value2",
          "SampleDescription": "Sample value2",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "SampleUnit": "RawNumber",
          "ModbusValue": {
            "FCREF": 1,
            "FCOffset": 1
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": false,
          "SampleLimitAlarm": false
        }
      ]
    }
  ],
  "DataServers": [
    {
      "ConnectRetryMax": 60,
      "ConnectRetryMin": 2,
      "DatasrvName": "DCC",
      "DatasrvProtocol": "SCI/SPD",
      "IOPin": false,
      "SCISPDParams": {
        "DevCertName": "DCC Certificate",
        "DevPkeyName": "DCC Private Key",
        "PushInterval": 1,
        "RootCAName": "DCC CA Certificate",
        "SCIServerAddr": "dcm-dcc.secomea.com",
        "SPDPort": 443,
        "Security": "TLS1.2"
      }
    }
  ]
}


And the collector part alone:

    {
      "CollectorName": "ModbusDevice",
      "CollectorDescription": "My first modbus",
      "Protocol": "ModBus/TCP",
      "ConnectRetryMin": 2,
      "ConnectRetryMax": 240,
      "ModbusAccess": {
        "ModbusFCs": [
          {
            "ModbusFCID": 1,
            "ModbusFCSlaveAddress": 1,
            "ModbusFC": "holding-registers",
            "ModbusFCStart": 0,
            "ModbusFCCount": 5,
            "ModbusFCSampleInterval": 2
          }
        ],
        "ModbusTimeout": 1000
      },
      "SamplePoints": [
        {
          "SampleName": "Value1",
          "SampleDescription": "Sample value1",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "SampleUnit": "RawNumber",
          "ModbusValue": {
            "FCREF": 1,
            "FCOffset": 0
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Value2",
          "SampleDescription": "Sample value2",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "SampleUnit": "RawNumber",
          "ModbusValue": {
            "FCREF": 1,
            "FCOffset": 1
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": false,
          "SampleLimitAlarm": false
        }
      ]
    }


A larger example prepared for sampling from the Coils and also Input addressing ranges. (But not used in any samplepoints) 

Samplepoints only have
"FCREF": 3 

That refers to ModBusFCID:3 which is configured for a Holding-registers address range. 

ModbusFCID 1 is configured for coils and ModbusFCID 2 is configured for input address range.  

{
  "ConfigName": "TVO53",
  "ConfigDescription": "Test configuration for Modbus > SDCC & C8Y and Event triggering",
  "CheckpointInterval": 600,
  "Collectors": [
    {
      "CollectorName": "Test1ModbusDevice",
      "CollectorDescription": "My first modbus",
      "Protocol": "ModBus/TCP",
      "ConnectRetryMin": 2,
      "ConnectRetryMax": 240,
      "ModbusAccess": {
        "ModbusFCs": [
          {
            "ModbusFCID": 1,
            "ModbusFCSlaveAddress": 1,
            "ModbusFC": "coils",
            "ModbusFCStart": 27,
            "ModbusFCCount": 64,
            "ModbusFCSampleInterval": 5
          },
          {
            "ModbusFCID": 2,
            "ModbusFCSlaveAddress": 1,
            "ModbusFC": "inputs",
            "ModbusFCStart": 3,
            "ModbusFCCount": 53,
            "ModbusFCSampleInterval": 3
          },
          {
            "ModbusFCID": 3,
            "ModbusFCSlaveAddress": 1,
            "ModbusFC": "holding-registers",
            "ModbusFCStart": 100,
            "ModbusFCCount": 33,
            "ModbusFCSampleInterval": 2
          }
        ],
        "ModbusTimeout": 1000
      },
      "SamplePoints": [
        {
          "SampleName": "Test1_REG108",
          "SampleDescription": "Temperature register",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "SampleUnit": "rawADC",
          "ModbusValue": {
            "FCREF": 3,
            "FCOffset": 8
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Test1_REG100",
          "SampleDescription": "2nd Temperature register",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "SampleUnit": "rawADC",
          "ModbusValue": {
            "FCREF": 3,
            "FCOffset": 0
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Test1_REG107",
          "SampleDescription": "1st switch",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "ModbusValue": {
            "FCREF": 3,
            "FCOffset": 7
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Test1_REG114",
          "SampleDescription": "2nd switch",
          "SamplesSaved": 100,
          "SampleDataType": "int16",
          "ModbusValue": {
            "FCREF": 3,
            "FCOffset": 14
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 1000,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Test1_REG125",
          "SampleDescription": "Register 9 setting",
          "SamplesSaved": 100,
          "OnlySaveOnChanged": true,
          "SampleDataType": "sbyte",
          "ModbusValue": {
            "FCREF": 3,
            "FCOffset": 25
          },
          "SampleLowerLimit": 0,
          "SampleUpperLimit": 8,
          "SampleLimitDiscard": true,
          "SampleLimitAlarm": true
        },
        {
          "SampleName": "Test1_REG108_DIV",
          "SampleDescription": "Register 9 value divided by 100",
          "SamplesSaved": 100,
          "SampleDataType": "double",
          "SampleUnit": "Volt DC",
          "Aggregation": {
            "Function": "compute",
            "Expression": "Test1_REG108, 100, /",
            "TriggerSample": "Test1_REG108"
          }
        },
        {
          "SampleName": "Test1_REG100_DIV",
          "SampleDescription": "Register 1 value divided by 100",
          "SamplesSaved": 100,
          "SampleDataType": "double",
          "SampleUnit": "Volt DC",
          "Aggregation": {
            "Function": "compute",
            "Expression": "Test1_REG100, 100, /",
            "TriggerSample": "Test1_REG100"
          }
        }
      ]
    }
  ],
  "DataServers": [
    {
      "DatasrvName": "secomea_c8y",
      "DatasrvProtocol": "C8Y/REST",
      "ConnectRetryMin": 2,
      "ConnectRetryMax": 10,
      "C8YParams": {
        "C8YRegisterURL": "https://SecomeaPresales.cumulocity.com",
        "RegName": "c8yreg",
        "C8YRootCAName": "cumulocityROOTCA",
        "PushInterval": 5
      }
    },
    {
   "ConnectRetryMax": 60,
   "ConnectRetryMin": 2,
   "DatasrvName": "DCC",
   "DatasrvProtocol": "SCI/SPD",
   "IOPin": true,
   "SCISPDParams": {
      "DevCertName": "DCC Certificate",
        "DevPkeyName": "DCC Private Key",
        "PushInterval": 1,
        "RootCAName": "DCC CA Certificate",
        "SCIServerAddr": "dcm-dcc.secomea.com",
        "SPDPort": 443,
        "Security": "TLS1.2"
    }
   }
  ]
}


  • An example config with 2 collectors 
    • Simulated data
    • Modbus incl event computer aggregation (event-based logging)
{
  "ConfigDescription": "Test configuration for Modbus > SDCC & C8Y and Event triggering",
  "ConfigName": "TVO53",
  "CheckpointInterval": 600,
  "Collectors": [
    {
      "CollectorName": "SINEsim",
      "CollectorDescription": "DCM Internal Simulation Server",
      "Protocol": "Simulator",
      "SamplePoints": [
        {
          "SampleName": "sine",
          "SampleDescription": "DCM simulation of sine curve",
          "SamplesSaved": 300,
          "SampleDataType": "double",
          "SimulatorData": {
            "SimulatorFunction": "sine",
            "SimulatorInitValue": 1000,
            "SimulatorIncValue": 100,
            "SimulatorSampleInterval": 0
          }
        }
      ]
    },
    {
      "CollectorDescription": "My first modbus",
      "CollectorName": "S6116",
      "ConnectRetryMax": 240,
      "ConnectRetryMin": 2,
      "ModbusAccess": {
        "ModbusFCs": [
          {
            "ModbusFC": "holding-registers",
            "ModbusFCCount": 8,
            "ModbusFCID": 3,
            "ModbusFCSampleInterval": 0,
            "ModbusFCSlaveAddress": 1,
            "ModbusFCStart": 100
          },
          {
            "ModbusFC": "holding-registers",
            "ModbusFCCount": 3,
            "ModbusFCID": 2,
            "ModbusFCSampleInterval": 10,
            "ModbusFCSlaveAddress": 1,
            "ModbusFCStart": 108
          }
        ],
        "ModbusTimeout": 5000
      },
      "Protocol": "ModBus/TCP",
      "SamplePoints": [
        {
          "ModbusValue": {
            "FCOffset": 0,
            "FCREF": 2
          },
          "SampleDataType": "int16",
          "SampleDescription": "1st Switch",
          "SampleLimitAlarm": true,
          "SampleLimitDiscard": true,
          "SampleLowerLimit": 0,
          "SampleName": "EventTrigger",
          "SampleUpperLimit": 1000,
          "SamplesSaved": 10
        },
        {
          "ModbusValue": {
            "FCOffset": 1,
            "FCREF": 2
          },
          "SampleDataType": "int16",
          "SampleDescription": "2nd Switch",
          "SampleLimitAlarm": true,
          "SampleLimitDiscard": true,
          "SampleLowerLimit": 0,
          "SampleName": "SinusTrigger",
          "SampleUpperLimit": 1000,
          "SamplesSaved": 100
        },
        {
          "ModbusValue": {
            "FCOffset": 0,
            "FCREF": 3
          },
          "SampleDataType": "int16",
          "SampleDescription": "B1",
          "SampleLimitAlarm": true,
          "SampleLimitDiscard": true,
          "SampleName": "Temperatur1",
          "SamplesSaved": 100
        },
        {
          "ModbusValue": {
            "FCOffset": 1,
            "FCREF": 3
          },
          "SampleDataType": "int16",
          "SampleDescription": "B2",
          "SampleLimitAlarm": true,
          "SampleLimitDiscard": true,
          "SampleName": "Temperatur2",
          "SamplesSaved": 100
        },
        {
          "ModbusValue": {
            "FCOffset": 2,
            "FCREF": 3
          },
          "SampleDataType": "int16",
          "SampleDescription": "B3",
          "SampleLimitAlarm": true,
          "SampleLimitDiscard": true,
          "SampleName": "Load1",
          "SamplesSaved": 100
        },
        {
          "ModbusValue": {
            "FCOffset": 3,
            "FCREF": 3
          },
          "SampleDataType": "int16",
          "SampleDescription": "B4",
          "SampleLimitAlarm": true,
          "SampleLimitDiscard": true,
          "SampleName": "Load2",
          "SamplesSaved": 100
        },
        {
          "SampleName": "EventValue",
          "SampleDescription": "Event Value computation: When EventTrigger > 500, sample Temp + Load",
          "SamplesSaved": 0,
          "SampleDataType": "double",
          "Aggregation": {
            "Function": "eventcompute",
            "Expression": "EventTrigger,500,>",
            "Values": [
              "Temperatur1",
              "Temperatur1",
              "Load1",
              "Load2"
            ],
            "TriggerSample": "EventTrigger",
            "TriggerNewInterval": 2
          }
        },
        {
          "SampleName": "SinusEvent",
          "SampleDescription": "Event Value computation: When SinusTrigger > 500, sample SimSine",
          "SamplesSaved": 0,
          "SampleDataType": "double",
          "Aggregation": {
            "Function": "eventcompute",
            "Expression": "SinusTrigger,500,>",
            "Values": [
              "SINEsim:sine"
            ],
            "TriggerSample": "SinusTrigger",
            "TriggerNewInterval": 1
          }
        }
      ]
    }
  ],
  "DataServers": [
    {
      "C8YParams": {
        "C8YRegisterURL": "https://secomeard.cumulocity.com",
        "C8YRootCAName": "cumulocityROOTCA",
        "PushInterval": 12,
        "RegName": "c8yreg"
      },
      "ConnectRetryMax": 10,
      "ConnectRetryMin": 2,
      "DatasrvName": "secomea_c8y",
      "DatasrvProtocol": "C8Y/REST"
    },
    {
    "ConnectRetryMax": 60,
    "ConnectRetryMin": 2,
    "DatasrvName": "DCC",
    "DatasrvProtocol": "SCI/SPD",
    "IOPin": true,
    "SCISPDParams": {
      "DevCertName": "DCC Certificate",
        "DevPkeyName": "DCC Private Key",
        "PushInterval": 1,
        "RootCAName": "DCC CA Certificate",
        "SCIServerAddr": "dcm-dcc.secomea.com",
        "SPDPort": 443,
        "Security": "TLS1.2"
     }
   }
  ]
}







 


Was this article helpful?