T
TedescoA
Guest
-> Hier kostenlos registrieren
Ich habe Pumpenpendelung in SCL für 3 Pumpen geschrieben,
ich möchte es auf 6 Pumpen ausbauen, leider habe ich die Übersicht verloren kann mir jemanden helfen?
Ihr ist der Code für 3 Pumpen:
VAR_INPUT
QUARTZ_Sec,QUARTZ_Min,READY1,READY2,READY3: BOOL;
END_VAR
VAR_OUTPUT
RUN1, RUN2, RUN3: bool;
END_VAR
VAR_IN_OUT
REQUESTED, TurnOverPresetTime, TurnOverRemainTime, OverlapPresetTime, OverlapRemainTime, SEQ : INT;
END_VAR
VAR_TEMP
AccountToReady, AccountToRun, xSeq, xReady, xRequest : INT;
READY : ARRAY[1..4] OF BOOL;
Run : array[1..3] of bool;
END_VAR
BEGIN
//Initialise variable
//--------------------
AccountToRun := 0;
AccountToReady := 0;
xSeq := 1;
xReady := 1;
xRequest := 1;
READY[1] := READY1;
READY[2] := READY2;
READY[3] := READY3;
READY[4] := READY1;
Run[1] := false;
Run[2] := false;
Run[3] := false;
// Account ready inputs
// --------------------
WHILE xReady <= 3 DO
IF READY[xReady] = true THEN AccountToReady := AccountToReady + 1; END_IF;
xReady := xReady + 1;
END_WHILE;
xReady := 1;
//Initialing of turn over, overlap time and sequence
//--------------------------------------------------
IF TurnOverRemainTime <= 0 AND OverlapRemainTime <= 0 THEN
TurnOverRemainTime := TurnOverPresetTime;
OverlapRemainTime := OverlapPresetTime;
SEQ:= SEQ + 1;
END_IF;
IF SEQ < 1 OR SEQ > 3 THEN SEQ := 1; END_IF;
// Overlap request
// ---------------
IF TurnOverRemainTime <= 0 AND OverlapRemainTime > 0 THEN Requested:= Requested + 1; END_IF;
// Change sequence always when first of sequence isn't ready
// ---------------------------------------------------------
xReady := 1;
WHILE xReady <= 3 DO
IF READY[xReady] = false
AND SEQ = xReady
THEN
SEQ := xReady + 1;
TurnOverRemainTime := TurnOverPresetTime - 1;
IF SEQ > 3 THEN SEQ := 1; END_IF;
END_IF;
xReady := xReady + 1;
END_WHILE;
// Change sequence always when second of sequence isn't ready
// ---------------------------------------------------------
xReady := 1;
WHILE xReady <= 3 DO
IF READY[xReady+1] = false
AND SEQ = xReady
THEN
SEQ := SEQ - 3 + 2;
TurnOverRemainTime := TurnOverPresetTime - 1;
IF SEQ <=0 THEN SEQ := 3; END_IF;
END_IF;
xReady := xReady + 1;
END_WHILE;
//Algorithme
//----------
WHILE xSeq <= 3 DO
IF SEQ=xSeq THEN xReady :=xSeq;
WHILE xRequest <= 3 DO
IF Requested = xRequest THEN
WHILE xReady <= 3 DO
IF READY[xReady] THEN Run[xReady]:= true;
AccountToRun := AccountToRun + 1;END_IF;
IF Requested = AccountToRun THEN xReady := 9999;
ELSE xReady := xReady + 1;
END_IF;
IF xReady > 3 AND xReady <> 9999 THEN xReady := 1;END_IF;
IF xReady = xSeq THEN xReady := 9999; END_IF;
END_WHILE;
END_IF;
xRequest := xRequest + 1;
END_WHILE;
END_IF;
xSeq := xSeq + 1;
END_WHILE;
//Discount turn over and overlap time
//-----------------------------------
IF AccountToReady > AccountToRun THEN
IF QUARTZ_Min = true AND TurnOverRemainTime > 0 AND AccountToRun > 0 AND REQUESTED > 0
THEN TurnOverRemainTime := TurnOverRemainTime - 1; END_IF;
END_IF;
IF QUARTZ_Sec = true AND OverlapRemainTime > 0 AND TurnOverRemainTime <= 0
THEN OverlapRemainTime := OverlapRemainTime - 1; END_IF;
//Ajustement of variable
//----------------------
Run1:= Run[1];
Run2:= Run[2];
Run3:= Run[3];
END_FUNCTION
ich möchte es auf 6 Pumpen ausbauen, leider habe ich die Übersicht verloren kann mir jemanden helfen?
Ihr ist der Code für 3 Pumpen:
VAR_INPUT
QUARTZ_Sec,QUARTZ_Min,READY1,READY2,READY3: BOOL;
END_VAR
VAR_OUTPUT
RUN1, RUN2, RUN3: bool;
END_VAR
VAR_IN_OUT
REQUESTED, TurnOverPresetTime, TurnOverRemainTime, OverlapPresetTime, OverlapRemainTime, SEQ : INT;
END_VAR
VAR_TEMP
AccountToReady, AccountToRun, xSeq, xReady, xRequest : INT;
READY : ARRAY[1..4] OF BOOL;
Run : array[1..3] of bool;
END_VAR
BEGIN
//Initialise variable
//--------------------
AccountToRun := 0;
AccountToReady := 0;
xSeq := 1;
xReady := 1;
xRequest := 1;
READY[1] := READY1;
READY[2] := READY2;
READY[3] := READY3;
READY[4] := READY1;
Run[1] := false;
Run[2] := false;
Run[3] := false;
// Account ready inputs
// --------------------
WHILE xReady <= 3 DO
IF READY[xReady] = true THEN AccountToReady := AccountToReady + 1; END_IF;
xReady := xReady + 1;
END_WHILE;
xReady := 1;
//Initialing of turn over, overlap time and sequence
//--------------------------------------------------
IF TurnOverRemainTime <= 0 AND OverlapRemainTime <= 0 THEN
TurnOverRemainTime := TurnOverPresetTime;
OverlapRemainTime := OverlapPresetTime;
SEQ:= SEQ + 1;
END_IF;
IF SEQ < 1 OR SEQ > 3 THEN SEQ := 1; END_IF;
// Overlap request
// ---------------
IF TurnOverRemainTime <= 0 AND OverlapRemainTime > 0 THEN Requested:= Requested + 1; END_IF;
// Change sequence always when first of sequence isn't ready
// ---------------------------------------------------------
xReady := 1;
WHILE xReady <= 3 DO
IF READY[xReady] = false
AND SEQ = xReady
THEN
SEQ := xReady + 1;
TurnOverRemainTime := TurnOverPresetTime - 1;
IF SEQ > 3 THEN SEQ := 1; END_IF;
END_IF;
xReady := xReady + 1;
END_WHILE;
// Change sequence always when second of sequence isn't ready
// ---------------------------------------------------------
xReady := 1;
WHILE xReady <= 3 DO
IF READY[xReady+1] = false
AND SEQ = xReady
THEN
SEQ := SEQ - 3 + 2;
TurnOverRemainTime := TurnOverPresetTime - 1;
IF SEQ <=0 THEN SEQ := 3; END_IF;
END_IF;
xReady := xReady + 1;
END_WHILE;
//Algorithme
//----------
WHILE xSeq <= 3 DO
IF SEQ=xSeq THEN xReady :=xSeq;
WHILE xRequest <= 3 DO
IF Requested = xRequest THEN
WHILE xReady <= 3 DO
IF READY[xReady] THEN Run[xReady]:= true;
AccountToRun := AccountToRun + 1;END_IF;
IF Requested = AccountToRun THEN xReady := 9999;
ELSE xReady := xReady + 1;
END_IF;
IF xReady > 3 AND xReady <> 9999 THEN xReady := 1;END_IF;
IF xReady = xSeq THEN xReady := 9999; END_IF;
END_WHILE;
END_IF;
xRequest := xRequest + 1;
END_WHILE;
END_IF;
xSeq := xSeq + 1;
END_WHILE;
//Discount turn over and overlap time
//-----------------------------------
IF AccountToReady > AccountToRun THEN
IF QUARTZ_Min = true AND TurnOverRemainTime > 0 AND AccountToRun > 0 AND REQUESTED > 0
THEN TurnOverRemainTime := TurnOverRemainTime - 1; END_IF;
END_IF;
IF QUARTZ_Sec = true AND OverlapRemainTime > 0 AND TurnOverRemainTime <= 0
THEN OverlapRemainTime := OverlapRemainTime - 1; END_IF;
//Ajustement of variable
//----------------------
Run1:= Run[1];
Run2:= Run[2];
Run3:= Run[3];
END_FUNCTION