Projektdateien hinzufügen.

This commit is contained in:
Matthias Heisig
2024-01-04 15:15:26 +01:00
parent 4c6f8dc5bd
commit faa33db290
94 changed files with 15104 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_AnalogSensorMockup" Id="{198f1df4-73a2-495b-b972-189adc06c969}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_AnalogSensorMockup
VAR_INPUT
// Raise sensor level from min to max
xEnable : BOOL;
// Sensor value when enabled
rOnValue : REAL;
// Sensor value when dissabled
rOffValue : REAL;
// Sensor noise value
rNoise : REAL := 0.0;
// Sensor min value for analog scaling
rMinValue : REAL := 0.0;
// Sensor max value for analog scaling
rMaxValue : REAL := 1.0;
END_VAR
VAR_OUTPUT
iAnalogValue AT %Q* : INT;
END_VAR
VAR
// Internal target value
_rTargetValue : REAL;
// Temp variable
_lrTmp : LREAL;
// Filter data
_rFilterParam : REAL := 0.005;
_rFilterParam2 : REAL := 1.0 - _rFilterParam;
// Calculated value
_rValue : REAL;
// Last calculated value
_rPrevValue : REAL := 0.0;
// Analog output
_fbValveAnalogOutput : FB_AnalogOutput('');
// Analog output scaling
_stAnalogScaling : ST_ANALOG_IO_CONFIG;
_stAnalogEWConfig : ST_ANALOG_EW_LEVELS;
_stAnalogEWDelays : ST_ANALOG_EW_DELAYS;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Pressure only if enabled
IF xEnable THEN
_rTargetValue := rOnValue;
ELSE
_rTargetValue := rOffValue;
END_IF
// Get a random number
GVL_GLOBAL.fbRandom(Seed := 1337, Num => _lrTmp);
// Exponential smoothing
_rValue := _rFilterParam * _rTargetValue + _rFilterParam2 * _rPrevValue;
_rPrevValue := _rValue;
// Add some random noise
IF xEnable THEN
_rValue := _rValue + (LREAL_TO_REAL(_lrTmp - 0.5) * rNoise);
END_IF
// Set analog output scaling
_stAnalogScaling.iAIMax := 32767;
_stAnalogScaling.iAIMin := 0;
_stAnalogScaling.rPVMax := rMaxValue;
_stAnalogScaling.rPVMin := rMinValue;
// Calculate analog output from ramp generator setpoint
_fbValveAnalogOutput(
rSetpoint:= _rValue,
stScalingConfig:= _stAnalogScaling,
xReleaseErrors:= FALSE,
xReleaseHardwareErrors:= FALSE,
xConfirmAlarms:= ,
iAnalogValue=> iAnalogValue,
xError=> );]]></ST>
</Implementation>
<LineIds Name="FB_AnalogSensorMockup">
<LineId Id="719" Count="14" />
<LineId Id="798" Count="0" />
<LineId Id="734" Count="0" />
<LineId Id="799" Count="0" />
<LineId Id="735" Count="14" />
<LineId Id="9" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_UnitMockup" Id="{a1155b26-00e6-4710-a8e4-140d6d5cd082}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_UnitMockup
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
// Valves posolyt
_fbPosolytValveTankOutlet : FB_ValveMockup;
// Valves negolyt
_fbNegolytValveTankOutlet : FB_ValveMockup;
// Pumps posolyt
_fbPosolytPumpInlet : FB_MotorMockup;
// Pumps negolyt
_fbNegolytPumpInlet : FB_MotorMockup;
// Pressure sensors posolyt
_fbPressurePosolytSegmentInlet : FB_AnalogSensorMockup;
_fbPressurePosolytTankInlet : FB_AnalogSensorMockup;
// Pressure sensors negolyt
_fbPressureNegolytSegmentInlet : FB_AnalogSensorMockup;
_fbPressureNegolytTankInlet : FB_AnalogSensorMockup;
// Helping variables
_xFlowThroughtSegmentPosolyt : BOOL;
_xFlowThroughtBypassPosolyt : BOOL;
_xFlowThroughtSegmentNegolyt : BOOL;
_xFlowThroughtBypassNegolyt : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Valves posolyt
_fbPosolytValveTankOutlet();
// Valves negolyt
_fbNegolytValveTankOutlet();
// Pumps posolyt
_fbPosolytPumpInlet();
// Pumps negolyt
_fbNegolytPumpInlet();
// Simulate flow posolyt
_xFlowThroughtSegmentPosolyt := _fbPosolytPumpInlet.xEnable AND _fbPosolytValveTankOutlet.xOpenFeedback;
_xFlowThroughtBypassPosolyt := _fbPosolytPumpInlet.xEnable AND NOT _fbPosolytValveTankOutlet.xOpenFeedback;
_xFlowThroughtSegmentNegolyt := _fbNegolytPumpInlet.xEnable AND _fbNegolytValveTankOutlet.xOpenFeedback;
_xFlowThroughtBypassNegolyt := _fbNegolytPumpInlet.xEnable AND NOT _fbNegolytValveTankOutlet.xOpenFeedback ;
// Pressure sensors posolyt
_fbPressurePosolytSegmentInlet(
xEnable:= _xFlowThroughtSegmentPosolyt,
rOnValue:= 0.487,
rOffValue:= 0.0,
rNoise:= 0.002,
rMinValue:= -1.0,
rMaxValue:= 1.5);
_fbPressurePosolytTankInlet(
xEnable:= _xFlowThroughtSegmentPosolyt,
rOnValue:= 0.0429,
rOffValue:= 0.0,
rNoise:= 0.002,
rMinValue:= -1.0,
rMaxValue:= 1.5);
// Pressure sensors negolyt
_fbPressureNegolytSegmentInlet(
xEnable:= _xFlowThroughtSegmentNegolyt,
rOnValue:= 0.487,
rOffValue:= 0.0,
rNoise:= 0.002,
rMinValue:= -1.0,
rMaxValue:= 1.5);
_fbPressureNegolytTankInlet(
xEnable:= _xFlowThroughtSegmentNegolyt,
rOnValue:= 0.0429,
rOffValue:= 0.0,
rNoise:= 0.002,
rMinValue:= -1.0,
rMaxValue:= 1.5);
]]></ST>
</Implementation>
<LineIds Name="FB_UnitMockup">
<LineId Id="482" Count="1" />
<LineId Id="486" Count="2" />
<LineId Id="491" Count="2" />
<LineId Id="495" Count="2" />
<LineId Id="499" Count="2" />
<LineId Id="695" Count="3" />
<LineId Id="502" Count="8" />
<LineId Id="519" Count="7" />
<LineId Id="568" Count="3" />
<LineId Id="699" Count="3" />
<LineId Id="576" Count="0" />
<LineId Id="585" Count="7" />
<LineId Id="600" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

