Senvion Plugin with Config Files

This plugin will read from the Senvion IEC 61850 Server, and send the data to the Ardexa cloud. It can be used to discover data, and also log data to the local device, and send it to the Ardexa cloud. This plugin works by using configuration files to control the names of variables, tables and sources.

Configuration of the Ardexa Edge Device

Ensure you have read a copy of the manufacturer's operating and safety manual. Please review the manual for safety instructions. Ardexa uses the IEC 61850 server to read live and historical data. The IEC 61850 Server is read via a the Ardexa IEC 61850 plugin. The IEC data is available from a default TCP Port 102 on the IP address for which the IEC Server is located. Ardexa needs to know the IP address of the IEC server for every WEC (Wind Turbine) and PMU (Grid Station), as below. Once the Ardexa edge device is installed on the plant's network, verify that it can "ping" every IEC Server using the following command in the REMOTE SHELL (replace the IP address with the IP address of your IEC Server):

ping -c 1 192.168.1.2

Also, check that the TCP Port for IEC Server is open for every WEC and PMU. You can do this using the REMOTE SHELL, using the nmap command as follows.

nmap -sS -p 102 192.168.1.2

Please don't forget to send to Ardexa:

  1. Clear photographs of the installation

  2. The IP address for every IEC Server on each WEC and PMU. That is; an IP address for every grid station and wind turbine.

  3. The userid of the IEC Server

  4. The password of the IEC Server. Please note that multiple logins with the same user name is not possible.

  5. The quantity and model numbers of all wind turbines at the park

Data Discovery

The plugin can be used to discover data, in particular:

  1. All the devices, nodes and datasets on the IEC Server. devices, nodes and datasets are the way data is organised in IEC servers.

  2. All the fields within those datasets, and/or

  3. A sample of the data within those fields

The following sections detail how to undertake data discovery.

Discovering Datasets

A IEC 61850 Server hosts data in a Senvion wind turbine. Data is organised in device(s), node(s) and dataset(s). A number of fields are then hosted within a dataset. The IEC Server does not have tables per se, but to remain consistent with the other wind plugins, we have made tables = datasets, for this plugin. This hierarchy is shown below.

Device
     └── Node
       └── Dataset1
         └── Field 1
         └── Field 2

       └── Dataset2
         └── Field 1
         └── Field 2
          ...etc ....

In order to list all the dataset names, the following command can be executed either on the REMOTE SHELL, or the via the plugin RUN DISCOVERY function. To run a discovery via the plugin's RUN DISCOVERY function, do the following:

  1. Ensure the {CONFIG_FILE} has the correct credentials to connect to the server. This {CONFIG_FILE} must be formatted as follows:

ip_address: 10.64.16.20
user: iec.smith
passwd: MyPassword
  • IP Address This is the IP address of the IEC server (Mandatory) ..something like: 192.168.1.2

  • The user is the username supplied by the Senvion manager, as is the password. Please note that multiple logins with the same user name is not possible.

  1. Ensure the Output config file is set to show_tables. The SHOW_TABLES_FILE file is an empty file that ends with show_tables (with this exact name - path does not matter). The IEC Server does not have tables per se, but to remain consistent with the other wind plugins, we have made tables = datasets, for this plugin.

  2. Select RUN DISCOVERY.

This will then show a list of datasets, which should look like this:

For device:  IECDeviceControlMe
Node: LLN0
   IEC Datasets:
      ActValues
      DP
      HistValues
      StatValues
Node: WALM1
   IEC Datasets:
      Events

The equivalent REMOTE SHELL command to view all the database tables is:senvion_iec61850_ardexa discover data {CONFIG_FILE} {SHOW_TABLES_FILE}. The CONFIG_FILE is the location of the file containing the credentials. The SHOW_TABLES_FILE file is an empty file that ends with show_tables (with this exact name - path does not matter)

Discovering Fields

In order to list all the field names within a dataset, the following command can be executed either on the REMOTE SHELL, or the via the plugin RUN DISCOVERY function. To run a discovery via the plugin's RUN DISCOVERY function, do the following:

  1. Ensure the {CONFIG_FILE} has the correct credentials to connect to the server.

  2. Ensure the {SHOW_DATASET_FIELDS} file is an empty file that ends with show_fields (with this exact name - path does not matter).

  3. Ensure you complete the variables; --device, --node and --dataset. These must be completed, and the values can be obtained from the output of Discovering Datasets discussed above.

  4. Select RUN DISCOVERY

