-> Hier kostenlos registrieren
Hallo Zusammen,
folgendes Problem:
Einer 2x verschachtelten REC-Struktur, die in einem Array gelagert wird, sollen Werte zugewiesen werden. Leider bekomme ich nur Werte zugewiesen, die als Input-VAR an den FB übergeben werden. Werte, die in anderen FB zugewiesen werden, werden nicht gespeichert.
Meine REC-Struktur:
Dazu als Beispiel eine Sub-Rec-Struktur:
In einem FB sollen nun diesen VARs Werte zugewiesen werden:
Wenn ich jetzt in einem FB diese Struktur abfrage, werden zwar die Werte, welche mit VAR_INPUT übergeben werden, verwendet, nicht aber dier oben gesetzten.
Aufrufprogramm mit vorbesetzten VAR_INPUT:
Und zum Schluss der verarbeitende FB "raffstore_schalten", in dem nichts ankommt:
Kann mir vielleicht jemnd einen Tip gebe, wo mein Fehler liegt.
Edit:
Jetzt habe ich gerade noch einmal nachgeschaut und den Eindruck gewonnen, dass garkeine Array-Werte gespeichert werden?????
Danke im voraus.
Majaestix
folgendes Problem:
Einer 2x verschachtelten REC-Struktur, die in einem Array gelagert wird, sollen Werte zugewiesen werden. Leider bekomme ich nur Werte zugewiesen, die als Input-VAR an den FB übergeben werden. Werte, die in anderen FB zugewiesen werden, werden nicht gespeichert.
Meine REC-Struktur:
Code:
TYPE raffstore_rec :
STRUCT
status : BOOL;
aufwaerts : BOOL;
abwaerts : BOOL;
input : blind_input_rec;
scene : blind_scene_rec;
shade : blind_shade_rec;
dark : blind_dark_rb_rec;
set : blind_set_rec;
security : blind_security_rb_rec;
control : blind_control_rec;
status_alarm : alarm_rec;
max_einschaltdauer : max_einschaltdauer_rec;
END_STRUCT
END_TYPE
Dazu als Beispiel eine Sub-Rec-Struktur:
Code:
TYPE blind_input_rec :
STRUCT
(* Eingaenge *)
in_pos : BYTE; (* Rückführung der Jalousiestellung *)
etc.
(* Setup *)
set_single_switch : BOOL := FALSE; (* TRUE für Einzeltasterbetrieb *)
etc.
(* Output *)
etc.
END_STRUCT
END_TYPE
In einem FB sollen nun diesen VARs Werte zugewiesen werden:
Code:
FUNCTION_BLOCK eg_aus_variablen_setzen
VAR_INPUT
enable : BOOL;
END_VAR
VAR
rs_rec : ARRAY[1..11] OF raffstore_rec;
END_VAR
[HR][/HR]
zum Beispiel:
(*----- blind_input_rec -----*)
rs_rec[1].input.set_single_switch := nein; (* TRUE für Einzeltasterbetrieb, nur via S1 *)
rs_rec[1].input.set_click_en := nein; (* TRUE für Single Klick Mode *)
rs_rec[1].input.set_click_time := T#500ms; (* Timeout für Klick Erkennung *)
rs_rec[1].input.set_max_runtime := T#80s; (* Timeout für eine Bewegung *)
rs_rec[1].input.set_manual_timeout := T#5m; (* Timeout = Ruhezeit S1/S2 -> zurück zum Automatikbetrieb *)
rs_rec[1].input.set_debounce_time := T#20ms; (* Entprellzeit für die Eingänge S *)
etc.
Wenn ich jetzt in einem FB diese Struktur abfrage, werden zwar die Werte, welche mit VAR_INPUT übergeben werden, verwendet, nicht aber dier oben gesetzten.
Aufrufprogramm mit vorbesetzten VAR_INPUT:
Code:
FUNCTION_BLOCK raffstore_wz_ost_auto
VAR_INPUT
raffstore_auf_zu : BOOL;
Enable : BOOL;
END_VAR
VAR
fb_raffstore_schalten : raffstore_schalten;
END_VAR
[HR][/HR]
(* ---------- einzelnen Raffstore betaetigen ---------- *)
(* ---------------------------------------------------------------------------- FB aktiviert -------------------------------------------------------------------------------- *)
IF enable = FALSE THEN
RETURN;
END_IF; (* ----- IF Enable = FALSE THEN ----- *)
(* ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- *)
fb_raffstore_schalten (rs_nr := 11, (* Raffstore Nummer *)
(* BLIND_INPUT *)
raffstore_blind_input_in_in := FALSE, (* Gesteuerter Betrieb wenn TRUE, QU + QD = TRUE = Auto, PI/AI -> PO/AO *)
raffstore_blind_input_in_s1 := FALSE, (* Eingang AUF falls IN = FALSE *)
raffstore_blind_input_in_s2 := FALSE, (* Eingang AB falls IN = FALSE *)
raffstore_blind_input_in_pi := 0, (* Position wenn IN = TRUE *)
raffstore_blind_input_in_ai := 255, (* Winkel wenn IN = TRUE *)
Und zum Schluss der verarbeitende FB "raffstore_schalten", in dem nichts ankommt:
Code:
FUNCTION_BLOCK raffstore_schalten
VAR_INPUT
rs_nr : INT; (* Raffstore Nummer *)
(* BLIND_INPUT *)
raffstore_blind_input_in_in : BOOL; (* Gesteuerter Betrieb wenn TRUE, QU + QD = TRUE = Auto, PI/AI -> PO/AO *)
raffstore_blind_input_in_s1 : BOOL; (* Eingang AUF falls IN = FALSE *)
raffstore_blind_input_in_s2 : BOOL; (* Eingang AB falls IN = FALSE *)
raffstore_blind_input_in_pi : BYTE; (* Position wenn IN = TRUE *)
raffstore_blind_input_in_ai : BYTE; (* Winkel wenn IN = TRUE *)
[HR][/HR]
(* ------------------------------------ Baustein BLIND_INPUT aus OSCAT.LIB ------------------------------------ *)
test_var := rs_rec[11].shade.set_direction;
(* Eingaenge *)
raffstore_blind_input (POS := rs_rec[rs_nr].control.out_pos, (* Rückführung der Jalousiestellung *)
ANG := rs_rec[rs_nr].control.out_ang, (* Rückführung der Lamellenwinkels *)
S1 := raffstore_blind_input_in_s1, (* Eingang AUF *)
S2 := raffstore_blind_input_in_s2, (* Eingang AB *)
IN := raffstore_blind_input_in_in, (* Gesteuerter Betrieb wenn TRUE *)
PI := raffstore_blind_input_in_pi, (* Position wenn IN = TRUE *)
AI := raffstore_blind_input_in_ai, (* Winkel wenn IN = TRUE *)
(* Setup *)
SINGLE_SWITCH := rs_rec[rs_nr].input.set_single_switch, (* TRUE für Einzeltasterbetrieb *)
CLICK_EN := rs_rec[rs_nr].input.set_click_en, (* TRUE für Single Klick Mode *)
CLICK_TIME := rs_rec[rs_nr].input.set_click_time, (* Timeout für Klick Erkennung *)
MAX_RUNTIME := rs_rec[rs_nr].input.set_max_runtime, (* Timeout für eine Bewegung *)
MANUAL_TIMEOUT := rs_rec[rs_nr].input.set_manual_timeout, (* Timeout des Handbetriebs Vorgabe 1h*)
DEBOUNCE_TIME := rs_rec[rs_nr].input.set_debounce_time, (* Entprellzeit für die Eingänge S *)
DBL_CLK1 := rs_rec[rs_nr].input.set_dbl_click1, (* bei Doppelklick Position anfahren wenn TRUE *)
DBL_POS1 := rs_rec[rs_nr].input.set_dbl_pos1, (* Position bei S1 Doppelklick *)
DBL_ANG1 := rs_rec[rs_nr].input.set_dbl_ang1, (* Winkel bei S1 Doppelklick *)
DBL_CLK2 := rs_rec[rs_nr].input.set_dbl_click2, (* bei Doppelklick Position anfahren wenn TRUE *)
DBL_POS2 := rs_rec[rs_nr].input.set_dbl_pos2, (* Position bei S1 Doppelklick *)
DBL_ANG2 := rs_rec[rs_nr].input.set_dbl_ang2, (* Winkel bei S2 Doppelklick *)
D1_TOGGLE := rs_rec[rs_nr].input.set_d1_toogle, (* Toggle Modus für D1 *)
D2_TOGGLE := rs_rec[rs_nr].input.set_d2_toogle, (* Toggle Modus für D2 *)
MASTER_MODE := rs_rec[rs_nr].input.set_master_mode, (* aktiviert den Master Mode wenn TRUE *)
(* Output *)
QU => rs_rec[rs_nr].input.out_qu, (* Motor AUF Signal *)
QD => rs_rec[rs_nr].input.out_qd, (* Motor AB Signal *)
STATUS => rs_rec[rs_nr].input.out_status, (* ESR kompatibler Status Ausgang *)
PO => rs_rec[rs_nr].input.out_po, (* Ausgang Position *)
AO => rs_rec[rs_nr].input.out_ao, (* Ausgang Winkelstellung *)
D1 => rs_rec[rs_nr].input.out_d1, (* Kommandoausgang für Doppelklick Funktion 1 *)
D2 => rs_rec[rs_nr].input.out_d2); (* Kommandoausgang für Doppelklick Funktion 2 *)
Kann mir vielleicht jemnd einen Tip gebe, wo mein Fehler liegt.
Edit:
Jetzt habe ich gerade noch einmal nachgeschaut und den Eindruck gewonnen, dass garkeine Array-Werte gespeichert werden?????
Danke im voraus.
Majaestix