Step 7 SCL FB in AWL oder FUP umwandeln

Kehrer

Level-2
Beiträge
439
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein Projekt erhalten welches fast nur in SCL programmiert ist.
Leider kenne ich mich damit gar nicht aus.
Ist es möglich dies in AWL oder FUP umzuschreiben?
Problem: Maschinenhersteller der es programmiert hat, gibt es nicht mehr.
Code:
2: // Prüfen ob Nest leer ist

IF oLinearschiene_eFrei = false THEN
IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
;
ELSE
sf_fehler(Fehlernummer := 1327, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(alc_step));
END_IF;


sc_nextstep := alc step;
ELSIF oEinschub_eTeil_InHalter = true AND oDebug_BrueckenTeilInHal = false THEN
IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
;
ELSE
sf_fehler(Fehlernummer := 1324, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(alc_step));
END_IF
sc_nextstep := alc_step;
ELSIF oDebug_BrueckenTeilInHal = true THEN
sf_fehler(Fehlernummer := 1326, Fehlerart := sk_hinweis, Diagnosenummer := BYTE_TO_INT(alc_step));
END_IF

bTeilEinschubGesehen := false;  // Vorbereitung um Teileeinschub zu sehen
 
Moin Kehrer,

um das Programm in AWL oder FUP umzuschreiben, sollte man verstehen, was da warum in SCL geschrieben wurde.

Häufig ist der SCL-code kürzer, aber leider nicht immer die beste Wahl.

Trotzdem empfehle ich Dir, Dich in SCL einzuarbeiten und das Programm nicht anzupassen. Denn:
1. beim Anpassen können natürlich leicht Fehler entstehen
2. Wenn der code nicht sinngemäß verstanden wurde, kann man es nicht in eine andere Programmiersprache umsetzen
3. Es werden immer mehr SCL-Programme auf Dich zukommen => Rüste Dich!

Also zum Code:

- am besten erstmal den ganzen Code markieren und oben bei der Buttonleiste gibt es den Button "Selektierten Text automatisch formatieren". Diesen bitte betätigen. Dann wird der Code schon einmal lesbarer.

Code:
2: // Prüfen ob Nest leer ist

