Sprünge in SCL

schnecke

Level-1
Beiträge
148
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

muss im alten Jahr noch schnell eine Frage loswerden... :p

In AWL gibt es ja z.B. den Sprungbefehl "SPB". Dies lässt sich in SCL ja durch die Anweisung "GOTO" bewerkstelligen.

Frage(n):

1) Gibt es für den Sprungbefehl "SPBN" auch eine entsprechende Anweisung in SCL?

2) Was kann in SCL für "NOP 0" geschrieben werden?


Lieben Dank!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du den SPBN nachbilden willst so wäre das "IF NOT xyz then GOTO abc"
Einen "NOP0" gibt es nicht - wozu auch. Eine leere Zeile könntest du aber mit einem einzelnen ";" erzeugen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm, obgleich man ja wohl den Befehl "GOTO" nicht verwenden sollte, habe ich es dennoch mal versucht, die Anweisung "SPBN" nachzubilden:


goto.jpg

Klappt aber noch nicht ganz; sollte doch eigentlich so sein, dass die Zeile mit A0.0 und E0.0 nur dann ausführbar ist, wenn im DB eine Null steht, oder?

Bei mir kann ich den Ausgang ansteuern, egal ob im DB eine Null oder z.B. eine Eins steht...
 
Zuletzt bearbeitet:
Kann es sein, dass der Vergleich in Klammer stehen muss?

Yep, das war das Problem - mit Klammern klappt es, vielen Dank bike!

Nun ergibt sich aber leider schon das nächste Problem:

goto.jpg

Wenn ich einen Vergleich auf "<=" und ">=" machen möchte, so bekomme ich mehrere Fehlermeldungen; eine davon lautet: Unzulässige Operandentypen.

Habe mal in der Hilfe nachgesehen und da steht, dass man beispielsweise den Datentyp "WORD" nicht auf diese beiden Vergleichsoperationen abfragen kann; soweit ok. Aber ich habe im DB1 doch angegeben, dass es sich um den Typ "INT" handeln soll und "INT" kann diese Vergleichsoperationen sehr wohl.

Muss ich hier vor dem Vergleich dennoch wandeln?

Lieben Dank!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Macht dein Vergleich Sinn?
Kleine 48 und größer 57 ist etwas schwer möglich.
Wenn du wegspringen willst, dann
IF (db1.dbw0 <=47) or (db1.dbw0 >=57) then .....

Du musst jede Bedingung für sich allein abfragen und nicht so mischen.


bike
 
Ah sorry, es sollte natürlich heißen >= 48 und <= 57.

Um nicht den Fehler Unzulässige Operandentypen zu bekommen muss ich folgende Wandlung durchführen:

goto.jpg

1) Allerdings verstehe ich nicht warum ich von Word nach Int wandeln muss - im DB habe ich doch als Typ "INT" angegeben?

2) Könnte man das Ganze etwas schöner (mit nur einer Wandlung) schreiben?
 
Zuletzt bearbeitet:
Der Fehler kommt, wenn du so in etwas schreibst?
if (db1.dbw >=48 ) AND (db1.dbw0 <=57) then....

sollte eigentlich funktionieren so :confused:


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke bike, aber wenn ich es so (wie von dir vorgeschlagen) schreibe, dann werden folgende Fehler angezeigt:

Fehler.jpg


Wenn ich es so programmiere

goto.jpg

dann klappt es - allerdings weiß ich nicht, warum gewandelt werden muss?
 
Zuletzt bearbeitet:
Hast du für den DB1 und das Datenwort ein Symbol und einen Datentyp angelegt?
So wie die Meldung ausschaut, ist da ein Wort bzw noch kein DB angelegt.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...allerdings weiß ich nicht, warum gewandelt werden muss?
Weil die S7 nur vorzeichenbehaftete Vergleiche kennt.
Word_To_Int ist nicht wirklich eine Umwandlungsroutine, sondern sagt dem Kompiler, dass Du das DBW0 als (vorzeichenbehaftetes) Integer und nicht als (vorzeichenloses) WORD benutzen willst.
Du kannst diese Umwandlung vermeiden wenn Du, wie das ein ordentlicher Programmierer sowieso macht, symbolisch arbeitest und das DB1.DBW0 schon im DB1 als Integer deklarierst.
Gruß
Erich
 
@Daniel: Was bitte geht nur symbolisch?

@bike: Eigentlich ist im DB schon der Typ "INT" angelegt:


DB.jpg

@Erich: Habe doch im DB "Integer" deklariert...

Danke für die Hilfe!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann greife bitte auch symbolisch darauf zu!
Gruß
Erich

Hm, bitte schön! ;)


Symbolisch.jpg


Also, hat geklappt... danke!

Frage noch dazu:

Warum erkennt der Compiler den deklarierten Datentyp "INT" im DB nur dann, wenn symbolisch darauf zugegriffen wird - ist das SCL-typisch oder wäre das auch in AWL so?
 
Zuletzt bearbeitet:
Hi,

ja ist so, bei absoluten DB-Zugriffen sind nur die Datentypen BOOL, BYTE, WORD und DWORD zulässig.
Diese müssen dann entsprechend gewandelt werden z.b. mit DWORD_TO_REAL(), DWORD_TO_DINT(), ...

Gruss Daniel
 
Danke Daniel,

d.h. also, wenn ich einen absoluten Zugriff auf einen DB mache und das Datenwort als "INT" deklariert ist, so muss immer zunächst eine Wandlung vollzogen werden, da es sich in diesem Beispiel ja um ein Datenwort (DB1.DBW0) handelt. Die Wandlung muss somit eine "WORD_TO_INT" sein.

Anders bei symbolischen Zugriffen, hier ist auch der Datentyp "INT" zulässig, so dass nicht gewandelt werden muss.

Kann man das so in etwa zusammenfassen?
 
Zurück
Oben