Fehler 4021 bei Zugriff auf Variablen eines FB im FB.

Aksels

Level-2
Beiträge
257
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute.

Habe irgendwie ein Brett vor dem Kopf. Ich benutzte Codesys 2.3.9.63 um eine Wago 750-890 zu programmieren.
Ich habe einen FB in einem FB benutzt. Ich kann die betroffene Variable vom HMI aus schreiben.
Wenn ich aber von Code aus darauf zugreifen will bekomme ich den Fehler 4021: Kein Schreibzugriff auf...

Code:
FUNCTION_BLOCK FB_Tank
VAR_INPUT
    iw_FS_Raw        :WORD;
    ir_korr_faktor        :REAL;
    ir_m3_max        :REAL;
    i_quit                :BOOL;
END_VAR
VAR_OUTPUT
    qx_Voll:BOOL;
    qx_Leer:BOOL;
    qx_FS_Err:BOOL;
    qr_FS_m3:REAL;
    qr_FS_Proz:REAL;
    qi_FS_Visu:INT;
END_VAR
VAR
    DB_FB_Analogwert_FS: FB_Analogwert_FS;
END_VAR
VAR RETAIN PERSISTENT
    DB_FB_Soll_Ist_Voll: FB_Soll_Ist;
    DB_FB_Soll_Ist_Leer: FB_Soll_Ist;
END_VAR

CodesysF1.jpg


In Tia klappt sowas ganz normal.
Ist das eine besonderheit des Speichermanagements?
Aber warum kann ich dann vom HMI aus ganz normal auf die Variable im FB im FB zugreifen?

Gruß,
Aksels
 
Hmmm.....
habe wohl nicht genau genug hin geschaut. Ich kann auch vom HMI aus nicht darauf zugreifen.
Funktioniert nicht:
PLC_PRG.DB_FB_Tank_1.DB_FB_Soll_Ist_Voll.s_Soll_Ein
Funktioniert:
PLC_PRG.DB_FB_Tanks.si_Max_Umfuell_Minuten
Ich kann in Codesys also nur auf die erste Ebene zugreifen. Also auf die Daten eines FBs.
Die Daten eines FBs in einem FB funktionieren nicht.
Kann man das ändern?

Gruß,
Aksels
 
Naja, sei mir nicht böse, aber ich weiß nicht ob man das so pauschal sagen kann. Ich fand es in meiner 20-jährigen Programmierlaufbahn eigentlich einen guten Programmierstil nur die am häufigsten verwendeten In- Out- oder InOut-Parameter eines FBs nach aussen zu legen und die dutzenden Profi-Parameter mittels Zugriff auf die Statics zu machen. Die Dinger sehen sonst irgendwann aus als hätten sie Haare.
Das macht den FB viel leichter benutzbar.
Andere, modernere Hochsprachen haben zur Regelung dieses Zugriffs sogar Schlüsselwörter wie public, private u.a..
Nur weil Step7, TIA und Codesys noch nicht so weit sind darf man Millionen von Programmierern von Hochsprachen doch nicht eines schlechten Programmierstils bezichtigen? ;)
Nichts desto trotz habe ich mir Deinen Tipp zu Herzen genommen und INs an dem inneren FB gemacht.
Jetzt funktioniert was anderes dafür nicht mehr.
Vielleicht hast Du Recht, und man sollte bei Codesys grundsätzlich Zugriffe auf Instanz-Daten vermeiden und alles in Merkern machen?
Kann das jemand bestätigen?
Ich verfolge das und schildere hier meine Erkenntnisse.
Gruß,
Aksels
 
Merker sind ein noch schlechterer Programmierstil.

Die Dinger sehen sonst irgendwann aus als hätten sie Haare.

Man kann die nicht so häufig benötigten Daten in eine Struktur packen und auf die Schnittstelle legen. Dann ist das genau ein "Haar". Ein FB muss immer wie eine Blackbox gesehen werden können. Ich beschalte In/Out/InOut und was drinnen passiert geht mich nichts an. Auch ein Zugriff des FB auf irgendwelche globalen Daten (wie z.B. Merker) ist nicht Sinn der Sache.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Andere, modernere Hochsprachen haben zur Regelung dieses Zugriffs sogar Schlüsselwörter wie public, private u.a..
Nur weil Step7, TIA und Codesys noch nicht so weit sind darf man Millionen von Programmierern von Hochsprachen doch nicht eines schlechten Programmierstils bezichtigen? ;)
Doch, darf man. Wenn man Baustein-interne Variablen nicht explizit als "public" oder "Achtung, Zugriffe von außerhalb!" markieren kann, dann darf man auch nicht von außen darauf zugreifen, egal ob der jeweilige Compiler das nun zusätzlich verhindert oder nicht.

Wenn man nicht jede Variabe einzeln auf die Bausteinschnittstelle herausführen will, dann ist das Zusammenfassen zu einer Struktur oder Datentyp und Herausführen auf die Schnittstelle ein gutes Mittel.

Harald
 
Guten Morgen.
Das bedeutet demnach ich habe mir einen nicht schönen Programmierstil angewöhnt.
Das betrübt mich etwas.
Ich darf mal ein Beispiel anbringen?
Ich habe einen FB_Soll_Ist, der als Eingang einen Istwert, als Ausgang einen Bool hat und innen zwei Real-Werte die einen Ein- und Ausschaltpunkt darstellen. Diesen benutze ich in meinem FB_Tank um Tank Voll anzeigen zu können.
Wenn ich im FB_Tank nun eine Plausibilitäts-Prüfung machen möchte (wenn Einschaltpunkt 0 dann auf 90 setzten) sollte ich so wie ich es verstanden habe den Ein- und Ausschaltpunkt nochmal im FB_Tank anlegen und diese beiden Werte als Eingänge dem FB_Soll_Ist zuführen?
OK.
Ist es aber dann in Ordnung den Ein- und Ausschaltpunkt im HMI aus dem FB_Tank direkt zu benutzen, oder soll ich dafür globale Merker verwenden, die ich dem FB_Tank als Eingänge übergebe?
Gruß,
Aksels
 
Lokale Variablen einer FB Instanz würde ich nie von außen beschreiben, auch wenn es ein System zulassen sollte. Und aus meiner Sicht sind auch globale Variablen in einem FB unschön.
Wenn Du nicht so viele Füßchen" bei grafischen Sprachen haben willst, kannst Du sie auch mittels Attribute 'hide' ausblenden. In ST kannst Du sie auch einfach beim Aufruf löschen.
Alternativ kannst Du auch Properties für den FB definieren - da hättest Du dann auch die gewünschten Eigenschaften 'private', 'public', etc.

Nachtrag: Von außen Beschreiben meint auch durch die Visu.
 
Zurück
Oben