FUNCTION_BLOCK "Zbiornik" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT "Valve_In (%)" : Real; "Valve_Out (%)" : Real; Disturbance : USInt; "Idle Time (ms)" : Int := 0; END_VAR VAR_OUTPUT "WaterLevel (l)" : Real; END_VAR VAR FillWaterLevel { ExternalWritable := 'False'} : Real; "Pump Output real (l/ms)" : Real; "Pump Memory" : Array[0..9999] of Real; "Pump Memory i" : Int; "Pump Memory Result" : Real; END_VAR VAR_TEMP "Disturbance Strength" : Real; Random : Int; "System Time" : DWord; END_VAR BEGIN // Limity #"Valve_In (%)" := LIMIT(MN := 0.0, IN := #"Valve_In (%)", MX := 100.0); #"Valve_Out (%)" := LIMIT(MN := 0.0, IN := #"Valve_Out (%)", MX := 100.0); #"Idle Time (ms)" := LIMIT(MN := 1, IN := #"Idle Time (ms)", MX := 10000); // #"Pump Memory Result" := 0; FOR #"Pump Memory i" := 1 TO #"Idle Time (ms)" DO #"Pump Memory"[#"Pump Memory i" - 1] := #"Pump Memory"[#"Pump Memory i"]; #"Pump Memory Result" += #"Pump Memory"[#"Pump Memory i" - 1]; END_FOR; #"Pump Memory"[#"Idle Time (ms)"] := #"Valve_In (%)"; #"Pump Memory Result" += #"Pump Memory"[#"Idle Time (ms)"]; #"Pump Memory Result" /= #"Idle Time (ms)"; //Tank inlet #"Pump Output real (l/ms)" := #"Pump Memory Result" / 1000.0; #FillWaterLevel := #FillWaterLevel + #"Pump Output real (l/ms)"; CASE #Disturbance OF 0..1: // Statement section case 1 #"Disturbance Strength" := 0.0; 2: // Statement section case 2 to 4 #"Disturbance Strength" := 0.0025; 3: #"Disturbance Strength" := 0.0035; 4: #"Disturbance Strength" := 0.004; ELSE // Statement section ELSE ; END_CASE; #"System Time" := TIME_TCK(); #Random := (DWORD_TO_DINT(#"System Time") MOD 10); IF #Random > 5 THEN #FillWaterLevel := #FillWaterLevel - #"Disturbance Strength"; END_IF; #FillWaterLevel := ((((150.0 - #"Valve_Out (%)") / 150.0) * #FillWaterLevel - #FillWaterLevel) / 1000.0 + #FillWaterLevel); #FillWaterLevel := LIMIT(MN := 0.0, IN := #FillWaterLevel, MX := 200.0); #"WaterLevel (l)" := #FillWaterLevel / 2; END_FUNCTION_BLOCK