///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_CLL_ExecCtrl_DSFunctions
//
//  Purpose:
//    This module contains the implementation of EPTF_CLL_ExecCtrl_DSFunctions functions.
//
//  Module depends on:
//    <EPTF_CLL_Common_Definitions>
//    <EPTF_CLL_ExecCtrl_Definitions>
//    <EPTF_CLL_DataSource_Definitions>
//    <EPTF_CLL_DataSource_Functions>
//    <EPTF_CLL_DataSourceClient_Functions>
//    <EPTF_CLL_ExecCtrl_LoggingFunctions>
//    <EPTF_CLL_Variable_Definitions>
//    <EPTF_CLL_Variable_Functions>
//    <EPTF_CLL_StatHandler_Functions>
//    <EPTF_CLL_Base_Functions>
//
//  Module Parameters:
//
//  Current Owner:
//    Jozsef Gyurusi (ethjgi)
//
//  Last Review Date:
//    2011-05-02
//
//  Detailed Comments:
//
//    Public functions:
//       -
//
//    All other functions in this module are private!
//
///////////////////////////////////////////////////////////////

module EPTF_CLL_ExecCtrl_DSFunctions {

//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_ExecCtrl_Functions all;
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_ExecCtrl_Definitions all;
//import from EPTF_CLL_ExecCtrlUIHandler_Definitions all;
import from EPTF_CLL_DataSource_Definitions all;
import from EPTF_CLL_DataSource_Functions all;
import from EPTF_CLL_DataSourceClient_Functions all;
import from EPTF_CLL_ExecCtrl_LoggingFunctions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_ExecCtrl_ScenarioFunctions all;
import from EPTF_CLL_ExecCtrl_PhaseDefinitions all;
import from EPTF_CLL_ExecCtrl_PhaseFunctions all;
import from EPTF_CLL_HashMapStr2Int_Functions all;
//import from EPTF_CLL_ExecCtrlUIHandler_Functions all;
import from EPTF_CLL_LGenBase_ConfigFunctions all;
import from EPTF_CLL_StatHandler_Functions all;
import from EPTF_CLL_ExecCtrl_ScenarioDefinitions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Common_Functions all;
import from EPTF_CLL_StatHandler_Definitions all;

friend module EPTF_CLL_ExecCtrl_Functions;
//=========================================================================
// Functions
//========================================================================

///////////////////////////////////////////////////////////
//  Group: EPTF_ExecCtrl
//
//  Purpose:
//    Functions related to EPTF_ExecCtrl feature
//
///////////////////////////////////////////////////////////
group DataSourceClient {

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_ExecCtrl_createIteratorVars
  //
  //  Purpose:
  //    Creates the iterator variables that are needed for the implementation of the ExecCtrl DataSourceClient feature.
  //    Called from f_EPTF_ExecCtrl_UIHandler_createGUI, before GUIDone has been sent to the LGens
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_ExecCtrl_createIteratorVars()
  runs on EPTF_ExecCtrl_CT{

    var EPTF_CharstringList vl_cList := {}, vl_cList2 := {}, vl_cList3 := {}
    var integer vl_idx := 0;
    //EntityGroups
    for(var integer i := 0; i < sizeof(v_ExecCtrl_entityGroups); i := i + 1){
      vl_cList[sizeof(vl_cList)] := v_ExecCtrl_entityGroups[i].name;
    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityGroups_varName, vl_cList ,vl_idx);

    //Lgens
    vl_cList := {}
    for(var integer i := 0; i < sizeof(v_ExecCtrl_lgens); i := i + 1){
      vl_cList[sizeof(vl_cList)] := v_ExecCtrl_lgens[i].name;
    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorLGens_varName, vl_cList ,vl_idx);


    //Regulators
    vl_cList := {}
    for(var integer i := 0; i < sizeof(v_EPTF_ExecCtrl_RegulatorNames); i := i + 1){
      vl_cList[sizeof(vl_cList)] := v_EPTF_ExecCtrl_RegulatorNames[i];
    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorRegulators_varName, vl_cList ,vl_idx);


    //ScenarioGroups
    vl_cList := {}
    for(var integer i := 0; i < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data); i := i + 1){
      vl_cList[sizeof(vl_cList)] := v_ExecCtrl_ScenarioGroupInstanceDB.data[i].name;
    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarioGroups_varName, vl_cList ,vl_idx);

    //PhaseLists
    vl_cList := {};
    var boolean vl_insert;
    for(var integer i := 0; i < sizeof(v_ExecCtrl_PhaseListDeclaratorDB.data); i := i + 1){
       vl_cList[sizeof(vl_cList)] := v_ExecCtrl_PhaseListDeclaratorDB.data[i].name;
       //SCGoupsOfPhaseList
       vl_cList2 := {};
       for(var integer j := 0; j < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data); j := j + 1){
         for(var integer k := 0; k < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists); k := k + 1){
           if(v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[k].name == v_ExecCtrl_PhaseListDeclaratorDB.data[i].name) {
             vl_insert := true;
             for(var integer l := 0; l < sizeof(vl_cList2); l := l + 1){
               if(vl_cList2[l] == v_ExecCtrl_ScenarioGroupInstanceDB.data[j].name) {
                 vl_insert := false;
               }
             }
             if(vl_insert) {
               vl_cList2[sizeof(vl_cList2)] := v_ExecCtrl_ScenarioGroupInstanceDB.data[j].name;
             }
           }
         }
       }
       f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & v_ExecCtrl_PhaseListDeclaratorDB.data[i].name & "." & c_ExecCtrl_iteratorScenarioGroups_varName, vl_cList2 ,vl_idx);

    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhaseLists, vl_cList ,vl_idx);

    //Phases
    vl_cList := {}
    vl_cList2 := {}
    for(var integer i := 0; i < sizeof(v_ExecCtrl_PhaseListDeclaratorDB.data); i := i + 1){
      vl_cList2 := {};
      for(var integer j := 0; j < sizeof(v_ExecCtrl_PhaseListDeclaratorDB.data[i].phases); j := j + 1){
        vl_cList[sizeof(vl_cList)] := v_ExecCtrl_PhaseListDeclaratorDB.data[i].phases[j].name;
        vl_cList2[sizeof(vl_cList2)] := v_ExecCtrl_PhaseListDeclaratorDB.data[i].phases[j].name;
      }
      f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName&v_ExecCtrl_PhaseListDeclaratorDB.data[i].name, vl_cList2 ,vl_idx);
    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName, vl_cList ,vl_idx);

    //ScenarioOfScGroup
    for(var integer j := 0; j < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data); j := j + 1){
       vl_cList := {}
       for(var integer i := 0; i < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarios); i := i + 1){
          vl_cList[sizeof(vl_cList)] := v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarios[i].name;
       }
       f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarioGroups_varName & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].name, vl_cList ,vl_idx);
    }

    //LGensForEntityGroup
    for(var integer j := 0; j < sizeof(v_ExecCtrl_entityGroups); j := j + 1){
        vl_cList := {}
        for(var integer i := 0; i < sizeof(v_ExecCtrl_entityGroups[j].lgenList); i := i + 1){
            vl_cList[sizeof(vl_cList)] := v_ExecCtrl_lgens[v_ExecCtrl_entityGroups[j].lgenList[i].lgenIdx].name;
        }
        f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorLGens_varName & "." & v_ExecCtrl_entityGroups[j].name, vl_cList ,vl_idx);
    }

    //Scenarios
    for(var integer j := 0; j < sizeof(v_ExecCtrl_entityGroups); j := j + 1){
        vl_cList := {}
        vl_cList2 := {}
        vl_cList3 := {}
        for(var integer i := 0; i < sizeof(v_ExecCtrl_entityGroups[j].scenarios); i := i + 1){
          vl_cList[sizeof(vl_cList)] := v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[i]].scData.name;
          if(v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[i]].scData.trafficType == originating) {
            vl_cList2[sizeof(vl_cList2)] := v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[i]].scData.name;
          }
          if(v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[i]].scData.trafficType == terminating) {
            vl_cList3[sizeof(vl_cList3)] := v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[i]].scData.name;
          }
        }
        f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarios_varName & "." & v_ExecCtrl_entityGroups[j].name, vl_cList ,vl_idx);
        f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarios_varName & "." & v_ExecCtrl_entityGroups[j].name & ".originating", vl_cList2 ,vl_idx);
        f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarios_varName & "." & v_ExecCtrl_entityGroups[j].name & ".terminating", vl_cList3 ,vl_idx);
      }

    //TrafficCases
    for(var integer j := 0; j < sizeof(v_ExecCtrl_entityGroups); j := j + 1){
      for(var integer k := 0; k < sizeof(v_ExecCtrl_entityGroups[j].scenarios); k := k + 1){
        vl_cList := {}
        var integer vl_scIdx := v_ExecCtrl_entityGroups[j].scenarios[k];
        for(var integer i:=0; i<sizeof(v_ExecCtrl_scenarios[vl_scIdx].scData.tcList);i:=i+1) {
            vl_cList[sizeof(vl_cList)] := f_EPTF_LGenBase_tcNameOfTcOfSc(v_ExecCtrl_scenarios[vl_scIdx].scData,i);
        }
        f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorTrafficCases_varName & "." & v_ExecCtrl_entityGroups[j].name & "." & v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[k]].scData.name, vl_cList ,vl_idx);
      }
    }
    //PhasesOfScGrp
    for(var integer j := 0; j < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data); j := j + 1){
       for(var integer i := 0; i < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists); i := i + 1){
          vl_cList := {}
          for(var integer k := 0; k < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[i].phases); k := k + 1){
            vl_cList[sizeof(vl_cList)] := v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[i].phases[k].name;
          }
          if(f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].name & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[i].name) == -1 ) {
            f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].name & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[i].name, vl_cList ,vl_idx);
          }
          if(f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[i].name) == -1 ) {
            f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[j].scenarioPhaseLists[i].name, vl_cList ,vl_idx);
          }
       }
    }


    //EntityGroups  - Lgens param
    for(var integer j := 0; j < sizeof(v_ExecCtrl_lgens); j := j + 1){
       vl_cList := {}
       for(var integer i := 0; i < sizeof(v_ExecCtrl_lgens[j].eGroups); i := i + 1){
          vl_cList[sizeof(vl_cList)] := v_ExecCtrl_entityGroups[v_ExecCtrl_lgens[j].eGroups[i].eGrpIdx].name;
       }
       f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityGroups_varName & "." & v_ExecCtrl_lgens[j].name, vl_cList ,vl_idx);
    }

    //EntityTypes  - Lgens param
    for(var integer j := 0; j < sizeof(v_ExecCtrl_lgens); j := j + 1){
       vl_cList := {}
       for(var integer i := 0; i < sizeof(v_ExecCtrl_lgens[j].resourceList); i := i + 1){
          vl_cList[sizeof(vl_cList)] := v_ExecCtrl_lgens[j].resourceList[i].eType;
       }
       f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityTypesForLGen_varName & "." & v_ExecCtrl_lgens[j].name, vl_cList ,vl_idx);
    }

    //Regulated items
    vl_cList := {}
    for(var integer i := 0; i < sizeof(v_EPTF_ExecCtrl_RegulatedItems); i := i + 1){
      if (ischosen(v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TC)) {
        vl_cList[sizeof(vl_cList)] := v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TC.eGrpName
          &"."&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TC.scName
          &"."&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TC.tcName;
      }
      if (ischosen(v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SC)) {
        vl_cList[sizeof(vl_cList)] := v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SC.eGrpName
          &"."&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SC.scName;
      }
      if (ischosen(v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TCInPhase)) {
        vl_cList[sizeof(vl_cList)] := v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TCInPhase.eGrpName
          &"."&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TCInPhase.scName
          &"."&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TCInPhase.tcName
          &"@"&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_TCInPhase.phase;
      }
      if (ischosen(v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SCInPhase)) {
        vl_cList[sizeof(vl_cList)] := v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SCInPhase.eGrpName
          &"."&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SCInPhase.scName
          &"@"&v_EPTF_ExecCtrl_RegulatedItems[i].idName.cps_SCInPhase.phase;
      }
    }
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorRegulatedItems_varName, vl_cList ,vl_idx);

    //Tc statistics
    f_EPTF_Var_newCharstringlist(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorTcStats_varName, c_EPTF_ExecCtrl_tcStatNames ,vl_idx);

    //FSM statistics
    for(var integer j := 0; j < sizeof(v_ExecCtrl_entityGroups); j := j + 1){
      for(var integer k := 0; k < sizeof(v_ExecCtrl_entityGroups[j].scenarios); k := k + 1){
        var integer vl_scIdx := v_ExecCtrl_entityGroups[j].scenarios[k];
        for(var integer i:=0; i<sizeof(v_ExecCtrl_scenarios[vl_scIdx].scData.tcList);i:=i+1) {

          vl_cList := {}
          // get FSM stats for this TC:
          for(var integer f:=0; f<sizeof(v_ExecCtrl_FSMStats); f:=f+1) {
            if (
              v_ExecCtrl_entityGroups[j].name == v_ExecCtrl_FSMStats[f].entityGroup and
              v_ExecCtrl_scenarios[v_ExecCtrl_entityGroups[j].scenarios[k]].scData.name==v_ExecCtrl_FSMStats[f].scenario and
              f_EPTF_LGenBase_tcNameOfTcOfSc(v_ExecCtrl_scenarios[vl_scIdx].scData,i)==v_ExecCtrl_FSMStats[f].tc
            ) {
              for (var integer st:=0; st<sizeof(v_ExecCtrl_FSMStats[f].stats); st:=st+1) {
                vl_cList[sizeof(vl_cList)] := v_ExecCtrl_FSMStats[f].stats[st].declaredName;
              }
            }
          }

          f_EPTF_Var_newCharstringlist(
            c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorFSMStats_varName & "."
            & v_ExecCtrl_entityGroups[j].name & "."
            & v_ExecCtrl_scenarios[vl_scIdx].scData.name & "."
            & f_EPTF_LGenBase_tcNameOfTcOfSc(v_ExecCtrl_scenarios[vl_scIdx].scData,i), vl_cList ,vl_idx);
        }
      }
    }

    //ScGroup of Scenario
    for(var integer j := 0; j < sizeof(v_ExecCtrl_entityGroups); j := j + 1){
      for(var integer k := 0; k < sizeof(v_ExecCtrl_entityGroups[j].scenarios); k := k + 1){
        var integer vl_scIdx := v_ExecCtrl_entityGroups[j].scenarios[k];
        var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
        var EPTF_ExecCtrl_ScenarioGroup_Instance vl_instance;
    	//f_EPTF_ExecCtrl_ScenarioGroup_get_byIndex(vl_scGrpIdx, vl_instance);

	if (vl_scGrpIdx > -1 and vl_scGrpIdx < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data))
	{
          f_EPTF_Var_newCharstring(c_ExecCtrl_DS_externalDataVar_prefix & "ScGroupOfSc_" & int2str(vl_scIdx), v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].name,
	  vl_idx);
	}
      }
    }
  }


  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_ExecCtrl_DSProcessData
  //
  //  Purpose:
  //    Processes the incoming Data requests - iterators and external data elements - and gives back a variable name.
  //    It should be registered in the ExecCtrl_init_CT. Type function fcb_EPTF_DataSourceClient_dataHandler
  //
  //  Parameters:
  //    *out charstring pl_dataVarName* - this variable contains the value of the data or the iterator result
  //    *in charstring pl_source* - the name of the data source 'feature'
  //    *in charstring pl_ptcName* - the name of the ptc (ID of the PTC)
  //    *in charstring pl_element* - the name of the data element
  //    *in* <EPTF_DataSource_Params> *pl_params* - the parameters
  //      of the data for the dataElement
  //
  //  Return Value:
  //    integer - error code (0 of OK, non zero if unsuccessful: e.g. invalid parameters given in pl_params)
  //
  //  Detailed Comments:
  //    When this function is called in the first time it creates the variable that contains the
  //    names of the variables that store the values of the elements of the data or the iterator. This variable name
  //    is returned in pl_dataVarName.
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_ExecCtrl_DSProcessData(out charstring pl_dataVarName,
                                                      in charstring pl_source,
                                                      in charstring pl_ptcName,
                                                      in charstring pl_element,
                                                      in EPTF_DataSource_Params pl_params)
  runs on EPTF_ExecCtrl_CT return integer{

    var EPTF_CharstringList vl_cList := {}
    var EPTF_CharstringList pl_result := {}
    var EPTF_Var_SubscriptionMode vl_subscriptionModeForVars := sampled;
    if (v_ExecCtrl_usePullModeForStats) {
      vl_subscriptionModeForVars := pull;
    }

    var integer vl_idx := 0;
    pl_dataVarName := "";
    select(pl_element){
     case(c_ExecCtrl_iteratorEntityTypesForLGen){
       vl_cList := {}
       var charstring vl_LGenName := "";
       if(0 == f_EPTF_ExecCtrl_getParams(pl_params,{c_ExecCtrl_paramNameLGen}, pl_result)){
           vl_LGenName := pl_result[0];
           var integer vl_key := -1;
           if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_lgensHash, vl_LGenName, vl_key)){
             pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityTypesForLGen_varName & "." & vl_LGenName;
           } else {
             pl_dataVarName :=  %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameLGen & ": " & vl_LGenName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
       }
     }
     case(c_ExecCtrl_iteratorRegulatedItems){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorRegulatedItems_varName;
       } else {
         pl_dataVarName := log2str(%definitionId, ": Datasource Parameter not needed." );
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case(c_ExecCtrl_iteratorEntityGroups){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityGroups_varName
       } else {
         // Lgen bemeno param kell - c_ExecCtrl_paramNameLGen
         vl_cList := {}
         var charstring vl_LGenName := "";
         if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameLGen}, pl_result)){
           vl_LGenName := pl_result[0];
           var integer vl_key := -1;
           if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_lgensHash, vl_LGenName, vl_key)){
             pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityGroups_varName & "." & vl_LGenName;
           } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameLGen & ": " & vl_LGenName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         }
       }
     }
     case(c_ExecCtrl_iteratorRegulators){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorRegulators_varName
       } else {
         pl_dataVarName := log2str(%definitionId, ": Datasource Parameter not needed." );
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case(c_ExecCtrl_iteratorScenarioGroups){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarioGroups_varName
       } else if(sizeof(pl_params) == 1) {
         if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNamePhaseList}, pl_result)){
           pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & pl_result[0] & "." & c_ExecCtrl_iteratorScenarioGroups_varName
         }
       } else {
         pl_dataVarName := log2str(%definitionId, ": Datasource Parameter not needed." );
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }

     case(c_ExecCtrl_iteratorPhaseLists){
       if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {}, pl_result)){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhaseLists;
       } else {
         pl_dataVarName := log2str(%definitionId, ": Datasource Parameter not needed." );
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }

     case(c_ExecCtrl_iteratorPhases){
       if(sizeof(pl_params) == 0){
           pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName
       } else if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNamePhaseList}, pl_result, true)) {
           pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & pl_result[0];
       } else if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameScenarioGroup,c_ExecCtrl_paramNamePhaseList}, pl_result, true)){
           pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & pl_result[0] & "." & pl_result[1];
       } else if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario}, pl_result)){
           vl_cList := {}
           var charstring vl_entityGrpName := "";
           var charstring vl_scName := "";
           vl_entityGrpName := pl_result[0];
           vl_scName := pl_result[1];
           var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
           if (vl_scIdx!=-1) {
                var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
                if (vl_scGrpIdx != -1){
                    for(var integer i := 0; i < sizeof(v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].scenarios); i := i + 1) {
                      if(v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].scenarios[i].idx == vl_scIdx) {
                         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName & "." & v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].scenarioPhaseLists[i].name;
                         break;
                      }
                    }
                } else {
                    pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario is not in scenarioGroup: "& vl_scName;
                    f_EPTF_ExecCtrl_warning(pl_dataVarName);
                }
           } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario doesn't exist: "& vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
        }
     }
     case(c_ExecCtrl_iteratorLGens){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorLGens_varName
       } else {
         vl_cList := {}
         var charstring vl_entityGrpName := "";
         if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameEntityGroup}, pl_result)){
           vl_entityGrpName := pl_result[0];
           var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
           if(vl_eGrpIdx > -1){
             pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorLGens_varName & "." & vl_entityGrpName;
           } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName ;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         }
       }
     }


     case(c_ExecCtrl_iteratorScenarios){
       vl_cList := {}
       var charstring vl_scenarioGrpName := "";
       // this if is needed to avoid false warning if the second param version is used:
       if (sizeof(pl_params)==1 and pl_params[0].paramName == c_ExecCtrl_paramNameScenarioGroup) {
         if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameScenarioGroup}, pl_result)){
           vl_scenarioGrpName := pl_result[0];
           var integer vl_key := -1;
           if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_ScenarioGroupInstanceDB.hashRef, vl_scenarioGrpName, vl_key)){
              pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarioGroups & "." & vl_scenarioGrpName;
           } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameScenarioGroup & ": " & vl_scenarioGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         }
       } else if (sizeof(pl_params)==2 and (pl_params[0].paramName == c_ExecCtrl_paramNameTrafficType or pl_params[1].paramName == c_ExecCtrl_paramNameTrafficType)) {
         var charstring vl_trafficType := "";
         if(pl_params[0].paramValue == "originating" or pl_params[0].paramValue == "terminating") {
           vl_trafficType := pl_params[0].paramValue;
         } else if (pl_params[1].paramValue == "originating" or pl_params[1].paramValue == "terminating") {
           vl_trafficType := pl_params[1].paramValue;
         }
         if(vl_trafficType != "") {
           if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameTrafficType}, pl_result)){
             var charstring vl_entityGrpName := "";
             vl_entityGrpName := pl_result[0];
             var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
             if(vl_eGrpIdx > -1){
               pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarios_varName & "." & vl_entityGrpName;
             } else {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                  "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarios_varName & "." & vl_entityGrpName & "." & vl_trafficType;
           }
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameTrafficType & ": " & pl_params[0].paramValue & " It can be only originating or terminating";
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       } else {
         var charstring vl_entityGrpName := "";
         if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameEntityGroup}, pl_result)){
           vl_entityGrpName := pl_result[0];
           var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
           if(vl_eGrpIdx > -1){
             pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarios_varName & "." & vl_entityGrpName;
           } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter(s) is/are wrong. The iterator " & c_ExecCtrl_iteratorScenarios & " either has no parameters or has only one, EntityGroup.";
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case(c_ExecCtrl_iteratorTrafficCases){
       vl_cList := {}
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams(pl_params,{c_ExecCtrl_paramNameEntityGroup,c_ExecCtrl_paramNameScenario}, pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         if(vl_eGrpIdx > -1 and vl_scIdx > -1){
           pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorTrafficCases_varName & "." & vl_entityGrpName & "." & vl_scName;
         } else {
           if( vl_scIdx > -1){
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                  "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
           } else {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                  "\n" & c_ExecCtrl_paramNameScenarioGroup & ": " & vl_scName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         }
       } else if(0 == f_EPTF_ExecCtrl_getParams(pl_params,{c_ExecCtrl_paramNameScenarioInstance}, pl_result)){
         var charstring vl_scInstanceName := pl_result[0];
         var integer vl_scInstIdx := f_EPTF_ExecCtrl_getScenarioIdxByInstanceName(vl_scInstanceName);
         
         if (vl_scInstIdx==-1) {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
              "\n" & c_ExecCtrl_paramNameScenarioInstance & ": " & vl_scInstanceName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         } else {
         
           vl_entityGrpName := f_EPTF_ExecCtrl_eGrp_name(f_EPTF_ExecCtrl_getScenarioEGroupIdx(vl_scInstIdx));
           vl_scName        := f_EPTF_ExecCtrl_getScenarioName(vl_scInstIdx);
           var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
           var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
           if(vl_eGrpIdx > -1 and vl_scIdx > -1){
             pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorTrafficCases_varName & "." & vl_entityGrpName & "." & vl_scName;
           } else {
             if( vl_scIdx > -1){
                 pl_dataVarName := (%definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName );
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             } else {
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameScenarioGroup & ": " & vl_scName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
           }
         }
       }
     }
     case(c_ExecCtrl_iteratorTcStats){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorTcStats_varName;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case(c_ExecCtrl_iteratorFSMStats){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_eGrpName      := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_eGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_eGrpName,vl_scName,vl_tcName);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_eGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdx){
           pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorFSMStats_varName & "." & vl_eGrpName & "." & vl_scName & "." & vl_tcName;
         }
       }
     }
     case(c_ExecCtrl_iteratorGlobalStats){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorGlobalStats_varName;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }

// DATAELEMENTS:

     case (c_ExecCtrl_dataElementProgressbar){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".notif.progressbar";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementProgressbarText){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".notif.progressbar.text";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementGlobalProgressbar){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".notif.globalProgressbar";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementExit){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_Exit;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementEndOfConfig){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := "EPTF_ExecCtrl.EventStatus.EndOfConfig";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementReadyToRun){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := "EPTF_ExecCtrl.EventStatus.ReadyToRun";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementGUIDone){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := "EPTF_ExecCtrl.EventStatus.GUIDone";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementEndOfTest){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := "EPTF_ExecCtrl.EventStatus.EndOfTest";
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementTimeElapsed){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_TimeElapsed;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementStart){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_Start;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementStop){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_Stop;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementTerminate){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_Terminate;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementSnapshot){
       if(sizeof(pl_params) == 0){
         pl_dataVarName := c_EPTF_ExecCtrl_Snapshot;
       } else {
         pl_dataVarName := %definitionId& ": Datasource Parameter not needed.";
         f_EPTF_ExecCtrl_warning(pl_dataVarName);
       }
     }
     case (c_ExecCtrl_dataElementEGrpType){
       var charstring vl_entityGrpName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup},
                                           pl_result)){
         vl_entityGrpName := pl_result[0];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         pl_dataVarName := "EntityType."&int2str(vl_eGrpIdx);
       }
     }
     case (c_ExecCtrl_dataElementEGrpSize){
       var charstring vl_entityGrpName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup},
                                           pl_result)){
         vl_entityGrpName := pl_result[0];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         pl_dataVarName := "EntityNum."&int2str(vl_eGrpIdx);
       }
     }
     case (c_ExecCtrl_dataElementNofMaxAvailEntitiesForLGen){
       var charstring vl_lGenName := "";
       var charstring vl_eTypeName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameLGen, c_ExecCtrl_paramNameEntityType},
                                           pl_result)){
         vl_lGenName := pl_result[0];
         vl_eTypeName := pl_result[1];
         var integer vl_lGenIdx := f_EPTF_ExecCtrl_getLGenIdx(vl_lGenName);
         if(vl_lGenIdx != -1){
            var integer vl_eIdx := f_EPTF_ExecCtrl_getLGenResourceListETypeIdx(vl_lGenIdx,vl_eTypeName);
            if(vl_eIdx != -1){
              pl_dataVarName := "Resource.EntityAvailNum."&int2str(vl_lGenIdx)&"."&int2str(vl_eIdx);
            } else {
                   pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                      "\n" & c_ExecCtrl_paramNameEntityType & ": " & vl_eTypeName;
                   f_EPTF_ExecCtrl_warning(pl_dataVarName);
            }
         } else {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                  "\n" & c_ExecCtrl_paramNameLGen & ": " & vl_lGenName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementNofCurrentAvailEntitiesForLGen){
       var charstring vl_lGenName := "";
       var charstring vl_eTypeName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameLGen, c_ExecCtrl_paramNameEntityType},
                                           pl_result)){
         vl_lGenName := pl_result[0];
         vl_eTypeName := pl_result[1];
         var integer vl_lGenIdx := f_EPTF_ExecCtrl_getLGenIdx(vl_lGenName);
         if(vl_lGenIdx != -1){
           var integer vl_eIdx := f_EPTF_ExecCtrl_getLGenResourceListETypeIdx(vl_lGenIdx,vl_eTypeName);
           if(vl_eIdx != -1){
             pl_dataVarName := "Resource.EntityAllocNum."&int2str(vl_lGenIdx)&"."&int2str(vl_eIdx);
           } else {
                   pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                      "\n" & c_ExecCtrl_paramNameEntityType & ": " & vl_eTypeName;
                   f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         } else {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                  "\n" & c_ExecCtrl_paramNameLGen & ": " & vl_lGenName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementEGrpSizeForLGen){
       var charstring vl_lGenName := "";
       var charstring vl_eGrpName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameLGen},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_lGenName := pl_result[1];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_eGrpName);
         var integer vl_lGenIdx := f_EPTF_ExecCtrl_getLGenIdx(vl_lGenName);
         var integer vl_lGenIdxInList := -1;
		 for(var integer vl_i := 0; vl_i < sizeof(v_ExecCtrl_entityGroups[vl_eGrpIdx].lgenList) ;vl_i := vl_i + 1){
            if(v_ExecCtrl_entityGroups[vl_eGrpIdx].lgenList[vl_i].lgenIdx == vl_lGenIdx){
              vl_lGenIdxInList := vl_i;
            }
		 }
         if (vl_lGenIdxInList > -1){
         	pl_dataVarName := "EGrpDistr.ECount."&int2str(vl_eGrpIdx)&"."&int2str(vl_lGenIdxInList);
         } else {
               pl_dataVarName := %definitionId& ": EntityGroup is not on LGen: "&
                  "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_eGrpName &
                  "\n" & c_ExecCtrl_paramNameLGen & ": " & vl_lGenName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementEGrpOffsetForLGen){
       var charstring vl_lGenName := "";
       var charstring vl_eGrpName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameLGen},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_lGenName := pl_result[1];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_eGrpName);
         var integer vl_lGenIdx := f_EPTF_ExecCtrl_getLGenIdx(vl_lGenName);
         var integer vl_lGenIdxInList := -1;
		 for(var integer vl_i := 0; vl_i < sizeof(v_ExecCtrl_entityGroups[vl_eGrpIdx].lgenList) ;vl_i := vl_i + 1){
            if(v_ExecCtrl_entityGroups[vl_eGrpIdx].lgenList[vl_i].lgenIdx == vl_lGenIdx){
              vl_lGenIdxInList := vl_i;
            }
		 }
         if (vl_lGenIdxInList > -1){
           pl_dataVarName := "EGrpDistr.EOffset."&int2str(vl_eGrpIdx)&"."&int2str(vl_lGenIdxInList);
         } else {
               pl_dataVarName := %definitionId& ": EntityGroup is not on LGen: "&
                  "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_eGrpName &
                  "\n" & c_ExecCtrl_paramNameLGen & ": " & vl_lGenName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

       }
     }
     case (c_ExecCtrl_dataElementScStatusForLGen){
       var charstring vl_eGrpName := "";
       var charstring vl_scTypeName := "";
       var charstring vl_lGenName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameLGen},
                                           pl_result)){
		 vl_eGrpName := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_lGenName := pl_result[2];

         pl_dataVarName := "StatusLED.Scenario.LGenStatus."&vl_lGenName&"."&vl_eGrpName&"."&vl_scTypeName;
       }
     }
     case (c_ExecCtrl_dataElementScIsWeighted){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_scName := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);

         pl_dataVarName := "Traffic.ScenarioType." & vl_eGrpName&"."& int2str(vl_scIdx);
       }
     }
     case (c_ExecCtrl_dataElementScStatus){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_scName := pl_result[1];

         pl_dataVarName := "ExecCtrl.scenarioStatus."&vl_eGrpName&"."&vl_scName
       }
     }
     case (c_ExecCtrl_dataElementScStart){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_scName := pl_result[1];

         pl_dataVarName := "ExecCtrl.startScenario."&vl_eGrpName&"."&vl_scName;
         }
     }
     case (c_ExecCtrl_dataElementScStop){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_scName := pl_result[1];

         pl_dataVarName := "ExecCtrl.stopScenario."&vl_eGrpName&"."&vl_scName;
         }
     }
     case (c_ExecCtrl_dataElementScCPS){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                           pl_result)){
         vl_eGrpName := pl_result[0];
         vl_scName := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);

         if (not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
           pl_dataVarName := %definitionId&": Scenario "&vl_eGrpName&"."&vl_scName&" is not weighted, only weighted scenario has ScCPS.\n";
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if (f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
        	pl_dataVarName := "Traffic.ScenarioCPS."&vl_eGrpName&"."&int2str(vl_scIdx);
         }
       }
     }
     case (c_ExecCtrl_dataElementTcStart){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdx){
           pl_dataVarName := "ExecCtrl.startTC." & vl_entityGrpName & "." & vl_scName & "." & vl_tcName;
         }
       }
     }
     case (c_ExecCtrl_dataElementTcStop){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdx){
           pl_dataVarName := "ExecCtrl.stopTC." & vl_entityGrpName & "." & vl_scName & "." & vl_tcName;
         }
       }
     }
     case (c_ExecCtrl_dataElementTcResetStats){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdx){
           pl_dataVarName := "ExecCtrl.resetStatsTC." & vl_entityGrpName & "." & vl_scName & "." & vl_tcName;
         }
       }
     }
     case (c_ExecCtrl_dataElementTcResetFSMStats){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdx){
           pl_dataVarName := "ExecCtrl.resetFSMStatsTC." & vl_entityGrpName & "." & vl_scName & "." & vl_tcName;
         }
       }
     }
     case (c_ExecCtrl_dataElementAllTcResetStats){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == sizeof(pl_params)){
           pl_dataVarName := "ExecCtrl.resetStatsAllTC";
       }
     }
     case (c_ExecCtrl_dataElementAllTcResetFSMStats){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == sizeof(pl_params)){
           pl_dataVarName := "ExecCtrl.resetFSMStatsAllTC";
       }
     }
     case (c_ExecCtrl_dataElementTcStartDelay){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         var integer vl_tcIdxRel := f_EPTF_ExecCtrl_getTcOfScenarioIdx(vl_tcIdx);

         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdxRel){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if (f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
           pl_dataVarName := %definitionId&": Scenario "&vl_entityGrpName&"."&vl_scName&" is weighted, only non-weighted scenario has TcStartDelay.\n";
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdxRel and not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)){
           pl_dataVarName := "Traffic.TCDelay." & vl_entityGrpName & "." & int2str(vl_scIdx) & "." & int2str(vl_tcIdxRel)
         }
       }
     }
     case (c_ExecCtrl_dataElementTcTargetCPSOrWeight){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         } else {
           var integer vl_tcOfScIdx := f_EPTF_ExecCtrl_getTcOfScenarioIdx(vl_tcIdx);
           if( -1 == vl_tcOfScIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
               "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           } else if(-1 != vl_eGrpIdx and -1 != vl_scIdx){
             pl_dataVarName := "Traffic.TCCPS." & vl_entityGrpName & "." & int2str(vl_scIdx) & "." & int2str(vl_tcOfScIdx)
           }
         }
       }
     }
     case (c_ExecCtrl_dataElementTcTimeProfile){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         var integer vl_tcOfScIdx := f_EPTF_ExecCtrl_getTcOfScenarioIdx(vl_tcIdx);
         if( -1 == vl_eGrpIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 == vl_tcOfScIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

         if (f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx) and vl_tcOfScIdx != 0 ) {
             pl_dataVarName := %definitionId&": Scenario can have TimeProfile only in the case of scenario is non-weighted or if scenario is weighted and tc is the first within scenario .\n";
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

         if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcOfScIdx and ((not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx) ) or
	 (f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx) and vl_tcOfScIdx == 0) ) ){
           pl_dataVarName := "Traffic.TimeProfile." & vl_entityGrpName & "." & int2str(vl_scIdx) & "." & int2str(vl_tcOfScIdx)
         }
       }
     }
     case (c_ExecCtrl_dataElementTcRegulator){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := ""; //optional
       if(sizeof(pl_params) == 2){
           if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                                {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                                pl_result)){
             vl_entityGrpName := pl_result[0];
             vl_scName        := pl_result[1];
             var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
             var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
             if( -1 == vl_eGrpIdx){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if( -1 == vl_scIdx){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if (f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
               pl_dataVarName := %definitionId&": Scenario "&vl_entityGrpName&"."&vl_scName&" is weighted, it cannot have a TC regulator.\n";
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if(-1 != vl_eGrpIdx and -1 != vl_scIdx and not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)){
                pl_dataVarName := "Traffic.Regulator." & vl_entityGrpName & "." & int2str(vl_scIdx);
             }
           }
       } else {
           if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                               {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
                                               pl_result)){
             vl_entityGrpName := pl_result[0];
             vl_scName        := pl_result[1];
             vl_tcName        := pl_result[2];
             var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName);
             var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
             var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
             var integer vl_tcIdxRel := -1;
             if( -1 != vl_tcIdx){
	              vl_tcIdxRel := v_ExecCtrl_trafficCases[vl_tcIdx].tcOfScenarioIdx;
             }
             if( -1 == vl_eGrpIdx){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if( -1 == vl_scIdx){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if (f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
               pl_dataVarName := %definitionId&": Scenario "&vl_entityGrpName&"."&vl_scName&" is weighted, it cannot have a TC regulator.\n";
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if( -1 == vl_tcIdx){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if( -1 == vl_tcIdxRel){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong: "&
                    "\n" & c_ExecCtrl_paramNameTrafficCase & ": " & vl_tcName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             if(-1 != vl_eGrpIdx and -1 != vl_scIdx and -1 != vl_tcIdxRel){
                pl_dataVarName := "Traffic.Regulator." & vl_entityGrpName & "." & int2str(vl_scIdx) & "." & int2str(vl_tcIdxRel)
             }
           }
       }
     }
     case (c_ExecCtrl_dataElementRegulatedItemType){
       var charstring vl_regulatedItemId := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatedItemId},
                                            pl_result)){
         vl_regulatedItemId := pl_result[0];
         var integer vl_key := -1;
         if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_regulatedItemsHash, vl_regulatedItemId, vl_key)){
            pl_dataVarName := "RegulatedItemType." & int2str(vl_key);
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatedItemId & ": " & vl_regulatedItemId;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatedItemName){
       var charstring vl_regulatedItemId := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatedItemId},
                                            pl_result)){
         vl_regulatedItemId := pl_result[0];
         var integer vl_key := -1;
         if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_regulatedItemsHash, vl_regulatedItemId, vl_key)){
            pl_dataVarName := "RegulatedItemName." & int2str(vl_key);
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatedItemId & ": " & vl_regulatedItemId;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatorName){
       var charstring vl_regulatedItemId := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatedItemId},
                                            pl_result)){
         vl_regulatedItemId := pl_result[0];
         var integer vl_key := -1;
         if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_regulatedItemsHash, vl_regulatedItemId, vl_key)){
            pl_dataVarName := f_EPTF_ExecCtrl_getRegulatorNameVarName(v_EPTF_ExecCtrl_RegulatedItems[vl_key].idName, vl_key);
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatedItemId & ": " & vl_regulatedItemId;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatedItemWeight){
       var charstring vl_regulatedItemId := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatedItemId},
                                            pl_result)){
         vl_regulatedItemId := pl_result[0];
         var integer vl_key := -1;
         if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_regulatedItemsHash, vl_regulatedItemId, vl_key)){
            pl_dataVarName := "RegulatedItemWeight." & int2str(vl_key);
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatedItemId & ": " & vl_regulatedItemId;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatedItemEnabled){
       var charstring vl_regulatedItemId := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatedItemId},
                                            pl_result)){
         vl_regulatedItemId := pl_result[0];
         var integer vl_key := -1;
         if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_regulatedItemsHash, vl_regulatedItemId, vl_key)){
            pl_dataVarName := "RegulatedItemEnabled." & int2str(vl_key);
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatedItemId & ": " & vl_regulatedItemId;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatorTotalValue){
       var charstring vl_regulatorName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatorName},
                                            pl_result)){
         vl_regulatorName := pl_result[0];
         var integer vl_regulatorId := f_EPTF_ExecCtrl_Regulator_getRegulatorId(vl_regulatorName);
         if(vl_regulatorId != -1){
           pl_dataVarName := f_EPTF_Var_getName(f_EPTF_ExecCtrl_Regulator_getRegulatorTotalValueIdxByRegulatorId(vl_regulatorId));
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatorName & ": " & vl_regulatorName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatorTargetLoad){
       var charstring vl_regulatorName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatorName},
                                            pl_result)){
         vl_regulatorName := pl_result[0];
         var integer vl_regulatorId := f_EPTF_ExecCtrl_Regulator_getRegulatorId(vl_regulatorName);
         if(vl_regulatorId != -1){
           pl_dataVarName := f_EPTF_Var_getName(f_EPTF_ExecCtrl_Regulator_getRegulatorTargetLoadIdxByRegulatorId(vl_regulatorId));
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatorName & ": " & vl_regulatorName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatorCurrentLoad){
       var charstring vl_regulatorName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatorName},
                                            pl_result)){
         vl_regulatorName := pl_result[0];
         var integer vl_regulatorId := f_EPTF_ExecCtrl_Regulator_getRegulatorId(vl_regulatorName);
         if(vl_regulatorId != -1){
           pl_dataVarName := f_EPTF_Var_getName(f_EPTF_ExecCtrl_Regulator_getRegulatorCurrentLoadIdxByRegulatorId(vl_regulatorId));
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatorName & ": " & vl_regulatorName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementRegulatorStatus){
       var charstring vl_regulatorName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameRegulatorName},
                                            pl_result)){
         vl_regulatorName := pl_result[0];
         var integer vl_regulatorId := f_EPTF_ExecCtrl_Regulator_getRegulatorId(vl_regulatorName);
         if(vl_regulatorId != -1){
           pl_dataVarName := f_EPTF_Var_getName(f_EPTF_ExecCtrl_Regulator_getRegulatorStatusIdxByRegulatorId(vl_regulatorId));
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameRegulatorName & ": " & vl_regulatorName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementNofDeployedLGens){
       // this if is needed to avoid false warning if the second param version is used:
       if (sizeof(pl_params)==1 and pl_params[0].paramName == c_ExecCtrl_paramNameEntityGroup) {
         if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup},
                                            pl_result)){
           var charstring vl_entityGrpName := "";
           vl_entityGrpName := pl_result[0];
           if( -1 != f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
             pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_entityGrpName&".nofLGens"
           } else {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
                "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         }
       } else {
	  if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                              {c_ExecCtrl_paramNameScenarioInstance},
                                              pl_result)){
            var charstring vl_scInstanceName := pl_result[0];
            var integer vl_scenarioIdx := f_EPTF_ExecCtrl_getScenarioIdxByInstanceName(vl_scInstanceName);
	    if( -1 != vl_scenarioIdx ){
    	      pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&v_ExecCtrl_entityGroups[v_ExecCtrl_scenarios[vl_scenarioIdx].eGroupIdx].name&".nofLGens"
            } else {
              pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameScenarioInstance & ": " & vl_scInstanceName;
              f_EPTF_ExecCtrl_warning(pl_dataVarName);
            }

          }

       }
     }
     case (c_ExecCtrl_dataElementNofActiveEntities){
       var charstring vl_entityGrpName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         if( -1 != f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
           pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_entityGrpName&".nofActiveEntities"
         } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementScStatus){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         if( -1 == f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 != vl_scIdx ){
           var charstring vl_scTypeName := v_ExecCtrl_scenarios[vl_scIdx].scData.name;
           pl_dataVarName := "ExecCtrl.scenarioStatus."& vl_entityGrpName &"." & vl_scTypeName
         }
       }

     }
     case (c_ExecCtrl_dataElementScTargetCPS){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         if( -1 == f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 != vl_scIdx ){
           if (not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
             pl_dataVarName := %definitionId&"Warning: Scenario "&vl_entityGrpName&"."&vl_scName&" is not weighted \n";
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
           pl_dataVarName := "Traffic.ScenarioCPS."& vl_entityGrpName &"." & int2str(vl_scIdx)
         }
       }
     }
     case (c_ExecCtrl_dataElementScRegulatorName){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         if( -1 == f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         if( -1 != vl_scIdx ){
           if (not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx)) {
             pl_dataVarName := %definitionId&"Warning: Scenario "&vl_entityGrpName&"."&vl_scName&" is not weighted \n";
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
           pl_dataVarName := "Traffic.Regulator."& vl_entityGrpName &"." & int2str(vl_scIdx)
         }
       }
     }
     case (c_ExecCtrl_dataElementScGrpCurrentPhase){
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioGroup}, pl_result, true)){
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_getIdx(pl_result[0])
          pl_dataVarName := "Var."& "Execution_Control.PhaseLists.tabbox"&"."&v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].groupPhaseList.name&".tab" &
          "." & pl_result[0] & ".GroupPhase";
       } else if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result))
       {
         var charstring vl_entityGrpName := "";
         var charstring vl_scName := "";

         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         if( -1 == f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         if( -1 == vl_scIdx){
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong."&
              "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if( -1 != vl_scGrpIdx ){
            pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & ".GroupPhase"
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     //ethjgy
     case (c_ExecCtrl_dataElementScGrpMode){
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioGroup}, pl_result, true)){
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_getIdx(pl_result[0])
         pl_dataVarName := "Var."& "Execution_Control.PhaseLists.tabbox"&"."&v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].groupPhaseList.name&".tab" &
         "." & pl_result[0] & ".GroupMode";
       } else if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result))
      {
         var charstring vl_eGrpName := "";
         var charstring vl_scName := "";
         vl_eGrpName := pl_result[0];
         vl_scName   := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if (vl_scGrpIdx!=-1) {
           pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & ".GroupMode";
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

       }
     }
     case (c_ExecCtrl_dataElementScGrpStatus){
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioGroup}, pl_result, true)){
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_getIdx(pl_result[0])
         pl_dataVarName := "Var."& "Execution_Control.PhaseLists.tabbox"&"."&v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].groupPhaseList.name&".tab" &
         "." & pl_result[0] & ".GroupStatus";
       } else if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result))
       {
         var charstring vl_eGrpName := "";
         var charstring vl_scName := "";

         vl_eGrpName := pl_result[0];
         vl_scName   := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if (vl_scGrpIdx!=-1) {
           pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & ".GroupStatus";
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

       }
     }
     case (c_ExecCtrl_dataElementScGrpStart){
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioGroup}, pl_result, true)){
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_getIdx(pl_result[0])
         pl_dataVarName := "Var."& "Execution_Control.PhaseLists.tabbox"&"."&v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].groupPhaseList.name&".tab" &
         "." & pl_result[0] & ".GroupStart";
       } else if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result))
       {
         var charstring vl_eGrpName := "";
         var charstring vl_scName := "";

         vl_eGrpName := pl_result[0];
         vl_scName   := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if (vl_scGrpIdx!=-1) {
           pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & ".GroupStart";
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

       }
     }
     case (c_ExecCtrl_dataElementScGrpTerminate){
      var charstring vl_eGrpName := "";
      var charstring vl_scName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result)
       ) {

         vl_eGrpName := pl_result[0];
         vl_scName   := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if (vl_scGrpIdx!=-1) {
           pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & ".TerminateGroup";
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }

       }
     }
     case (c_ExecCtrl_dataElementScGrpReset){
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioGroup}, pl_result, true)){
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_getIdx(pl_result[0])
         pl_dataVarName := "Var."& "Execution_Control.PhaseLists.tabbox"&"."&v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].groupPhaseList.name&".tab" &
         "." & pl_result[0] & ".GroupReset";
       } else if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result))
       {
         var charstring vl_eGrpName := "";
         var charstring vl_scName := "";

         vl_eGrpName := pl_result[0];
         vl_scName   := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if (vl_scGrpIdx!=-1) {
           pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & ".GroupReset";
         } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         }
       }
     }
     case (c_ExecCtrl_dataElementScGrpScStatus){
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioGroup, c_ExecCtrl_paramNameScenarioInstance}, pl_result, true)){
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_getIdx(pl_result[0])
         pl_dataVarName := "Var."& "Execution_Control.PhaseLists.tabbox"&"."&v_ExecCtrl_ScenarioGroupInstanceDB.data[vl_scGrpIdx].groupPhaseList.name&".tab" &
         "." & pl_result[0] & "." & pl_result[1] & ".ScenarioStatus";
      } else
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result))
       {
         var charstring vl_eGrpName := "";
         var charstring vl_scName := "";
         vl_eGrpName := pl_result[0];
         vl_scName   := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
         if(vl_scIdx != -1){
           var charstring vl_scInstanceName := f_EPTF_ExecCtrl_getScenarioInstanceName(vl_scIdx);
           if(vl_scGrpIdx != -1){
             pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx) & "." & vl_scInstanceName & ".ScenarioStatus";
           } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be in a group: "&vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
         }
       }
     }
     case (c_ExecCtrl_dataElementScStartButton){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result)
       ) {

         vl_eGrpName := pl_result[0];
         vl_scTypeName   := pl_result[1];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".ControlButtons.Start";
       }
     }
     case (c_ExecCtrl_dataElementScStopButton){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result)
       ) {

         vl_eGrpName := pl_result[0];
         vl_scTypeName   := pl_result[1];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".ControlButtons.Stop";
       }
     }
     case (c_ExecCtrl_dataElementScReset){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
         pl_result)
       ) {

         vl_eGrpName := pl_result[0];
         vl_scTypeName   := pl_result[1];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".ControlButtons.Reset";
       }
     }
     case (c_ExecCtrl_dataElementTcStartButton){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&".ControlButtons.Start";
       }
     }
     case (c_ExecCtrl_dataElementTcStopButton){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&".ControlButtons.Stop";
       }
     }
     case (c_ExecCtrl_dataElementTcGroupFinishStatus){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&".GroupFinishStatusLED";
       }
     }
     case (c_ExecCtrl_dataElementTcStatus){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {
         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := "ExecCtrl.trafficCaseStatus."&vl_eGrpName&"."&vl_scTypeName&"."&vl_tcName;
       }
     }
     case (c_ExecCtrl_dataElementTcGrpFinishStatus){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      var charstring vl_statName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase, c_ExecCtrl_paramNameCondition},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         vl_statName   := pl_result[3]
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&
            vl_tcName&".GroupFinishCondStatusLED."&vl_statName;
       }
     }
     case (c_ExecCtrl_dataElementTcExecTime){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&
          vl_scTypeName&".TC."&vl_tcName&".ExecTime";
       }
     }
     case (c_ExecCtrl_dataElementTcGoS){
       var charstring vl_eGrpName := "";
       var charstring vl_scTypeName := "";
       var charstring vl_tcName := "";
       if(0 == f_EPTF_ExecCtrl_getParams(
          pl_params,
          {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
          pl_result)
        ) {

          vl_eGrpName   := pl_result[0];
          vl_scTypeName := pl_result[1];
          vl_tcName     := pl_result[2];

          var charstring vl_nofSuccVarName,vl_nofFailVarName,vl_nofTimeoutVarName,vl_nofErrorVarName;
          vl_nofSuccVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&"."&c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Success]
          vl_nofFailVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&"."&c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Fail]
          vl_nofErrorVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&"."&c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Error]
          vl_nofTimeoutVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scTypeName&".TC."&vl_tcName&"."&c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Timeout]
          var integer vl_tcId := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_eGrpName,vl_scTypeName,vl_tcName);
          var charstring vl_statManagerPTCName := f_EPTF_Base_selfName();
          if (v_EPTF_ExecCtrl_nofExternalStatHandlers>0) {
            vl_statManagerPTCName := "ExecCtrl_ExternalStatHandler_Comp_"&log2str(vl_tcId mod v_EPTF_ExecCtrl_nofExternalStatHandlers)
          }
          // forward request to StatManager:
          if (0 != f_EPTF_DataSourceClient_getData(
            pl_dataVarName := pl_dataVarName,
            pl_source := "StatManager",
            pl_ptcName := vl_statManagerPTCName,
            pl_element := "GoS",
            pl_params := {
              {paramName := "SuccessVarName", paramValue := vl_nofSuccVarName},
              {paramName := "FailVarName", paramValue := vl_nofFailVarName},
              {paramName := "TimeoutVarName", paramValue := vl_nofTimeoutVarName},
              {paramName := "ErrorVarName", paramValue := vl_nofErrorVarName}
            }
          )) {
            pl_dataVarName := "GoS does not exist"
          }
        }
     }
     case (c_ExecCtrl_dataElementTcSingleShotEntityIdx){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&
          vl_scTypeName&".TC."&vl_tcName&".SingleShotTc.EIdx";
       }
     }
     case (c_ExecCtrl_dataElementTcSingleShotEnableLog){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&
          vl_scTypeName&".TC."&vl_tcName&".SingleShotTc.EnableLog";
       }
     }
     case (c_ExecCtrl_dataElementTcSingleShotStart){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_tcName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
         pl_result)
       ) {

         vl_eGrpName   := pl_result[0];
         vl_scTypeName := pl_result[1];
         vl_tcName     := pl_result[2];
         pl_dataVarName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&
          vl_scTypeName&".TC."&vl_tcName&".SingleShotTc.Start";
       }
     }
     case (c_ExecCtrl_dataElementPhaseListEnablePhase){
      var charstring vl_phaseListName := "";
      var charstring vl_phaseName := "";
      //v_ExecCtrl_PhaseListDeclaratorDB.data[pl_declaratorIdx].phases[pl_phaseIdx].enabled
      if(0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNamePhaseList, c_ExecCtrl_paramNamePhase}, pl_result)) {
         vl_phaseListName := pl_result[0];
         vl_phaseName := pl_result[1];
         pl_dataVarName := "Var." & "Execution_Control.PhaseLists.tabbox"&"."& vl_phaseListName &".tab" & ".mainTable." & vl_phaseName;
      }
     }
     case (c_ExecCtrl_dataElementScGrpEnablePhase){
      var charstring vl_scGrpName := "";
      var charstring vl_phaseName := "";
      if(0 == f_EPTF_ExecCtrl_getParams(
         pl_params,
         {c_ExecCtrl_paramNameScenarioGroup, c_ExecCtrl_paramNamePhase},
         pl_result)
       ) {

         vl_scGrpName := pl_result[0];
         vl_phaseName := pl_result[1];
         var integer vl_scGrpIdx;
         if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_ScenarioGroupInstanceDB.hashRef, vl_scGrpName, vl_scGrpIdx)) {
           var charstring p_phaseListDeclaratorName := f_EPTF_ExecCtrl_getScenarioGroupInstanceGroupPhaseListName(vl_scGrpIdx);
           var integer p_idx;
           if (f_EPTF_str2int_HashMap_Find(v_ExecCtrl_PhaseListDeclaratorDB.hashRef, p_phaseListDeclaratorName, p_idx)) {
             //"Var."&f_EPTF_ExecCtrl_UIVars_getPhaseListTabName_FromPhaseListDB(p_idx)&
             //".mainTable."&f_EPTF_ExecCtrl_getPhaseListDeclaratorPhaseName(p_idx,i)
             pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getPhaseListTabName_FromPhaseListDB(p_idx)&
              ".mainTable."&vl_phaseName;
           };
         }
       }
     }
     case (c_ExecCtrl_dataElementScGrpScEnablePhase){
      var charstring vl_eGrpName := "";
      var charstring vl_scTypeName := "";
      var charstring vl_phaseName := "";
      // this if is needed to avoid false warning if the second param version is used:
      if (sizeof(pl_params)==3) {
        if(0 == f_EPTF_ExecCtrl_getParams(
           pl_params,
           {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNamePhase},
           pl_result)
         ) {

           vl_eGrpName   := pl_result[0];
           vl_scTypeName := pl_result[1];
           vl_phaseName  := pl_result[2];
           var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scTypeName);
           var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
           if (vl_scIdx!=-1 and vl_scGrpIdx!=-1) {
             var charstring vl_scInstanceName := f_EPTF_ExecCtrl_getScenarioInstanceName(vl_scIdx);
             //"Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(p_idx)&"."&
             //  f_EPTF_ExecCtrl_getScenarioGroupInstanceScenarioName(p_idx,j)&"."&
             //  f_EPTF_ExecCtrl_getScenarioGroupInstanceScenarioPhaseListPhaseName(p_idx,j,i)
             pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx)&"."&
              vl_scInstanceName&"."&
              vl_phaseName;
           }
         }
       } else {
            if(0 == f_EPTF_ExecCtrl_getParams(
               pl_params,
               {c_ExecCtrl_paramNameScenarioInstance, c_ExecCtrl_paramNamePhase},
               pl_result)
             ) {
               var charstring vl_scInstanceName := pl_result[0];
               vl_phaseName  := pl_result[1];
               var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdxByInstanceName(vl_scInstanceName);
               var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
               if (vl_scIdx!=-1 and vl_scGrpIdx!=-1) {
                 pl_dataVarName := "Var."&f_EPTF_ExecCtrl_UIVars_getScenarioGroupTableName_FromScenarioGroupDB(vl_scGrpIdx)&"."&
                  vl_scInstanceName&"."&
                  vl_phaseName;
               }
             }
       }
     }
     //eptebal
     case (c_ExecCtrl_dataElementEGrpOffset){
       var charstring vl_entityGrpName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         pl_dataVarName := "EPTF_ExecCtrl.Statistics.EG."&vl_entityGrpName&".eOffset";
       }
     }
     case (c_ExecCtrl_dataElementEGrpLGenPool){
       var charstring vl_entityGrpName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         pl_dataVarName := "EPTF_ExecCtrl.Statistics.EG."&vl_entityGrpName&".LGenPool";
       }
     }
     case (c_ExecCtrl_dataElementScInstanceName){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         pl_dataVarName := "EPTF_ExecCtrl.Statistics.EG."&vl_entityGrpName&".SC."&vl_scName&".instanceName";
       }
     }
     case (c_ExecCtrl_dataElementScPhaseListName){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         pl_dataVarName := "EPTF_ExecCtrl.Statistics.EG."&vl_entityGrpName&".SC."&vl_scName&".phaseListName";
       }
     }
     case (c_ExecCtrl_dataElementScScGrpName){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         pl_dataVarName := "EPTF_ExecCtrl.Statistics.EG."&vl_entityGrpName&".SC."&vl_scName&".scGrpName";
       }
     }
     case (c_ExecCtrl_dataElementTcStat){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       var charstring vl_tcStatName := "";
       
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase, c_ExecCtrl_paramNameStatistic},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         vl_tcStatName    := pl_result[3];

         var charstring vl_statName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_entityGrpName&".SC."&vl_scName&".TC."&vl_tcName&"."&vl_tcStatName;
         if (vl_tcStatName == c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_ExecTime]) {
           pl_dataVarName := vl_statName;
         } else {
           var EPTF_StatHandler_CT vl_statHandler := f_EPTF_ExecCtrl_findStatHandler(vl_statName);
           if (vl_statHandler == null ) {
             pl_dataVarName := %definitionId& ": StatHandler is not found for statistic: "&vl_statName;
             f_EPTF_ExecCtrl_debug(pl_dataVarName);
           } else {
             if (vl_statHandler!=self) {
               f_EPTF_Var_subscribeRemote(
                     pl_remoteCompRef := vl_statHandler,
                     pl_remoteProviderVarName := vl_statName,
                     pl_subscriptionMode :=  vl_subscriptionModeForVars,
                     pl_idx := vl_idx,
                     pl_localName := vl_statName&"_Local"
               );
               if (vl_idx==-1) {
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_statName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
               } else {
                 pl_dataVarName := f_EPTF_Var_getName(vl_idx);
               }
             } else {
                if (not f_EPTF_StatHandler_getVarNameByStatName(vl_statName, pl_dataVarName)){
                  pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_statName;
                  f_EPTF_ExecCtrl_warning(pl_dataVarName);
                }
             }
           }
         }
       }
     }
     // {Delta statistics}: for LGen Variables
     case (c_ExecCtrl_dataElementTcStatDelta){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       var charstring vl_tcStatName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase, c_ExecCtrl_paramNameStatistic},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         vl_tcStatName    := pl_result[3];

         var charstring vl_varDeltaName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_entityGrpName&".SC."&vl_scName&".TC."&vl_tcName&"."&vl_tcStatName&".delta";
         var integer vl_varDeltaId := f_EPTF_Var_getId(vl_varDeltaName);
         if(0<=vl_varDeltaId){
           pl_dataVarName := vl_varDeltaName;
         }
       }
     }
     case (c_ExecCtrl_dataElementCurrentCPS){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         if( not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx) ){
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario should be weighted: "&vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
         } else {
           var charstring vl_statName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_entityGrpName&".SC."&vl_scName&".CurrentCPS";
           var EPTF_StatHandler_CT vl_statHandler := f_EPTF_ExecCtrl_findStatHandler(vl_statName);
           if (vl_statHandler == null ) {
             pl_dataVarName := %definitionId& ": StatHandler is not found for statistic: "&vl_statName;
             f_EPTF_ExecCtrl_debug(pl_dataVarName);
           } else {
             if (vl_statHandler!=self) {
               f_EPTF_Var_subscribeRemote(
                     pl_remoteCompRef := vl_statHandler,
                     pl_remoteProviderVarName := vl_statName,
                     pl_subscriptionMode :=  vl_subscriptionModeForVars,
                     pl_idx := vl_idx
               );
               if (vl_idx==-1) {
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_statName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
               } else {
                 pl_dataVarName := f_EPTF_Var_getName(vl_idx);
               }
             } else {
               if (not f_EPTF_StatHandler_getVarNameByStatName(vl_statName, pl_dataVarName)){
                 pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_statName;
                 f_EPTF_ExecCtrl_warning(pl_dataVarName);
               }
             }
           }
         }
       }
     }
     case (c_ExecCtrl_dataElementFSMStat){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       var charstring vl_fsmStatName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase, c_ExecCtrl_paramNameStatistic},
                                            pl_result)){
         vl_eGrpName      := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         vl_fsmStatName   := pl_result[3];

         var charstring vl_statName := c_EPTF_ExecCtrl_statisticsRoot&".EG."&vl_eGrpName&".SC."&vl_scName&".TC."&vl_tcName&".FSMStats."&vl_fsmStatName;
         var EPTF_StatHandler_CT vl_statHandler := f_EPTF_ExecCtrl_findStatHandler(vl_statName);
         if (vl_statHandler == null ) {
           pl_dataVarName := %definitionId& ": StatHandler is not found for statistic: "&vl_statName;
           f_EPTF_ExecCtrl_debug(pl_dataVarName);
         } else {
           if (vl_statHandler!=self) {
             f_EPTF_Var_subscribeRemote(
                   pl_remoteCompRef := vl_statHandler,
                   pl_remoteProviderVarName := vl_statName,
                   pl_subscriptionMode :=  vl_subscriptionModeForVars,
                   pl_idx := vl_idx
             );
             if (vl_idx==-1) {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_statName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             } else {
               pl_dataVarName := f_EPTF_Var_getName(vl_idx);
             }
           } else {
             if (not f_EPTF_StatHandler_getVarNameByStatName(vl_statName, pl_dataVarName)){
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_statName;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
           }
         }
       }
     }
     case(c_ExecCtrl_dataElementScGroupOfSc){
       var charstring vl_eGrpName := "";
       var charstring vl_scName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                            pl_result)){
         vl_eGrpName      := pl_result[0];
         vl_scName        := pl_result[1];
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_eGrpName, vl_scName);
         if (vl_scIdx!=-1) {
           var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
  	       if (vl_scGrpIdx != -1){
			 pl_dataVarName := c_ExecCtrl_DS_externalDataVar_prefix & "ScGroupOfSc_" & int2str(vl_scIdx)
       	   } else {
             pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario is not in scenarioGroup: "& vl_scName;
             f_EPTF_ExecCtrl_warning(pl_dataVarName);
           }
    	 } else {
           pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Scenario doesn't exist: "& vl_scName;
           f_EPTF_ExecCtrl_warning(pl_dataVarName);
    	 }
       }
     }
     case (c_ExecCtrl_dataElementGlobalStat){
       var charstring vl_globalStatName := "";
       if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                            {c_ExecCtrl_paramNameStatistic},
                                            pl_result)){
         vl_globalStatName    := pl_result[0];
         var charstring vl_globalStatNameFull := c_EPTF_ExecCtrl_statisticsRoot&"."&vl_globalStatName;
         var EPTF_StatHandler_CT vl_statHandler := f_EPTF_ExecCtrl_findStatHandler(vl_globalStatNameFull);
         if (vl_statHandler == null ) {
           pl_dataVarName := %definitionId& ": StatHandler is not found for statistic: "&vl_globalStatNameFull;
           f_EPTF_ExecCtrl_debug(pl_dataVarName);
         } else {
           if (vl_statHandler!=self) {
             f_EPTF_Var_subscribeRemote(
                   pl_remoteCompRef := vl_statHandler,
                   pl_remoteProviderVarName := vl_globalStatNameFull,
                   pl_subscriptionMode :=  vl_subscriptionModeForVars,
                   pl_idx := vl_idx
             );
             if (vl_idx==-1) {
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_globalStatNameFull;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
             pl_dataVarName := f_EPTF_Var_getName(vl_idx);
           } else {
             if (not f_EPTF_StatHandler_getVarNameByStatName(vl_globalStatNameFull, pl_dataVarName)){
               pl_dataVarName := %definitionId& ": Datasource Parameter is wrong. Statistic doesn't exist: "&vl_globalStatNameFull;
               f_EPTF_ExecCtrl_warning(pl_dataVarName);
             }
           }
         }
       }
     }
     case else {  //error, no rule for that
        pl_dataVarName := %definitionId& ": unhandled element: "& pl_element;
        f_EPTF_ExecCtrl_warning(pl_dataVarName);
        return -1;
     }
    }

    var integer vl_iteratorVarIdx := f_EPTF_Var_getId(pl_dataVarName);
    if(vl_iteratorVarIdx == -1){
      pl_dataVarName := %definitionId&": Invalid DataSource parameter: Invalid iterator or externalData or parameter: "&
        "\nSource: "&pl_source&
        "\nPTC : "&pl_ptcName &
        "\nElement Name : " &pl_element&
        "\nParams: " & log2str(pl_params)&
        "\nReason: "&pl_dataVarName;
      f_EPTF_ExecCtrl_warning(pl_dataVarName);
      return -2;
    }
    return 0;
  }

///////////////////////////////////////////////////////////
//  Function: f_EPTF_ExecCtrl_DSProcessDataValue
// 
//  Purpose:
//    Processes the incoming DataValue requests - iterators and external data elements - and gives back the value.
//    It should be registered in the ExecCtrl_init_CT. Type function fcb_EPTF_DataSourceClient_dataValueHandler
//
//  Parameters:
//    *out *<EPTF_Var_DirectContent>* pl_dataValue* - the value of the data or the iterator result
//    *in charstring pl_source* - the name of the data source 'feature'
//    *in charstring pl_ptcName* - the name of the ptc (ID of the PTC)  
//    *in charstring pl_element* - the name of the data element
//    *in* <EPTF_DataSource_Params> *pl_params* - the parameters
//      of the data for the dataElement
//
//  Return Value:
//    integer - error code (0 of OK, non zero if unsuccessful: e.g. invalid parameters given in pl_params)
//
//  Detailed Comments: 
//    -
//
///////////////////////////////////////////////////////////
friend function f_EPTF_ExecCtrl_DSProcessDataValue(out EPTF_Var_DirectContent pl_dataValue,
                                              in charstring pl_source,
                                              in charstring pl_ptcName,
                                              in charstring pl_element,
                                              in EPTF_DataSource_Params pl_params)
runs on EPTF_ExecCtrl_CT return integer{   
  var integer vl_errorCode := -1;
  var EPTF_CharstringList pl_result := {};
  pl_dataValue := {unknownVal := {omit}}; // set it to invalid
  select( pl_element )
  {
    case(c_EPTF_DataSource_dataElement_Help) {
      vl_errorCode := f_EPTF_DataSource_handleHelp(pl_dataValue,pl_source,pl_params,c_EPTF_ExecCtrl_help);
    }
    case(c_EPTF_DataSource_dataElement_isWritable) {
      var charstring vl_source;
      var charstring vl_ptcName;
      var charstring vl_element;
      var EPTF_DataSource_Params vl_params;

      vl_errorCode := f_EPTF_DataSource_getRequestPartsFromParams(pl_params, vl_source, vl_ptcName, vl_element, vl_params);
      if (vl_errorCode == 0) {
        if (vl_element == c_ExecCtrl_dataElementRestart) {
          pl_dataValue := {boolVal := true};
        } else {
          vl_errorCode := -1;
        }
      }
    }
    case(c_ExecCtrl_dataElementEntityGroupOfScenarioInstance) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioInstance}, pl_result, true)){
        var charstring vl_scInstanceName := pl_result[0];
        var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdxByInstanceName(vl_scInstanceName);
        if (vl_scIdx==-1) {
          var charstring vl_errorMsg := %definitionId& ": Datasource Parameter is wrong: "&
             "\n" & c_ExecCtrl_paramNameScenarioInstance & ": " & vl_scInstanceName;
          pl_dataValue:={charstringVal := vl_errorMsg}
          vl_errorCode := 2;
        } else {
          var integer vl_eGrpIdx := v_ExecCtrl_scenarios[vl_scIdx].eGroupIdx;
          var charstring vl_eGrpName := v_ExecCtrl_entityGroups[vl_eGrpIdx].name;
          pl_dataValue:={charstringVal := vl_eGrpName}
          vl_errorCode := 0;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameScenarioInstance;
        pl_dataValue:={charstringVal := vl_errorMsg}
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementScenarioTypeNameOfScenarioInstance) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioInstance}, pl_result, true)){
        var charstring vl_scInstanceName := pl_result[0];
        var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdxByInstanceName(vl_scInstanceName);
        if (vl_scIdx==-1) {
          var charstring vl_errorMsg := %definitionId& ": Datasource Parameter is wrong: "&
             "\n" & c_ExecCtrl_paramNameScenarioInstance & ": " & vl_scInstanceName;
          pl_dataValue:={charstringVal := vl_errorMsg}
          vl_errorCode := 2;
        } else {
          var charstring vl_scTypeName := v_ExecCtrl_scenarios[vl_scIdx].scData.name;
          pl_dataValue:={charstringVal := vl_scTypeName}
          vl_errorCode := 0;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameScenarioInstance;
        pl_dataValue:={charstringVal := vl_errorMsg}
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_iteratorEGrpsOnClients) {
      var integer vl_egrpsSize := sizeof(v_ExecCtrl_entityGroups);
      var EPTF_CharstringList vl_result := {};
      for (var integer i := 0; i < vl_egrpsSize; i := i + 1) {
        var integer vl_clientsSize := sizeof(v_ExecCtrl_entityGroups[i].lgenList);
        for (var integer j := 0; j < vl_clientsSize; j := j + 1) {
          vl_result[sizeof(vl_result)] := int2str(i) & "." & int2str(j);
        }
      }
      pl_dataValue.charstringlistVal := vl_result;
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementEntityGroupOfEGrpOnClient) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameEGrpOnClient}, pl_result, true)){
        var charstring vl_lgenInstanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_lgenInstanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_egrpIndex := str2int(vl_instanceParts[0]);
          if (vl_egrpIndex < sizeof(v_ExecCtrl_entityGroups)) {
            pl_dataValue.charstringVal := v_ExecCtrl_entityGroups[vl_egrpIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEGrpOnClient & " is wrong: nonexistent EntityGroup.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEGrpOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEGrpOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementClientOfEGrpOnClient) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameEGrpOnClient}, pl_result, true)){
        var charstring vl_lgenInstanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_lgenInstanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_egrpIndex := str2int(vl_instanceParts[0]);
          var integer vl_clientIndex := str2int(vl_instanceParts[1]);
          if (vl_egrpIndex < sizeof(v_ExecCtrl_entityGroups) and vl_clientIndex < sizeof(v_ExecCtrl_entityGroups[vl_egrpIndex].lgenList)) {
            pl_dataValue.charstringVal := v_ExecCtrl_lgens[v_ExecCtrl_entityGroups[vl_egrpIndex].lgenList[vl_clientIndex].lgenIdx].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEGrpOnClient & " is wrong: nonexistent EntityGroup or LGen.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEGrpOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEGrpOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_iteratorEntityTypesForLGenOnClients) {
      var integer vl_clientsSize := sizeof(v_ExecCtrl_lgens);
      var EPTF_CharstringList vl_result := {};
      for (var integer i := 0; i < vl_clientsSize; i := i + 1) {
        var integer vl_egrpTypesSize := sizeof(v_ExecCtrl_lgens[i].resourceList);
        for (var integer j := 0; j < vl_egrpTypesSize; j := j + 1) {
          vl_result[sizeof(vl_result)] := int2str(i) & "." & int2str(j);
        }
      }
      pl_dataValue.charstringlistVal := vl_result;
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementClientOfEntityTypesForLGenOnClients) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameEntityTypeForLGenOnClient}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_clientsIndex := str2int(vl_instanceParts[0]);
          if (vl_clientsIndex < sizeof(v_ExecCtrl_lgens)) {
            pl_dataValue.charstringVal := v_ExecCtrl_lgens[vl_clientsIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong: nonexistent LGen.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEntityTypeForLGenOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementEntityTypeOfEntityTypesForLGenOnClients) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameEntityTypeForLGenOnClient}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_clientsIndex := str2int(vl_instanceParts[0]);
          var integer vl_typeIndex := str2int(vl_instanceParts[1]);
          if (vl_clientsIndex < sizeof(v_ExecCtrl_lgens) and vl_typeIndex < sizeof(v_ExecCtrl_lgens[vl_clientsIndex].resourceList)) {
            pl_dataValue.charstringVal := v_ExecCtrl_lgens[vl_clientsIndex].resourceList[vl_typeIndex].eType;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong: nonexistent LGen or resource.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEntityTypeForLGenOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_iteratorScenariosOnClients) {
      var integer vl_clientsSize := sizeof(v_ExecCtrl_lgens);
      var EPTF_CharstringList vl_result := {};
      for (var integer i := 0; i < vl_clientsSize; i := i + 1) {
        var integer vl_egrpsSize := sizeof(v_ExecCtrl_lgens[i].eGroups);
        for (var integer j := 0; j < vl_egrpsSize; j := j + 1) {
          var integer vl_egrpIndex := v_ExecCtrl_lgens[i].eGroups[j].eGrpIdx;
          var integer vl_scenariosSize := sizeof(v_ExecCtrl_entityGroups[vl_egrpIndex].scenarios);
          for (var integer k := 0; k < vl_scenariosSize; k := k + 1) {
            var integer vl_scenarioIndex := v_ExecCtrl_entityGroups[vl_egrpIndex].scenarios[k];
            vl_result[sizeof(vl_result)] := int2str(i) & "." & int2str(vl_egrpIndex) & "." & int2str(vl_scenarioIndex);
          }
        }
      }
      pl_dataValue.charstringlistVal := vl_result;
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementClientOfScenariosOnClients) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioOnClient}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 3) {
          var integer vl_clientsIndex := str2int(vl_instanceParts[0]);
          if (vl_clientsIndex < sizeof(v_ExecCtrl_lgens)) {
            pl_dataValue.charstringVal := v_ExecCtrl_lgens[vl_clientsIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong: nonexistent LGen.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEntityTypeForLGenOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementEntityGroupOfScenariosOnClients) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioOnClient}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 3) {
          var integer vl_egrpIndex := str2int(vl_instanceParts[1]);
          if (vl_egrpIndex < sizeof(v_ExecCtrl_entityGroups)) {
            pl_dataValue.charstringVal := v_ExecCtrl_entityGroups[vl_egrpIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong: nonexistent EntityGroup.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEntityTypeForLGenOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementScenarioOfScenariosOnClients) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioOnClient}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 3) {
          var integer vl_scenarioIndex := str2int(vl_instanceParts[2]);
          if (vl_scenarioIndex < sizeof(v_ExecCtrl_scenarios)) {
            pl_dataValue.charstringVal := v_ExecCtrl_scenarios[vl_scenarioIndex].scData.name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong: nonexistent Scenario.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameEntityTypeForLGenOnClient & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameEntityTypeForLGenOnClient;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_iteratorTrafficCasesOfScenarios) {
      var integer vl_scenariosSize := sizeof(v_ExecCtrl_scenarios);
      var EPTF_CharstringList vl_result := {};
      for (var integer i := 0; i < vl_scenariosSize; i := i + 1) {
        var integer vl_trafficCasesSize := sizeof(v_ExecCtrl_scenarios[i].scData.tcList);
        for (var integer j := 0; j < vl_trafficCasesSize; j := j + 1) {
          vl_result[sizeof(vl_result)] := int2str(i) & "." & int2str(j);
        }
      }
      pl_dataValue.charstringlistVal := vl_result;
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementScenarioOfTrafficCasesOfScenarios) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameTrafficCaseOfScenario}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_scenarioIndex := str2int(vl_instanceParts[0]);
          if (vl_scenarioIndex < sizeof(v_ExecCtrl_scenarios)) {
            pl_dataValue.charstringVal := v_ExecCtrl_scenarios[vl_scenarioIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameTrafficCaseOfScenario & " is wrong: nonexistent Scenario.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameTrafficCaseOfScenario & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameTrafficCaseOfScenario;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementTrafficCaseOfTrafficCasesOfScenarios) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameTrafficCaseOfScenario}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_scenarioIndex := str2int(vl_instanceParts[0]);
          var integer vl_tcOfScidx := str2int(vl_instanceParts[1]);
          if (vl_scenarioIndex < sizeof(v_ExecCtrl_scenarios) and vl_tcOfScidx < sizeof(v_ExecCtrl_scenarios[vl_scenarioIndex].scData.tcList)) {
            pl_dataValue.charstringVal := v_ExecCtrl_scenarios[vl_scenarioIndex].scData.tcList[vl_tcOfScidx].tcPrivateName;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameTrafficCaseOfScenario & " is wrong: nonexistent Scenario or TrafficCase.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameTrafficCaseOfScenario & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameTrafficCaseOfScenario;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_iteratorScenariosOfScenarioGroupsWithPhaseList) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNamePhaseList}, pl_result, true)){
        var charstring vl_phaseList := pl_result[0];
        var integer vl_scgrpSize := sizeof(v_EPTF_ExecCtrl_ScenarioGroup_Declarators);
        var EPTF_CharstringList vl_result := {};
        for (var integer i := 0; i < vl_scgrpSize; i := i + 1) {
          if (v_EPTF_ExecCtrl_ScenarioGroup_Declarators[i].phaseListName == vl_phaseList) {
            var integer vl_scenariosOfScgrpSize := sizeof(v_EPTF_ExecCtrl_ScenarioGroup_Declarators[i].scenarioNames);
            for (var integer j := 0; j < vl_scenariosOfScgrpSize; j := j + 1) {
              vl_result[sizeof(vl_result)] := int2str(i) & "." & int2str(j);
            }
          }
        }
        pl_dataValue.charstringlistVal := vl_result;
        vl_errorCode := 0;
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNamePhaseList;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementScenarioGroupOfScenariosOfScenarioGroupsWithPhaseList) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioOfScenarioGroup}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_scenarioGroupIndex := str2int(vl_instanceParts[0]);
          if (vl_scenarioGroupIndex < sizeof(v_EPTF_ExecCtrl_ScenarioGroup_Declarators)) {
            pl_dataValue.charstringVal := v_EPTF_ExecCtrl_ScenarioGroup_Declarators[vl_scenarioGroupIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameScenarioOfScenarioGroup & " is wrong: nonexistent ScenarioGroup.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameScenarioOfScenarioGroup & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameScenarioOfScenarioGroup;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementScenarioOfScenariosOfScenarioGroupsWithPhaseList) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameScenarioOfScenarioGroup}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 2) {
          var integer vl_scenarioGroupIndex := str2int(vl_instanceParts[0]);
          var integer vl_scenariosOfScgrpSize := str2int(vl_instanceParts[1]);
          if (vl_scenarioGroupIndex < sizeof(v_EPTF_ExecCtrl_ScenarioGroup_Declarators) and vl_scenariosOfScgrpSize < sizeof(v_EPTF_ExecCtrl_ScenarioGroup_Declarators[vl_scenarioGroupIndex].scenarioNames)) {
            pl_dataValue.charstringVal := v_EPTF_ExecCtrl_ScenarioGroup_Declarators[vl_scenarioGroupIndex].scenarioNames[vl_scenariosOfScgrpSize];
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameScenarioOfScenarioGroup & " is wrong: nonexistent ScenarioGroup or Scenario.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameScenarioOfScenarioGroup & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameScenarioOfScenarioGroup;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementTcHasTimeProfile){
       var charstring vl_entityGrpName := "";
       var charstring vl_scName := "";
       var charstring vl_tcName := "";
       if (0 == f_EPTF_ExecCtrl_getParams(pl_params, {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase}, pl_result)) {
         vl_entityGrpName := pl_result[0];
         vl_scName        := pl_result[1];
         vl_tcName        := pl_result[2];
         
         var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
         var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(vl_entityGrpName,vl_scName,vl_tcName);
         var integer vl_tcIdxRel := f_EPTF_ExecCtrl_getTcOfScenarioIdx(vl_tcIdx);
         
         pl_dataValue := {boolVal := not f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx) or vl_tcIdxRel == 0};
         vl_errorCode := 0;
       } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given for " & c_ExecCtrl_dataElementTcHasTimeProfile & ". Expected: EntityGroup, Scenario, TrafficCase, received: " & log2str(pl_params);
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
       }
    }
    case(c_ExecCtrl_iteratorFSMStatsOfTrafficCases) {
      var EPTF_CharstringList vl_result := {};
      
      var integer vl_scenariosSize := sizeof(v_ExecCtrl_scenarios);
      for (var integer i := 0; i < vl_scenariosSize; i := i + 1) {
        var integer vl_trafficCasesSize := sizeof(v_ExecCtrl_scenarios[i].scData.tcList);
        var integer vl_eGroupIdx := v_ExecCtrl_scenarios[i].eGroupIdx;
        for (var integer j := 0; j < vl_trafficCasesSize; j := j + 1) {
          var charstring vl_fsmStatVarName := c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorFSMStats_varName & "."
            & v_ExecCtrl_entityGroups[vl_eGroupIdx].name & "."
            & v_ExecCtrl_scenarios[i].scData.name & "."
            & f_EPTF_LGenBase_tcNameOfTcOfSc(v_ExecCtrl_scenarios[i].scData,j);
          var integer vl_fsmStatsId := f_EPTF_Var_getId(vl_fsmStatVarName);
          var EPTF_CharstringList vl_fsmStats := f_EPTF_Var_getCharstringlistValue(vl_fsmStatsId);
          for (var integer k := 0; k < sizeof(vl_fsmStats); k := k + 1) {
            vl_result[sizeof(vl_result)] := int2str(i) & "." & int2str(j) & "." & int2str(vl_fsmStatsId) & "." & int2str(k);
          }
        }
      }
      
      pl_dataValue.charstringlistVal := vl_result;
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementScenarioOfFSMStatsOfTrafficCases) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameFSMStatsOfTrafficCase}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 4) {
          var integer vl_scenarioIndex := str2int(vl_instanceParts[0]);
          if (vl_scenarioIndex < sizeof(v_ExecCtrl_scenarios)) {
            pl_dataValue.charstringVal := v_ExecCtrl_scenarios[vl_scenarioIndex].name;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong: nonexistent Scenario.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameFSMStatsOfTrafficCase;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementTrafficCaseOfFSMStatsOfTrafficCases) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameFSMStatsOfTrafficCase}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 4) {
          var integer vl_scenarioIndex := str2int(vl_instanceParts[0]);
          var integer vl_tcOfScidx := str2int(vl_instanceParts[1]);
          if (vl_scenarioIndex < sizeof(v_ExecCtrl_scenarios) and vl_tcOfScidx < sizeof(v_ExecCtrl_scenarios[vl_scenarioIndex].scData.tcList)) {
            pl_dataValue.charstringVal := v_ExecCtrl_scenarios[vl_scenarioIndex].scData.tcList[vl_tcOfScidx].tcPrivateName;
            vl_errorCode := 0;
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong: nonexistent Scenario or TrafficCase.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameFSMStatsOfTrafficCase;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementFSMStatNameOfFSMStatsOfTrafficCases) {
      if(0 == f_EPTF_ExecCtrl_getParams( pl_params, {c_ExecCtrl_paramNameFSMStatsOfTrafficCase}, pl_result, true)){
        var charstring vl_instanceName := pl_result[0];
        var EPTF_CharstringList vl_instanceParts := f_EPTF_Common_splitString(vl_instanceName, ".");
        if (sizeof(vl_instanceParts) == 4) {
          var integer vl_fsmStatsVarId := str2int(vl_instanceParts[2]);
          var integer vl_fsmStatIndex := str2int(vl_instanceParts[3]);
          
          if (vl_fsmStatsVarId > 0) {
            var EPTF_CharstringList vl_fsmStatsList := f_EPTF_Var_getCharstringlistValue(vl_fsmStatsVarId);
            if (vl_fsmStatIndex < sizeof(vl_fsmStatsList)) {
              pl_dataValue.charstringVal := vl_fsmStatsList[vl_fsmStatIndex];
              vl_errorCode := 0;
            } else {
              var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong: nonexistent FSMStat.";
              pl_dataValue:={charstringVal := vl_errorMsg};
              vl_errorCode := 4;
            }
          } else {
            var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong: nonexistent FSMStats.";
            pl_dataValue:={charstringVal := vl_errorMsg};
            vl_errorCode := 3;
          }
        } else {
          var charstring vl_errorMsg := %definitionId& ": " & c_ExecCtrl_paramNameFSMStatsOfTrafficCase & " is wrong.";
          pl_dataValue:={charstringVal := vl_errorMsg};
          vl_errorCode := 2;
        }
      } else {
        var charstring vl_errorMsg := %definitionId& ": Wrong parameters are given. Parameter is missing: "& c_ExecCtrl_paramNameFSMStatsOfTrafficCase;
        pl_dataValue:={charstringVal := vl_errorMsg};
        vl_errorCode := 1;
      }
    }
    case(c_ExecCtrl_dataElementGetStartCommand){
      var charstring vl_executable := "";
      var charstring vl_configFile := "";
      var EPTF_CharstringList vl_testCase := {};
      pl_dataValue:={charstringVal := f_EPTF_Base_getStartCommand(vl_executable, vl_configFile, vl_testCase)};
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementGetExecutable){
      var charstring vl_executable := "";
      var charstring vl_configFile := "";
      var EPTF_CharstringList vl_testCase := {};
      f_EPTF_Base_getStartCommand(vl_executable, vl_configFile, vl_testCase);
      pl_dataValue:={charstringVal := vl_executable};
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementGetConfigFile){
      var charstring vl_executable := "";
      var charstring vl_configFile := "";
      var EPTF_CharstringList vl_testCase := {};
      f_EPTF_Base_getStartCommand(vl_executable, vl_configFile, vl_testCase);
      pl_dataValue:={charstringVal := vl_configFile};
      vl_errorCode := 0;
    }
    case(c_ExecCtrl_dataElementGetTestCases){
      var charstring vl_executable := "";
      var charstring vl_configFile := "";
      var EPTF_CharstringList vl_testCase := {};
      f_EPTF_Base_getStartCommand(vl_executable, vl_configFile, vl_testCase);
      pl_dataValue:={charstringlistVal := vl_testCase};
      vl_errorCode := 0;
    }
    case (c_ExecCtrl_dataElementTcGoS){
     var charstring vl_eGrpName := "";
     var charstring vl_scTypeName := "";
     var charstring vl_tcName := "";
     if(0 == f_EPTF_ExecCtrl_getParams(
        pl_params,
        {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario, c_ExecCtrl_paramNameTrafficCase},
        pl_result)
      ) {

        vl_eGrpName   := pl_result[0];
        vl_scTypeName := pl_result[1];
        vl_tcName     := pl_result[2];
        
        var charstring vl_nofSuccVarName,vl_nofFailVarName,vl_nofTimeoutVarName,vl_nofErrorVarName;
        f_EPTF_ExecCtrl_DSProcessData(
          pl_dataVarName := vl_nofSuccVarName,
          pl_source := pl_source,
          pl_ptcName:= pl_ptcName,
          pl_element := c_ExecCtrl_dataElementTcStat,
          pl_params := pl_params & {{paramName := c_ExecCtrl_paramNameStatistic, paramValue := c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Success]}}
        )
        f_EPTF_ExecCtrl_DSProcessData(
          pl_dataVarName := vl_nofFailVarName,
          pl_source := pl_source,
          pl_ptcName:= pl_ptcName,
          pl_element := c_ExecCtrl_dataElementTcStat,
          pl_params := pl_params & {{paramName := c_ExecCtrl_paramNameStatistic, paramValue := c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Fail]}}
        )
        f_EPTF_ExecCtrl_DSProcessData(
          pl_dataVarName := vl_nofTimeoutVarName,
          pl_source := pl_source,
          pl_ptcName:= pl_ptcName,
          pl_element := c_ExecCtrl_dataElementTcStat,
          pl_params := pl_params & {{paramName := c_ExecCtrl_paramNameStatistic, paramValue := c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Timeout]}}
        )
        f_EPTF_ExecCtrl_DSProcessData(
          pl_dataVarName := vl_nofErrorVarName,
          pl_source := pl_source,
          pl_ptcName:= pl_ptcName,
          pl_element := c_ExecCtrl_dataElementTcStat,
          pl_params := pl_params & {{paramName := c_ExecCtrl_paramNameStatistic, paramValue := c_EPTF_ExecCtrl_tcStatNames[c_EPTF_ExecCtrl_tcStatId_Error]}}
        )
        
        var integer vl_succ := f_EPTF_Var_getIntValue(f_EPTF_Var_getId(vl_nofSuccVarName));
        var integer vl_fail := f_EPTF_Var_getIntValue(f_EPTF_Var_getId(vl_nofFailVarName));
        var integer vl_timeout := f_EPTF_Var_getIntValue(f_EPTF_Var_getId(vl_nofTimeoutVarName));
        var integer vl_error := f_EPTF_Var_getIntValue(f_EPTF_Var_getId(vl_nofErrorVarName));
        
        var float vl_gos := 0.0;
        if (vl_succ!=0) {
          vl_gos := 100.0*int2float(vl_succ)/int2float(vl_succ+vl_fail+vl_timeout+vl_error);
        }
        
        pl_dataValue:={floatVal := vl_gos};
        vl_errorCode := 0;
      }
    }
    case else
    {
    }
  }
  return vl_errorCode;
}  

///////////////////////////////////////////////////////////
//  Function: f_EPTF_ExecCtrl_DSProcessSetDataValue
// 
//  Purpose:
//    Processes the incoming setDataValue requests - iterators and external data elements - and gives back the value.
//    It should be registered in the ExecCtrl_init_CT. Type function fcb_EPTF_DataSourceClient_setDataValueHandler
//
//  Parameters:
//    *inout* <EPTF_Var_DirectContent> *pl_dataValue* - the value of the data
//    *in charstring pl_source* - the name of the data source 'feature'
//    *in charstring pl_ptcName* - the name of the ptc (ID of the PTC)
//    *in charstring pl_element* - the name of the data element
//    *in* <EPTF_DataSource_Params> *pl_params* - the parameters
//      of the data for the dataElement
//    *in* <EPTF_IntegerList> *pl_indexList* - in case of list-type values the elements of this parameter
//      are the indexes in the list-type data for which the values should be set
//      For elementary type values this argument is not used
//
//  Return Value:
//    integer - error code (0 of OK, non zero if unsuccessful:
//     e.g. invalid parameters given in pl_params, or data is read-only.
//     If error code is not zero pl_dataValue can be used to provide textual error message)
//
//  Detailed Comments: 
//    -
//
///////////////////////////////////////////////////////////
friend function f_EPTF_ExecCtrl_DSProcessSetDataValue(inout EPTF_Var_DirectContent pl_dataValue,
                                                      in charstring pl_source,
                                                      in charstring pl_ptcName,
                                                      in charstring pl_element,
                                                      in EPTF_DataSource_Params pl_params,
                                                      in EPTF_IntegerList pl_indexList)
runs on EPTF_ExecCtrl_CT return integer{   
  var integer vl_errorCode := -1;
  var EPTF_CharstringList pl_result := {};
  select( pl_element )
  {
    case (c_ExecCtrl_dataElementRestart){
      var charstring vl_executable := "-";
      var charstring vl_configFile := "-";
      var EPTF_CharstringList vl_testCase := {"-"};
      if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                          {c_ExecCtrl_paramNameExecutable},
                                          pl_result)){
         vl_executable := pl_result[0];
      }
      if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                          {c_ExecCtrl_paramNameConfigFile},
                                          pl_result)){
         vl_configFile := pl_result[0];
      }
      if (0 == f_EPTF_ExecCtrl_getParams(pl_params,
                                          {c_ExecCtrl_paramNameTestCases},
                                          pl_result)){
         vl_testCase := f_EPTF_Common_splitString(pl_result[0], " ");  // there could be more TC name spearated by space in pl_result[0];
      }
      f_EPTF_Base_restart(vl_executable, vl_configFile, vl_testCase); // it will never return, pl_dataValue is invalid by default
      vl_errorCode := 0;
    }
    case else
    {
    }
  }
  return vl_errorCode;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_ExecCtrl_conditionHandler_isWeightedSc
//
//  Purpose:
//    Callback function type to handle condition for isWeighted.
//    The type of this function is <fcb_EPTF_DataSourceClient_conditionHandler>
//
//  Parameters:
//    *out boolean pl_conditionValue* - true if the given scenario is weighted
//    *in charstring pl_source* - the name of the data source 'feature' (now <c_ExecCtrl_DataSource_sourceId>)
//    *in charstring pl_ptcName* - the name of the ptc (ID of the PTC) (now "f_EPTF_Base_selfName())
//    *in charstring pl_method* - the name of the method (now: <c_ExecCtrl_conditionIsWeightedSc>)
//    *in* <EPTF_DataSource_Params> *pl_params* - the parameters
//      of the data for the dataElement (now <c_ExecCtrl_paramNameEntityGroup>, and <c_ExecCtrl_paramNameScenario>)
//
//  Return Value:
//    integer - error code (0 of OK, non zero if unsuccessful:
//     e.g. invalid parameters given in pl_params)
//
//  Detailed Comments:
//    This function is called when <f_EPTF_DataSource_getCondition> is requested
//    for the specified pl_source,pl_ptcName and pl_method.
//    Its return value (error code) and pl_conditionValue is forwarded
//    to <f_EPTF_DataSource_getCondition>.
///////////////////////////////////////////////////////////
friend function f_EPTF_ExecCtrl_conditionHandler_isWeightedSc(
  out boolean pl_conditionValue,
  in charstring pl_source,
  in charstring pl_ptcName,
  in charstring pl_method,
  in EPTF_DataSource_Params pl_params
) runs on EPTF_ExecCtrl_CT return integer {
  var EPTF_CharstringList pl_result := {};
  var charstring vl_entityGrpName := "";
  var charstring vl_scName := "";
  if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                       {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                       pl_result)){
    vl_entityGrpName := pl_result[0];
    vl_scName        := pl_result[1];
    if( -1 == f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
       f_EPTF_ExecCtrl_warning(%definitionId& ": Datasource Parameter is wrong."&
         "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName );
       return 1;
    }
    var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
    if( -1 == vl_scIdx){
       f_EPTF_ExecCtrl_warning(%definitionId& ": Datasource Parameter is wrong."&
         "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName );
       return 2;
    }
    if( -1 != vl_scIdx ){
      pl_conditionValue :=  f_EPTF_ExecCtrl_isWeightedScenario(vl_scIdx);
      return 0;
    }
  }
  return -1;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_ExecCtrl_conditionHandler_isInScGroup
//
//  Purpose:
//    Callback function type to handle condition for isInScGroup.
//    The type of this function is <fcb_EPTF_DataSourceClient_conditionHandler>
//
//  Parameters:
//    *out boolean pl_conditionValue* - true if the given scenario is in a scenario group
//    *in charstring pl_source* - the name of the data source 'feature' (now <c_ExecCtrl_DataSource_sourceId>)
//    *in charstring pl_ptcName* - the name of the ptc (ID of the PTC) (now f_EPTF_Base_selfName())
//    *in charstring pl_method* - the name of the method (now: <c_ExecCtrl_conditionIsInScGroup>)
//    *in* <EPTF_DataSource_Params> *pl_params* - the parameters
//      of the data for the dataElement (now <c_ExecCtrl_paramNameEntityGroup>, and <c_ExecCtrl_paramNameScenario>)
//
//  Return Value:
//    integer - error code (0 of OK, non zero if unsuccessful:
//     e.g. invalid parameters given in pl_params)
//
//  Detailed Comments:
//    This function is called when <f_EPTF_DataSource_getCondition> is requested
//    for the specified pl_source,pl_ptcName and pl_method.
//    Its return value (error code) and pl_conditionValue is forwarded
//    to <f_EPTF_DataSource_getCondition>.
///////////////////////////////////////////////////////////
friend function f_EPTF_ExecCtrl_conditionHandler_isInScGroup(
  out boolean pl_conditionValue,
  in charstring pl_source,
  in charstring pl_ptcName,
  in charstring pl_method,
  in EPTF_DataSource_Params pl_params
) runs on EPTF_ExecCtrl_CT return integer {
  var EPTF_CharstringList pl_result := {};
  var charstring vl_entityGrpName := "";
  var charstring vl_scName := "";
  if(0 == f_EPTF_ExecCtrl_getParams( pl_params,
                                       {c_ExecCtrl_paramNameEntityGroup, c_ExecCtrl_paramNameScenario},
                                       pl_result)){
    vl_entityGrpName := pl_result[0];
    vl_scName        := pl_result[1];
    if( -1 == f_EPTF_ExecCtrl_getEntityGroupIdx(vl_entityGrpName)){
       f_EPTF_ExecCtrl_warning(%definitionId& ": Datasource Parameter is wrong."&
         "\n" & c_ExecCtrl_paramNameEntityGroup & ": " & vl_entityGrpName );
       return 1;
    }
    var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(vl_entityGrpName, vl_scName);
    if( -1 == vl_scIdx){
       f_EPTF_ExecCtrl_warning(%definitionId& ": Datasource Parameter is wrong."&
         "\n" & c_ExecCtrl_paramNameScenario & ": " & vl_scName );
       return 2;
    }
    if( -1 != vl_scIdx ){
      var integer vl_scGrpIdx := f_EPTF_ExecCtrl_ScenarioGroup_get_byScIndex(vl_scIdx);
      pl_conditionValue :=  (vl_scGrpIdx!=-1);
      return 0;
    }
  }
  return -1;
}


// returns positive error code if params are not correct
// returns -1 if params are wrong syntactically
private function f_EPTF_ExecCtrl_getParams(in EPTF_DataSource_Params pl_params,
                                           in EPTF_CharstringList pl_needed,
                                           out EPTF_CharstringList pl_result,
                                           in boolean pl_noWarning := false)
runs on EPTF_ExecCtrl_CT return integer {
  pl_result := {};
  if(sizeof(pl_params) == sizeof(pl_needed)){
     for(var integer j := 0; j < sizeof(pl_needed); j := j + 1){
       for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
         if(pl_params[i].paramName == pl_needed[j]){
           pl_result[sizeof(pl_result)] := pl_params[i].paramValue;
         }
       }
     }
     if(sizeof(pl_result) != sizeof(pl_needed)){
       if(not pl_noWarning){
         var EPTF_CharstringList vl_error := {};
         for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
           vl_error[i] := pl_params[i].paramName;
         }
         f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Parameters are not correct: "&
         "\nReceived: "& log2str(vl_error)&
         "\nNeeded  : "& log2str(pl_needed) );
       }
       return -1;
     }
     return f_EPTF_ExecCtrl_DScheckParams(pl_params);
  } else{
    if(not pl_noWarning){
        var EPTF_CharstringList vl_error := {};
        for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
          vl_error[i] := pl_params[i].paramName;
        }
        if(sizeof(pl_params) < sizeof(pl_needed)){
           f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Too few parameters are given: "&
           "\nReceived: "& log2str(vl_error)&
           "\nNeeded  : "& log2str(pl_needed));
        } else {
           f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Too many parameters are given: "&
           "\nReceived: "& log2str(vl_error)&
           "\nNeeded  : "& log2str(pl_needed));
        }
    }
    return -1;
  }
}

// extracts the needed parameters from the params. It returns "" for values of params that are not found.
private function f_EPTF_ExecCtrl_extractParams(in EPTF_DataSource_Params pl_params,
                                           in EPTF_CharstringList pl_needed,
                                           out EPTF_CharstringList pl_result)
runs on EPTF_ExecCtrl_CT {
  pl_result := {};
  for(var integer j := 0; j < sizeof(pl_needed); j := j + 1){
    pl_result[j] := "";
    for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
      if(pl_params[i].paramName == pl_needed[j]){
        pl_result[j] := pl_params[i].paramValue;
        break;
      }
    }
  }
}

// returns positive error code if params are not correct
private function f_EPTF_ExecCtrl_DScheckParams(
  in EPTF_DataSource_Params pl_params,
  in boolean pl_noWarning := false)
runs on EPTF_ExecCtrl_CT return integer {

  var EPTF_CharstringList pl_result;
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameEntityGroup,c_ExecCtrl_paramNameScenario,c_ExecCtrl_paramNameTrafficCase},pl_result);

  // check EGrp
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameEntityGroup is present
    // check if entity group exists
    var integer vl_eGrpIdx := f_EPTF_ExecCtrl_getEntityGroupIdx(pl_result[0]);
    if(vl_eGrpIdx == -1){
      var integer vl_eGrpListVarIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityGroups_varName);
      var EPTF_CharstringList vl_eGrpNames := {};
      if (vl_eGrpListVarIdx!=-1) {
        vl_eGrpNames:= f_EPTF_Var_getCharstringlistValue(vl_eGrpListVarIdx);
      }
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Entity group """&pl_result[0]&""" does not exits. Available entity groups:"&log2str(vl_eGrpNames));
      return 1;
    }
  }

  // check Scenario
  if (pl_result[1]!="" and pl_result[0]!="") { // c_ExecCtrl_paramNameScenario and c_ExecCtrl_paramNameEntityGroup are present
    // check if scenario exists
    var integer vl_scIdx := f_EPTF_ExecCtrl_getScenarioIdx(pl_result[0], pl_result[1]);
    if(vl_scIdx == -1){
      var EPTF_IntegerList vl_scIdxs := f_EPTF_ExecCtrl_eGrp_scenarios(f_EPTF_ExecCtrl_getEntityGroupIdx(pl_result[0]));
      var EPTF_CharstringList vl_scNames := {};
      for(var integer i:=0; i<sizeof(vl_scIdxs); i:=i+1) {
        vl_scNames[sizeof(vl_scNames)] := f_EPTF_ExecCtrl_getScenarioName(vl_scIdxs[i]);
      }
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Scenario """&pl_result[1]&""" does not exits in entity group """&pl_result[0]&""". Available scenarios:"&log2str(vl_scNames));
      return 2;
    }
  }

  // check Traffic case
  if (pl_result[2]!="" and pl_result[1]!="" and pl_result[0]!="") { //c_ExecCtrl_paramNameTrafficCase,c_ExecCtrl_paramNameScenario and c_ExecCtrl_paramNameEntityGroup are present
    // check if traffic case exists
    var integer vl_tcIdx := f_EPTF_ExecCtrl_getTrafficCaseIdx(pl_result[0],pl_result[1],pl_result[2]);
    if( -1 == vl_tcIdx){
      var integer vl_tcListVarIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorTrafficCases_varName & "." & pl_result[0] & "." & pl_result[1]);
      var EPTF_CharstringList vl_tcNames := {};
      if (vl_tcListVarIdx!=-1) {
        vl_tcNames:= f_EPTF_Var_getCharstringlistValue(vl_tcListVarIdx);
      }
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Traffic case """&pl_result[2]&""" does not exits in the scenario """
        &pl_result[1]&""" of entity group """&pl_result[0]&""". Available traffic cases:"&log2str(vl_tcNames));
      return 3;
    }
  }

  // check TC stat name (and FSM stat name)
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameStatistic},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameStatistic is present
    // check if tc stat name exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(c_EPTF_ExecCtrl_tcStatNames); i:=i+1) {
      if (c_EPTF_ExecCtrl_tcStatNames[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }

    // check FSM stat names:
    if (not vl_found) {
      // available FSM statNames:
      var EPTF_CharstringList vl_params;
      f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameEntityGroup,c_ExecCtrl_paramNameScenario,c_ExecCtrl_paramNameTrafficCase},vl_params);
      var charstring vl_eGrpName := vl_params[0];
      var charstring vl_scName := vl_params[1];
      var charstring vl_tcName := vl_params[2];

      var integer vl_varIdx := f_EPTF_Var_getId(
        c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorFSMStats_varName & "."
        & vl_eGrpName & "."
        & vl_scName & "."
        & vl_tcName
      );
      var EPTF_CharstringList vl_availableValues := {};
      if (vl_varIdx!=-1) {
        vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
      }

      // check if FSM statName exists
      for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
        if (vl_availableValues[i]==pl_result[0]) {
          vl_found:=true;
          break;
        }
      }
      if (not vl_found) {
        f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: FSM statistics """&pl_result[0]&""" does not exits. Available FSM statNames:"&log2str(vl_availableValues));
        //return 4; // do not return here: TC Stats warning is also shown
      }
    }

    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Traffic case statistics """&pl_result[0]&""" does not exits. Available TC statNames:"&log2str(c_EPTF_ExecCtrl_tcStatNames));
      return 4;
    }
  }

  // check Group finish condition name
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameCondition},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameCondition is present
    // available grp finish conditions:
    var EPTF_CharstringList vl_availableConditions := {};
    for(var integer st:=0; st<sizeof(c_EPTF_ExecCtrl_tcStatNames);st:=st+1) {
      var EPTF_ExecCtrl_GrpFinishConditionType vl_grpFinishConditionType := f_EPTF_ExecCtrl_UIVars_tcStatId2GrpFinishConditionType(st);
      if (vl_grpFinishConditionType == c_EPTF_ExecCtrl_groupFinishConditionUnknown) {
        continue; // no conditions for these stats
      }
      vl_availableConditions[sizeof(vl_availableConditions)] := c_EPTF_ExecCtrl_tcStatNames[st];
    }

    // check if group finish condition exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableConditions); i:=i+1) {
      if (vl_availableConditions[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Group finish condition """&pl_result[0]&""" does not exits. Available grp finish conditions:"&log2str(vl_availableConditions));
      return 5;
    }
  }

  // check LGen name
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameLGen},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameLGen is present
    // available lgens:
    var integer vl_varIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorLGens_varName);
    var EPTF_CharstringList vl_availableValues := {};
    if (vl_varIdx!=-1) {
      vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
    }

    // check if group finish condition exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: LGen with name """&pl_result[0]&""" does not exits. Available LGens:"&log2str(vl_availableValues));
      return 6;
    }
  }

  // check Scenario group name
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameScenarioGroup},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameScenarioGroup is present
    // available scGroups:
    var integer vl_varIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorScenarioGroups_varName);
    var EPTF_CharstringList vl_availableValues := {};
    if (vl_varIdx!=-1) {
      vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
    }

    // check if scGroup exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Scenario group """&pl_result[0]&""" does not exits. Available scenario groups:"&log2str(vl_availableValues));
      return 7;
    }
  }

  // check entity type name
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameEntityType,c_ExecCtrl_paramNameLGen},pl_result);
  if (pl_result[0]!="" and pl_result[1]!="") { // c_ExecCtrl_paramNameEntityType is present

    var charstring vl_LGenName := pl_result[1];
    // available values:
    var integer vl_varIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorEntityTypesForLGen_varName & "." & vl_LGenName);
    var EPTF_CharstringList vl_availableValues := {};
    if (vl_varIdx!=-1) {
      vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
    }

    // check if given value exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Entity type name """&pl_result[0]&""" does not exits on LGen """&vl_LGenName&""". Available entity types:"&log2str(vl_availableValues));
      return 8;
    }
  }

  // check c_ExecCtrl_paramNameScenarioInstance
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameScenarioInstance},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameScenarioInstance is present

    // available values:
    var EPTF_CharstringList vl_availableValues := {};
    for(var integer scidx:=0; scidx<sizeof(v_ExecCtrl_scenarios);scidx:=scidx+1) {
      vl_availableValues[sizeof(vl_availableValues)] := v_ExecCtrl_scenarios[scidx].name;
    }

    // check if given value exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Scenario instance """&pl_result[0]&""" does not exits. Available scenario instances:"&log2str(vl_availableValues));
      return 9;
    }
  }

  // check c_ExecCtrl_paramNameRegulatedItemId
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameRegulatedItemId},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameRegulatedItemId is present
    // available regulated items:
    var integer vl_varIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorRegulatedItems_varName);
    var EPTF_CharstringList vl_availableValues := {};
    if (vl_varIdx!=-1) {
      vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
    }

    // check if regulated items exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Regulated item """&pl_result[0]&""" does not exits. Available regulated items:"&log2str(vl_availableValues));
      return 10;
    }
  }

  // check c_ExecCtrl_paramNameRegulatorName
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNameRegulatorName},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNameRegulatorName is present
    // available regulators:
    var integer vl_varIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorRegulators_varName);
    var EPTF_CharstringList vl_availableValues := {};
    if (vl_varIdx!=-1) {
      vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
    }

    // check if regulator exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Regulator with name """&pl_result[0]&""" does not exits. Available regulator names:"&log2str(vl_availableValues));
      return 11;
    }
  }

  // check c_ExecCtrl_paramNamePhase
  f_EPTF_ExecCtrl_extractParams(pl_params,{c_ExecCtrl_paramNamePhase},pl_result);
  if (pl_result[0]!="") { // c_ExecCtrl_paramNamePhase is present
    // available phases:
    var integer vl_varIdx := f_EPTF_Var_getId(c_ExecCtrl_DS_iteratorVar_prefix & c_ExecCtrl_iteratorPhases_varName);
    var EPTF_CharstringList vl_availableValues := {};
    if (vl_varIdx!=-1) {
      vl_availableValues:= f_EPTF_Var_getCharstringlistValue(vl_varIdx);
    }

    // check if phase name exists
    var boolean vl_found := false;
    for(var integer i:=0; i<sizeof(vl_availableValues); i:=i+1) {
      if (vl_availableValues[i]==pl_result[0]) {
        vl_found:=true;
        break;
      }
    }
    if (not vl_found) {
      f_EPTF_ExecCtrl_warning(%definitionId& ": Invalid DataSource parameter: Phase """&pl_result[0]&""" does not exits. Available phases:"&log2str(vl_availableValues));
      return 12;
    }
  }

  return 0;

}


} // group R3

} // module