The output of this command will show all the fields in the specified database table, along with a sample of the rows in the table. For some of the tables, the fields will also details the name and units of the fields. This will be something like:

Sample of the Events IEC Dataset on Device: IECDeviceControlMe and Node: WALM1. Source: WEA 11-123456

  stVal  stVal_str             comego  comego_str      idx  idx_str    Timestamp
-------  ------------------  --------  ------------  -----  ---------  -------------------------
      0  Initialization             0  come              0  first      2024-10-04 21:00:00+00:00
    220  Unknown                    1  go                1  follow     2024-10-04 21:00:00+00:00
      0  Initialization             1  go                1  follow     2024-10-04 05:00:01+00:00
    220  Unknown                    0  come              0  first      2024-10-04 05:00:01+00:00
      0  Initialization             0  come              0  first      2024-10-03 21:00:00+00:00
    220  Unknown                    1  go                1  follow     2024-10-03 21:00:00+00:00
      0  Initialization             1  go                1  follow     2024-10-03 05:00:01+00:00
    220  Unknown                    0  come              0  first      2024-10-03 05:00:01+00:00
      0  Initialization             0  come              0  first      2024-10-02 21:00:00+00:00
    220  Unknown                    1  go                1  follow     2024-10-02 21:00:00+00:00
    210  Mains operation            2  state             2  state      2024-10-02 13:48:23+00:00
    200  Mains run-up               2  state             2  state      2024-10-02 13:47:53+00:00
    190  Mains connection           2  state             2  state      2024-10-02 13:47:52+00:00
    180  Run-up                     2  state             2  state      2024-10-02 13:45:42+00:00
    130  Automatic start-up         2  state             2  state      2024-10-02 13:45:01+00:00
      0  Initialization             1  go                1  follow     2024-10-02 13:45:01+00:00
   9210  Unknown                    0  come              0  first      2024-10-02 13:45:01+00:00
     60  Brake program 52           2  state             2  state      2024-10-02 11:00:00+00:00
      0  Initialization             0  come              0  first      2024-10-02 11:00:00+00:00
   9210  Unknown                    1  go                1  follow     2024-10-02 11:00:00+00:00
    210  Mains operation            2  state             2  state      2024-10-02 10:37:43+00:00
    200  Mains run-up               2  state             2  state      2024-10-02 10:37:13+00:00

Here is another example from the ActValues dataset:

Sample of the ActValues IEC Dataset on Device: IECDeviceControlMe and Node: LLN0. Source: WEA 11-123456

Name                 Value                        Quality  Timestamp                  Units      Multiplier
-------------------  -------------------------  ---------  -------------------------  -------  ------------
WTUR1.W              2868.37451171875                   0  2024-10-05 03:24:03+00:00  kW                  1
WTUR1.VAr            22.470943450927734                 0  2024-10-05 03:24:03+00:00  kvar                1
WTUR1.VA             2868.3828125                       0  2024-10-05 03:24:03+00:00  kVA                 1
WTUR1.TotWh          45728500.0                         0  2024-10-05 03:24:02+00:00  kWh                 1
WTUR1.TotVArh        5311372.0                          0  2024-10-05 03:22:32+00:00  kvarh               1
WTUR1.DmdWh          342584.0                           0  2024-10-03 11:14:47+00:00  kWh                 1
WTUR1.DmdVArh        4756185.0                          0  2024-10-04 21:50:25+00:00  kvarh               1
WTUR1.TurSt          Normal operation                   0  2024-10-02 13:48:23+00:00                      1
WROT1.RotSpd         0.16960002481937408                0  2024-10-05 03:24:03+00:00  rots/s              1
WROT1.HubTmp         15.0                               0  2024-10-05 03:24:03+00:00  °C                  1
WROT1.PtAngValBl1    9.5                                0  2024-10-05 03:24:03+00:00  °                   1
WROT1.PtAngValBl2    9.5                                0  2024-10-05 03:24:03+00:00  °                   1
WROT1.PtAngValBl3    9.5                                0  2024-10-05 03:24:03+00:00  °                   1
WROT1.RotBrgTmp      24.600000381469727                 0  2024-10-05 03:24:03+00:00  °C                  1
WTRM1.TrmTmpShfBrg1  63.349998474121094                 0  2024-10-05 03:24:03+00:00  °C                  1
WTRM1.TrmTmpShfBrg2  71.44999694824219                  0  2024-10-05 03:24:03+00:00  °C                  1
WTRM1.TrmTmpGbxOil   56.599998474121094                 0  2024-10-05 03:24:03+00:00  °C                  1
WTRM1.GbxSpd         20.472349166870117                 0  2024-10-05 03:24:03+00:00  rots/s              1
WGEN1.Spd            20.47117042541504                  0  2024-10-05 03:24:03+00:00  rots/s              1
WGEN1.GnTmpSta       115.3499984741211                  0  2024-10-05 03:24:03+00:00  °C                  1