[COLOR=#008000]IF oLinearschiene_eFrei = false THEN [/COLOR][COLOR=#0000ff]// IF NOT oLinearschiene_eFrei THEN ist eleganter[/COLOR]
[COLOR=#ff8c00]IF a2m_sync <> 0 THEN[/COLOR] // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen [COLOR=#0000ff]// wenn in der Variablen "a2m_sync" keine 0 drin steht[/COLOR]
[COLOR=#ff8c00];[/COLOR] [COLOR=#0000ff]// nichts machen![/COLOR]
[COLOR=#ff8c00]ELSE [/COLOR][COLOR=#0000ff]// wenn doch, dann[/COLOR]
[COLOR=#ff8c00]sf_fehler(Fehlernummer := 1327, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(alc_step));[/COLOR] [COLOR=#0000ff]// dies machen[/COLOR]
[COLOR=#ff8c00]END_IF; [/COLOR][COLOR=#0000ff]// IF-Abfrage beenden[/COLOR]


sc_nextstep := alc step;
[COLOR=#008000]ELSIF oEinschub_eTeil_InHalter = true AND oDebug_BrueckenTeilInHal = false THEN[/COLOR]
[COLOR=#a52a2a]IF a2m_sync <> 0 THEN[/COLOR] // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen [COLOR=#0000ff]// wenn in der Variablen "a2m_sync" keine 0 drin steht[/COLOR]
[COLOR=#a52a2a];[/COLOR] [COLOR=#0000ff]// nichts machen![/COLOR]
[COLOR=#a52a2a]ELSE[/COLOR] [COLOR=#0000ff]// wenn doch, dann[/COLOR]
[COLOR=#a52a2a]sf_fehler(Fehlernummer := 1324, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(alc_step));[/COLOR] [COLOR=#0000ff]// dies machen[/COLOR]
[COLOR=#a52a2a]END_IF[/COLOR] [COLOR=#0000ff]// IF-Abfrage beenden[/COLOR]
sc_nextstep := alc_step;
[COLOR=#008000]ELSIF oDebug_BrueckenTeilInHal = true THEN[/COLOR]
sf_fehler(Fehlernummer := 1326, Fehlerart := sk_hinweis, Diagnosenummer := BYTE_TO_INT(alc_step));
END_IF[COLOR=#0000ff]// IF-Abfrage beenden[/COLOR]

bTeilEinschubGesehen := false;  // Vorbereitung um Teileeinschub zu sehen

[COLOR=#008000]END_IF[/COLOR] [COLOR=#0000ff]// muss noch dazu kommen[/COLOR]


Insgesamt sieht der Code nicht sehr elegant aus. Aber ich denke, dass der Code eine Standardprogrammierung wiederspiegelt, die maschinenabhängig befüllt wird. Aber daran kann jetzt nichts mehr geändert werden. Wichtiger ist, dass Du verstehst, was passiert.

noch ein paar Tipps:

Code:
IF
    <boolscher Wert> // der boolsche Wert muss nicht verglichen werden (Variable = true / Variable = false), sondern sollte direkt abgefragt werden (Variable / NOT Variable)
THEN
    ;
ELSE
    ;
END_IF;

Leere Anweisungsteile eine IF-Abfrage zeugen davon, das die Abfragelogik invers gestaltet werden sollte:

NICHT:

Code:
IF false THEN
    ;
ELSE
    <something>;
END_IF;

SONDERN:

Code:
IF NOT false THEN
    <something>;
END_IF;




VG

MFreiberger
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
grundsätzlich ist es möglich SCL wieder zu AWL oder FUP zu machen - wenn es sich hier nur um einen kleinen Baustein handeln würde und du kein SCL kannst dann könnte das auch eine Option sein - wenn aber das Programm im Großen und Ganzen nur in SCL geschrieben ist dann würde ich dir von Umschreiben abraten und dir empfehlen SCL verstehen zu lernen. So schwer ist das nun auch nicht.

Dein hier veröffentlichter Code-Schnipsel wird übrigens übersichtlicher wenn man die IF-Abfragen einrückt - dann sieht man auch was wie zusammenhängt - das wäre dann so :
Code:
IF NOT oLinearschiene_eFrei THEN

   IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
      ;
   ELSE
      sf_fehler(Fehlernummer := 1327, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(alc_step));
   END_IF;
   sc_nextstep := alc step;

ELSIF oEinschub_eTeil_InHalter AND NOT oDebug_BrueckenTeilInHal THEN

   IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
      ;
   ELSE
      sf_fehler(Fehlernummer := 1324, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(alc_step));
   END_IF ;
   sc_nextstep := alc_step;

ELSIF oDebug_BrueckenTeilInHal THEN
   sf_fehler(Fehlernummer := 1326, Fehlerart := sk_hinweis, Diagnosenummer := BYTE_TO_INT(alc_step));

END_IF;

bTeilEinschubGesehen := false;  // Vorbereitung um Teileeinschub zu sehen

Gruß
Larry
 
Code:
2: // Prüfen ob Nest leer ist

[COLOR=#008000]IF oLinearschiene_eFrei = false THEN [/COLOR][COLOR=#0000ff]// IF NOT oLinearschiene_eFrei THEN ist eleganter[/COLOR]





VG

MFreiberger[/QUOTE]

Na ja mit IF Else ist es eigentlich selbsterklärend sogar für mich.
Kann ich aber keinen Status ansehen, oder wie kann ich dann prüfen ob [COLOR=#008000]oLinearschiene_eFrei 
[/COLOR]false oder true ist?
Wie funktioniert dies im SCL?
Habe mich im OB1 beholfen mit dem Eingang.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja mit IF Else ist es eigentlich selbsterklärend sogar für mich.
Versuch besser, dich umzugewöhnen. Wenn man anstatt IF NOT immer IF nimmt und dann im ELSE weiter
macht, dass ist schon sehr ungewöhnlich und für viele andere dann unverständlich.


Kann ich aber keinen Status ansehen
STATUS/BEOBACHTEN einschalten ( Brille ), dann solltest du den Status sehen.

Arbeitest du mit TIA oder Step7 Classic?
 
Moin Kehrer,

wenn Du Dir einen SCL-Baustein online ansiehst, solltest Du rechts neben dem Code ein paar Spalten haben. Ggf. sind diese verdeckt (rüberscrollen / die Spalten kann man verschieben).

Wenn der Code mehrere Anweisungen in einer Zeile enthält, kann man in den Online-Spalten ein kleines, schwarzes Dreieck anklicken (expandieren). Dadurch werden die Werte der einzelnen Anweisungen dargestellt.

VG

MFreiberger
 
Moin Kehrer,

ich hatte mich, ohne nachzudenken, auf TIA-SCL bezogen. In Step7 classic ist das alles viiiiiel mühsamer.
Leider hatte ich das in SCL noch nicht richtig Fuß gefasst und damit kann ich dabei leider weniger unterstützen.

VG

MFreiberger
 
Wenn man anstatt IF NOT immer IF nimmt und dann im ELSE weiter
macht, dass ist schon sehr ungewöhnlich und für viele andere dann unverständlich.
Ungewöhnlich bzw. gewöhnungsbedürftig mag es wohl sein, aber unverständlich doch hoffentlich für niemanden! Das verstehen nicht nur die "Hochsprachler", sondern sogar die "nur-SPSler". ;)

In Hinblick auf IF ... THEN ... ELSIF ... THEN ... ELSE sollte man zumindest offen dafür sein, dass "leere Zweige" (die gar nichts tun) durchaus sinnvoll/zweckmässig sein können.
Geschachtelte IF-Abfragen (auf die man ausweichen müsste) können auch sehr schnell unübersichtlich werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... und man die dann auch alle "anders herum" denken muss....
Das übt ganz ungemein, DeMorgan geistig präsent zu halten! ;)

Natürlich hast Du Recht, dass es immer auf den Zusammenhang ankommt, aber das ist auch das, was ich damit sagen wollte.

PS:
Wahrscheinlich bin ich etwas (zu sehr) S5-AWL-vorbelastet: da gab es nur SPB und kein SPBN.
Und ersatzweise
Code:
     SPB = M001
     SPA = M002
M001 ... // Bedingung erfüllt
M002 ...
zu schreiben, also den zusätzlichen SPA zu spendieren, hätte ich als pure Verschwendung von chronisch zu knappem Speicherplatz verpönt. ;)
 
Mach mal einen online-Screenshot von dem If Anfang, also weiter oben. Evtl ist oben schon eine If Bedingung erfüllt so dass der Rest eben nicht mehr abgearbeitet wird.
Wird denn dein SCL Baustein überhaupt aufgerufen ( z.b. OB1 )?
Und ist die CPU in RUN?
 
Zuletzt bearbeitet:
Zurück
Oben