13
PLC_SIM/POUs/MAIN.TcPOU Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="MAIN" Id="{bb83bde3-1093-40be-b27d-d7bc60ebb5a6}">
<Declaration><![CDATA[PROGRAM MAIN
VAR
END_VAR
]]>
</Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_MotorMockup" Id="{2caa045e-1cb0-4e4b-ae71-f86aa7b0d7a4}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_MotorMockup
VAR_INPUT
// Enable motor
xEnable AT%I* : BOOL;
// Motor setpoint
iSetpoint AT%I* : INT;
END_VAR
VAR_OUTPUT
// Motor circuit breaker ok
xMCBOk AT %Q* : BOOL;
// Repair switch ok
xRepairSwitchOk AT %Q* : BOOL;
// Motor speed feedback
iMotorSpeedFeedback AT %Q* : INT;
END_VAR
VAR
_iInternalSetpoint : INT;
_fbRampGenerator : FB_RampGenerator;
_fbValveAnalogInput : FB_AnalogInput('');
_stAnalogScaling : ST_ANALOG_IO_CONFIG := (iAIMax := 32767, iAIMin := 0, rPVMax := 100, rPVMin := 0);
_stAnalogEWConfig : ST_ANALOG_EW_LEVELS;
_stAnalogEWDelays : ST_ANALOG_EW_DELAYS;
_fbValveAnalogOutput : FB_AnalogOutput('');
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Set MCB and repair switch ok
xMCBOk := TRUE;
xRepairSwitchok := TRUE;
// Turn motor off if enable signal is not set
IF xEnable THEN
_iInternalSetpoint := iSetpoint;
ELSE
iSetpoint := 0;
END_IF
// Calculate setpoint 0% - 100%
// from analog value
_fbValveAnalogInput(
iAnalogValue:= iSetpoint,
stScalingConfig:= _stAnalogScaling,
stEWConfig:= _stAnalogEWConfig,
stEWDelayConfig:= _stAnalogEWDelays,
xUnderrange:= FALSE,
xOverrange:= FALSE,
xErrorCard:= FALSE,
xReleaseErrors:= FALSE,
xReleaseLimitErrors:= FALSE,
xReleaseHardwareErrors:= FALSE,
xConfirmAlarms:= ,
xError=> ,
xWarning=> ,
rScaledValue=> ,
xErrorLow=> ,
xWarningLow=> ,
xWarningHigh=> ,
xErrorHigh=> );
// Ramp generator for speed simulation
_fbRampGenerator(
rTarget:= _fbValveAnalogInput.rScaledValue,
rTargetMin:= 0,
rTargetMax:= 100,
timRampUp:= T#10S,
timRampDown:= T#10S,
rSetpoint=> );
// Calculate analog output from ramp generator setpoint
_fbValveAnalogOutput(
rSetpoint:= _fbRampGenerator.rSetpoint,
stScalingConfig:= _stAnalogScaling,
xReleaseErrors:= FALSE,
xReleaseHardwareErrors:= FALSE,
xConfirmAlarms:= ,
iAnalogValue=> iMotorSpeedFeedback,
xError=> );]]></ST>
</Implementation>
<LineIds Name="FB_MotorMockup">
<LineId Id="23" Count="0" />
<LineId Id="9" Count="0" />
<LineId Id="25" Count="0" />
<LineId Id="83" Count="0" />
<LineId Id="75" Count="0" />
<LineId Id="74" Count="0" />
<LineId Id="76" Count="0" />
<LineId Id="81" Count="1" />
<LineId Id="77" Count="0" />
<LineId Id="26" Count="0" />
<LineId Id="35" Count="38" />
<LineId Id="24" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_ValveAnalogMockup" Id="{e3712921-003e-473b-993e-6c5d40e0a0c0}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_ValveAnalogMockup
VAR_INPUT
iAnalogSetpoint AT %I* : INT;
END_VAR
VAR_OUTPUT
xOpenFeedback AT %Q* : BOOL;
xCloseFeedback AT %Q* : BOOL;
iAnalogProcessValue AT %Q* : INT;
END_VAR
VAR
_fbRampGenerator : FB_RampGenerator;
_fbValveAnalogInput : FB_AnalogInput('');
_stAnalogScaling : ST_ANALOG_IO_CONFIG := (iAIMax := 32767, iAIMin := 0, rPVMax := 100, rPVMin := 0);
_stAnalogEWConfig : ST_ANALOG_EW_LEVELS;
_stAnalogEWDelays : ST_ANALOG_EW_DELAYS;
_fbValveAnalogOutput : FB_AnalogOutput('');
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Calculate setpoint 0% - 100%
// from analog value
_fbValveAnalogInput(
iAnalogValue:= iAnalogSetpoint,
stScalingConfig:= _stAnalogScaling,
stEWConfig:= _stAnalogEWConfig,
stEWDelayConfig:= _stAnalogEWDelays,
xUnderrange:= FALSE,
xOverrange:= FALSE,
xErrorCard:= FALSE,
xReleaseErrors:= FALSE,
xReleaseLimitErrors:= FALSE,
xReleaseHardwareErrors:= FALSE,
xConfirmAlarms:= ,
xError=> ,
xWarning=> ,
rScaledValue=> ,
xErrorLow=> ,
xWarningLow=> ,
xWarningHigh=> ,
xErrorHigh=> );
// Ramp generator for position simulation
_fbRampGenerator(
rTarget:= _fbValveAnalogInput.rScaledValue,
rTargetMin:= 0,
rTargetMax:= 100,
timRampUp:= T#5S,
timRampDown:= T#5S,
rSetpoint=> );
// Calculate analog output from ramp generator setpoint
_fbValveAnalogOutput(
rSetpoint:= _fbRampGenerator.rSetpoint,
stScalingConfig:= _stAnalogScaling,
xReleaseErrors:= FALSE,
xReleaseHardwareErrors:= FALSE,
xConfirmAlarms:= ,
iAnalogValue=> iAnalogProcessValue,
xError=> );
// Simulate close feedback
IF _fbRampGenerator.rSetpoint < 5.0 THEN
xCloseFeedback := TRUE;
ELSE
xCloseFeedback := FALSE;
END_IF
// Simulate open feedback
IF _fbRampGenerator.rSetpoint > 95.0 THEN
xOpenFeedback := TRUE;
ELSE
xOpenFeedback := FALSE;
END_IF]]></ST>
</Implementation>
<LineIds Name="FB_ValveAnalogMockup">
<LineId Id="603" Count="38" />
<LineId Id="75" Count="0" />
<LineId Id="642" Count="0" />
<LineId Id="654" Count="0" />
<LineId Id="643" Count="1" />
<LineId Id="646" Count="1" />
<LineId Id="645" Count="0" />
<LineId Id="655" Count="0" />
<LineId Id="649" Count="0" />
<LineId Id="648" Count="0" />
<LineId Id="650" Count="0" />
<LineId Id="652" Count="1" />
<LineId Id="651" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_ValveMockup" Id="{547b8ab6-f6bc-4f02-ac80-4920749ff4eb}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_ValveMockup
VAR_INPUT
xOpenValve AT %I* : BOOL;
xCloseValve AT %I* : BOOL;
END_VAR
VAR_OUTPUT
xOpenFeedback AT %Q* : BOOL;
xCloseFeedback AT %Q* : BOOL;
END_VAR
VAR
_tonOpen : TON := (PT := T#2S);
_tonClose : TON := (PT := T#2S);
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Timer for open and close feedback
_tonOpen(IN := xOpenValve);
_tonClose(IN := xCloseValve);
// Open and close feedback
xOpenFeedback := _tonOpen.Q;
xCloseFeedback := _tonClose.Q;]]></ST>
</Implementation>
<LineIds Name="FB_ValveMockup">
<LineId Id="54" Count="5" />
<LineId Id="20" Count="0" />
</LineIds>
</POU>
</TcPlcObject>