Wertzuweisung in ein Array aus verschachtelten Records

majaestix

Level-2
Beiträge
39
Reaktionspunkte
1
Zuviel Werbung?
-> 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:

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
 
Moin,

wenn ich dich richtig verstanden habe übergibst du die Strukturen in einen FB als Input und möchtest die Zustände die aus der Abarbeitung des FB's resultieren speichern.
Wenn du Werte speichern möchtest nutze VAR_IN_OUT.
Wenn du den Inhalt der Struktur auch bei einem Stromausfahl speichern möchtest, musst du dir eine Instanz der Struktur als retain persistant speichern.

MFG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im FB eg_aus_variablen_setzen initialisierst Du eine FB-lokale Variable namens rs_rec. Der FB raffstore_schalten hat auf diese Variable keinen Zugriff, die dort verwendete rs_rec muss also eine andere sein. Vielleicht global deklariert? In dem Fall brauchst Du nur die lokale rs_rec aus dem eg_aus_variablen_setzen entfernen.
 
Hallo StrucuredTrash,

leider kann man den Danke Button nur einmal drücken, ich würde ihn sonst festklemmen ;-)

Vielleicht global deklariert?

Genau das wars und Deine Lösung passte auch noch perfekt!
Und ich Dumpfbacke habe tagelang nach diesem sch..... Fehler gesucht:roll:

Also, noch mal ganz herzlichen Dank!

Gruss

Majaestix
 
Zurück
Oben