The equivalent REMOTE SHELL command to view all the database tables is:senvion_iec61850_ardexa discover fields {CONFIG_FILE} {SHOW_DATASET_FIELDS} --device {DEVICE} --node {NODE} --dataset {DATASET}. The CONFIG_FILE is the location of the file containing the credentials. The TABLE_NAME is an empty file that ends with show_tables (with this exact name - path does not matter). Ensure you complete the variables; --device, --node and --dataset. These must be completed, and the values can be obtained from the output of Discovering Datasets discussed above. For example: senvion_iec61850_ardexa discover fields /opt/ardexa/config/senvion-iec61850-ardexa/testonly.config_file --device IECDeviceControlMe --node LLN0 --dataset ActValues

Discovering Data Using Custom Mapping File

The primary purpose of a configuration file driven plugin is to provide as much flexibility as possible when defining what to capture and what to call each field. This plugin is able to read a mapping file to undertaken one or more of the following tasks:

  1. Only collecting required variables and ignoring anything else.

  2. Renaming all or selected variables to something else.

  3. Scaling variables.

  4. Changing units.

  5. Sending data to customised tables and sources in the Ardexa cloud.

The mapping file is a comma separated file containing 11 items as follows:

  1. Ardexa Table. This is the name of the Ardexa table, where the data will be copied.

  2. Ardexa Source. This is the Ardexa source name given to the data. Note that Senvion IEC servers have 1 source per IP address. So there is no need to include the "native source name"

  3. Ardexa Variable Name. This is the name given to the variable as it will appear in the Ardexa cloud.

  4. IEC Device. This is the device that needs to be queried to get the variable. This name IS case sensitive. See the output from Discovering Fields

  5. IEC Node. This is the node that needs to be queried to get the variable. This name IS case sensitive. See the output from Discovering Fields

  6. IEC Dataset. This is the dataset that needs to be queried to get the variable. This name IS case sensitive. See the output from Discovering Fields

  7. IEC Source. This is the source name in the IEC server. Bear in mind there is 1 source per IP address in a Senvion server. Use the discover fields item discussed previously to find the name. This name is not case sensitive.

  8. IEC Field Name. The name of the required variable in the GE table. Use the discover fields item discussed previously to find the name. This name is not case sensitive.

  9. Type. The Ardexa variable type. Can be one of decimal, int, keyword or date

  10. Units. The units if the variable. May be empty.

  11. Scale. The scale of the variable. May be empty

Here is an example of a mapping file:

