Step 5 AWL Befehl "B"

Hucky

Level-2
Beiträge
218
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Nabend....

ich versuche gerade einen Codeschnipsel zu verstehen. Es geht um einen Funktionsbaustein wo OP-Aufträge (OP15) abgearbeitet werden.
Das ganze sieht so aus:

Code:
M001        :
        :A    DB    52
        :L    DW    40
        :L    KH    00FF
        :UW
        :T    DW    40
        :L    KH    0001
        :T    MW    170
        :B    DW     40
        :SLW        0
        :T    MW    170
        :

DW 40 entspricht hier den Bereichszeiger der Bildnummer in der Parametrierung vom Panel.
Was in den paar Zeilen passiert versteh ich so einigemaßen, aber mit "B DW 40" kann ich so nun garnichts anfangen, bzw. habe in diversen AWL-Befehlstabellen den Befehl nicht gefunden. Dazu in Kombination mit dem Befehl SLW 0 ?! Das Word um 0 Bits nach links ? Was macht das für einen Sinn ?

Kann wer helfen ?

Hucky
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... habe in diversen AWL-Befehlstabellen den Befehl nicht gefunden.
Du musst in einer Beschreibung von S5-AWL suchen. Aber der Bearbeite-Befehl war nicht auf allen S5-CPUs verfügbar.
Dazu in Kombination mit dem Befehl SLW 0 ?! Das Word um 0 Bits nach links ?
Warum nicht SLW? Im rechten Byte von DW40 (also in DR40 - der Inhalt von DL40 ist hier irrelevant) steht, um wieviele BitPositionen der Akku-Inhalt nach links geschoben werden soll.

Warum in Deinem Beispiel allerdings die '1' nicht nur nach dem Schieben, sondern auch vorher schon nach MW170 kopiert wird ... heaven knows ... kann es sein, dass der Schöpfer dieser ProgrammZeilen kein sehr grosses Vertrauen in seine CPU hatte? ;)
 
Ich glaub ja eher, dass du den Code nicht verstanden hast 🤪
Ich denke doch, dass ich nachvollziehen kann, was der Code macht, Dieter.
Das schliesst allerdings nicht aus, dass der Code noch das eine oder andere Rätselchen enthält.
Warum wird z.B. die Anzahl der "Schiebungen" durch Maskierung mit KH 00FF auf 255 begrenzt und nicht durch Maskierung mit z.B. KH 001F auf 31 oder sogar durch KH 000F auf 15?
Warum erspart man sich die Maskierung auf das komplette DR 40 nicht ganz, wo doch der B DW 40 den Inhalt von DL 40 sowieso ignoriert?
Warum wird die '1' per L KH 0001 in den Akku geladen und nicht per L KB 1?
Der L KH 0001 verschwendet 2 Byte ProgrammSpeicher gegenüber dem (genauso gut lesbaren!) L KB 1.
Der L KH 00FF verschwendet übrigens ebenfalls 2 Byte ProgrammSpeicher gegenüber dem L KB 255, aber das bemeckere ich ja gar nicht, denn die bessere Lesbarkeit will ich nicht opfern. ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum wird die '1' per L KH 0001 in den Akku geladen und nicht per L KB 1?
Der L KH 0001 verschwendet 2 Byte ProgrammSpeicher gegenüber dem (genauso gut lesbaren!) L KB 1.
Das hat mehrere Gründe, erstens wenn man Wortweise anfängt bleibt man idr. bei Wortweiser Bearbeitung. Zweitens ist das mit den 2 Bytes statt 1 Byte so nicht ganz richtig, das zweite Byte im L KB 1 wird im MC5-Code mit nullen aufgefüllt. Und wenn du mit Ressourcen sparen anfängst, dann solltest du wissen dass beim ausführen von L KB 1 mehr Zykluszeit generiert wird.

1696151832218.png
 
