AWL Code in SCL umwandeln

robson

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Liebe Forum Gemeinde, ich stehe vor dem Problem, dass ich einen AWL Code welchen ich geschrieben habe nun in SCL umwandeln soll da ich diesen Baustein in einer 1200er CPU verwenden muss. Leider bin ich bei dem Thema SCL noch ein abssoluter Neuling....Programmiere eigentlich nur FUP und AWL. Ich hoffe ihr könnt mir ein paar Tipps geben wie ich diesen AWL Code in SCL rüberbringe und ich das auch noch so halbwegs verstehe ;)

Netzwerk: 1 Abfrage von Quittiertaster
U #Quittiertaste
FP #FP1
L #Impulszeit
SV #Impulstimer

Netzwerk: 2 Errechnen von Beginn Quitbereich
L #Anzahl_Woerter
L 2
*I
SLW 3
T #Beginn_Quittbereich

Netzwerk: 3 Auswertung Störung
SET
R #Neue_Stoerung
R #Stoerung
LAR1 P#0.0
L #Anzahl_Woerter
Lop1: T #loop_Anzahl

//
// Erkennen von neuer Störung
//
AUF #Stoerungdatenbaustein
L DBW [AR1,P#0.0]
L DIW [AR1,P#14.0]
XOW
UW
L 0
<>I
S #Neue_Stoerung

//
// Störungen noch aktiv
//
L DBW [AR1,P#0.0]
L 0
<>I
S #Stoerung

//
// Speichern von aktuellen Störungen
//
L DBW [AR1,P#0.0]
T DIW [AR1,P#14.0]

//
// Quittierbit setzten und rücksetzten
//
TAR1 AR2
L #Beginn_Quittbereich
+AR2
U #Impulstimer
SPBN Eins
L W#16#FFFF
T DBW [AR2,P#0.0]
SPA weit
Eins: L W#16#0
T DBW [AR2,P#0.0]
weit: NOP 0

//
// Erhöhen von Adressregister
//
L P#2.0
+AR1
L #loop_Anzahl
LOOP Lop1

Vielen Dank für eure Hilfe und ich hoffe jemand kann mir bei diesem Thema helfen!!
 
OP
robson

robson

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
das mit dem neu schreiben habe ich schon geahnt :( ..... aber da ich in SCL wirklich ein Neuling bin wäre es sehr hilfreich für mich wenn mir irgend jemand helfen bzw. erklären kann wie die Ganzen Anweisungen in SCL aussehen bzw. ob man den AWL Code eins zu eins in SCL neu schreiben kann oder das Ganze neu überdecken muss.
 

borromeus

Well-known member
Beiträge
2.270
Punkte Reaktionen
329
diesen AWL Code nicht.
Es gibt ja ein SCL Handbuch bzw. SCL "Erste Schritte".
Lies das einfach mal durch....
 

Perfektionist

Well-known member
Beiträge
3.557
Punkte Reaktionen
517
Zuviel Werbung?
->Hier kostenlos registrieren
da da in deinem AWL-Code auch noch mit Pointer gearbeitet wird, solltest Du Dich auch mit den neuen Möglichkeit der variablen Indizierung von Array-Elementen auseinander setzen. Und der loop-Befehl wird in SCL auch deutlich übersichtlicher formuliert, aber eben anders. Sprünge in SCL macht man nicht, auch wenn die Möglichkeit besteht.

Wenn Du in Deinem Leben schonmal mit Hochsprachen zu tun hattest (Pascal, C, Basic ohne Zeilennummern) kannst Du auf dieses Wissen aufbauend an SCL herangehen. Ansonsten steht dir ein sehr steiniger Weg bevor, wenn Du auf derartiges Basiswissen nicht zurückgreifen kannst.
 

IBFS

Well-known member
Beiträge
4.052
Punkte Reaktionen
883
in der 1200er gibt's ja auch FUP. Neu Überdenken und in FUP programmieren.

FUP und POINTER ... tolle Idee. :rolleyes:

Die Herangehensweise muss sein nicht den Code mit aller Gewalt umzusetzen,
sondern vom Gedanken - WAS macht der Baustein - einen frischen Code in SCL
zu erstellen. Man sollte als vom Ergebnis her denken.

Frank
 
OP
robson

robson

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Vielen Dank für die vielen Antworten, ich habe noch ein Anliegen kann mir jemand einen Tipp bzw. Anstoss geben wie ich in SCL eine Schleife (Loop) aufbaue und wie man einen Datenbaustein auf Wertänderung (0-->1) überwacht.

Werde mich jetzt auf den Weg machen und mir ein SCL Handbuch besorgen.....und dann ein Nachtstudium einlegen ;)
Schönen Abend noch
Rob
 

Perfektionist

Well-known member
Beiträge
3.557
Punkte Reaktionen
517
das verspricht ja eine lange Nacht zu werden. Stichwort Hochsprachenschleifen: for-next, while-do, repeat-until. Was davon nun in SCL geht, kann ich Dir spontan nicht sagen. Aus dem Informatikunterricht glaube ich mich zu erinnern, dass die while-do nach Möglichkeit die erste Wahl währe.
 
OP
robson

robson

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo miteinander :D

Zuerst einmal vielen Dank für die vielen Antworten, ich bin jetzt schon ein Ganzes Stüch weiter mit meinem Baustein..... ich habe nur noch ein Problem das mein TIA V11 SP2 UP 5 leider den Datentyp "BLOCK_DB" bzw. auch die Anweisung "word_to_block_db" nicht erkennt und immer einen Syntaxfehler auswirft.

Ich möchte unbedingt indirekt auf einen DB zugreifen....gibt es ausser diesen Möglichkeiten noch andere Befehle...? bzw. woran kann das liegen das ich in SCL diese Datentypen / Anweisungen nicht nutzen kann....?

Vielen Dank für eure Hilfe
 
OP
robson

robson

Member
Beiträge
11
Punkte Reaktionen
0
Danke, habe ich gefunden ;) ich habe jett folgende SCL Code erstellt und nun gibt mir der Compiler beim Übersetzen immer einen "Übersetzungsfehler" aus obwohl kein Syntax Error ansteht bzw. irgendetwas rot makiert ist.

// Errechnen Adressierung Bereiche
#t_anzahl_DW := (#i_Anzahl_wörter-1)*2;
#t_quittierbereich := #i_Anzahl_wörter*2;

// Auswertung Störungen
#t_index := 0;
FOR #t_index := 0 TO #t_anzahl_DW BY 2 DO

// Störmeldungen quittieren
IF #i_Quittiertaste =1 THEN POKE(area:=16#84, dbNumber:=#i_Datenbaustein, byteOffset:=INT_TO_DINT (#t_index), value:=16#0000);
#s_störung := 0;

// Abfrage ob Störmeldung vorhanden
ELSIF PEEK(area:=16#84, dbNumber:=#i_Datenbaustein, byteOffset:=INT_TO_DINT (#t_index)) <> 0 THEN
#s_störung :=1;
END_IF;

// Quittierbereich invertieren
POKE(area:=16#84, dbNumber:=#i_Datenbaustein, byteOffset:=DINT_TO_WORD (#t_quittierbereich+#t_index),value:=16#FFFF);

END_FOR;

Könnte mir bitte irgend jemand einen Tipp geben wo das Problem liegt...?
 

hucki

User des Jahres 2014
Beiträge
5.546
Punkte Reaktionen
1.646
Zuviel Werbung?
->Hier kostenlos registrieren
Code:
[FONT=courier new]// Errechnen Adressierung Bereiche
#t_anzahl_DW := (#i_Anzahl_wörter-1)*2;
#t_quittierbereich := #i_Anzahl_wörter*2;

// Auswertung Störungen
[COLOR=#ff8c00]#t_index := 0;[/COLOR]
FOR #t_index := 0 TO #t_anzahl_DW BY 2 DO
  
  // Störmeldungen quittieren
  IF #i_Quittiertaste =1 THEN 

     [COLOR=#ff0000]POKE[/COLOR](area:=16#84, dbNumber:=#i_Datenbaustein, byteOffset:=INT_TO_DINT (#t_index), value:=16#0000);
     #s_störung := 0;
        
  // Abfrage ob Störmeldung vorhanden
  ELS[COLOR=#ff0000][U][B]E[/B][/U][/COLOR]IF PEEK(area:=16#84, dbNumber:=#i_Datenbaustein, byteOffset:=INT_TO_DINT (#t_index)) <> 0 THEN

     #s_störung :=1;

  END_IF;

  // Quittierbereich invertieren
  POKE(area:=16#84, dbNumber:=#i_Datenbaustein, byteOffset:=DINT_TO_WORD (#t_quittierbereich+#t_index),value:=16#FFFF);
            
END_FOR;[/FONT]
Ich weiß ja nicht, ob Du den Code hier rein kopiert hast. Wenn ja, fehlt beim ELSEIF das E in der Mitte (rote Markierung) und das POKE gehört normalerweise nicht mehr in die IF-Zeile.
Den Code selber hab' ich jetzt nicht getestet (kann ich auch gar nicht :()

PS: Die 1. Zuweisung "#t_index := 0;" kannst Du weglassen, denn die machst Du ja in der nächsten Zeile mit der FOR-Schleife gleich nochmal.
Und was ich nicht verstehe, ist der Kommentar "Quittierbereich invertieren" und dann erfolgt eine feste Wertzuweisung von "value:=16#FFFF" in der nächsten Zeile. Wie passt das zueinander?


Benutz' übrigens bitte die Code-Einbettung (Icon mit #-Symbol 2. Reihe ganz rechts). Wie Du vlt. siehst, kann man den Code so besser lesen. Vor allem, wenn er in der Schriftart "Courier New" formatiert wird. Auf jeden Fall läßt er sich besser vom Rest des Textes unterscheiden.
Außerdem solltest Du auch die Variablendeklarationen mit angeben, damit man auch eventuelle Fehler bei den Typzuordnungen/-umwandlungen erkennen kann.
 
Zuletzt bearbeitet:
Oben