Instanz DB in SCL automatisch erzeugen

Zuviel Werbung?
-> Hier kostenlos registrieren

Also die Vorgehensweise in den Siemens-Link finde ich ja mehr als seltsam.
Ich habe üblicherweise eine Quellcodedatei für einen Baustein, laut Siemens soll ich in diesen Quellcode die Instanz-DBs mit erzeugen? Bei FBs weiß ich nicht im voraus wie viele Instanzen ich benötigen werde. Die dort geschilderte Vorgehensweise ist wohl eher was für Bausteine an denen ich in der Inbetriebnahmephase oder zum Testen viel ändere.

Aber zum Erzeugen der Datenbausteine:
Wenn du einen FB mit einem eigenen Instanz-DB aufrufst, wird der DB automatisch erzeugt.
Code:
TestFB.DB234(IN1 := false, IN2 := true);
Wenn der DB234 nicht existiert wird er automatisch erzeugt.

Wenn du vorher in der Symboltabelle ein Symbol für den DB234 (z.B. "IDB_TestFB" mit Datentyp FB xy) anlegst, kannst du den Baustein auch über das Symbol erzeugen:

Code:
TestFB.IDB_TestFB(IN1 := false, IN2 := true);


Vielleicht hat in den Zusammenhang nochmal jemand einen Tip für mich:
Und zwar kann ich über die Compileroptionen einstellen dass die Bausteinnummern automatisch vergeben werden. Leider funktioniert das mit der Nummer des Instanz-DB wie oben zu einem FB nicht automatisch. Also muss ich auch wenn ich das ganze Programm in SCL geschrieben habe immer noch für die Instanz-DB manuell in der Symboltabelle arbeiten. Und wenn ich mit der automatischen Nummernvergabe arbeite, weiß ich vorab nicht einmal welche Nummer der FB später bekommen wird.
Vielleicht gibts da noch einen Trick wie man in SCL auf die manuelle Nummernvergabe komplett verzichten könnte.
 
Automatisches Blocknummerzuweisung sollte funktionieren.
Hast du die Rehenfolge richtig ?:

Erst FB
Dann IDB
Dann aufruf von FB.IDB

Dies klappt bei mir mit Automatisches Blocknummern:

Code:
FUNCTION_BLOCK "my_FB"

VAR_input
    iInp1 : INT ;
    iInp2 : INT ;
END_VAR

VAR_output
    iOutp1 : INT ;
END_VAR

VAR
    iStat1 : INT ;
    iStat2 : INT ;
END_VAR

iStat2 := iStat1 ;
iOutP1 := iStat1 + iInp1 - iInp2 ;
iStat1 := iOutp1 ;

END_FUNCTION_BLOCK


DATA_BLOCK "my_IDB"  "my_FB"
BEGIN
END_DATA_BLOCK


ORGANIZATION_BLOCK OB1
VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
END_VAR

"my_FB"."my_IDB"( iInp1:=10 , iInp2:=12 ); 
MW12 := INT_TO_WORD("my_IDB".iOutp1) ;

END_ORGANIZATION_BLOCK
 
Automatisches Blocknummerzuweisung sollte funktionieren.
Hast du die Rehenfolge richtig ?:

Erst FB
Dann IDB
Dann aufruf von FB.IDB

Dies klappt bei mir mit Automatisches Blocknummern:

Code:
DATA_BLOCK "my_IDB"  "my_FB"
BEGIN
END_DATA_BLOCK

Ah, so geht es.
Ich hatte zwar gehofft dass es auch ohne separate Deklaration mit DATA_BLOCK ... funktioniert , aber zumindest funktioniert es überhaupt.
 
So stehts doch auch in der "seltsamen" Anleitung von Siemens ;-)
in Bild 2

Ja, schon. Bezogen auf das Beispiel von Jesper würde ich persönlich die Data-Block Definition zusammen mit dem OB1 in die gleiche Quelldatei packen, und nicht in die des "my_FB" wie im Siemens Beispiel.

Mehrere Bausteine in einer Quelldatei verbieten sich ja, weil sich die Bausteine dann im Onlinestatus nicht mehr beobachten lassen.
 
Mehrere Bausteine in einer Quelldatei verbieten sich ja, weil sich die Bausteine dann im Onlinestatus nicht mehr beobachten lassen.
Stimmt das ?

Eine weitere Möglickeit ist FBs, IDBs, OBs usw. in getrennte SCL Quelldateien zu haben.
Man kan dann mit eine "Make" Datei die Compile-Reihenfolge steuern.
Es gilt immer nur das die Reihenfolge von die Deklarationen gehalten werden muss.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, es lassen sich die Bausteine doch beobachten.
Zumindest habe ich das mit der 5.5 getestet und da geht es. Vielleicht hatte ich mal eine SPS bei der alle Verbindungen belegt waren oder sowas...obwohl es dann eigentlich eine Meldung gibt.
 
Zurück
Oben