kleines SCL Programm - finde Fehler nicht

FrankTheTank

Level-1
Beiträge
41
Reaktionspunkte
0
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
 
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.
 
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[COLOR=red];[/COLOR]
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 ;-)
 
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.
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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.
 
Hallo,
in dem Fall solltest du dem Vorschlag von Thomas folgen.
Du legst die FB's in der Instanz des aufrufenden FB's wie Variablen im STAT-Bereich an - also etwa so :
Code:
VAR
   myFB : FB62 ;
End_Var ;
 
... und im Programm rufst du dann "myFB" auf ...
Entscheidend hierfür ist allerdings, dass deine "Unter"-FB's auch wirklich multi-Instanz-fähig sind und auch eigenständig funktionieren (mit ihren internen Variablen oder/und der Schnittstelle).

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
Klar geht das, dafür sind die Schnittstellen ja da. Die Instanz-FBs müssen natürlich dann bevor sie in einem anderen FB verwendet werden bekannt sein.
Ich habe jetzt mal anhand deines Beispiels von oben die FB62 und FB63 mit einer Schnittstelle erweitert, ohne besondere Sinnhaftigkeit.

So kannst du das Programm dann an einem Stück übersetzen:
Code:
(***********************************)
FUNCTION_BLOCK FB62
VAR_INPUT
   conf : int;
END_VAR
VAR_OUTPUT
   currentState : INT;
END_VAR

BEGIN
    currentState := 1;
END_FUNCTION_BLOCK
(***********************************)
FUNCTION_BLOCK FB63
VAR_INPUT
   conf : int;
END_VAR
VAR_OUTPUT
   currentState : INT;
END_VAR

BEGIN
    currentState := 1;
END_FUNCTION_BLOCK
(***********************************)
FUNCTION_BLOCK FB61
VAR
   parallel_executable : BOOL := TRUE;
   gen1 : FB62;
   gen2 : FB63;
END_VAR

BEGIN
    (* Bausteine aufrufen *)
    gen1(conf := 123);
    gen2(conf := 456);

    IF (gen1.currentState = 3) & (gen2.currentState = 1) THEN
       parallel_executable := TRUE;
    END_IF;
END_FUNCTION_BLOCK
(***********************************)
ORGANIZATION_BLOCK OB1
VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
END_VAR

BEGIN
    (* FB61 aufrufen, mit Instanz-DB61 *)
    FB61.DB61();  
END_ORGANIZATION_BLOCK
 
Hallo!

Danke für die schnelle Antwort. Soweit ich das verstanden habe mach ich das dann so:

Code:
FUNCTION_BLOCK FB61
VAR
   ParExecutable : BOOL;
   Gen1 : FB62;
   Gen2 : FB63;
END_VAR

Gen1;
Gen2;

END_FUNCTION_BLOCK;

DATA_BLOCK DB61
BEGIN
FB61
END_DATA_BLOCK;
Muss ich dann FB62 und FB63 vor FB61 in der SCL Quelle stehen haben?
Und wie funktioniert das dann mit deren Datenblöcken? Genauso anlegen wie bei FB61?

Code:
FUNCTION_BLOCK FB62
VAR
   StateGen1 : INT := 1;
END_VAR
...
END_FUNCTION_BLOCK;

[edit] Aaaah, genau so ein Beispiel hab ich gebraucht! Super :) [/edit]
 
Zuletzt bearbeitet:
Zurück
Oben