# Ardexa Table[0],  Ardexa Source [1],  Ardexa Variable Name [2],   IEC Device [3],         IEC Node [4],   IEC Dataset [5],        IEC Source [6],     IEC Field Name [7],     Type [8],   Units [9],  Scale [10]
senvion_test,       turbine1,           WTUR1_W_avg,                IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.W,                decimal,    W,          1000
senvion_test,       turbine1,           WTUR1_VAr_avg,              IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.VAr,              decimal,    var,        1000
senvion_test,       turbine1,           WTUR1_VA_avg,               IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.VA,               decimal,    VA,         1000
senvion_test,       turbine1,           WTUR1_TotWh_avg,            IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.TotWh,            decimal,    Wh,         1000
senvion_test,       turbine1,           WTUR1_TurSt,                IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.TurSt,            keyword,     ,          1
senvion_test,       turbine1,           WROT1_PtAngValBl1_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.PtAngValBl1,      decimal,    °,          1
senvion_test,       turbine1,           WROT1_PtAngValBl2_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.PtAngValBl2,      decimal,    °,          1
senvion_test,       turbine1,           WROT1_PtAngValBl3_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.PtAngValBl3,      decimal,    °,          1
senvion_test,       turbine1,           WROT1_RotSpd_avg,           IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.RotSpd,           decimal,    rots/s,     1      
senvion_test,       turbine1,           WROT1_HubTmp_avg,           IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.HubTmp,           decimal,    °C,         1      
senvion_test,       turbine1,           WROT1_RotBrgTmp_avg,        IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.RotBrgTmp,        decimal,    °C,         1      
senvion_test,       turbine1,           WTRM1_TrmTmpShfBrg1_avg,    IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTRM1.TrmTmpShfBrg1,    decimal,    °C,         1      
senvion_test,       turbine1,           WTRM1_TrmTmpShfBrg2_avg,    IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTRM1.TrmTmpShfBrg2,    decimal,    °C,         1      
senvion_test,       turbine1,           WTRM1_TrmTmpGbxOil_avg,     IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTRM1.TrmTmpGbxOil,     decimal,    °C,         1        

Note:

  1. Anything starting with # is a comment and can be ignored.

  2. If timestamp need to be included, then use either timestamp.

The above mapping file will produce the following output:

  Table                                senvion_test    
  Source                               turbine1        
  WTUR1_W_avg(decimal:W)               1.42689e+06     
  WTUR1_VAr_avg(decimal:var)           14676.7         
  WTUR1_VA_avg(decimal:VA)             1.4269e+06      
  WTUR1_TotWh_avg(decimal:Wh)          4.57615e+10     
  WTUR1_TurSt(keyword)                 Normal operation
  WROT1_PtAngValBl1_avg(decimal:°)     0.49            
  WROT1_PtAngValBl2_avg(decimal:°)     0.49            
  WROT1_PtAngValBl3_avg(decimal:°)     0.5             
  WROT1_RotSpd_avg(decimal:rots/s)     0.168333        
  WROT1_HubTmp_avg(decimal:°C)         19              
  WROT1_RotBrgTmp_avg(decimal:°C)      27.7            
  WTRM1_TrmTmpShfBrg1_avg(decimal:°C)  63.25           
  WTRM1_TrmTmpShfBrg2_avg(decimal:°C)  69.25           
  WTRM1_TrmTmpGbxOil_avg(decimal:°C)   55.8            

The equivalent REMOTE SHELL command to view all the database tables is:senvion_iec61850_ardexa discover data {CONFIG_FILE} {MAPPING_FILE} --device {DEVICE} --node {NODE} --dataset {DATASET}. The CONFIG_FILE is the location of the file containing the credentials. The MAPPING_FILE is the location of the mapping file discussed above. Ensure you complete the variables; --device, --node and --dataset. These must be completed, and the values can be obtained from the output of Discovering Datasets discussed above. For example: senvion_iec61850_ardexa discover data /opt/ardexa/config/senvion-iec61850-ardexa/testonly.config_file /opt/ardexa/config/senvion-iec61850-ardexa/full_mapping.csv --device IECDeviceControlMe --node LLN0 --dataset ActValues

Discovering Data Using Custom "Per Source" Files

Instead of using a single mapping file (as discussed above), a separate file for each "source" can be used in conjunction with the file system to produce the desired table/source names. If the "mapping file" argument ends with the (exact) name per_source (an empty file with this exact name, path does not matter), then the plugin will recursively look for files in the directory /opt/ardexa/config/senvion-iec61850-ardexa/per-source. The file structure is very similar to that used in /opt/ardexa/logs, where the first directory is the Ardexa Table, and any subsequent directories, plus the file name (minus the extension) will form the Ardexa Source Name. For example, take the following file structure:

/opt/ardexa/config/senvion-iec61850-ardexa/per-source
                                        └── test_senvion_per_source
                                            ├── WEA1
                                               └── turbine1.csv

