Step 7 SCL ARRAY of UDT schreiben (FC -> FB -> DB)

hartmann08

Level-2
Beiträge
30
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute ,

Ich sehe im Moment den Wald vor lauter Bäumen nicht mehr, und hoffe daher auf eine kleine Hilfe eurerseits.

Ich würde gerne in SCL Step7 aus einem FC heraus in einen DB mit einem ARRAY of UDT schreiben.

Wie gesagt bin mir gerade nicht mehr sicher ob das so funktioniert wie ich mir gedacht habe, oder es gibt vielleicht einen viel einfacheren Weg um das ARRAY mit UDT von 1..64 zu beschreiben .

Ich hoffe es ist ersichtlich was ich vorhabe und einigermassen gut erklärt.

grüsse sh

UDT:
UDT.png

DB mit ARRAY of UDT 1..64:
DB_ARRAYUDT.png

SCL FB mit Aufruf des FC:
Bild_2022-05-02_111950372.png


SCL FC in dem das UDT beschrieben werden soll:
SCL_FC.png
 

Anhänge

  • SCL_FB.png
    SCL_FB.png
    31,7 KB · Aufrufe: 19
Hast du es denn mit oder ohne dem Punkt vor dem Arrayindex wie auf dem Screenshot? Der müsste denk ich weg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Q_dbxxx := Q_dbxxx[1] <-- Hier meckert er die Parameterzuweisung an das diese nicht korrekt ist. Jemand ne Idee ?
Es stört mich dass die Namen sind gleich, obwohl es sind unterschiedliche Variabeln.
Einer ist die IN_OUT von die FB; die andere is die OUTPUT von die FC.
Wenn man es lest sieht es fast aus als ob du ein ganzen Struktur ein Unterelement von denselben Struktur zuweist (das ist was mich vorher verwirrt hat).
Vielleicht verwirrt es die SCL Kompiler. Probier mal die Namen unterschiedlich zu benennen.

Sonnst, ist FC_XXX kompiliert bevor FB_XXX ?
in STEP7 KLassik muss man die Kompilierreihenfolge beachten.
 
Zuletzt bearbeitet:
Q_dbxxx := Q_dbxxx[1] <-- Hier meckert er die Parameterzuweisung an das diese nicht korrekt ist. Jemand ne Idee ?
Ach ja, die FB-IN_OUT_Parameter können nicht an weitere Baustein-Aufrufe (z.B. den FC) durchgereicht werden. Das Array Q_dbxxx des FB müsste in VAR_INPUT oder VAR_OUTPUT oder VAR (STAT) oder VAR_TEMP liegen, oder (teilweise) darüber kopiert werden:
Code:
//im FB

VAR_IN_OUT
  Q_dbxxx : ARRAY[1..64] OF "UDT_XXX";
END_VAR
VAR_TEMP
  tmpUDT_1 : "UDT_XXX";
END_VAR

//tmpUDT_1 := Q_dbxxx[1]; //falls der FC den UDT auch lesen will

FC_XXX(I_x1 := FALSE, I_x2 := FALSE, Q_dbxxx := tmpUDT_1);
Q_dbxxx[1] := tmpUDT_1;

Beim FC ist es egal, ob Q_dbxxx ein OUTPUT oder IN_OUT ist.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach ja, die FB-IN_OUT_Parameter können nicht an weitere Baustein-Aufrufe (z.B. den FC) durchgereicht werden. Das Array Q_dbxxx des FB müsste in VAR_INPUT oder VAR_OUTPUT oder VAR (STAT) oder VAR_TEMP liegen, oder (teilweise) darüber kopiert werden:
Code:
//im FB

VAR_IN_OUT
  Q_dbxxx : ARRAY[1..64] OF "UDT_XXX";
END_VAR
VAR_TEMP
  tmpUDT_1 : "UDT_XXX";
END_VAR

//tmpUDT_1 := Q_dbxxx[1]; //falls der FC den UDT auch lesen will

FC_XXX(I_x1 := FALSE, I_x2 := FALSE, Q_dbxxx := tmpUDT_1);
Q_dbxxx[1] := tmpUDT_1;

Beim FC ist es egal, ob Q_dbxxx ein OUTPUT oder IN_OUT ist.

Harald
Hallo Harald, Danke Dir für deine Antwort.

Der FC schreibt nur .

FC_xxx : schreiben der beiden Bytes im UDT
FB_xxx : Aufruf 64x den FC_xxx

Ich habe mir gedacht mit einer FOR die 64 FC zu durchlaufen und je nach Schleifenzähler wird der FC aufgerufen um dann in das jeweilige UDT zu schreiben.
 
Es stört mich dass die Namen sind gleich, obwohl es sind unterschiedliche Variabeln.
Einer ist die IN_OUT von die FB; die andere is die OUTPUT von die FC.
Wenn man es lest sieht es fast aus als ob du ein ganzen Struktur ein Unterelement von denselben Struktur zuweist (das ist was mich vorher verwirrt hat).
Vielleicht verwirrt es die SCL Kompiler. Probier mal die Namen unterschiedlich zu benennen.

Sonnst, ist FC_XXX kompiliert bevor FB_XXX ?
in STEP7 KLassik muss man die Kompilierreihenfolge beachten.
Daran hat es nicht gelegen , aber Danke Dir
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/DP hab jetzt das ARRAY in den OUTPUT gelegt
Dann braucht das SPS-Programm zweimal den Speicherplatz für das komplette Array. Einmal im Instanz-DB als OUT-Parameter und einmal in dem Global-DB der am OUT-Parameter verschaltet ist. Und nach dem Ende des FB wird das komplette Array vom Instanz-OUT in den global-DB kopiert. Wenn das Array als IN_OUT übergeben wird, dann wird nur die Adresse des Aktualparameters übergeben und dann wird nicht zusätzlich kopiert, dann muß aber im FB nach dem FC-Aufruf kopiert werden. Das Kopieren vom Instanz-OUT in den verschalteten global-DB ist aber effizienter/schneller als das Kopieren im FB von TEMP nach IN_OUT. Hier muß man abwägen, ob man im FB sowieso das komplette Array beschreibt (dann ist OUTPUT meistens besser) oder nur kleine Teile des Arrays bearbeiten will (dann ist IN_OUT besser).

Harald
 
.. Ich habe mir gedacht mit einer FOR die 64 FC zu durchlaufen ..
Wenn du ohnehin nur Konstanten an die Function übergibst, und in der FC auch nur Konstanten in das ARRAY einträgst, warum dann überhaupt der Aufwand mit der FC? Schreibe doch deine Werte direkt in die Bytes. Du kannst in der Deklaration des FB auch symbolische Konstanten anlegen und diese statt "B#16#00" und "B#16#01" verwenden. In einer FOR-Schleife würdest du dann überall die selben Werte rein schreiben?
 
Moin!

Wie PN/DP und Dagobert angemerkt haben: Warum ein extra FC?

Bei PN/DP möchte ich ergänzen das jeder Bausteinaufruf auch Zykluszeit "frisst"! Wir mussten schon die Verschachtelungstiefe / Bausteinaufrufe reduzieren Aufgrund zu hoher Zykluszeit.

Du kannst auch einfach folgende Zeilen anstelle des FCs nutzen, damit Fallen selbst die IF..ELSE weg.
BOOL wird auch implizit konvertiert, ich bevorzuge die explizite Konvertierung.

Q_dbxxx[X].bYTE1 := BOOL_TO_BYTE("VAR für I_x1 vom Aufruf X");
Q_dbxxx[X].bYTE2 := BOOL_TO_BYTE("VAR für I_x1 vom Aufruf X" AND "VAR für I_x2 vom Aufruf X");
 
Zurück
Oben