Siemens S7 PLC Plugin


This is a plugin to read data from a Siemens S7 PLC.


You run a log to send data to the cloud, or a discover to only display information. There must be a config file when running log or a discover. The config file defines which variables need to be collected, what names they appear on the the Ardexa cloud, units and scaling, what table(s) they variables will be sent to, and the source name(s). Example config file as follows. Always verify data accuracy by running a discover first, before committing the plugin to collect data.

    # Table,    Source Name,    Variable Name,      Memory Area,   Block Number,   Memory Address,  Type,       Units,  Scale,  Invalidate,    Lookup Table/Num Bytes
    solar,      hec,            AC Voltage 1,       DB,             1,             MW23,            dec,        V,      1+10,     , 
    solar,      hec,            Grid Freq,          DB,             1,             freal9,          dec,        Hz,     0.01,     , 
    solar,      hec,            Cos Phi,            DB,             1,             freal7,          dec,        .,      100,      , 
    solar,      hec,            PT100 Temperature,  DB,             1,             freal6,          dec,        C,      1,        , 
    solar,      hec,            Total Hours,        DB,             3,             freal3,          dec,        h,      0.1,      , 
    solar,      hec,            Total Hours 4,      DB,             3,             dd45,            dec,        h,      0.1,      , 
    solar,      hec,            DC Current 1,       DB,             3,             freal5,          dec,        A,      1,        , 
    solar,      hec,            HDG Setpoint Mode,  DB,             6,             MX0.0,           bitb,       bool,   1,        ,             1
    solar,      hec,            Run Auto,           DB,             6,             MX0.1,           bitb,       bool,   1,        ,             2
    solar,      hec,            Run Manual,         DB,             6,             MX0.2,           bitb_int,   bool,   1,        ,             3
    solar,      hec,            Key Switch,         DB,             6,             EW33,            str,        ,       1,        ,             mode.dict
    solar,      hec,            Key Switch2,        DB,             9,             EW34,            str_rep,    ,       1,        ,             mode.dict
    solar,      hec,            Program Name,       DB,             9,             DW3467,          dec,        ,       1,        ,             20
    solar,      pid_box,        PV- Voltage,        DB,             9,             EW35,            int,        V,      1,        , 
    solar,      pid_box,        PV- Current,        DB,             9,             EW63,            int,        mA,     1,        ,
    solar,      alarm,          Alarm 0 Keyword,    DB,             9,             MX6.3,           bit,        ,       1,        ,             container_alarm0.dict
    solar,      alarm,          Alarm 1 Keyword,    DB,             9,             MX7.4,           bit,        ,       1,        ,             container_alarm1.dict
    solar,      alarm,          Alarm 2 Keyword,    DB,             9,             MX8.5,           bit,        ,       1,        ,             container_alarm2.dict
    solar,      alarm,          Alarm 3 Keyword,    DB,             9,             MX9.6,           bit,        ,       1,        ,             container_alarm3.dict
    solar,      alarm,          Alarm 1,            DB,             9,             MX1.0,           bool,       ,       1,        ,
    solar,      alarm,          Alarm 2,            DB,             9,             MX2.0,           bool,       ,       1,        , 
    solar,      alarm,          Alarm 3,            DB,             9,             MX3.0,           bool,       ,       1,        ,
    solar,      alarm,          Alarm 4,            DB,             9,             MX4.0,           int_bool,   ,       1,        ,
    solar,      hec,            Total Current,      DB,             10,            MW888,           dec,        h,      0.1,    >100000,
    solar,      status,         Binary Status Raw,  DB,             10,            MX0.1,           bin,        ,       1,        ,


  • Anything that starts with # is a comment line, and will be ignored

  • The Memory Area is sometimes referred to as the "block". Valid values can be things like OB, DB, SDB, FC, SFC, FB, SFB. However, they can also be customised implementations.

  • In Block Number, this is an integer value, usually in the range [0...127]. Check with the PLC project manager.

  • Memory Address MUST be formatted as follows:

    • Boolean values: eg; MX13.1. The value M is ignored, but the X denotes a bit wise mapping. 13 is the memory location, and .1 is bit 1.

    • Integer values: eg; MW2. The value M is ignored, but the W denotes a WORD (2 byte) entry, or b denotes a byte. 2 is the memory location, in this case.

    • Real (decimal) values: eg; freal334. The value freal is used to denote a real (4 bytes value). 334 is the memory location, in this case.

    • DWORD: The use of dd (where the second letter is a d indicates a double word. In these cases, the result may be interpreted as a floating point number or an integer. - To interpret the result as a floating point number, use the --use_float_dword argument discussed below. Otherwise the result will be treated as an integer.

  • Scale will only be used for decimal and integer types. An error will be reported if you try and divide an integer, or multiply by anything other than a whole number. The scale can also be a value such as 0.75-9, where the -9 is a BIAS value (addition or subtraction). In which case it will FIRST subtract the 9, THEN multiply by 0.75. If using a bias value, then it can ONLY be used with a decimal type.

  • Invalidate. This column will only do the following task": If an entry starts with >, it will invalidate ALL entries in a configuration file, if the value for this entry is greater than the specified amount. For example; if the Invalidate column entry is >10000, then a value of 12,000 will ensure ALL readings in the configuration file are invalidated. Use this item with caution. Also, it will ONLY work on dec values. This invalidation feature is intended for those machines that have poor quality control, and sometimes transmit wildly wrong values.

  • in Lookup Table; Sometimes you want to convert an INT to a keyword, through a lookup table. Or you may want to get a register bit and convert it to a keyword, or the string length. See examples below.

  • Allowable Type column values are as follows:

    • dec ... Converts the S7 location to a decimal. Can be scaled (including division).

    • int ... Converts the S7 location to an integer. Can only be scaled upwards (not divided). So a scale value that is not a whole number will be rejected. See also the explanation for scale above, since it can include a bias and scale factor.

    • bool ... S7 location is converted to an INT. This value is then check as follows: Anything other than 0 will output a True. Else, output will be False.

    • int_bool ... S7 location is converted to an INT. This value is then check as follows: Anything other than 0 will output a 1. Else, output will be 0.

    • bin ... Converts the S7 location to an integer, then to a binary representation.

    • bit ... Used with a lookup table (in the Lookup Table column) to define a bit being turned or off. See example contents of file below. Bits start at "1" (not "0"), and are defined in the Lookup Table column.

    • bitb ... If a bit in the S7 location is turned on/off, it will reflect a boolean ("True"/"False") output.

    • bitb_int ... If a bit in the S7 location is turned on/off, it will reflect a boolean ("1"/"0") output.

    • str ... Treated as an ASCII character. If it can't be converted, it will output an empty field

    • str_rep ... Same as str, but it will clear \0 values in the resultant string.

    • str_raw ... Treated as raw characters without ANY conversion. Note the INTEGER in the example above specifies the LENGTH of the string to the PLC


  • ip_address This is the IP Address of the S7 PLC. Make sure that Port 102 is open.

  • config_path. This is the config file location

  • --attempts Is the number of attempts to make to get data from the PLC. The default=2

  • --rack and --slot values are both integers. They default to rack=0 and slot=1. The Rack (0..7) and Slot (1..31) can be found in the hardware configuration of the project. There is however some special cases for which those values ​​are fixed or can work with a defaults, as shown:

    S7 TYPE     RACK        SLOT        Comments
    S7 300 CPU  0           2           Always
    S7 400 CPU  ....Not fixed...        Follow the hardware configuration.
    Win AC CPU  ....Not fixed...        Follow the hardware configuration.
    S7 1200 CPU 0           0           Or 0, 1
    S7 1500 CPU 0           0           Or 0, 1
    WinAC IE    0           0           Or follow Hardware configuration.
  • --use_float_dword Use this flag to treat a DWORD as a floating point number. Otherwise it will be treated as an integer.

Write Arguments

This plugin can be used to write to an S7 PLC. Only a single value can be written at any one time. A log record is written anytime a memory location is written. This log record is written to the S7_write table, and is available in SEARCHES on the Ardexa front end. The command is s7_ardexa set_command {arguments}. The arguments for the write capability include, in order:

  • The IP address if the IP Address of the S7 PLC

  • The area (eg; DB)

  • The block (eg; 99)

  • The memory address (eg; MW916)

  • The --rack and --slot values are both optional integers. See the above Read Arguments

For example: s7_ardexa set_command db 2 MW876 1193

Example of "bit" lookup

Bit starts at 1. Include a 0 value to display something (or blank) if no bits are turned on

0 : 
1 : leakage sensor#1
2 : AC surge protection device
3 : key-operated switch
4 : scram button
5 : switcher signal from UC PCB Control Board
6 : leakage sensor#2
7 : leakage sensor#4
8 : leakage sensor#3
9 : signal 8 abnormal 
10 : energy-saving contractor KM1 return signal
11 : bad leakage sensor #2
12 : bad leakage sensor #1
13 : bad leakage sensor #4
14 : bad leakage sensor #2
15 : signal 4 abnormal
16 : signal 4 abnormal

Example of "str" lookup file

Numbers can be anything, since they are read from a single modbus (16 bit) register

-1 : 
51 : Closed
267 : Inverter
276 : Instantaneous value
295 : MPP
303 : Off
308 : On
309 : Operation
311 : Open
336 : Contact the manufacturer
337 : Contact the installer
338 : Invalid
381 : Stop
455 : Warning
569 : Activated
1041 : Leading

Last updated