This file structure will produce one source (WEA1/turbine1) that will log data to the Ardexa table called test_senvion_per_source. The contents of the file is the same as the single mapping file, minus the "Table" and "Source Name" fields.

  1. Ardexa Variable Name. This is the name given to the variable as it will appear in the Ardexa cloud.

  2. IEC Device. This is the device that needs to be queried to get the variable. This name IS case sensitive. See the output from Discovering Fields

  3. IEC Node. This is the node that needs to be queried to get the variable. This name IS case sensitive. See the output from Discovering Fields

  4. IEC Dataset. This is the dataset that needs to be queried to get the variable. This name IS case sensitive. See the output from Discovering Fields

  5. IEC Source. This is the source name in the IEC server. Bear in mind there is 1 source per IP address in a Senvion server. Use the discover fields item discussed previously to find the name. This name is not case sensitive.

  6. IEC Field Name. The name of the required variable in the GE table. Use the discover fields item discussed previously to find the name. This name is not case sensitive.

  7. Type. The Ardexa variable type. Can be one of decimal, int, keyword or date

  8. Units. The units if the variable. May be empty.

  9. Scale. The scale of the variable. May be empty

Here is an example of two mapping files:

  • turbine1.csv

# Ardexa Variable Name [2], IEC Device [3],         IEC Node [4],   IEC Dataset [5],        IEC Source [6],     IEC Field Name [7],     Type [8],   Units [9],  Scale [10]
WTUR1_W_avg,                IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.W,                decimal,    W,          1000
WTUR1_VAr_avg,              IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.VAr,              decimal,    var,        1000
WTUR1_VA_avg,               IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.VA,               decimal,    VA,         1000
WTUR1_TotWh_avg,            IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.TotWh,            decimal,    Wh,         1000
WTUR1_TurSt,                IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTUR1.TurSt,            keyword,     ,          1
WROT1_PtAngValBl1_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.PtAngValBl1,      decimal,    °,          1
WROT1_PtAngValBl2_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.PtAngValBl2,      decimal,    °,          1
WROT1_PtAngValBl3_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.PtAngValBl3,      decimal,    °,          1
WROT1_RotSpd_avg,           IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.RotSpd,           decimal,    rots/s,     1      
WROT1_HubTmp_avg,           IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.HubTmp,           decimal,    °C,         1      
WROT1_RotBrgTmp_avg,        IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WROT1.RotBrgTmp,        decimal,    °C,         1      
WTRM1_TrmTmpShfBrg1_avg,    IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTRM1.TrmTmpShfBrg1,    decimal,    °C,         1      
WTRM1_TrmTmpShfBrg2_avg,    IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTRM1.TrmTmpShfBrg2,    decimal,    °C,         1      
WTRM1_TrmTmpGbxOil_avg,     IECDeviceControlMe,     LLN0,           ActValues,              WEA 11-123456,      WTRM1.TrmTmpGbxOil,     decimal,    °C,         1      

Note:

  1. Anything starting with # is a comment and can be ignored.

The above "per source" mapping files will produce the following output. Notice the table and source names.

  Table                                test_senvion_per_source
  Source                               WEA1/turbine1          
  WTUR1_W_avg(decimal:W)               1.74315e+06            
  WTUR1_VAr_avg(decimal:var)           10742.7                
  WTUR1_VA_avg(decimal:VA)             1.74315e+06            
  WTUR1_TotWh_avg(decimal:Wh)          4.57672e+10            
  WTUR1_TurSt(keyword)                 Normal operation       
  WROT1_PtAngValBl1_avg(decimal:°)     0.99                   
  WROT1_PtAngValBl2_avg(decimal:°)     0.99                   
  WROT1_PtAngValBl3_avg(decimal:°)     1                      
  WROT1_RotSpd_avg(decimal:rots/s)     0.168333               
  WROT1_HubTmp_avg(decimal:°C)         18                     
  WROT1_RotBrgTmp_avg(decimal:°C)      26.35                  
  WTRM1_TrmTmpShfBrg1_avg(decimal:°C)  63.35                  
  WTRM1_TrmTmpShfBrg2_avg(decimal:°C)  70.2                   
  WTRM1_TrmTmpGbxOil_avg(decimal:°C)   56.75   

