Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: kleines SCL Programm - finde Fehler nicht

  1. #1
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo allerseits!

    Der Übersetzer meckert mal wieder und ich verstehe nicht warum.

    Hier ist der Teil, über den er sich beschwert:

    Code:
    FUNCTION_BLOCK FB61
    
    VAR
       parallel_executable : BOOL := TRUE
    END_VAR;
    
    ...
    IF (DB62.gen1_currentState = 3) & (DB63.gen2_currentState = 1) THEN
       parallel_executable := TRUE
    END_IF;
    ...
    
    END_FUNCTION_BLOCK;
    
    
    FUNCTION_BLOCK FB62
    VAR
       gen1_currentState : INT := 1;
    END_VAR;
    ...
    END_FUNCTION_BLOCK;
    
    FUNCTION_BLOCK FB63
    VAR
       gen2_currentState : INT := 1;
    END_VAR;
    ...
    END_FUNCTION_BLOCK;
    Bei der IF Abfrage im FB61 sagt er:
    Ungültiger Eingangs-, Ausgangs- oder Durchgangsparameter.
    Der Ausdruck muss vom Datentyp BOOL sein.

    Weiss jemand woran das liegt?

    mfg,
    Frank
    Zitieren Zitieren kleines SCL Programm - finde Fehler nicht  

  2. #2
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    Code:
    FUNCTION_BLOCK FB61
    VAR
       parallel_executable : BOOL := TRUE;
    END_VAR;
     
    IF (DB62.gen1_currentState = 3) & (DB63.gen2_currentState = 1) THEN
       parallel_executable := TRUE;
    END_IF;
    END_FUNCTION_BLOCK
     
    DATA_BLOCK DB61 FB61
    BEGIN 
    END_DATA_BLOCK
     
    FUNCTION_BLOCK FB62
    VAR
       gen1_currentState : INT := 1;
    END_VAR;
    ;
    END_FUNCTION_BLOCK
     
    DATA_BLOCK DB62 FB62
    BEGIN 
    END_DATA_BLOCK
     
    FUNCTION_BLOCK FB63
    VAR
       gen2_currentState : INT := 1;
    END_VAR;
    ;
    END_FUNCTION_BLOCK
     
    DATA_BLOCK DB63 FB63
    BEGIN 
    END_DATA_BLOCK
    So funktioniert es bei mir.

    Habe allerdings erst das If Statement auskommentiert, damit alle DBs erzeugt werden.

  3. Folgender Benutzer sagt Danke zu Dotzi für den nützlichen Beitrag:

    FrankTheTank (23.08.2011)

  4. #3
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Zitat Zitat von FrankTheTank Beitrag anzeigen
    Hallo allerseits!

    Der Übersetzer meckert mal wieder und ich verstehe nicht warum.

    Hier ist der Teil, über den er sich beschwert:

    Code:
     
    FUNCTION_BLOCK FB61
     
    VAR
       parallel_executable : BOOL := TRUE
    END_VAR;
     
    ...
    IF (DB62.gen1_currentState = 3) & (DB63.gen2_currentState = 1) THEN
       parallel_executable := TRUE;
    END_IF;
    ...
     
    END_FUNCTION_BLOCK;
     
     
    FUNCTION_BLOCK FB62
    VAR
       gen1_currentState : INT := 1;
    END_VAR;
    ...
    END_FUNCTION_BLOCK;
     
    FUNCTION_BLOCK FB63
    VAR
       gen2_currentState : INT := 1;
    END_VAR;
    ...
    END_FUNCTION_BLOCK;
    Bei der IF Abfrage im FB61 sagt er:
    Ungültiger Eingangs-, Ausgangs- oder Durchgangsparameter.
    Der Ausdruck muss vom Datentyp BOOL sein.

    Weiss jemand woran das liegt?

    mfg,
    Frank
    Meistens am Strichpunkt
    mfG Aventinus

  5. #4
    Registriert seit
    19.11.2008
    Ort
    Schweigen am Weintor
    Beiträge
    707
    Danke
    191
    Erhielt 161 Danke für 92 Beiträge

    Standard

    IF (DB62.gen1_currentState = 3) & (DB63.gen2_currentState = 1) THEN
    parallel_executable := TRUE;
    END_IF;

  6. #5
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Habe allerdings erst das If Statement auskommentiert, damit alle DBs erzeugt werden.
    Danke! Daran hat es gelegen. Das fehlende Semikolon war nur ein Abtippfehler.

    Lässt sich das irgendwie so verbauen, dass man nicht erst die IF Statement ausbauen muss, übersetzen, IF Statements reinbauen, nochmal übersetzen?

    Das Programm soll ohne irgendwelche Fummeleien vom Benutzer einfach übersetzt werden können ohne dass er noch was am SCL Code verändern muss.

  7. #6
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    Baustein am ende übersetzen oder die Variablen über die Baustein-Schnittstellen (z.B. IN/OUT) übergeben.

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  8. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von FrankTheTank Beitrag anzeigen
    Lässt sich das irgendwie so verbauen, dass man nicht erst die IF Statement ausbauen muss, übersetzen, IF Statements reinbauen, nochmal übersetzen?

    Das Programm soll ohne irgendwelche Fummeleien vom Benutzer einfach übersetzt werden können ohne dass er noch was am SCL Code verändern muss.
    Wenn du das komplette Programm in eine SCL-Datei packen möchtest, ist die Reihenfolge der Bausteine wichtig.
    Es müssen die Funktionen/Funktionsbausteine die benötigt werden bekannt sein, wenn der Übersetzer an die Stelle im Programm kommt.
    Ich würds so machen, dass ich ganz oben die UDTs hinschreibe (TYPE) dann die Funktionen in der korrekten Reihenfolge, dann FBs und OBs.

    Was bei dir im Programm fehlt ist der eigentliche Aufruf des FBs mit dem zugehörigen Instanz-DB.
    Wenn dein Funktionsbaustein keine Parameter hat, z.B. mit:
    Code:
    FB62.DB62();
    Ist der DB62 an dieser Stelle des Übersetzungsvorganges noch nicht vorhanden, so wird er automatisch angelegt und es kann im weiteren Verlauf des Übersetzungsvorganges darauf zugegriffen werden.
    Das manuelle Anlegen mit DATA_BLOCK x y kann dann entfallen.

    Wenn du viele verschiedene Quelldateien hast, kann man die Reihenfolge des Übersetzungsvorgang am einfachsten mit einer Übersetzungssteuerdatei erledigen. In dieser gibst du dann die Reihenfolge an in der die verschiedenen Quellcodedateien übersetzt werden müssen, damit es zu keinen Konflikten kommt.
    In Anlehnung an C-Compiler könnte man dieses z.B. MakeAll nennen, wenn damit das komplette Programm erzeugt wird.

  9. #8
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo!

    Also alle FBs und FCs liegen in einer SCL Source Datei. Was muss ich genau eingeben, damit es in der richtigen Reihenfolge übersetzt wird?

    chronologischer Aufruf der Funktionen und Blöcke sieht atm so aus:


    1. FB60
    2. FC70 (wird von FB60 aufgerufen)
    3. FB61 (braucht Daten von DB62, DB63)
    4. FB62 (braucht Daten von DB61)
    5. FB63 (braucht Daten von DB61)

    Der OB ruft auf FB60 => FB61 => FB62 => FB63.

  10. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Naja, deine Aufrufstruktur ist sozusagen ein Zirkelschluss. Man könnte sagen die ist sehr unglücklich gewählt.
    Wenn du das so behalten willst kommst du nicht umhin die Datenbausteine wie von Dotzi gemacht dediziert anzulegen.

    Warum sind FB62/63 nicht Multiinstanzen von FB61, und warum muss jeder FB seinen eigenen Instanz-DB besitzen und auf die Instanzdaten des anderen zugreifen? Warum nicht über Schnittstellen?

  11. #10
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    Da ich ein Neuling bin, weiß ich leider nicht, was mit Multiinstanz gemeint ist bzw. wie ich das realisieren soll.

    Muss ich dazu FB62 und FB63 von FB61 aus aufrufen? Werden die benötigten Variablen von FB61 dann zu FB62/63 "durchgereicht"? Und kennt dann FB61 die Variablen seiner "Kinder"? Das würde nämlich mein Problem lösen.

Ähnliche Themen

  1. Kleines Programm
    Von pulpago im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 07.09.2011, 12:07
  2. CPU geht auf STOP, ich finde den Fehler nicht :(
    Von nikilouder im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.09.2011, 23:23
  3. SCL: kleines Programm
    Von Uli_87 im Forum Programmierstrategien
    Antworten: 15
    Letzter Beitrag: 05.06.2009, 18:09
  4. ein kleines Programm in S5
    Von wowo im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 10.10.2007, 23:40
  5. Ein kleines Programm nur !!! Nur wie !??
    Von Anonymous im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 16.02.2004, 03:04

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •