Hallo
Ich hatte das gleiche Problem:
Habe den Baustein wie Folgt angepasst (Fett markiert). Die Initialverte werden bei ersten Zyklus der SPS in den Speicher kopiert. Somit können alle Storen mit Initialwerten geladen werden und keine Probleme mit Kopieren neustarten oder Programmänderungen.
Gruss
FUNCTION_BLOCK FB_BLIND_SCENE_Omalik
VAR_INPUT
UP, DN : BOOL;
S_IN : BYTE;
PI, AI : BYTE;
ENABLE : BOOL;
SWRITE : BOOL;
SCENE : BYTE;
ini_EN: : ARRAY[0..15] OF BYTE;
ini_PI : ARRAY[0..15] OF BYTE;
ini_AI : ARRAY[0..15] OF BYTE;
END_VAR
VAR_OUTPUT
QU, QD : BOOL;
STATUS : BYTE;
PO, AO : BYTE;
END_VAR
VAR RETAIN
sx : ARRAY[0..15,0..2] OF BYTE;
END_VAR
VAR_TEMP
x : BYTE;
schleife:BYTE;
END_VAR
(* delete all bits except the lower 4 of scene *)
x := scene AND 16#0F;
IF enable AND sx[x,0] <> 0 AND UP AND DN THEN
po := sx[x,0];
ao := sx[x,1];
status := 160 + x; (* Status number is 160 to 175 for the 16 scenes *)
QU := TRUE;
QD := TRUE;
ELSE
QU := UP;
QD := DN;
status := S_IN;
po := pi;
ao := ai;
END_IF;
(* write scene if necessary *)
IF swrite THEN
status := 176; (* write scene *)
sx[x,0] := pi;
sx[x,1] := ai;
IF enable THEN sx[x,2] := 1; ELSE sx[x,2] := 0; END_IF; (* if sx[x,2] = 0 the scene is disabled *)
END_IF;
(* Inizialisieren *)
IF NOT erster_zyklus THEN (*Sollen die Ini Werte geladen werden? *)
FOR schleife := 0 TO 15 DO
sx[schleife,0] := ini_EN[schleife]; (* Ini Werte laden *)
sx[schleife,1] := ini_PI[schleife]; (* Ini Werte laden *)
sx[schleife,2] := ini_AI[schleife];
END_FOR
END_IF;