The equivalent REMOTE SHELL command to view all the database tables is:senvion_iec61850_ardexa discover data {CONFIG_FILE} {MAPPING_FILE} --device {DEVICE} --node {NODE} --dataset {DATASET}. The CONFIG_FILE is the location of the file containing the credentials. The MAPPING_FILE argument must ends with the name per_source (an empty file with this exact name, path does not matter), then the plugin will recursively look for files in the directory /opt/ardexa/config/ge-wind-odbc-ardexa/per-source. Ensure you complete the variables; --device, --node and --dataset. These must be completed, and the values can be obtained from the output of Discovering Datasets discussed above. For example: senvion_iec61850_ardexa discover data /opt/ardexa/config/senvion-iec61850-ardexa/testonly.config_file /opt/ardexa/config/senvion-iec61850-ardexa/per_source --device IECDeviceControlMe --node LLN0 --dataset ActValues

Remember that the per-source directory must be created, as follows: mkdir -p /opt/ardexa/config/ge-wind-odbc-ardexa/per-source. Then create directories and files as required, and in accordance with the discussion above.

A Special Note on Using the "Per Source" feature in Senvion Plants

Senvion Plants are configured to collect data from an IP address per turbine. This means that without some form of control, the per-source feature will try and collect from all sources. In order to prevent this behaviour and collect only from the required source, use the --required_source argument as shown below. This will ensure only the required sources are collected. Make sure the source is enclosed in quotes, especially if there are spaces in the source name. For example: senvion_iec61850_ardexa discover data /opt/ardexa/config/senvion-iec61850-ardexa/testonly.config_file /opt/ardexa/config/senvion-iec61850-ardexa/per_source --required_source 'WEA 05-301441'

"Per Source" Mapping Generator

As discussed above, mapping files allow as much flexibility as possible. There is a very high probability that most of the time, the same OEM input field will need to be to mapped to the same output field name (such as an IEC name), for all the turbines at a site. To assist with this repetitive process, the plugin includes a generate sub-command that will accept a template CSV file, which describes the general mapping and applies it to any turbines that can be automatically discovered. The template file for a per source generate command will look a "mapping" file discussed above, except that the first 2 columns (table and source) have been removed.

This is an example "per source" mapping file:

# Source Name [0],  Ardexa Variable Name [1],   IEC Device [2],         IEC Node [3],   IEC Dataset [4],        IEC Field Name [5],     Type [6],   Units [7],  Scale [8]
${turbine},         WTUR1_W_avg,                IECDeviceControlMe,     LLN0,           ActValues,              WTUR1.W,                decimal,    W,          1000
${turbine},         WTUR1_VAr_avg,              IECDeviceControlMe,     LLN0,           ActValues,              WTUR1.VAr,              decimal,    var,        1000
${turbine},         WTUR1_VA_avg,               IECDeviceControlMe,     LLN0,           ActValues,              WTUR1.VA,               decimal,    VA,         1000
${turbine},         WTUR1_TotWh_avg,            IECDeviceControlMe,     LLN0,           ActValues,              WTUR1.TotWh,            decimal,    Wh,         1000
${turbine},         WTUR1_TurSt,                IECDeviceControlMe,     LLN0,           ActValues,              WTUR1.TurSt,            keyword,     ,          1
${turbine},         WROT1_PtAngValBl1_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WROT1.PtAngValBl1,      decimal,    °,          1
${turbine},         WROT1_PtAngValBl2_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WROT1.PtAngValBl2,      decimal,    °,          1
${turbine},         WROT1_PtAngValBl3_avg,      IECDeviceControlMe,     LLN0,           ActValues,              WROT1.PtAngValBl3,      decimal,    °,          1
${turbine},         WROT1_RotSpd_avg,           IECDeviceControlMe,     LLN0,           ActValues,              WROT1.RotSpd,           decimal,    rots/s,     1      
${turbine},         WROT1_HubTmp_avg,           IECDeviceControlMe,     LLN0,           ActValues,              WROT1.HubTmp,           decimal,    °C,         1      
${turbine},         WROT1_RotBrgTmp_avg,        IECDeviceControlMe,     LLN0,           ActValues,              WROT1.RotBrgTmp,        decimal,    °C,         1      
${turbine},         WTRM1_TrmTmpShfBrg1_avg,    IECDeviceControlMe,     LLN0,           ActValues,              WTRM1.TrmTmpShfBrg1,    decimal,    °C,         1      
${turbine},         WTRM1_TrmTmpShfBrg2_avg,    IECDeviceControlMe,     LLN0,           ActValues,              WTRM1.TrmTmpShfBrg2,    decimal,    °C,         1      
${turbine},         WTRM1_TrmTmpGbxOil_avg,     IECDeviceControlMe,     LLN0,           ActValues,              WTRM1.TrmTmpGbxOil,     decimal,    °C,         1    