Das hat mehrere Gründe, erstens wenn man Wortweise anfängt bleibt man idr. bei Wortweiser Bearbeitung.
Diese Bemerkung verstehe ich nicht. Wer bleibt womit bei wortweiser (oder byteweiser?) Bearbeitung?
Zweitens ist das mit den 2 Bytes statt 1 Byte so nicht ganz richtig, das zweite Byte im L KB 1 wird im MC5-Code mit nullen aufgefüllt.
Nein, in MC5 ist der L KB ein 2-Byte-Befehl und alle anderen LadeBefehle für Konstanten sind 4-Byte-Befehle (L KH, L KM, L KC, ...) mit
Ausnahme von L DH und L KG. Letztere sind 6-Byte-Befehle, die 32-Bit-Konstanten laden.
Im MC5-Code belegt die Konstante des L KB tatsächlich nur 1 Byte. Das bzw. die höherwertigen Bytes der Konstante werden erst beim Ausführen des L KB mit 0 im Akku vorbesetzt.
Und wenn du mit Ressourcen sparen anfängst, dann solltest du wissen dass beim ausführen von L KB 1 mehr Zykluszeit generiert wird.

Anhang anzeigen 71876
Anscheinend gibt es dazu selbst bei Siemens keine einheitliche Linie, siehe:
Lade.jpg
 
@Heinileini
Du hast dich gewundert warum die 1 vor dem Schieben in MW170 geladen wird.
Warum in Deinem Beispiel allerdings die '1' nicht nur nach dem Schieben, sondern auch vorher schon nach MW170 kopiert wird ... heaven knows ... kann es sein, dass der Schöpfer dieser ProgrammZeilen kein sehr grosses Vertrauen in seine CPU hatte? ;)
Der Grund ist doch ganz simpel.
Abhängig von der Bildnummer des OP in DW40 soll ein Bit in MW170 gesetzt werden.
Also muss MW170 vor dem Schieben mit 1 initialisiert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Heinileini
Du hast dich gewundert warum die 1 vor dem Schieben in MW170 geladen wird.

Der Grund ist doch ganz simpel.
Abhängig von der Bildnummer des OP in DW40 soll ein Bit in MW170 gesetzt werden.
Das sehe ich gar nicht so, Dieter. Die SchlussFolgerung ...
Also muss MW170 vor dem Schieben mit 1 initialisiert werden.
... ist falsch. Das Schieben wird nicht im MW170 ausgeführt, sondern im Akku.
Der Akku muss mit 1 initialisiert werden und dann wird das Bit im niederwertigen Wort des Akkus nach links geschoben ... schlimmstenfalls so weit, dass es im niederwertigen Wort des Akkus verschwindet, ohne jemals im höherwertigen Wort des Akkus aufzutauchen. Das zuletzt "über den Rand geschobene" und im Akku nicht mehr sichtbare Bit kann über ANZ1 abgefragt werden.
Wird der Inhalt des Akkus vor dem Schieben nach MW170 kopiert und der Zustand nach dem Schieben ebenfalls, so wird also im MW170 der Zustand vor dem Verschieben mit dem Zustand danach überschrieben.
Das könnte sinnvoll sein *), wenn der Bereich MW170 zwischen dem ersten T MW170 und dem zweiten T MW170 ausgewertet würde - wird aber nicht in dem Code aus #1.

*) ... aber langweilig wäre es dennoch, weil der Inhalt des MW170 im Code aus #1 nach dem ersten T MW170 bis zum zweiten T MW170 immer 1 ist.
 
@Heinileini :
Du hast Recht mit deiner Annahme - der " L KH 0001 " initiualisiert schon den Akku (und so nebenher das MW 170 - was nicht wirklich Relevanz hat - war warscheinlich "zur Vorsicht" mit programmiert worden).
Trotzdem bin ich der Ansicht, dass diese Diskussion, da die eigentliche Frage ja beantwortet ist, nicht mehr wirklich zielführend ist. Es ist mehr ein "Streiten um des Kaisers Bart" ...
 
Trotzdem bin ich der Ansicht, dass diese Diskussion, da die eigentliche Frage ja beantwortet ist, nicht mehr wirklich zielführend ist. Es ist mehr ein "Streiten um des Kaisers Bart" ...
Stimmt, Ralf. Ehe man sich versieht, kommen Kommentare, die man am liebsten im Sande verlaufen lassen möchte, die man dann aber doch wieder kommentiert, obwohl man sie für mehr oder weniger off topic hält ... sorry!
 
Zurück
Oben