Versuchs mal mit:
MOVB AB3, VB3
Erklärung:
AW0: bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
AB 0 bit 15 14 13 12 11 10 9 8
AB 1 bit 7 6 5 4 3 2 1 0
Sieht komisch aus, ist es auch, ist aber so bei Siemens, wenn ich mich richtig erinnere.
Hallo,
ich habe ein (wahrscheinlich ganz einfach zu lösendes) Problem:
Ich möchte einen Wortwert (+8 ) in ein Bytewert umwandeln.
LD E0.0
MOVW -8, AW0
/I -1, AW0
MOVW AW0, AW2 ----> Bis hierhin klappt noch alles. (AW2=+8 )
ITB AW2, VB2 ------> VB2 ist jetzt 0, soll aber 8 sein.
Kann mir jemand sagen, woran das liegt und wie ich da abhilfe schaffe.
christoph
Versuchs mal mit:
MOVB AB3, VB3
Erklärung:
AW0: bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
AB 0 bit 15 14 13 12 11 10 9 8
AB 1 bit 7 6 5 4 3 2 1 0
Sieht komisch aus, ist es auch, ist aber so bei Siemens, wenn ich mich richtig erinnere.
Ja, das geht.
Hast du vielleicht auch eine Lösung für folgendes Problem :
An meinem Schieberegister SHRB kann ich an dem Eingang, der mit N bezeichnet ist, einen Bytewert von z.B. +8 (für Rechts-Schieben) oder -8 (für Links-Schieben) anlegen. Den wert kann ich bislang nur per Hand ändern,sprich: SPS-Stop, Wert ändern, Prog. reinladen, SPS-Run. Dann schiebt er links.
Im diesen Vorgang zu automatisieren, will ich nun eine Funktion haben, die den Bytewert automatisch ändert,z.B. Wenn E0.0 = 1 und E0.1 = 0, dann soll ein Bytewert von +8 anstehen. Eingänge anderherum= -8 . Kann ein Bytewert im Speicher VB0 oder so überhaupt negativ sein ?? Im Handbuch steht einmal der Bereich 0 - 255 und auch der Bereich -128 - +127. Wie werden die Bereiche deklariert???
Vielen Dank für die Hilfe...
Christoph
Bei Werten von 8 ist schieben ineffizient, weil es auf ein ganzes Byte hinausläuft, was durch Byte-Tausch (im vorigen Beitrag im Prinzip vorgeführt) effizienter geht.Originally Posted by christoph
Was Du eigentlich tun willst ist also bei ener Bedingung rechts, bei einer anderen links schieben.Im diesen Vorgang zu automatisieren, will ich nun eine Funktion haben, die den Bytewert automatisch ändert,z.B. Wenn E0.0 = 1 und E0.1 = 0, dann soll ein Bytewert von +8 anstehen. Eingänge anderherum= -8
(Und wenn keine zutrifft, gar nicht?)
Das ist nicht klar, da deine zwei Eingänge insgesamt 4 kombintorische Zustände haben können.
Die Lösung ist:
Bau den Links und den Rechtschiebebefehl ein und überspringe den (oder beide), der/die nicht ausgeführt werden sollen.
Ob schieben mit Variabler Länge geht, weiss ich nicht, kenne den Befehlsvorrat der 200 nicht auswendig. Tippe aber auf nein, da ich niemals eine Steuerung oder einen Mikrocontroller gesehen habe, die es könnten.
Gar nicht. Im Speicher stehn nur Bitmuster. Bis +127 sind sie für mit und ohne Vorzeichen identisch. 11111111 binär ist 255 wenn es von eiem Befehl gelesen wird, der kein Vorzeicehn erwartet. Erwarte der Befehl ein Vorzeichen, so ist es -1. Besser ausgedrückt: Der Befehl interpretiert die Bitfolge so oder so.. Kann ein Bytewert im Speicher VB0 oder so überhaupt negativ sein ?? Im Handbuch steht einmal der Bereich 0 - 255 und auch der Bereich -128 - +127. Wie werden die Bereiche deklariert???
PS: programmierst Du AWL oder FUP(weil Du von Eingang mit N bez. spachst).
In FUP geht das Springen nicht. Dafür haben die Blöcke einen Freigabe-Eingang. Wenn der nicht 1 ist, werden sie auch nicht ausgeführt.
Ich habe jetzt deinen Lösungsvorschlag verarbeitet, Zottel:
Bau den Links und den Rechtschiebebefehl ein und überspringe den (oder beide), der/die nicht ausgeführt werden sollen.
Mein vorheriger Gedanke war wahrscheinlich einfach zu kompliziert. Jetzt funzt es auf jeden Fall.
Christoph
P.S.: Bis jetzt habe ich in KOP programmiert.
Bookmarks