DB in FB erzeugen [SCL]

dewenni

Level-1
Beiträge
10
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein kleines Problem mit dem Erzeugen eines DB´s in einem FB.
Folgendes habe ich vor:
Ich habe einen FB geschrieben der eine Kommunikation über RS232 herstellt. Sende und Empfangsdaten (durch FB2, FB3) laufen dabei über einen DB in dem drei Strings deklariert sind. Diesen DB habe ich bisher selbst erstellt und deklariert. Im FB-Code arbeite ich dann mit der DB-Nummer.
Funktioniert auch soweit ganz gut.
Mein Ziel ist es jetzt das ich im FB automatisch einen DB erzeuge und mit den drei Strings bestücke bzw. deklariere.

Quasi so:

DATA_BLOCK HAAKE_DB

STRUCT
SE : STRING[20];
SW : STRING[20];
T1 : STRING[20];
END_STRUCT;

BEGIN
SE := ' ';
SW := ' ';
T1 := ' ';

END_DATA_BLOCK


Wenn ich diesen "DATA_BLOCK" innerhalb meines FUNCTION_BLOCK einbaue,
bekomme ich über 100 Warnungen in Form von "Ungültige Zeichen bis Zeile xxx" und der Compiler erzeugt mir meinen FB nicht. Der gewünschte DB wird aber richtig erzeugt und deklariert.

Wenn ich diesen "DATA_BLOCK" außerhalb meines FUNCTION_BLOCK einbaue,
habe ich ein Problem innerhalb des FUNCTION_BLOCK auf den DB zuzugreifen. Dann kann er mit folgendem Zugriff z.B. nichts anfangen, weil unbekannt.
temp := HAAKE_DB.SE;

Kann mir da vielleicht jemand weiterhelfen?
Es sollte halt später so funktionieren das wenn jemand meinen FB im CFC-Plan einsetzt, automatisch ein DB namens HAAKE_DB unter einer freien DB-Nummer erzeugt wird.

Meine bisherige Vorgehensweise ist da wahrscheinlich nicht die richtige,
ich weiß aber nicht wie ich es sonst machen soll.

Vielen Dank!

Gruß Sven
 
Zuletzt bearbeitet:
Du musst deinen Data Block ausserhalb des Funktion Blocks schreiben.
Allerdings würde ich in deinem FB nicht nach DB Nummern arbeiten sondern Symbolisch.
Vor dem ersten generieren MUSS IMMER erst der FC,FB,DB in der Symbolik eingetragen werden.

Code Beispiel:
Code:
FUNCTION_BLOCK FB_Test
VAR_TEMP
  // temporäre Variablen
END_VAR
VAR
  // statische Variablen
END_VAR
  // Anweisungsteil
  ;
END_FUNCTION_BLOCK
//Erst ab hier den Data Block beginnen lassen!!!
DATA_BLOCK DB_Test
//
// Baustein-Kommentar ...
//
  STRUCT
Var1: INT;
  END_STRUCT
BEGIN
END_DATA_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal vielen Dank für die Antwort.
Ich habe das jetzt mal so gemacht. Die Fehler sind auch schon mal weniger geworden.

Allerdings besteht noch das Problem das er teilweise mit dem symbolischen DB-Namen nichts anfangen kann.

z.B. beim Aufruf von Sende und Empfangsbaustein (FB2, FB3)

Code:
FB2 ( EN      := true,
      EN_R    := true,
      R       := false,
      LADDR   := 300,
      DB_NO   := HAAKE_DB
      DBB_NO  := 0);

Da kommt dann die Fehlermeldung: " Ungültiger Datentyp"
Muss ich in diesem Fall die DB-Nummer von Haake_DB erst auslesen und dann an den FB2 übergeben?
 
Hi,
du musst am FB noch den Instanz DB des FB2/3 mit angeben.

Code:
FB2.db2 ( EN      := true,
                       EN_R    := true,
                       R       := false,
                       LADDR   := 300,
                       DB_NO   := HAAKE_DB
                       DBB_NO  := 0);

Oder als Multiinstanz aufruf, dann musst du ihn oben im Stat bereich deklarieren.
Schätze mal so:

FB_Send : FB2;

Dann im Programm nur FB_Send und Rest wie oben
Hab leider grad kein Step7 da und hab auch noch nie nen FB Aufruf in SCL gemacht :rolleyes:
 
Ich mache das bereits mit der Deklaration
Code:
Send : FB2
und dann später
Code:
Send ( EN      := true,
       EN_R    := true,
       R       := false,
       LADDR   := 300,
       DB_NO   := HAAKE_DB
       DBB_NO  := 0);

Hatte es im vorherigen Post nicht korrekt angegeben.
Das ändert aber nichts daran das im Auruf von dem FB die Variable HAAKE_DB nicht akzeptiert wird. Ist ja auch eigentlich logisch. Der FB erwartet als DB_NO nur eine INT-Zahl. Hinter HAAKE_DB steckt ja wahrscheinlich "FBXX".
Ich müsste also denke ich mal die DB-Nummer von HAAKE_DB auslesen.
Irgendwie ganz schön kompliziert :confused:
 
Zurück
Oben