The equivalent REMOTE SHELL command to generate the "per source" mappings files is:senvion_iec61850_ardexa generate {CONFIG_FILE} {PER_SOURCE MAPPING FILE} {TABLE NAME}. The CONFIG_FILE is the location of the file containing the credentials. The MAPPING_FILE is the per source mapping file. The "TABLE NAME" is the name of the Ardexa table, where the events will be sent. For example: senvion_iec61850_ardexa generate /opt/ardexa/config/senvion-iec61850-ardexa/testonly.config_file /opt/ardexa/config/senvion-iec61850-ardexa/oem-to-iec-test_v1.csv --table wind_iec_600s --device IECDeviceControlMe --node LLN0 --dataset ActValues

Running this command will create the following directories and files.

/opt/ardexa/config/senvion-iec61850-ardexa/per-source
                                        └── wind_iec_600s
                                            ├── turbine1.csv

The data can then be discovered using the section titled Discovering Data Using Custom "Per Source" Files above, to display the data

Log

Logging data to the cloud can be enacted via the Ardexa Front End. The equivalent REMOTE SHELL command is:senvion_iec61850_ardexa log {CONFIG_FILE} {PER_SOURCE_FILE or MAPPING FILE}. The CONFIG_FILE is the location of the file containing the credentials. The MAPPING_FILE argument must ends with the name per_source (an empty file with this exact name, path does not matter), then the plugin will recursively look for files in the directory /opt/ardexa/config/senvion-iec61850-ardexa/per-source. Otherwise, if a MAPPING FILE is used, it will use that log data For example: senvion_iec61850_ardexa log /opt/ardexa/config/senvion-iec61850-ardexa/task/testonly.config_file /opt/ardexa/config/senvion-iec61850-ardexa/per_source

Log Book

To record log book data, Please define a mapping file similar to below,

# Ardexa Table[0]   , Ardexa Source [1], Ardexa Variable Name [2], IEC Device [3]    , IEC Node [4], IEC Dataset [5], IEC Source [6], IEC Field Name [7], Type [8], Units [9], Scale [10]
senvion_test_logbook, WEA 11-123456    , stVal                   , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , stVal             , int     ,          ,          1
senvion_test_logbook, WEA 11-123456    , stVal_str               , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , stVal_str         , keyword ,          ,          1
senvion_test_logbook, WEA 11-123456    , comego                  , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , comego            , int     ,          ,          1
senvion_test_logbook, WEA 11-123456    , comego_str              , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , comego_str        , keyword ,          ,          1
senvion_test_logbook, WEA 11-123456    , idx                     , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , idx               , int     ,          ,          1
senvion_test_logbook, WEA 11-123456    , idx_str                 , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , idx_str           , keyword ,          ,          1
senvion_test_logbook, WEA 11-123456    , Timestamp               , REguardControlBWEC, WALM1       , Events         , WEA 11-123456 , Timestamp         , date    ,          ,          1

The discovery output for the above mapping file will be:

  Table                senvion_test_logbook
  Source               WEA 11-123456      
  stVal(integer)       220                 
  stVal_str(keyword)   Unknown             
  comego(integer)      1                   
  comego_str(keyword)  go                  
  idx(integer)         1                   
  idx_str(keyword)     follow              
  Timestamp(date)      2025-08-27T20:00:00Z

The discover data and log commands works as usual for data from the turbine. Any new event will be logged to the logbook table as long as they are logged in a sufficient frequency. Here, it is recommended to configure the logbook task to run every 1m.

Example command to discover data and log are shown below

senvion_iec61850_ardexa discover data '/path/to/config_file.config_file' '/path/to/mapping_file.csv'
senvion_iec61850_ardexa log '/path/to/config_file.config_file' '/path/to/mapping_file.csv'

Last updated

Was this helpful?