SCL Bausteingenerierung

Carlsson

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich hab ne SCL-Quelle, in welcher verschiedene FB mit Instanz-DB existieren. Beim Übersetzen erhalte ich jede Menge Fehler, da die Bausteine fehlen. Jetzt meine Frage:
Legt der SCL-Compiler die Bausteine FB, DB, FC usw selbsttätig an, oder muß ich das zuvor manuell erledigen? Denn nach dem manuellen Anlegen der leeren Bausteine gibts keinen Fehler mehr.
Falls dem so ist (manuelles Anlegen notwendig), fände ich das ziemlich lästig. Oder gibt es einen tollen SCL Befehl (sowas wie "generate FB1") zum Erstellen der Bausteine?

Vielen Dank,
Carlsson
 
Scl

Hallo,

der Compiler legt die Bausteine selbstständig an. Er arbeitet die Quelle aber nacheinander ab. Wenn du jetzt zb als ersten Baustein in der Quelle den FB1 drinhast und als zweiten Baustein den FB2 gibts Probleme wenn du im FB1 den FB2 aufrufst. Dieser existiert zu dem Zeitpunkt noch nicht. Also Quelle umsortieren oder einzelne Quellen machen. Einzelne Quellen sind evtl auch günstiger für Änderungshistory usw und wenn man die Quellen nochmal separat ablegt.

André
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die flinke Antwort. Da hab ich noch ein kleines Denkproblem. Angenommen ich hab ein Programm mit OB1, FB1 (Instanz: DB1) und FB2 (Instanz: DB2). Im SCL Code ruft FB2 u.a. Variablen aus DB1 ab. FB1 ruft FB2 auf, OB1 ruft FB1 auf. In welcher Reihenfolge sind nun die Quellen zu kompilieren? Denn FB2 zuerst geht nicht, denn er brauch ja den Instanz-DB von FB1 (also DB1). FB1 zuerst geht auch nicht, denn er benötigt FB2.
Wahrscheinlich muss ich mein Konzept ändern und mal schauen, dass sich nicht die Schlange in den Schwanz beisst ;)
Stimmts?

Carlsson
 
Es ist generell keine gute Idee fremde Datenbausteine direkt in SCL anzusprechen. Da die Querverweise nicht 100% mit SCL funktionieren werden spätere Änderungen recht erschwert.
 
Auch keine gute Idee ist es, das Bausteine (dein FB2) Daten fremder Instanzbausteine (dein DB1==>Instanz von FB1) nutzt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch keine gute Idee ist es, das Bausteine (dein FB2) Daten fremder Instanzbausteine (dein DB1==>Instanz von FB1) nutzt.

*ACK* ... wenn es sich um einen direkten zugriff handelt ... anders sieht das mit einer FB globalen UDT aus, aber das geht nur in AWL, den parameterlosen CALL kennt scl nicht :rolleyes:
 
Eine Makedatei kann man so aufbauen, dass alles in der richtigen Reihenfolge übersetzt wird.
1. UDT - Strukturen
2. DB - abgeleiten von UDTs
3. FC
4. FB mit Instanz-DBs (Bausteinnummern in Symbolik deklarieren)
5. OBxx
6. OB1

Fertig.
 
OK, dass hilft erstmal weiter.
Allerdings ist dumm, dass der SCL-Code automatisch generiert wird und ich nun das Generator-Programm ändern darf...Da hätte sich der Programmierer vorher mal nen Kopp machen können :-?
...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gut, mal sehen ob diesen Thread noch irgendwer liest :D
Hab gerade ne Menge von Beiträgen aus diesem Forum gelesen, welche von meinem ehemaligen Mitarbeiter gestellt worden sind. Aber ist auch egal.
Ich hab jetzt folgendes Dilemma:
In dem kleinen SCL-Projekt welches ich bearbeite "proof-of-concept" wird ein SFB4 verwendet, der ja bekanntlich seinen DB benötigt. Der DB wird erstellt, wenn der SCL-Compiler den entsprechenden Aufruf FB.DB() findet. Jetzt benötige ich jedoch den Timer-Ausgang Q in mehreren dem FB untergeordneten FCs, die ja laut SCL-Compiler zuvor kompiliert werden sollten.
Struktur: OB1 ruft auf FB1 (mit SFB4) ruft auf FC2 (benötigt Timer-Ausgang Q)
Direkt abfragen will ich den Timer eigentlich nicht, denn dann funktioniert die SCL-Compilierung nicht mehr und es entspricht nicht den Gepflogenheiten auf fremde Instanz-DB zuzugreifen.

1. Wie gestalte ich denn nun so eine Schnittstelle?
2. Kann ich den Timer aus einer untergeordneten Funktion heraus starten?

Machts gut,
Carlsson
:s11:
 
Struktur: OB1 ruft auf FB1 (mit SFB4) ruft auf FC2 (benötigt Timer-Ausgang Q)
1. Wie gestalte ich denn nun so eine Schnittstelle?
2. Kann ich den Timer aus einer untergeordneten Funktion heraus starten?

Hallo,
zu 1.)
das wäre eine INPUT-Variable vom Typ BOOL bei dem FC.
zu 2.)
due Funktion gibt per OUTPUT-Variable (oder ggf. auch IN_OUT) die Rückmeldung an den FB in dem du an den Ausgang des FC eine STAT-Variable vom Typ BOOL parametrierst ...

Gruß
LL
 
Vielleicht so...?

Code:
FUNCTION FC1 : BOOL
// Bausteinparameter
VAR_INPUT
    // Eingangsparameter
    bTimer : BOOL ;
END_VAR
    // Anweisungsteil
    IF bTimer then
        FC1 := TRUE;
    ELSE 
        FC1 := FALSE;
    END_IF ;
END_FUNCTION
(*----------------------------------------------*)
FUNCTION_BLOCK FB1
VAR
    // statische Variablen
    delay : SFB4 ;
    sfbstart : BOOL ;
END_VAR
    // Anweisungsteil
    delay.IN  := sfbstart ;
    delay (PT := T#2s);
    sfbstart := FC1(bTimer := delay.Q) ;  
END_FUNCTION_BLOCK
(*----------------------------------------------*)
DATA_BLOCK DB1  FB1
//
// Baustein-Kommentar ...
//
BEGIN
END_DATA_BLOCK
(*----------------------------------------------*)
ORGANIZATION_BLOCK OB1
VAR_TEMP
    // reserviert
    info : ARRAY[0..19] OF BYTE;
    // temporäre Variablen
END_VAR
    // Anweisungen
    FB1.DB1() ; 
END_ORGANIZATION_BLOCK
Gruß...
 
Zurück
Oben