Mehrmals Schieben mit SHL

mendelfranz

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

ich bin noch Anfänger bei TwinCat und versuche mich mit Shiften und Rotieren.

Meine Frage: Wie kann ich das Programm umgestalten, dass ich mehrmals hintereinander shiften kann?

Bsp.:

IF bShiftLinks THEN
dwErgebnis := SHL (dwVar,1);

In diesem Beispiel ist es ja nur 1mal möglich, da dwVar ja immer konstant bleibt. Mein Versuch, den Wert von dwErgebnis nach dem Shiften auf dwVar zu schreiben, funktioniert nicht, wie ich mir das vorstelle. Beim Rotieren konnte ich bereits das gleiche Problem beobachten.

MFG. mf
 
Hallo,
das sollte aber gehen.
Woher kommt denn dwVar ?
Wie versuchst du denn dwErgebnis auf dwVar zu schreiben ?
Wie sieht überhaupt der komplette Code aus ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist der Orginal-Code:

IF bState THEN
dwVar := SHL(DWORD#1, iBit) OR dwVar;
ELSE
dwVar := ROL(DWORD#16#FFFFFFFE, iBit) AND dwVar;
END_IF

dwVar stellt den Status von einem Greifer dar, den ich momentan allerdings als festen Wert zum Testen annehme. (Wird am Anfang des Test-Programms z.B. auf 2#00000000000000000000010011010010, Dezimal : 1234 geschrieben). Wie gesagt, vorerst geht des mir nur ums Shiften und Rotieren. Aber vielleicht könnt Ihr mir die komplette Funktion erklären...;)

Das Testprogramm sollte folgendermaßen ausschauen:

Testprogramm:

Variablendeklaration:

dwVar : DWORD ;
dwErgebnis : DWORD;
bShiftLinks : BOOL;

Code:

IF bShiftLinks THEN
dwErgebnis := SHL (dwVar,1);
dwVar := dwErgebnis;
END_IF

Wie gesagt, ich möchte mit jedem Tastenklick (bShiftLinks kommt zum Test von der Visu) den Wert von dwVar um 1 nach links schieben.
 
Zuletzt bearbeitet:
Eigentlich sollte das schon in einer Zeile funktionieren. Vielleicht ein Fehler beim Online-Beobachten?

Code:
dwVar := 1;
dwVar := SHL (dwVar,1);
(* dwVar ist jetzt 2 *)
dwVar := SHL (dwVar,1);
(* dwVar ist jetzt 4 *)
dwVar := SHL (dwVar,1);
(* dwVar ist jetzt 8 *)

dwVar := 1;
dwVar := SHL (dwVar,1) OR dwVar;
(* dwVar ist jetzt 3 *)
dwVar := SHL (dwVar,1) OR dwVar;
(* dwVar ist jetzt 7 *)
dwVar := SHL (dwVar,1) OR dwVar;
(* dwVar ist jetzt 15 *)
 
Hm, der Originalcode hat mit Deinem Testprogramm aber nicht viel zu tun. Beim Original wird in "dwVar" das Bit an Position "iBit" bei "bState=TRUE" auf 1 und bei "bState=False" auf 0 gesetzt.
Im Testprogramm wird dagegen der Inhalt von "dwVar" geschoben. Und was heisst, dass das Schreiben von "dwErgebnis" auf "dwVar" nicht so funktioniert, wie Du es Dir vorstellst? Wie funktioniert es denn?
Abgesehen davon brauchst Du auch gar keine Hilfsvariable "dwErgebnis". Es geht auch so:
Code:
dwVar:=SHL(dwVar,1);
oder auch so:
Code:
dwVar:=dwVar+dwVar;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn das Schiebebit von der Visu kommt dann solltest du auf alle Fälle noch eine Flankenauswertung zusätzlich mit einbauen.
Ohne diese macht die Anweisung mit Sicherheit einige Hundert Schiebe-Befehle während du die Taste drückst/ das Bit setzt.

Gruß
Larry
 
Also in etwa so :
Code:
IF bShiftLinks and not FM_Shift THEN
       dwErgebnis := SHL (dwVar,1);
   dwVar := dwErgebnis;
END_IF ;
FM_Shift := bShiftLinks ;
 
Morgen zusammen,

also ich hab am Freitag auch noch rausgefunden, dass ich eine pos. Flanke verwenden muss und es funktioniert wunderbar:

fbFlanke(CLK:= bShiftRechts, Q=> );

IF fbFlanke.Q THEN
dwStatus:= SHL (dwStatus,1);
END_IF

Vielen Dank für die Hilfe!
 
Zurück
Oben