SCL - AWL Kommando "SRD" in SCL

Floh

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

AWL ist ja so einfach! Oder hat man sich nur schon zu sehr daran gewöhnt. Ich brauch in SCL etwas vergleichbares zur folgenden AWL Anweisung (Schiebe und wenn Positiv dann tue...).

Code:
AWL:
        L 1
        T #i
Loop: L     #MASKE // Maske Bitweise  schieben 
        SRD   1 
        T     #MASKE  // Wenn positiv springe
        JP    chkO 
//
        CLR    // not active ...
        =     DBX[AR1,P#0.0] // ... so copy to bit
        :
        :
        :
        JU    eoO 
//
chkO: NOP 0
eoO: l #i 
       L 16
       <16
       JC Loop

Klar fallen mir so einige Lösungen ein, aber die erscheinen mir alle sehr umständlich. Vielleicht hat einer von Euch ja eine "elegante" nicht so aufwendige Lösung. Hab in der Hilfe keinen vergleichbaren Befehl für SRD gefunden. Wäre echt glücklich, wenn Ihr mir helfen könntet. Vielen Dank schon mal

Gruß
Floh
 
Hallo Floh,

du scheinst ja voll auf dem SCL-Trip zu sein. Die Schiebe- und Rotierfunktionen nennen sich in SCL:

SHL
SHR
ROL
ROR

Bsp.
TEST_WORD := SHL(IN:=TEST_WORD, N:=1);


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Onkel Dagobert,

Danke für die Antwort. Das mit dem SCL ist nicht freiwillig. Mein chef hat sich in den Kopf gesetzt, dass SCL ja so toll ist, das einige unserer Standardbausteine jetzt von AWL nach SCL konvertiert werden sollen. Ich konnte es ihm nicht ausreden und muß es jetzt ausbaden.
Die meisten Schwierigkeiten hab ich, wenn es um die Umsetzung von Logik geht, die mit der RLO und STA (englisch) oder STW mit verwenden. Wie zum Beispiel dieses Problem mit dem schieben und dann das herausgeschoben Bit prüfen und zum Sprung verwenden. Siehe das kleine Stückchen Programm am Anfang. Schieben weis ich ja jetzt, aber wie prüfe ich das herausgeschobene Bit für meine If Anweisung :confused: .
Ich glaube die größte Schwierigkeit besteht im Umdenken, da man nicht 1 zu 1 übersetzen darf/kann.
Daher bin ich froh über jede Hilfe, die von euch kommt!

Vielen Dank
Gruß Floh
 
Hallo Floh,

das ist wohl eine Gemeinsamkeit aller Chef's, keine Ahnung haben, immer alles wollen und demzufolge viel zu knapp kalkulieren - kenne ich :( . Aber vielleicht steckt ja auch ein Kundenwunsch dahinter.

Wenn es sich um Standardfunktionen handelt wäre es u.U. vielleicht besser, die Funktionen der Bausteine mit eigenen Worten zu formulieren, und ohne Zuhilfenahme der AWL-Vorlage neue Bausteine zu erstellen. Nebenbei hätte man auch gleich eine Funktionsbeschreibung welche man als Kommentar einfügen könnte.

Die Abfrage des herausgeschobenen Bits könnte man in SCL durch die Abfrage des rechtsstehenden Bits ersetzen.

Code:
FOR i:=1 TO 32 DO 
  TEMP := ((MASKE AND 1) = 1);
  MASKE := SHR(IN:=MASKE, N:=1);
  ...
END_FOR;

Möglich wäre eventuell auch ein Sichten mit dem AT-Befehl auf ein ARRAY of BOOL, welches man dann in der Schleife abfragen könnte.

Hast du schon eine Lösung für die indirekte Adressierung DBX[AR1,P#0.0] ?


Gruß, Onkel
 
Zuletzt bearbeitet:
Hallo Onkel,

Dieses Mal ist es wirklich rein die Idee meines Chefs (Hat glaub ich was mit dem Traum PCS7 und standard S7 Projekte verwenden gleiche Bausteine zu tun, ha ha..:rolleyes: ).
Er meinte das kann ja nicht so schlimm sein - wir haben doch die Bausteine in AWL.:mad:
Ich hatte schon darauf hingewiesen, dass neu schreiben die einzige vernünftige Möglichkeit ist. Aber die Antwort läßt er nicht gelten. Zusätzlich darf sich das DB Layout nicht ändern, da andere Bausteine und die SCADA daraufzugreifen. Folglich mach ich den ersten Baustein eins zu eins mit AWL, dann kann er sich den Sch... ansehen und vielleicht zur Einsicht kommen. :rolleyes:
Das Ganz sieht jetzt schon abenteuerlich aus mit den vielen Konvertiereungen der Formate, wo man sich bei AWL nicht so große Gedanken machen muss.
Die inderekte Adressierung glaube ich hab ich im Grif. Lade den UDT vom DB in die Temp und arbeite die meiste Zeit mit den Temp Variablen. Schade nur, dass man dabei den DB nicht indiziert ansprechen kann, weil er ja ansonsten sein Datenformat im DB nicht findet (DB(index).UDT_Var[Ptr_Byte,Ptr_Bit]).
Ansonsten eben mit DB(index).DX[Ptr_Byte,Ptr_Bit]. Direktes öffnen eine DB und dann anschliesend nur DBX ... zu verwenden geht doch nicht, oder :confused:
Die Lösung für's schieben werd ich einbauen. Viele Dank dafür.
So also bis zum nächsten Stolperstein.
Gruß Floh
 
Zurück
Oben