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,10 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<GVL Name="GVL_GLOBAL" Id="{48e9f5d5-c85b-4e17-821e-1a57bdce0dd8}">
<Declaration><![CDATA[{attribute 'qualified_only'}
VAR_GLOBAL
// Random number generator
fbRandom : DRAND;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

109
PLC_SIM/PLC_SIM.plcproj Normal file
View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FileVersion>1.0.0.0</FileVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{efb0a11f-989c-4d9e-b375-03735c7e3bff}</ProjectGuid>
<SubObjectsSortedByName>True</SubObjectsSortedByName>
<DownloadApplicationInfo>true</DownloadApplicationInfo>
<WriteProductVersion>true</WriteProductVersion>
<GenerateTpy>false</GenerateTpy>
<Name>PLC_SIM</Name>
<ProgramVersion>3.1.4024.0</ProgramVersion>
<Application>{38921a44-c50c-41e2-854b-4368e8bbac4c}</Application>
<TypeSystem>{adae6458-f6ee-4eb6-8029-1d3613296f7d}</TypeSystem>
<Implicit_Task_Info>{ba927202-89ed-442b-8e0b-f1ede5c67eb6}</Implicit_Task_Info>
<Implicit_KindOfTask>{27c26cb9-57f9-4e40-a5e3-9ab282e33703}</Implicit_KindOfTask>
<Implicit_Jitter_Distribution>{15dd2994-9051-41e5-9816-57eb64e27026}</Implicit_Jitter_Distribution>
<LibraryReferences>{2e35f69f-cdc6-406f-ab1c-2ecda0902edb}</LibraryReferences>
</PropertyGroup>
<ItemGroup>
<Compile Include="GVLs\GVL_GLOBAL.TcGVL">
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="PlcTask.TcTTO">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Analog_Sensor_Mockup\FB_AnalogSensorMockup.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\FB_UnitMockup.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\MAIN.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Motor_Mockup\FB_MotorMockup.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Valve_Mockup\FB_ValveAnalogMockup.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Valve_Mockup\FB_ValveMockup.TcPOU">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="DUTs" />
<Folder Include="GVLs" />
<Folder Include="POUs\Analog_Sensor_Mockup" />
<Folder Include="POUs\Motor_Mockup" />
<Folder Include="POUs\Valve_Mockup" />
<Folder Include="VISUs" />
<Folder Include="POUs" />
</ItemGroup>
<ItemGroup>
<PlaceholderReference Include="Tc2_Standard">
<DefaultResolution>Tc2_Standard, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Standard</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_System">
<DefaultResolution>Tc2_System, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_System</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc3_Module">
<DefaultResolution>Tc3_Module, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_Module</Namespace>
</PlaceholderReference>
</ItemGroup>
<ItemGroup>
<None Include="PLC_SIM.tmc">
<SubType>Content</SubType>
</None>
</ItemGroup>
<ProjectExtensions>
<PlcProjectOptions>
<XmlArchive>
<Data>
<o xml:space="preserve" t="OptionKey">
<v n="Name">"&lt;ProjectRoot&gt;"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>{40450F57-0AA3-4216-96F3-5444ECB29763}</v>
<o>
<v n="Name">"{40450F57-0AA3-4216-96F3-5444ECB29763}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" ckt="String" cvt="String">
<v>ActiveVisuProfile</v>
<v>IR0whWr8bwfwBwAAiD2qpQAAAABVAgAA37x72QAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA0AC4ANwAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWFHYAaQBzAHUAaQBuAHAAdQB0AHMAFwxzAHkAcwB0AGUAbQAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC1INgBjAGIAMQBjAGQAZQAxAC0AZAA1AGQAYwAtADQAYQAzAGIALQA5ADAANQA0AC0AMgAxAGYAYQA3ADUANgBhADMAZgBhADQALihJAG4AdABlAHIAZgBhAGMAZQBWAGUAcgBzAGkAbwBuAEkAbgBmAG8AL0x7AGMANgAxADEAZQA0ADAAMAAtADcAZgBiADkALQA0AGMAMwA1AC0AYgA5AGEAYwAtADQAZQAzADEANABiADUAOQA5ADYANAAzAH0AMBhNAGEAagBvAHIAVgBlAHIAcwBpAG8AbgAxGE0AaQBuAG8AcgBWAGUAcgBzAGkAbwBuADIMTABlAGcAYQBjAHkAMzBMAGEAbgBnAHUAYQBnAGUATQBvAGQAZQBsAFYAZQByAHMAaQBvAG4ASQBuAGYAbwA0MEwAbwBhAGQATABpAGIAcgBhAHIAaQBlAHMASQBuAHQAbwBQAHIAbwBqAGUAYwB0ADUaQwBvAG0AcABhAHQAaQBiAGkAbABpAHQAeQDQAAIaA9ADAS0E0AUGGgfQBwgaAUUHCQjQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtDtAPAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60BAAAA0A0BLRHQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0S0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAUAAAA0AwLrQIAAADQDQEtE9APAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAAAAAANAMC60CAAAA0A0BLRTQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0V0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtFtAPAS0X0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAMAAAAFAAAADQAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtF9AAHy0t0C4vGgPQMAutAQAAANAxC60XAAAA0DIarQDQMy8aA9AwC60CAAAA0DELrQMAAADQMhqtANA0Gq0A0DUarQA=</v>
</d>
</o>
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
<o>
<v n="Name">"{192FAD59-8248-4824-A8DE-9177C94C195A}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
</d>
<d n="Values" t="Hashtable" />
</o>
</Data>
<TypeList>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</PlcProjectOptions>
</ProjectExtensions>
</Project>

1
PLC_SIM/PLC_SIM.tmc Normal file

File diff suppressed because one or more lines are too long

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>

17
PLC_SIM/PlcTask.TcTTO Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<Task Name="PlcTask" Id="{7e68243f-9ee1-4485-91d4-df46ccccb863}">
<!--CycleTime in micro seconds.-->
<CycleTime>10000</CycleTime>
<Priority>21</Priority>
<PouCall>
<Name>MAIN</Name>
</PouCall>
<TaskFBGuid>{e424b7e9-d35f-4add-9e65-4af401c46aa0}</TaskFBGuid>
<Fb_init>{4a091579-5862-4103-8545-d4a37f151ab9}</Fb_init>
<Fb_exit>{f7dc1c2f-47b8-4449-935a-4621db3fcb63}</Fb_exit>
<CycleUpdate>{44041344-d2bc-48db-b8cc-eb686eb6ca64}</CycleUpdate>
<PostCycleUpdate>{0c24a224-7f2d-4ec6-9338-1114f4f413c3}</PostCycleUpdate>
<ObjectProperties />
</Task>
</TcPlcObject>