Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: Mehrmals Schieben mit SHL

  1. #1
    Registriert seit
    14.01.2009
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Mehrmals Schieben mit SHL  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    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

  3. #3
    mendelfranz ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.01.2009
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.
    Geändert von mendelfranz (18.11.2011 um 11:04 Uhr)

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    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 *)

  5. #5
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    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;

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    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

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

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

  8. #8
    mendelfranz ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.01.2009
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!

Ähnliche Themen

  1. Einen FB mehrmals einsetzen
    Von Guarnere im Forum Simatic
    Antworten: 32
    Letzter Beitrag: 25.11.2009, 10:50
  2. meldefenster popt mehrmals auf
    Von wachsi im Forum HMI
    Antworten: 1
    Letzter Beitrag: 21.11.2008, 11:44
  3. Instanz DB mehrmals aufrufen
    Von Deep Blue im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.08.2007, 12:39
  4. Timer in FB mehrmals verwenden
    Von Mike_S7 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 10.12.2006, 12:38
  5. FB mehrmals benutzen
    Von Zapot im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 16.11.2006, 22:03

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •