From cf9501ea013a473cfd7fee0b0a0e177d015d55df Mon Sep 17 00:00:00 2001 From: "m.heisig" Date: Thu, 19 Mar 2026 12:17:10 +0100 Subject: [PATCH] Changed all components to use HAL structs as in and outs - All components now use HAL structs as inputs and outputs - Restructured library folders - FB_Axis_PTP now implements the execute pattern with E_CmdResult - Bumped version number to 2.0.0 --- BaseComponents.tsproj | 350 +--------------- BasicComponents.library | Bin 1028740 -> 1035852 bytes BasicComponents/BasicComponents.plcproj | 381 +++++++++--------- .../Analog/DUTs}/ST_ANALOG_EW_CONFIG.TcDUT | 0 .../Analog/DUTs}/ST_ANALOG_EW_DELAYS.TcDUT | 0 .../Analog/DUTs}/ST_ANALOG_EW_LEVELS.TcDUT | 0 .../Analog/DUTs}/ST_ANALOG_IO_CONFIG.TcDUT | 0 .../Analog/DUTs/ST_AnalogInput_IO.TcDUT | 22 + .../Analog/DUTs/ST_AnalogOutput_IO.TcDUT | 11 + .../Analog/POUs}/FB_AnalogInput.TcPOU | 24 +- .../Analog/POUs}/FB_AnalogOutput.TcPOU | 7 +- .../AxisPTP/DUTs}/E_AXIS_PTP_STATE.TcDUT | 1 + .../AxisPTP/DUTs}/ST_AxisPTP_IO.TcDUT | 0 .../AxisPTP/POUs}/FB_AxisPTP.TcPOU | 99 +++-- .../Controller/POUs}/FB_Limit.TcPOU | 0 .../Controller/POUs}/FB_PI.TcPOU | 0 .../Controller/POUs}/FB_PID.TcPOU | 0 .../Controller/POUs}/FB_RampGenerator.TcPOU | 0 .../EventListener/DUTs}/E_EventType.TcDUT | 0 .../DUTs}/ST_BufferEventEntry.TcDUT | 0 .../POUs}/FB_EventListener.TcPOU | 0 .../Components/Motor/FB_MotorBecker.TcPOU | 0 .../Motor/Types/ST_MOTOR_BECKER_CONFIG.TcDUT | 0 .../Utilities/FB_AlarmMessage.TcPOU | 0 .../Components/Utilities/FB_Blinker.TcPOU | 0 .../Utilities/FB_ReleaseSignal.TcPOU | 0 .../Utilities/FC_HashFNV1a_32Bit.TcPOU | 0 .../Utilities/F_GetTaskCycleTime.TcPOU | 0 .../Valves/DUTs}/ST_ValveAnalogConfig.TcDUT | 0 .../Valves/DUTs/ST_ValveAnalog_IO.TcDUT | 16 + .../Valves/DUTs}/ST_ValveConfig.TcDUT | 0 .../Components/Valves/DUTs/ST_Valve_IO.TcDUT | 21 + .../Valves/POUs}/FB_Valve.TcPOU | 20 +- .../Valves/POUs}/FB_ValveAnalog.TcPOU | 26 +- .../{POUs/GVL => GVLs}/GVL_CONFIGS.TcGVL | 0 .../Constants => GVLs}/GVL_TYPE_CONST.TcGVL | 0 .../Datentypen/ST_HMI_ANALOG_MOTOR_DATA.TcDUT | 0 .../HMI/Datentypen/ST_HMI_ANALOG_VALUE.TcDUT | 0 .../Datentypen/ST_HMI_ANALOG_VALVE_DATA.TcDUT | 0 .../Datentypen/ST_HMI_CONTROL_BUTTON.TcDUT | 0 .../HMI/Datentypen/ST_HMI_INTEGER_VALUE.TcDUT | 0 .../HMI/Datentypen/ST_HMI_INTERLOCK.TcDUT | 0 .../HMI/Datentypen/ST_HMI_VALVE_DATA.TcDUT | 0 .../HMI/Datentypen/T_INTERLOCK.TcDUT | 0 .../HMI/Enum/E_HMI_ANALOG_VALUE_STATUS.TcDUT | 0 .../HMI/Enum/E_HMI_BUTTON_FEEDBACK.TcDUT | 0 .../{POUs => }/HMI/Enum/E_HMI_MODE.TcDUT | 0 .../HMI/Enum/E_HMI_MOTOR_STATUS.TcDUT | 0 .../HMI/Enum/E_HMI_VALVE_STATUS.TcDUT | 0 BasicComponents/{POUs => }/PRG_MAIN.TcPOU | 28 +- .../AITests/FB_AnalogInputTest.TcPOU | 256 ++++++------ .../AOTests/FB_AnalogOutputTest.TcPOU | 24 +- .../FB_ValveAnalog_Test.TcPOU | 18 +- .../FB_ReleaseSignalTest.TcPOU | 0 .../UtilitiesTests/FB_BlinkerTest.TcPOU | 0 .../FB_HashFNV1a_32BitTest.TcPOU | 0 .../Unittests/UtilitiesTests/FB_PT1Test.TcPOU | 0 .../UtilitiesTests/FB_RampGeneratorTest.TcPOU | 0 .../ValveTests/FB_ValveTestHMI.TcPOU | 70 ++-- .../ValveTests/FB_ValveTestTimoutClose.TcPOU | 4 +- .../ValveTests/FB_ValveTestTimoutOpen.TcPOU | 4 +- .../FB_ValveTestTriggerTimoutClose.TcPOU | 2 +- .../FB_ValveTestTriggerTimoutOpen.TcPOU | 2 +- .../Unittests/ValveTests/FB_Valve_Test.TcPOU | 24 +- 64 files changed, 573 insertions(+), 837 deletions(-) rename BasicComponents/{POUs/Components/Analog/Types => Components/Analog/DUTs}/ST_ANALOG_EW_CONFIG.TcDUT (100%) rename BasicComponents/{POUs/Components/Analog/Types => Components/Analog/DUTs}/ST_ANALOG_EW_DELAYS.TcDUT (100%) rename BasicComponents/{POUs/Components/Analog/Types => Components/Analog/DUTs}/ST_ANALOG_EW_LEVELS.TcDUT (100%) rename BasicComponents/{POUs/Components/Analog/Types => Components/Analog/DUTs}/ST_ANALOG_IO_CONFIG.TcDUT (100%) create mode 100644 BasicComponents/Components/Analog/DUTs/ST_AnalogInput_IO.TcDUT create mode 100644 BasicComponents/Components/Analog/DUTs/ST_AnalogOutput_IO.TcDUT rename BasicComponents/{POUs/Components/Analog => Components/Analog/POUs}/FB_AnalogInput.TcPOU (97%) rename BasicComponents/{POUs/Components/Analog => Components/Analog/POUs}/FB_AnalogOutput.TcPOU (98%) rename BasicComponents/{POUs/Components/AxisPTP => Components/AxisPTP/DUTs}/E_AXIS_PTP_STATE.TcDUT (97%) rename BasicComponents/{POUs/Components/AxisPTP => Components/AxisPTP/DUTs}/ST_AxisPTP_IO.TcDUT (100%) rename BasicComponents/{POUs/Components/AxisPTP => Components/AxisPTP/POUs}/FB_AxisPTP.TcPOU (89%) rename BasicComponents/{POUs/Components/Controller => Components/Controller/POUs}/FB_Limit.TcPOU (100%) rename BasicComponents/{POUs/Components/Controller => Components/Controller/POUs}/FB_PI.TcPOU (100%) rename BasicComponents/{POUs/Components/Controller => Components/Controller/POUs}/FB_PID.TcPOU (100%) rename BasicComponents/{POUs/Components/Controller => Components/Controller/POUs}/FB_RampGenerator.TcPOU (100%) rename BasicComponents/{POUs/Components/EventListener/Types => Components/EventListener/DUTs}/E_EventType.TcDUT (100%) rename BasicComponents/{POUs/Components/EventListener/Types => Components/EventListener/DUTs}/ST_BufferEventEntry.TcDUT (100%) rename BasicComponents/{POUs/Components/EventListener => Components/EventListener/POUs}/FB_EventListener.TcPOU (100%) rename BasicComponents/{POUs => }/Components/Motor/FB_MotorBecker.TcPOU (100%) rename BasicComponents/{POUs => }/Components/Motor/Types/ST_MOTOR_BECKER_CONFIG.TcDUT (100%) rename BasicComponents/{POUs => }/Components/Utilities/FB_AlarmMessage.TcPOU (100%) rename BasicComponents/{POUs => }/Components/Utilities/FB_Blinker.TcPOU (100%) rename BasicComponents/{POUs => }/Components/Utilities/FB_ReleaseSignal.TcPOU (100%) rename BasicComponents/{POUs => }/Components/Utilities/FC_HashFNV1a_32Bit.TcPOU (100%) rename BasicComponents/{POUs => }/Components/Utilities/F_GetTaskCycleTime.TcPOU (100%) rename BasicComponents/{POUs/Components/Valves/Types => Components/Valves/DUTs}/ST_ValveAnalogConfig.TcDUT (100%) create mode 100644 BasicComponents/Components/Valves/DUTs/ST_ValveAnalog_IO.TcDUT rename BasicComponents/{POUs/Components/Valves/Types => Components/Valves/DUTs}/ST_ValveConfig.TcDUT (100%) create mode 100644 BasicComponents/Components/Valves/DUTs/ST_Valve_IO.TcDUT rename BasicComponents/{POUs/Components/Valves => Components/Valves/POUs}/FB_Valve.TcPOU (96%) rename BasicComponents/{POUs/Components/Valves => Components/Valves/POUs}/FB_ValveAnalog.TcPOU (95%) rename BasicComponents/{POUs/GVL => GVLs}/GVL_CONFIGS.TcGVL (100%) rename BasicComponents/{POUs/Constants => GVLs}/GVL_TYPE_CONST.TcGVL (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_ANALOG_MOTOR_DATA.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_ANALOG_VALUE.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_ANALOG_VALVE_DATA.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_CONTROL_BUTTON.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_INTEGER_VALUE.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_INTERLOCK.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/ST_HMI_VALVE_DATA.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Datentypen/T_INTERLOCK.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Enum/E_HMI_ANALOG_VALUE_STATUS.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Enum/E_HMI_BUTTON_FEEDBACK.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Enum/E_HMI_MODE.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Enum/E_HMI_MOTOR_STATUS.TcDUT (100%) rename BasicComponents/{POUs => }/HMI/Enum/E_HMI_VALVE_STATUS.TcDUT (100%) rename BasicComponents/{POUs => }/PRG_MAIN.TcPOU (53%) rename BasicComponents/{POUs => }/Unittests/AITests/FB_AnalogInputTest.TcPOU (93%) rename BasicComponents/{POUs => }/Unittests/AOTests/FB_AnalogOutputTest.TcPOU (96%) rename BasicComponents/{POUs => }/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU (93%) rename BasicComponents/{POUs => }/Unittests/ReleaseSignalTests/FB_ReleaseSignalTest.TcPOU (100%) rename BasicComponents/{POUs => }/Unittests/UtilitiesTests/FB_BlinkerTest.TcPOU (100%) rename BasicComponents/{POUs => }/Unittests/UtilitiesTests/FB_HashFNV1a_32BitTest.TcPOU (100%) rename BasicComponents/{POUs => }/Unittests/UtilitiesTests/FB_PT1Test.TcPOU (100%) rename BasicComponents/{POUs => }/Unittests/UtilitiesTests/FB_RampGeneratorTest.TcPOU (100%) rename BasicComponents/{POUs => }/Unittests/ValveTests/FB_ValveTestHMI.TcPOU (88%) rename BasicComponents/{POUs => }/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU (89%) rename BasicComponents/{POUs => }/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU (89%) rename BasicComponents/{POUs => }/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU (92%) rename BasicComponents/{POUs => }/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU (92%) rename BasicComponents/{POUs => }/Unittests/ValveTests/FB_Valve_Test.TcPOU (88%) diff --git a/BaseComponents.tsproj b/BaseComponents.tsproj index 2a3426e..5d534d2 100644 --- a/BaseComponents.tsproj +++ b/BaseComponents.tsproj @@ -136,357 +136,9 @@ - + BasicComponents Instance {08500001-0000-0000-F000-000000000064} - - PlcTask Inputs - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOn.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOn.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOn.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOn.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOn.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOn.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOn.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOn.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOn.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOn.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOn.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOn.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOn.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOn.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOn.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOn.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOn.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOn.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOn.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOn.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOn.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOn.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOn.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOn.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOff.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOff.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOff.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorLowOff.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOff.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOff.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOff.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningLowOff.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOff.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOff.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOff.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIWarningHighOff.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOff.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOff.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOff.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIErrorHighOff.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOff.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOff.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOff.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIUnderrangeOff.xErrorCard - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOff.iAnalogValue - - INT - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOff.xUnderrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOff.xOverrange - - BOOL - - - PRG_MAIN._fbAnalogInputTest._fbAIOverrangeOff.xErrorCard - - BOOL - - - PRG_MAIN._fbValve_TimeoutTestOpen._fbValveTimeout.xOpenFeedback - BOOL - - - PRG_MAIN._fbValve_TimeoutTestOpen._fbValveTimeout.xCloseFeedback - BOOL - - - PRG_MAIN._fbValve_TimeoutTestClose._fbValveTimeout.xOpenFeedback - BOOL - - - PRG_MAIN._fbValve_TimeoutTestClose._fbValveTimeout.xCloseFeedback - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerOpen._fbValveTimeout.xOpenFeedback - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerOpen._fbValveTimeout.xCloseFeedback - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerClose._fbValveTimeout.xOpenFeedback - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerClose._fbValveTimeout.xCloseFeedback - BOOL - - - PRG_MAIN._fbValveTestHMI._fbValveOC.xOpenFeedback - BOOL - - - PRG_MAIN._fbValveTestHMI._fbValveOC.xCloseFeedback - BOOL - - - - PlcTask Outputs - - PRG_MAIN._fbValve_TimeoutTestOpen._fbValveTimeout.xOpenValve - - BOOL - - - PRG_MAIN._fbValve_TimeoutTestOpen._fbValveTimeout.xCloseValve - - BOOL - - - PRG_MAIN._fbValve_TimeoutTestClose._fbValveTimeout.xOpenValve - - BOOL - - - PRG_MAIN._fbValve_TimeoutTestClose._fbValveTimeout.xCloseValve - - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerOpen._fbValveTimeout.xOpenValve - - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerOpen._fbValveTimeout.xCloseValve - - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerClose._fbValveTimeout.xOpenValve - - BOOL - - - PRG_MAIN._fbValve_TimoutTriggerClose._fbValveTimeout.xCloseValve - - BOOL - - - PRG_MAIN._fbValveTestHMI._fbValveOC.xOpenValve - - BOOL - - - PRG_MAIN._fbValveTestHMI._fbValveOC.xCloseValve - - BOOL - - 0 diff --git a/BasicComponents.library b/BasicComponents.library index b8f96a4c9405605af7e8b2d8259bb88b6fd5fb54..8ba660df19a4d1ef4605fdfe616d1de09561a501 100644 GIT binary patch delta 75105 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 z

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 delta 69228 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 diff --git a/BasicComponents/BasicComponents.plcproj b/BasicComponents/BasicComponents.plcproj index 14875d4..e505420 100644 --- a/BasicComponents/BasicComponents.plcproj +++ b/BasicComponents/BasicComponents.plcproj @@ -21,7 +21,7 @@ false Heisig GmbH BaseComponents - 1.3.4 + 2.0.0 BC M.Heisig Basic components fb's (Valves, AI, AO, Motors, etc.) @@ -45,218 +45,231 @@ + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + true + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + Code + + Code + true + + + Code + true + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - - Code - - - Code - - - Code - true - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - true - - - Code - true - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - + Code + + + + + + + + + + + + + + + + + + - - - - - - - true - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - @@ -310,8 +323,8 @@ - - + + "<ProjectRoot>" {192FAD59-8248-4824-A8DE-9177C94C195A} @@ -2692,16 +2705,16 @@ - - - System.Boolean - System.Collections.Hashtable - System.Int32 - {54dd0eac-a6d8-46f2-8c27-2f43c7e49861} - System.String - System.UInt32 - - + + + System.Boolean + System.Collections.Hashtable + System.Int32 + {54dd0eac-a6d8-46f2-8c27-2f43c7e49861} + System.String + System.UInt32 + + \ No newline at end of file diff --git a/BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_EW_CONFIG.TcDUT b/BasicComponents/Components/Analog/DUTs/ST_ANALOG_EW_CONFIG.TcDUT similarity index 100% rename from BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_EW_CONFIG.TcDUT rename to BasicComponents/Components/Analog/DUTs/ST_ANALOG_EW_CONFIG.TcDUT diff --git a/BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_EW_DELAYS.TcDUT b/BasicComponents/Components/Analog/DUTs/ST_ANALOG_EW_DELAYS.TcDUT similarity index 100% rename from BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_EW_DELAYS.TcDUT rename to BasicComponents/Components/Analog/DUTs/ST_ANALOG_EW_DELAYS.TcDUT diff --git a/BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_EW_LEVELS.TcDUT b/BasicComponents/Components/Analog/DUTs/ST_ANALOG_EW_LEVELS.TcDUT similarity index 100% rename from BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_EW_LEVELS.TcDUT rename to BasicComponents/Components/Analog/DUTs/ST_ANALOG_EW_LEVELS.TcDUT diff --git a/BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_IO_CONFIG.TcDUT b/BasicComponents/Components/Analog/DUTs/ST_ANALOG_IO_CONFIG.TcDUT similarity index 100% rename from BasicComponents/POUs/Components/Analog/Types/ST_ANALOG_IO_CONFIG.TcDUT rename to BasicComponents/Components/Analog/DUTs/ST_ANALOG_IO_CONFIG.TcDUT diff --git a/BasicComponents/Components/Analog/DUTs/ST_AnalogInput_IO.TcDUT b/BasicComponents/Components/Analog/DUTs/ST_AnalogInput_IO.TcDUT new file mode 100644 index 0000000..cca463b --- /dev/null +++ b/BasicComponents/Components/Analog/DUTs/ST_AnalogInput_IO.TcDUT @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/BasicComponents/Components/Analog/DUTs/ST_AnalogOutput_IO.TcDUT b/BasicComponents/Components/Analog/DUTs/ST_AnalogOutput_IO.TcDUT new file mode 100644 index 0000000..b493847 --- /dev/null +++ b/BasicComponents/Components/Analog/DUTs/ST_AnalogOutput_IO.TcDUT @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/BasicComponents/POUs/Components/Analog/FB_AnalogInput.TcPOU b/BasicComponents/Components/Analog/POUs/FB_AnalogInput.TcPOU similarity index 97% rename from BasicComponents/POUs/Components/Analog/FB_AnalogInput.TcPOU rename to BasicComponents/Components/Analog/POUs/FB_AnalogInput.TcPOU index 1aeda2a..abf1b2a 100644 --- a/BasicComponents/POUs/Components/Analog/FB_AnalogInput.TcPOU +++ b/BasicComponents/Components/Analog/POUs/FB_AnalogInput.TcPOU @@ -3,19 +3,6 @@ + + + + + \ No newline at end of file diff --git a/BasicComponents/POUs/Components/Valves/Types/ST_ValveConfig.TcDUT b/BasicComponents/Components/Valves/DUTs/ST_ValveConfig.TcDUT similarity index 100% rename from BasicComponents/POUs/Components/Valves/Types/ST_ValveConfig.TcDUT rename to BasicComponents/Components/Valves/DUTs/ST_ValveConfig.TcDUT diff --git a/BasicComponents/Components/Valves/DUTs/ST_Valve_IO.TcDUT b/BasicComponents/Components/Valves/DUTs/ST_Valve_IO.TcDUT new file mode 100644 index 0000000..8f67b51 --- /dev/null +++ b/BasicComponents/Components/Valves/DUTs/ST_Valve_IO.TcDUT @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/BasicComponents/POUs/Components/Valves/FB_Valve.TcPOU b/BasicComponents/Components/Valves/POUs/FB_Valve.TcPOU similarity index 96% rename from BasicComponents/POUs/Components/Valves/FB_Valve.TcPOU rename to BasicComponents/Components/Valves/POUs/FB_Valve.TcPOU index 7360b4c..ef7271e 100644 --- a/BasicComponents/POUs/Components/Valves/FB_Valve.TcPOU +++ b/BasicComponents/Components/Valves/POUs/FB_Valve.TcPOU @@ -3,8 +3,7 @@ iSetpoint, xError => _xAnalogOutputError, + stIO := stIO.stAnalogOutputIO, stHMIInterface:= stHMIInterface.stSetpoint); IF _fbAnalogOutput.xError THEN @@ -250,10 +243,6 @@ ELSE END_IF _fbAnalogInput( - iAnalogValue:= iFeedbackValue, - xUnderrange:= _xHasUnderrangeFeedback AND xFeedbackUnderrange, - xOverrange:= _xHasOverrangeFeedback AND xFeedbackOverrange, - xErrorCard:= _xHasCardError AND xErrorCard, stAnalogIOConfig:= stValveConfig.stAnalogInputConfig, stAnalogEWConfig:= stValveConfig.stAnalogInputEWConfig, xReleaseErrors:= xReleaseErrors, @@ -267,7 +256,8 @@ _fbAnalogInput( xErrorLow=> , xWarningLow=> , xWarningHigh=> , - xErrorHigh=> ); + xErrorHigh=> , + stIO := stIO.stAnalogInputIO); IF _fbAnalogInput.xError THEN _xError := TRUE; @@ -279,8 +269,8 @@ END_IF // Handle open close feedback -_xIsOpen := (stValveConfig.xHasOpenFeedback AND xOpenFeedback AND (NOT xCloseFeedback)) OR ((NOT stValveConfig.xHasOpenFeedback) AND (_rCurrentValvePosition >= stValveConfig.rPVIsOpen)); -_xIsClosed := (stValveConfig.xHasClosedFeedback AND xCloseFeedback AND (NOT xOpenFeedback)) OR ((NOT stValveConfig.xHasClosedFeedback) AND (_rCurrentValvePosition <= stValveConfig.rPVIsOpen)); +_xIsOpen := (stValveConfig.xHasOpenFeedback AND stIO.i_xOpenFeedback AND (NOT stIO.i_xCloseFeedback)) OR ((NOT stValveConfig.xHasOpenFeedback) AND (_rCurrentValvePosition >= stValveConfig.rPVIsOpen)); +_xIsClosed := (stValveConfig.xHasClosedFeedback AND stIO.i_xCloseFeedback AND (NOT stIO.i_xOpenFeedback)) OR ((NOT stValveConfig.xHasClosedFeedback) AND (_rCurrentValvePosition <= stValveConfig.rPVIsOpen)); // Calculate target tolerance diff --git a/BasicComponents/POUs/GVL/GVL_CONFIGS.TcGVL b/BasicComponents/GVLs/GVL_CONFIGS.TcGVL similarity index 100% rename from BasicComponents/POUs/GVL/GVL_CONFIGS.TcGVL rename to BasicComponents/GVLs/GVL_CONFIGS.TcGVL diff --git a/BasicComponents/POUs/Constants/GVL_TYPE_CONST.TcGVL b/BasicComponents/GVLs/GVL_TYPE_CONST.TcGVL similarity index 100% rename from BasicComponents/POUs/Constants/GVL_TYPE_CONST.TcGVL rename to BasicComponents/GVLs/GVL_TYPE_CONST.TcGVL diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_ANALOG_MOTOR_DATA.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_ANALOG_MOTOR_DATA.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_ANALOG_MOTOR_DATA.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_ANALOG_MOTOR_DATA.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_ANALOG_VALUE.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_ANALOG_VALUE.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_ANALOG_VALUE.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_ANALOG_VALUE.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_ANALOG_VALVE_DATA.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_ANALOG_VALVE_DATA.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_ANALOG_VALVE_DATA.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_ANALOG_VALVE_DATA.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_CONTROL_BUTTON.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_CONTROL_BUTTON.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_CONTROL_BUTTON.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_CONTROL_BUTTON.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_INTEGER_VALUE.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_INTEGER_VALUE.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_INTEGER_VALUE.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_INTEGER_VALUE.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_INTERLOCK.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_INTERLOCK.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_INTERLOCK.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_INTERLOCK.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/ST_HMI_VALVE_DATA.TcDUT b/BasicComponents/HMI/Datentypen/ST_HMI_VALVE_DATA.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/ST_HMI_VALVE_DATA.TcDUT rename to BasicComponents/HMI/Datentypen/ST_HMI_VALVE_DATA.TcDUT diff --git a/BasicComponents/POUs/HMI/Datentypen/T_INTERLOCK.TcDUT b/BasicComponents/HMI/Datentypen/T_INTERLOCK.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Datentypen/T_INTERLOCK.TcDUT rename to BasicComponents/HMI/Datentypen/T_INTERLOCK.TcDUT diff --git a/BasicComponents/POUs/HMI/Enum/E_HMI_ANALOG_VALUE_STATUS.TcDUT b/BasicComponents/HMI/Enum/E_HMI_ANALOG_VALUE_STATUS.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Enum/E_HMI_ANALOG_VALUE_STATUS.TcDUT rename to BasicComponents/HMI/Enum/E_HMI_ANALOG_VALUE_STATUS.TcDUT diff --git a/BasicComponents/POUs/HMI/Enum/E_HMI_BUTTON_FEEDBACK.TcDUT b/BasicComponents/HMI/Enum/E_HMI_BUTTON_FEEDBACK.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Enum/E_HMI_BUTTON_FEEDBACK.TcDUT rename to BasicComponents/HMI/Enum/E_HMI_BUTTON_FEEDBACK.TcDUT diff --git a/BasicComponents/POUs/HMI/Enum/E_HMI_MODE.TcDUT b/BasicComponents/HMI/Enum/E_HMI_MODE.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Enum/E_HMI_MODE.TcDUT rename to BasicComponents/HMI/Enum/E_HMI_MODE.TcDUT diff --git a/BasicComponents/POUs/HMI/Enum/E_HMI_MOTOR_STATUS.TcDUT b/BasicComponents/HMI/Enum/E_HMI_MOTOR_STATUS.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Enum/E_HMI_MOTOR_STATUS.TcDUT rename to BasicComponents/HMI/Enum/E_HMI_MOTOR_STATUS.TcDUT diff --git a/BasicComponents/POUs/HMI/Enum/E_HMI_VALVE_STATUS.TcDUT b/BasicComponents/HMI/Enum/E_HMI_VALVE_STATUS.TcDUT similarity index 100% rename from BasicComponents/POUs/HMI/Enum/E_HMI_VALVE_STATUS.TcDUT rename to BasicComponents/HMI/Enum/E_HMI_VALVE_STATUS.TcDUT diff --git a/BasicComponents/POUs/PRG_MAIN.TcPOU b/BasicComponents/PRG_MAIN.TcPOU similarity index 53% rename from BasicComponents/POUs/PRG_MAIN.TcPOU rename to BasicComponents/PRG_MAIN.TcPOU index 75b1bcd..a90dad3 100644 --- a/BasicComponents/POUs/PRG_MAIN.TcPOU +++ b/BasicComponents/PRG_MAIN.TcPOU @@ -4,20 +4,20 @@ _xError, rScaledValue=> ); @@ -179,13 +179,13 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // run analog input _fbAnalogInput( - iAnalogValue:= 1234, + i_iAnalogValue:= 1234, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, xReleaseLimitErrors := TRUE, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xInUnitTestMode := TRUE, xError=> _xError, rScaledValue=> ); @@ -229,12 +229,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // run analog input _fbAnalogInput( - iAnalogValue:= 1234, + i_iAnalogValue:= 1234, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xInUnitTestMode := TRUE, xError=> _xError, rScaledValue=> _rResult); @@ -281,12 +281,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // Check with active release signal _fbAI( - iAnalogValue:= 95, + i_iAnalogValue:= 95, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -304,10 +304,10 @@ AssertTrue(Condition:= _xResultErrorHigh, Message:= 'Error high is not active'); // Check without active release signal _fbAI( - iAnalogValue:= 95, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 95, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= FALSE, xError=> _xResultError, rScaledValue=> , @@ -365,12 +365,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; IF NOT _xErrorHighOffInitDone THEN _xErrorHighOffInitDone := TRUE; _fbAIErrorHighOff( - iAnalogValue:= 95, + i_iAnalogValue:= 95, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -382,10 +382,10 @@ IF NOT _xErrorHighOffInitDone THEN ELSE _fbErrorHighOffTimer(IN := TRUE, PT := timOffTime); _fbAIErrorHighOff( - iAnalogValue:= 50, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 50, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -454,12 +454,12 @@ _fbErrorHighOnTimer(IN := TRUE, PT := timOnTime); // Check with active release signal _fbAIErrorHighOn( - iAnalogValue:= 95, + i_iAnalogValue:= 95, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -518,12 +518,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // Error low with release _fbAI( - iAnalogValue:= 0, + i_iAnalogValue:= 0, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -542,10 +542,10 @@ AssertFalse(Condition:= _xResultErrorHigh, Message:= 'Error high is active'); // Error low without release _fbAI( - iAnalogValue:= 0, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 0, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= FALSE, xError=> _xResultError, rScaledValue=> , @@ -602,12 +602,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; IF NOT _xErrorLowOffInitDone THEN _xErrorLowOffInitDone := TRUE; _fbAIErrorLowOff( - iAnalogValue:= 5, + i_iAnalogValue:= 5, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -619,10 +619,10 @@ IF NOT _xErrorLowOffInitDone THEN ELSE _fbErrorLowOffTimer(IN := TRUE, PT := timOffTime); _fbAIErrorLowOff( - iAnalogValue:= 50, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 50, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -688,12 +688,12 @@ _fbErrorLowOnTimer(IN := TRUE, PT := timOnTime); // Check with active release signal _fbAIErrorLowOn( - iAnalogValue:= 5, + i_iAnalogValue:= 5, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -753,12 +753,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // run analog input _fbAnalogInput( - iAnalogValue:= 3071, // 0,75 * 4095 = 3071,25 + i_iAnalogValue:= 3071, // 0,75 * 4095 = 3071,25 stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xError=> , xInUnitTestMode := TRUE, rScaledValue=> _rResult); @@ -807,12 +807,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // run AI to check for overrange error _fbAI( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= TRUE, - xErrorCard:= , + i_xUnderrange:= FALSE, + i_xOverrange:= TRUE, + i_xErrorCard:= , xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -866,12 +866,12 @@ IF NOT _xOverrangeOffInitDone THEN _xOverrangeOffInitDone := TRUE; // run AI to check for overrange error _fbAIOverrangeOff( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= TRUE, - xErrorCard:= , + i_xUnderrange:= FALSE, + i_xOverrange:= TRUE, + i_xErrorCard:= , xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -884,12 +884,12 @@ END_IF // run AI cyclically until overrange error is supposed to be off _fbAIOverrangeOff( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= , + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= , xReleaseErrors := TRUE, xReleaseHardwareErrors := TRUE, xReleaseLimitErrors:= TRUE, @@ -945,12 +945,12 @@ _fbOverrangeOnTimer(IN := TRUE, PT := T#100MS); // run AI to check for overrange error _fbAIOverrangeOn( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= TRUE, - xErrorCard:= , + i_xUnderrange:= FALSE, + i_xOverrange:= TRUE, + i_xErrorCard:= , xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1003,12 +1003,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // run AI to check for underrange error _fbAI( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= TRUE, - xOverrange:= FALSE, - xErrorCard:= , + i_xUnderrange:= TRUE, + i_xOverrange:= FALSE, + i_xErrorCard:= , xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1062,12 +1062,12 @@ IF NOT _xUnderrangeOffInitDone THEN _xUnderrangeOffInitDone := TRUE; // run AI to check for underrange error _fbAIUnderrangeOff( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= TRUE, - xOverrange:= FALSE, - xErrorCard:= , + i_xUnderrange:= TRUE, + i_xOverrange:= FALSE, + i_xErrorCard:= , xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1080,12 +1080,12 @@ END_IF // run AI cyclically until underrange error is supposed to be off _fbAIUnderrangeOff( - iAnalogValue:= 0, + i_iAnalogValue:= 0, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= , + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= , xReleaseErrors := TRUE, xReleaseHardwareErrors := TRUE, xReleaseLimitErrors:= TRUE, @@ -1141,12 +1141,12 @@ _fbUnderrangeOnTimer(IN := TRUE, PT := T#100MS); // run AI to check for underrange error _fbAIUnderrangeOn( - iAnalogValue:= 50, + i_iAnalogValue:= 50, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= TRUE, - xOverrange:= FALSE, - xErrorCard:= , + i_xUnderrange:= TRUE, + i_xOverrange:= FALSE, + i_xErrorCard:= , xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1200,12 +1200,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // Check with active release signal _fbAI( - iAnalogValue:= 85, + i_iAnalogValue:= 85, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1224,10 +1224,10 @@ AssertFalse(Condition:= _xResultErrorHigh, Message:= 'Error high is active'); // Check without active release signal _fbAI( - iAnalogValue:= 85, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 85, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= FALSE, xError=> _xResultError, rScaledValue=> , @@ -1283,12 +1283,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; IF NOT _xWarningHighOffInitDone THEN _xWarningHighOffInitDone := TRUE; _fbAIWarningHighOff( - iAnalogValue:= 85, + i_iAnalogValue:= 85, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1300,10 +1300,10 @@ IF NOT _xWarningHighOffInitDone THEN ELSE _fbWarningHighOffTimer(IN := TRUE, PT := timOffTime); _fbAIWarningHighOff( - iAnalogValue:= 50, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 50, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1369,12 +1369,12 @@ _fbWarningHighOnTimer(IN := TRUE, PT := timOnTime); // Check with active release signal _fbAIWarningHighOn( - iAnalogValue:= 85, + i_iAnalogValue:= 85, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1433,12 +1433,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; // Warning low with release _fbAI( - iAnalogValue:= 15, + i_iAnalogValue:= 15, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1457,10 +1457,10 @@ AssertFalse(Condition:= _xResultErrorHigh, Message:= 'Error high is active'); // Warning low without release _fbAI( - iAnalogValue:= 15, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 15, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= FALSE, xError=> _xResultError, rScaledValue=> , @@ -1517,12 +1517,12 @@ _stAnalogEWConfig.stDelays := _stDelayConfig; IF NOT _xWarningLowOffInitDone THEN _xWarningLowOffInitDone := TRUE; _fbAIWarningLowOff( - iAnalogValue:= 15, + i_iAnalogValue:= 15, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1534,10 +1534,10 @@ IF NOT _xWarningLowOffInitDone THEN ELSE _fbWarningLowOffTimer(IN := TRUE, PT := timOffTime); _fbAIWarningLowOff( - iAnalogValue:= 50, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_iAnalogValue:= 50, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , @@ -1603,12 +1603,12 @@ _fbWarningLowOnTimer(IN := TRUE, PT := timOnTime); // Check with active release signal _fbAIWarningLowOn( - iAnalogValue:= 15, + i_iAnalogValue:= 15, stAnalogIOConfig := _stAnalogInputConfig, stAnalogEWConfig := _stAnalogEWConfig, - xUnderrange:= FALSE, - xOverrange:= FALSE, - xErrorCard:= FALSE, + i_xUnderrange:= FALSE, + i_xOverrange:= FALSE, + i_xErrorCard:= FALSE, xReleaseLimitErrors:= TRUE, xError=> _xResultError, rScaledValue=> , diff --git a/BasicComponents/POUs/Unittests/AOTests/FB_AnalogOutputTest.TcPOU b/BasicComponents/Unittests/AOTests/FB_AnalogOutputTest.TcPOU similarity index 96% rename from BasicComponents/POUs/Unittests/AOTests/FB_AnalogOutputTest.TcPOU rename to BasicComponents/Unittests/AOTests/FB_AnalogOutputTest.TcPOU index 3098565..a98217a 100644 --- a/BasicComponents/POUs/Unittests/AOTests/FB_AnalogOutputTest.TcPOU +++ b/BasicComponents/Unittests/AOTests/FB_AnalogOutputTest.TcPOU @@ -63,7 +63,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); @@ -112,7 +112,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); @@ -170,7 +170,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); @@ -198,7 +198,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError); // reading error from HMI interface @@ -251,7 +251,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); @@ -266,7 +266,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError); // and evaluate result @@ -280,7 +280,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError); // and evaluate result @@ -294,7 +294,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError); // and evaluate result @@ -308,7 +308,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError); // and evaluate result @@ -359,7 +359,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); @@ -410,7 +410,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); @@ -454,7 +454,7 @@ _fbAnalogOutput( xReleaseErrors := , xConfirmAlarms := , stHMIInterface := _stHMIInterface, - iAnalogValue => _iAnalogOutput, + o_iAnalogValue => _iAnalogOutput, xError => _xError, xInUnitTestMode := TRUE); diff --git a/BasicComponents/POUs/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU b/BasicComponents/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU similarity index 93% rename from BasicComponents/POUs/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU rename to BasicComponents/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU index 44cd6fe..00f6ad6 100644 --- a/BasicComponents/POUs/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU +++ b/BasicComponents/Unittests/AnalogValveTests/FB_ValveAnalog_Test.TcPOU @@ -63,7 +63,7 @@ _fbValve.ReqAutomaticMode(); _fbValve.rSPAutomatic := 100; // needs one cycle to write values (scaled feedback ~75, tolerance 95 to 105) -_fbValve(xAutomaticOpen := TRUE, stValveConfig := _stValveConfig, stHMIInterface := _stHMIValve, iFeedbackValue := 3000, xError => _xError, xInUnitTestMode := TRUE); +_fbValve(xAutomaticOpen := TRUE, stValveConfig := _stValveConfig, stHMIInterface := _stHMIValve, i_iFeedbackValue := 3000, xError => _xError, xInUnitTestMode := TRUE); // assert result AssertTrue(_xError, 'Expected NotInRangeError, got no error.'); @@ -102,7 +102,7 @@ _xOpenFeedback := FALSE; _xCloseFeedback := FALSE; _fbValve.xReleaseManualMode := TRUE; _fbValve.ReqManualMode(); -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); // We should now be in manual mode @@ -112,7 +112,7 @@ AssertTrue(Condition := _fbValve.IsInManualMode, Message := 'Valve did not chang // Test closed _xOpenFeedback := FALSE; _xCloseFeedback := TRUE; -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); AssertTrue(Condition := _fbValve.IsClosed, Message := 'Valve should be closed'); AssertFalse(Condition := _fbValve.IsOpen, Message := 'Valve should not be open'); @@ -120,14 +120,14 @@ AssertFalse(Condition := _fbValve.IsOpen, Message := 'Valve should not be open') _xOpenFeedback := TRUE; _xCloseFeedback := FALSE; _stHMIValve.stSetpoint.rValue := 100.0; -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); AssertTrue(Condition := _fbValve.IsOpen, Message := 'Valve should be open'); AssertFalse(Condition := _fbValve.IsClosed, Message := 'Valve should not be closed'); // Test open and close _xOpenFeedback := TRUE; _xCloseFeedback := TRUE; -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); AssertFalse(Condition := _fbValve.IsClosed OR _fbValve.IsOpen, Message := 'Valve should not signal open or closed with both feedback signals high'); TEST_FINISHED();]]> @@ -161,7 +161,7 @@ _stValveConfig.xHasAnalogFeedback := TRUE; _fbValve( stValveConfig := _stValveConfig, stHMIInterface := _stHMIValve, - xFeedbackOverrange := TRUE, + i_xFeedbackOverrange := TRUE, xError => _xError, xInUnitTestMode := TRUE); @@ -199,7 +199,7 @@ _stValveConfig.xHasAnalogFeedback := TRUE; _fbValve( stValveConfig := _stValveConfig, stHMIInterface := _stHMIValve, - xFeedbackUnderrange := TRUE, + i_xFeedbackUnderrange := TRUE, xError => _xError, xInUnitTestMode := TRUE); @@ -487,7 +487,7 @@ IF _fbValve.IsOpen THEN // Valve should now be closed AssertFalse(Condition := _fbValve.IsOpen, Message := 'Valve should not be open with active Interlock'); AssertTrue(Condition := _fbValve.IsClosed, Message := 'Close output not active with active Interlock'); - AssertEquals_INT(Expected := 0, Actual := _fbValve.iSetpoint, Message := 'Analog output should be zero'); + AssertEquals_INT(Expected := 0, Actual := _fbValve.o_iSetpoint, Message := 'Analog output should be zero'); ELSE AssertTrue(Condition := _fbValve.IsOpen, Message := 'Valve did not open before the test'); END_IF @@ -535,7 +535,7 @@ IF _fbValve.IsOpen THEN // Valve should now be closed AssertFalse(Condition := _fbValve.IsOpen, Message := 'Valve should not be open with active Interlock'); AssertTrue(Condition := _fbValve.IsClosed, Message := 'Close output not active with active Interlock'); - AssertEquals_INT(Expected := 0, Actual := _fbValve.iSetpoint, Message := 'Analog output should be zero'); + AssertEquals_INT(Expected := 0, Actual := _fbValve.o_iSetpoint, Message := 'Analog output should be zero'); ELSE AssertTrue(Condition := _fbValve.IsOpen, Message := 'Valve did not open before the test'); END_IF diff --git a/BasicComponents/POUs/Unittests/ReleaseSignalTests/FB_ReleaseSignalTest.TcPOU b/BasicComponents/Unittests/ReleaseSignalTests/FB_ReleaseSignalTest.TcPOU similarity index 100% rename from BasicComponents/POUs/Unittests/ReleaseSignalTests/FB_ReleaseSignalTest.TcPOU rename to BasicComponents/Unittests/ReleaseSignalTests/FB_ReleaseSignalTest.TcPOU diff --git a/BasicComponents/POUs/Unittests/UtilitiesTests/FB_BlinkerTest.TcPOU b/BasicComponents/Unittests/UtilitiesTests/FB_BlinkerTest.TcPOU similarity index 100% rename from BasicComponents/POUs/Unittests/UtilitiesTests/FB_BlinkerTest.TcPOU rename to BasicComponents/Unittests/UtilitiesTests/FB_BlinkerTest.TcPOU diff --git a/BasicComponents/POUs/Unittests/UtilitiesTests/FB_HashFNV1a_32BitTest.TcPOU b/BasicComponents/Unittests/UtilitiesTests/FB_HashFNV1a_32BitTest.TcPOU similarity index 100% rename from BasicComponents/POUs/Unittests/UtilitiesTests/FB_HashFNV1a_32BitTest.TcPOU rename to BasicComponents/Unittests/UtilitiesTests/FB_HashFNV1a_32BitTest.TcPOU diff --git a/BasicComponents/POUs/Unittests/UtilitiesTests/FB_PT1Test.TcPOU b/BasicComponents/Unittests/UtilitiesTests/FB_PT1Test.TcPOU similarity index 100% rename from BasicComponents/POUs/Unittests/UtilitiesTests/FB_PT1Test.TcPOU rename to BasicComponents/Unittests/UtilitiesTests/FB_PT1Test.TcPOU diff --git a/BasicComponents/POUs/Unittests/UtilitiesTests/FB_RampGeneratorTest.TcPOU b/BasicComponents/Unittests/UtilitiesTests/FB_RampGeneratorTest.TcPOU similarity index 100% rename from BasicComponents/POUs/Unittests/UtilitiesTests/FB_RampGeneratorTest.TcPOU rename to BasicComponents/Unittests/UtilitiesTests/FB_RampGeneratorTest.TcPOU diff --git a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestHMI.TcPOU b/BasicComponents/Unittests/ValveTests/FB_ValveTestHMI.TcPOU similarity index 88% rename from BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestHMI.TcPOU rename to BasicComponents/Unittests/ValveTests/FB_ValveTestHMI.TcPOU index 356cc0a..4d0d771 100644 --- a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestHMI.TcPOU +++ b/BasicComponents/Unittests/ValveTests/FB_ValveTestHMI.TcPOU @@ -46,13 +46,13 @@ _fbValve( wProcessINTLKUsed:= _wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= _stValveConfig, - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); // Valve should now be in manual mode and xRequest should have been reset AssertTrue(Condition := _fbValve.IsInManualMode, Message := 'Valve did not change to manual mode'); @@ -90,13 +90,13 @@ _fbValve( wProcessINTLKUsed:= _wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= _stValveConfig, - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); AssertFalse(Condition := _stHMIValve.stManualButton.xRelease, Message := 'Manual mode button was released but should not have been'); @@ -108,13 +108,13 @@ _fbValve( wProcessINTLKUsed:= _wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= , - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); AssertTrue(Condition := _stHMIValve.stManualButton.xRelease, Message := 'Manual mode button was not released but should have been'); @@ -151,13 +151,13 @@ _fbValveOC( wProcessINTLKUsed:= _wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= _stValveConfig, - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); // Valve should now be in manual mode AssertTrue(Condition := _fbValveOC.IsInManualMode, Message := 'Valve did not change to manual mode pre test'); @@ -170,16 +170,16 @@ _fbValveOC( wProcessINTLKUsed:= _wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= , - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); // test for valve state and HMI feedback -AssertTrue(Condition := _fbValveOC.xOpenValve, Message := 'Valve did not open as requested by hmi button'); +AssertTrue(Condition := _fbValveOC.o_xOpenValve, Message := 'Valve did not open as requested by hmi button'); AssertFalse(Condition := _stHMIValve.stOpenButton.xRequest, Message := 'Valve did not reset open request'); _eExpectedOpenButtonFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; _eExpectedCloseButtonFeedback := E_HMI_BUTTON_FEEDBACK.NONE; @@ -194,16 +194,16 @@ _fbValveOC( wProcessINTLKUsed:= _wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= , - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); // test for valve state and HMI feedback -AssertTrue(Condition := _fbValveOC.xCloseValve, Message := 'Valve did not close as requested by hmi button'); +AssertTrue(Condition := _fbValveOC.o_xCloseValve, Message := 'Valve did not close as requested by hmi button'); AssertFalse(Condition := _stHMIValve.stCloseButton.xRequest, Message := 'Valve did not reset close request'); _eExpectedOpenButtonFeedback := E_HMI_BUTTON_FEEDBACK.NONE; _eExpectedCloseButtonFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; @@ -243,13 +243,13 @@ _fbValve( wProcessINTLKUsed:= wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= _stValveConfig, - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); // Valve should now be in manual mode AssertTrue(Condition := _fbValve.IsInManualMode, Message := 'Valve did not change to manual mode pre test'); @@ -265,15 +265,15 @@ _fbValve( wProcessINTLKUsed:= wInterlocksUsed, stHMIInterface:= _stHMIValve, xError=> , - xOpenFeedback:= , - xCloseFeedback:= , + i_xOpenFeedback:= , + i_xCloseFeedback:= , xReleaseErrors:= , xConfirmAlarms:= , stValveConfig:= , - xOpenValve=> , - xCloseValve=> ); + o_xOpenValve=> , + o_xCloseValve=> ); -AssertFalse(Condition := _fbValve.xOpenValve, Message := 'Valve did not block manual open command with active interlock'); +AssertFalse(Condition := _fbValve.o_xOpenValve, Message := 'Valve did not block manual open command with active interlock'); TEST_FINISHED();]]> diff --git a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU b/BasicComponents/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU similarity index 89% rename from BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU rename to BasicComponents/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU index b0e27bf..b0bd758 100644 --- a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU +++ b/BasicComponents/Unittests/ValveTests/FB_ValveTestTimoutClose.TcPOU @@ -48,8 +48,8 @@ CASE _iState OF 10: // set close feedback after 50ms and call valve block _xOpenFeedback := FALSE; - _xCloseFeedback := _fbValveTimeout.xCloseValve AND _fbDelayFeedbackSignalTimer.Q; - _fbValveTimeout(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); + _xCloseFeedback := _fbValveTimeout.o_xCloseValve AND _fbDelayFeedbackSignalTimer.Q; + _fbValveTimeout(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); // test timeout after 200ms IF _fbTimeoutCloseTestTimer.Q THEN diff --git a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU b/BasicComponents/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU similarity index 89% rename from BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU rename to BasicComponents/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU index 502ee48..b72fc3b 100644 --- a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU +++ b/BasicComponents/Unittests/ValveTests/FB_ValveTestTimoutOpen.TcPOU @@ -48,9 +48,9 @@ CASE _iState OF 10: // set open feedback after 50ms and call valve block - _xOpenFeedback := _fbValveTimeout.xOpenValve AND _fbDelayFeedbackSignalTimer.Q; + _xOpenFeedback := _fbValveTimeout.o_xOpenValve AND _fbDelayFeedbackSignalTimer.Q; _xCloseFeedback := FALSE; - _fbValveTimeout(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); + _fbValveTimeout(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); // test timeout after 200ms IF _fbTimeoutOpenTestTimer.Q THEN diff --git a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU b/BasicComponents/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU similarity index 92% rename from BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU rename to BasicComponents/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU index 1ef858b..20d0afe 100644 --- a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU +++ b/BasicComponents/Unittests/ValveTests/FB_ValveTestTriggerTimoutClose.TcPOU @@ -50,7 +50,7 @@ CASE _iState OF // both feedback false and call valve block _xOpenFeedback := FALSE; _xCloseFeedback := FALSE; - _fbValveTimeout(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, xInUnitTestMode := TRUE, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); + _fbValveTimeout(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, xInUnitTestMode := TRUE, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); // test timeout after 200ms IF _fbTimeoutCloseTestTimer.Q THEN diff --git a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU b/BasicComponents/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU similarity index 92% rename from BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU rename to BasicComponents/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU index 2dd502d..d793682 100644 --- a/BasicComponents/POUs/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU +++ b/BasicComponents/Unittests/ValveTests/FB_ValveTestTriggerTimoutOpen.TcPOU @@ -51,7 +51,7 @@ CASE _iState OF // both feedback false and call valve block _xOpenFeedback := FALSE; _xCloseFeedback := FALSE; - _fbValveTimeout(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, xInUnitTestMode := TRUE, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); + _fbValveTimeout(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, xInUnitTestMode := TRUE, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig); // test timeout after 200ms IF _fbTimeoutOpenTestTimer.Q THEN diff --git a/BasicComponents/POUs/Unittests/ValveTests/FB_Valve_Test.TcPOU b/BasicComponents/Unittests/ValveTests/FB_Valve_Test.TcPOU similarity index 88% rename from BasicComponents/POUs/Unittests/ValveTests/FB_Valve_Test.TcPOU rename to BasicComponents/Unittests/ValveTests/FB_Valve_Test.TcPOU index 3979e99..17fd003 100644 --- a/BasicComponents/POUs/Unittests/ValveTests/FB_Valve_Test.TcPOU +++ b/BasicComponents/Unittests/ValveTests/FB_Valve_Test.TcPOU @@ -53,7 +53,7 @@ _xOpenFeedback := FALSE; _xCloseFeedback := FALSE; _fbValve.xReleaseManualMode := TRUE; _fbValve.ReqManualMode(); -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); // We should now be in manual mode AssertTrue(Condition := _fbValve.IsInManualMode, Message := 'Valve did not changed to manual mode'); @@ -65,7 +65,7 @@ AssertFalse(Condition := _fbValve.IsClosed OR _fbValve.IsOpen, Message := 'Valve // Test closed _xOpenFeedback := FALSE; _xCloseFeedback := TRUE; -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback,stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback,stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); AssertTrue(Condition := _fbValve.IsClosed, Message := 'Valve should be closed'); AssertFalse(Condition := _fbValve.IsOpen, Message := 'Valve should not be open'); @@ -74,14 +74,14 @@ _xOpenFeedback := TRUE; _xCloseFeedback := FALSE; _stHMIValve.stOpenButton.xRequest := TRUE; _fbValve(stHMIInterface := _stHMIValve); -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); AssertTrue(Condition := _fbValve.IsOpen, Message := 'Valve should be open'); AssertFalse(Condition := _fbValve.IsClosed, Message := 'Valve should not be closed'); // Test open and close _xOpenFeedback := TRUE; _xCloseFeedback := TRUE; -_fbValve(xOpenFeedback := _xOpenFeedback, xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); +_fbValve(i_xOpenFeedback := _xOpenFeedback, i_xCloseFeedback := _xCloseFeedback, stHMIInterface := _stHMIValve, stValveConfig := _stValveConfig, xInUnitTestMode := TRUE); AssertFalse(Condition := _fbValve.IsClosed OR _fbValve.IsOpen, Message := 'Valve should not signal open or closed with both feedback signals high'); TEST_FINISHED();]]> @@ -347,16 +347,16 @@ IF _fbValve.IsOpen THEN _fbValve(wProcessINTLK := _wInterlocks, wProcessINTLKUsed := _wInterlocksUsed, stHMIInterface := _stHMIValve); // Valve should now be closed - AssertFalse(Condition := _fbValve.xOpenValve, Message := 'Valve should not be open with active Interlock'); - AssertTrue(Condition := _fbValve.xCloseValve, Message := 'Close output not active with active Interlock'); + AssertFalse(Condition := _fbValve.o_xOpenValve, Message := 'Valve should not be open with active Interlock'); + AssertTrue(Condition := _fbValve.o_xCloseValve, Message := 'Close output not active with active Interlock'); // Test the same with open valve when interlock active _stValveConfig.xNormallyOpen := TRUE; _fbValve(stValveConfig := _stValveConfig, wProcessINTLK := _wInterlocks, wProcessINTLKUsed := _wInterlocksUsed, stHMIInterface := _stHMIValve); // Valve should now be open - AssertTrue(Condition := _fbValve.xOpenValve, Message := 'Valve should be open with active Interlock and inverted config'); - AssertFalse(Condition := _fbValve.xCloseValve, Message := 'Close output active with active Interlock and inverted config'); + AssertTrue(Condition := _fbValve.o_xOpenValve, Message := 'Valve should be open with active Interlock and inverted config'); + AssertFalse(Condition := _fbValve.o_xCloseValve, Message := 'Close output active with active Interlock and inverted config'); ELSE AssertTrue(Condition := _fbValve.IsOpen, Message := 'Valve did not open before the test'); END_IF @@ -405,16 +405,16 @@ IF _fbValve.IsOpen THEN _fbValve(wProcessINTLK := _wInterlocks, wProcessINTLKUsed := _wInterlocksUsed, stHMIInterface := _stHMIValve); // Valve should now be closed - AssertFalse(Condition := _fbValve.xOpenValve, Message := 'Valve should not be open with active Interlock'); - AssertTrue(Condition := _fbValve.xCloseValve, Message := 'Close output not active with active Interlock'); + AssertFalse(Condition := _fbValve.o_xOpenValve, Message := 'Valve should not be open with active Interlock'); + AssertTrue(Condition := _fbValve.o_xCloseValve, Message := 'Close output not active with active Interlock'); // Test the same with open valve when interlock active _stValveConfig.xNormallyOpen := TRUE; _fbValve(stValveConfig := _stValveConfig, wProcessINTLK := _wInterlocks, wProcessINTLKUsed := _wInterlocksUsed, stHMIInterface := _stHMIValve); // Valve should now be open - AssertTrue(Condition := _fbValve.xOpenValve, Message := 'Valve should be open with active Interlock and inverted config'); - AssertFalse(Condition := _fbValve.xCloseValve, Message := 'Close output active with active Interlock and inverted config'); + AssertTrue(Condition := _fbValve.o_xOpenValve, Message := 'Valve should be open with active Interlock and inverted config'); + AssertFalse(Condition := _fbValve.o_xCloseValve, Message := 'Close output active with active Interlock and inverted config'); AssertTrue(Condition := _stHMIValve.stOpenButton.eFeedback = E_HMI_BUTTON_FEEDBACK.ACTIVE, Message := 'Open button should be set active with active Interlock and inverted config'); ELSE AssertTrue(Condition := _fbValve.IsOpen, Message := 'Valve did not open before the test');