Übersetzungsfehler in SCL

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr,

ich bin gerade dabei mich etwas in SCL einzuarbeiten; naja so gut es halt geht, da es nicht so viel Übungsmaterial gibt.

Habe aber etwas gefunden:

Code:
FUNCTION_BLOCK FB1
 
VAR_TEMP
    // temporäre Variablen
END_VAR
 
VAR
    // statische Variablen
 
    biVal_R22 : WORD;
    actFlag_R22 : BOOL;
    curr_time_R22 : S5TIME;
    S5Timer_flag_R22 : BOOL;
 
    State_ST_1 : INT := 0;
 
END_VAR
 
BEGIN
 
    IF (E1.0 = true) THEN         
    State_ST_1 := 1; 
    S5Timer_flag_R22 := false;
 
END_IF;
 
1:
           curr_time_R22 := S_ODT (T_NO:=T22, 
                       S := S5Timer_flag_R22, 
                      TV := T#3S,
                       R := FALSE, 
                      BI := biVal_R22, 
                       Q := actFlag_R22); 
 
    IF (S5Timer_flag_R22 = false) THEN  // Start Timer
    S5Timer_flag_R22 := true; 
 
END_IF;   
 
    IF (actFlag_R22 = true) THEN        // Timer abgelaufen
    S5Timer_flag_R22:= false;
    A1.0 := false;                   
 
END_IF;
 
END_FUNCTION_Block

Bei der Übersetzung bekomme ich allerdings die Meldung

"Unbekannte Anweisung"

an folgender Stelle: curr_time_R22 := S_ODT (T_NO:=T22,


Offensichtlich handelt es sich hier um einen Sprung mit der Sprungmarke 1?

Wenn ich die 1 nämlich auskommentiere, dann gibt es keinen Übersetzungsfehler.

Frage:

Da ich den Code 1:1 übernommen habe, muss er eigentlich funktionieren - was kann da faul sein? :confused:
 
Hallo Petzi,
eine Sprungmarke (LABEL) muß in SCL genau wie eine Variable deklariert werden (siehe dazu in der SCL-Hilfe). Außerdem bin ich mir da wegen der Syntax jetzt im Augenblick absolut nicht sicher ("1:") - nach meiner Meinung müßte die Label-Bezeichnung u.U. auch mit einem Buchstaben beginnen (da bin ich aber nicht sicher).

Gruß
Larry​
 
Danke VL,

also dann ist die Deklaration sozusagen falsch...


Könnte es denn sein, dass (wie von mir angenommen) es sich bei diesem

"State_ST_1 : INT := 0;"

gar nicht um eine Sprungmarke (Sprungbefehl) handelt, sondern um etwas völlig anderes?
 
... ich vermute, das das "1:" ein Überbleibsel aus einem SELECT CASE ist ...

Anmerkung dazu noch :
Ich würde beim Einarbeiten in SCL nicht zu sehr auf vorgefertigte Beispiele setzen. Oft sind sie nicht so Klasse und manchmal versteht man zunächst gar nicht, was da erstellt worden ist und kopiert sich so dann ggf. etwas, das hinterher Unsinn ist ...
 
Zuletzt bearbeitet:
... ich vermute, das das "1:" ein Überbleibsel aus einem SELECT CASE ist ...

Anmerkung dazu noch :
Ich würde beim Einarbeiten in SCL nicht zu sehr auf vorgefertigte Beispiele setzen. Oft sind sie nicht so Klasse und manchmal versteht man zunächst gar nicht, was da erstellt worden ist und kopiert sich so dann ggf. etwas, das hinterher Unsinn ist ...

Ok, vermutlich war meine Annahme bezüglich Sprung falsch...

Leider gibt es halt in SCL kaum Übungen im Netz - zumindest finde ich keine. Habt ihr evtl. einen Link, wo es rein um SCL geht?

Vielen Dank!
 
Ja danke VL, dieses Modul hatte ich mir auch schon mal angesehen...

Es ist halt sehr begrenzt; ich vermisse dabei einfach verschiedene SCL-Anwendungen. Aber offensichtlich gibt es nicht viel Übungsmaterial im Netz über SCL.
 
... ich hatte dieses Problem auch mal ...
und dann habe ich festgestellt, dass das beste Übungsmaterial die Probleme und Anforderungen aus der Praxis sind. Daran lassen sich die eigenen Fertigkeiten am Besten weiterentwickeln ...
Zu den meißten Beispielen, die es so gibt, kann man doch sowieso oft keine realen Bezug herstellen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... und dann habe ich festgestellt, dass das beste Übungsmaterial die Probleme und Anforderungen aus der Praxis sind.
Gruß
Larry

Yep, das stimmt wohl!

So wie es aussieht handelt es sich also bei meinem Code aus Thread #1 tatsächlich um eine Case-Anweisung.

Dazu gleich noch eine Frage aus der Praxis: :p

Code:
FUNCTION_BLOCK FB3
 
    CASE Byte_TO_INT (MB10) OF
    1: A0.0 := 1;
    2: A1.0 := 1;
 
    ELSE
    A0.0 := 0;
    A1.0 := 0;
 
    END_CASE;
 
END_FUNCTION_BLOCK

Wie schaffe ich es denn nun, dass A0.0 auch dann ausgeht, wenn MB10 den Wert 2 hat und A1.0 auch dann ausgeht, wenn MB10 den Wert 1 hat?
 
Code:
FUNCTION_BLOCK FB3
 
    CASE Byte_TO_INT (MB10) OF
    1: A0.0 := 1;
       A1.0 := 0;
    2: A1.0 := 1;
       A0.0 := 0;
 
    ELSE
    A0.0 := 0;
    A1.0 := 0;
 
    END_CASE;
 
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dank' euch - ja so klappt es!

Noch eine Frage allgemein zu SCL:

Es gibt ja keine generelle Vorschrift über das Einrücken von Befehlen in SCL, aber es wird dadurch oftmals ja doch sehr viel übersichtlicher...

Wie haltet ihr das, arbeitet ihr unter SCL zum Einrücken mit dem Tabulator oder ist es sinnvoll, sich eine andere Vorgehensweise anzueignen?
 
Nu,

Um den Überblick zu behalten, sollte man die einzelnen Blöcke eingerückt schreiben.

Bleibt aber jedem selbst überlassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dank' euch - ja so klappt es!

Noch eine Frage allgemein zu SCL:

Es gibt ja keine generelle Vorschrift über das Einrücken von Befehlen in SCL, aber es wird dadurch oftmals ja doch sehr viel übersichtlicher...

Wie haltet ihr das, arbeitet ihr unter SCL zum Einrücken mit dem Tabulator oder ist es sinnvoll, sich eine andere Vorgehensweise anzueignen?

Ich kann dir nur empfehlen unbedingt den Tab. zu verwenden (und zwar konsequent!) Ich würde dir einen 4er Tab. empfehlen.
 
Zurück
Oben