Step 7 TAW, Schiebefunktion und Bit-Wertigkeiten

Zuviel Werbung?
-> Hier kostenlos registrieren
@00alex
Wenn man keine Ahnung hat, einfach mal den Mund halten! Du hast in einem einzigen Post gleich zwei unwahre Behauptungen aufgestellt und hast dann noch darauf beharrt, nachdem Du korrigiert wurdest. Du wurdest schon dafür gesperrt, dass Du mehrfach Fragesteller mit unwahren Behauptungen verwirrt hast. Bist Du eigentlich komplett beratungsresistent?

Zudem ist es schlechter Stil, die falschen Behauptungen in einem EDIT in sehr, sehr kleiner Schrift zu korrigieren.

Ich bin kurz davor, Deinen Beitrag zu melden, offensichtlich bist Du ja nicht zur Einsicht fähig.
Hast du es aber probiert ob es "+ -1" geht ?..bevor du mich der Unwahrheit beschuldigst :D
 
Habe nur gesagt soll -1 benutzt werden für Ruckverschieben ...ob es man es auch so eingibt habe ich niergends gesagt !
-1 gibt man ein als "+ -1" ;)
 
Eigentlich wollte ich nichts mehr dazu sagen, aber da 00alex ständig an seinen Beiträgen herumeditiert:

"+ -1" kann an dieser Stelle nicht verwendet werden. "+ -1" rechnet mit dem 16-Bit Bitmuster für -1, dieses entspricht nicht, dem 32-Bit Bitmuster für -1 und kann somit nicht verwendet werden, wenn mit DINT gerechnet wird!
DAS muss ich nicht vorher ausprobieren, ICH habe nämlich im Gegensatz zu 00alex schon jede Menge Erfahrung mit der Materie, vielleicht ist das auch der Grund, weshalb ich keine ungesicherten Behauptungen als Wahrheit verkaufe!!!
 
Das würde ich dir nicht bestreiten ! Und ich bin ein Anfänger , nicht dummer aber trotzdem Anfänger !
Könntest du mir sagen was bei diesem Beispiel aber schrecklich fehlerhaft wäre und ob was falsches/unerwartetes passiern würde bei diesem Beispiel wenn man es so macht wie ich mir (fälschicher-?-weise) ausgedacht habe !

Also was würde hier unerwartet passieren wenn man maximal 20 000 mal :p den Bit hin und her verschiebt und diese Grenze(n) auch überwacht !?
 
Probier es einfach mal aus:
L L#100000
+ -1
T MD100

und anschließend

L L#100000
+ L#-1
T MD100

Und dann informierst Du Dich besser erstmal über die Zahlenformate und die Darstellung von negativen Zahlen!

Es nimmt Dir hier keiner übel, dass Du ein Anfänger bist, aber dass Du glaubst alles besser zu wissen!
 
Das Programm funktioniert so nicht, evtl liegt der Fehler auch bei mir. An "oAusgangsbit" habe ich mit Merker 130.0 versehen, an iAusgangswort das AW124. In der Schnittstelle des FB habe ich ja
als Eingang deklariert und den "oAusgangsbit" als Ausgang. Müsste ich das zu prüfende Ausgangswort AW124 nicht als Ausgang deklarieren??

So sieht der Bausteinaufruf bei mir aus:

Code:
      CALL  FB     2 , DB200
       iAusgangswort:=AW10
       iBitPos_plus :=M20.0
       iBitPos_minus:=M20.1
       oAusgangsbit :=M20.2

Ich hab das auch nochmal mit PLCSIM getestet. Ich denke der Code funktioniert.

Du möchtest doch ein Ausgangswort nehmen und bitweise testen, ob der abgefragte Ausgang des Status HIGH hat. Oder etwas nicht?

Dann musst Du dem Baustein als IN-Parameter das zu prüfende Ausgangswort geben. Klingt erstmal komisch, ist aber so. :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich würde die AR1 ; AR2 (Adressregister) nur dann benützen wenn ich mich auf die Adresse eines gegebenen Formalparameter beziehen würde ! ... sonst immer die Speicherindirekten Pointer benutzen (die mit den rechteckigen Klammer).

Geschmacksache und Bequemlichkeit ;)

(viele Wege nach Rom ...usw)

Ich werde meine Zeit nicht mehr sinnlos damit vertreiben, mit Dir zu diskutieren...
 
Hi !
Versuchs mal damit:


Code:
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_TEMP
  OB1_EV_CLASS : BYTE ;	//Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;	//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;	//Priority of OB Execution
  OB1_OB_NUMBR : BYTE ;	//1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;	//Reserved for system
  OB1_RESERVED_2 : BYTE ;	//Reserved for system
  OB1_PREV_CYCLE : INT ;	//Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;	//Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;	//Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;	//Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =

      L     AW     0; 
      TAW   ; 
      T     MW     0; 

      L     MW     0; 
      L     0; 
      ==I   ; 
      SPB   init; 
      SPA   nex1; 

init: L     1; 
      T     MW     0; 

nex1: NOP   0; 

      U     M     10.0; 
      FP    M     11.0; 
      SPB   vorw; 


      U     M     10.1; 
      FP    M     11.1; 
      SPB   ruek; 

      SPA   ende; 


vorw: NOP   0; 
      TAK   ; 
      SLW   1; 
      T     MW     0; 
      SPA   ende; 

ruek: NOP   0; 
      TAK   ; 
      L     1; 
      ==I   ; 
      SPBN  nex2; 
      L     W#16#8000; 
      T     MW     0; 
      SPA   ende; 

nex2: L     MW     0; 
      SRW   1; 
      T     MW     0; 

      SPA   ende; 

ende: NOP   0; 
      L     MW     0; 
      TAW   ; 
      T     AW     0; 



END_ORGANIZATION_BLOCK

Ist zwar direkt im OB1 programmiert, aber das in einen Baustein zu packen dürfte ja nicht das Problem sein.

Gruß B.A.
 
Wie würde Schieben auf zB. 134 Bits funktionieren ?
Schieben geht nur bis DWORD Länge , oder ?
Das andere löst man mit Pointer , nicht ?
:confused:

Wenn du mehr als DWORD Schieben willst würde ich es auch nicht mit Pointer machen.
Es gibt da sowas wie Division und Modulo.

Da aber nur Word vom Threadersteller gefordert ist interessiert es auch jetzt niemand wie man x mal schiebt.
Man kann und sollte auch nicht immer alles super universal machen.

Zurück zum ursprünglichen Thema:
@Tigerente:
Warum willst du das mit Pointer lösen?
Meiner Meinung nach sollte man Pointer weitestgehend vermeiden, außer es ist das Ergebnis wirklich um vieles Leichter zu verstehen.

Ich würde es einfach mit SLW und SRW lösen.
Wenn das Bit aus dem Word hinausgeschoben ist dann setze einfach im anderen Byte das jeweils niederwertigste oder höchstwertigste Bit.

Code:
FUNCTION_BLOCK "BitRotieren"
TITLE = Dieser Baustein kann ein Bit in einem Word nach links oder rechts Rotieren 
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Auf : Bool;   // Rotiert das Bit nach links
      Ab : Bool;   // Rotiert das Bit nach rechts
      Reset : Bool;   // Setzt das rotierte Bit zurück
   END_VAR

   VAR_OUTPUT 
      Byte1 : Byte;   // Beim ersten mal Auf wird in diesem Byte das niederwertigste Bit gesetzt
      Byte2 : Byte;   // Beim ersten mal Ab wird in diesem Byte das höchstwertigste Bit gesetzt
   END_VAR

   VAR 
      RotiereBit : Word;   // Aktueller Zustand des zu rotierenden Bit
      fpAuf : Bool;
      fpAb : Bool;
   END_VAR


BEGIN
NETWORK
TITLE = Auf: Schiebe Bit nach links
      U #Auf;
      FP #fpAuf;
      SPBN endAuf;

// Schiebe das Bit um eine Stelle nach links
      L #RotiereBit;
      SLW 1;
      T #RotiereBit;

// Wenn RotiereBit den Wert 0 hat dann setze das niederwertigste Bit
      L 0;
      ==I;
      SPBN endAuf;
      L 1;
      T #RotiereBit;

endAuf:      NOP 0;

NETWORK
TITLE = Ab: Schiebe Bit nach rechts
      U #Ab;
      FP #fpAb;
      SPBN endAb;

// Schiebe das Bit um eine Stelle nach rechts
      L #RotiereBit;
      SRW 1;
      T #RotiereBit;

// Wenn RotiereBit den Wert 0 hat dann setze das höchstwertigste Bit
      L 0;
      ==I;
      SPBN endAb;
      L 32768;//2^15 => setze höchstwertiges Bit im Word
      T #RotiereBit;

endAb:      NOP 0;


NETWORK
TITLE = Reset: Setzt Rotiere Bit auf 0 => Kein Ausgang wird angesteuert
      UN #Reset;
      SPB endReset;

      L 0;
      T #RotiereBit;

endReset:      NOP 0;


NETWORK
TITLE = Setze Ausgang
      L #RotiereBit;
      T #Byte1;
      TAW;
      T #Byte2;

END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Tigerente:
Warum willst du das mit Pointer lösen?
Meiner Meinung nach sollte man Pointer weitestgehend vermeiden, außer es ist das Ergebnis wirklich um vieles Leichter zu verstehen.

Ich würde es einfach mit SLW und SRW lösen.
Wenn das Bit aus dem Word hinausgeschoben ist dann setze einfach im anderen Byte das jeweils niederwertigste oder höchstwertigste Bit.

Ich fand die Pointer-Lösung halt einfach nachvollziehbar und der Code wird auch nicht unbedingt länger.
In so einem (gekapselten) Baustein tut der Pointer m.E. nicht weh.

Was aber jetzt nicht bedeutet, dass ich die Pointerlösung als den (einzigen) Königsweg betrachte...
 
Hi !
Versuchs mal damit:


Code:
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_TEMP
  OB1_EV_CLASS : BYTE ;	//Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;	//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;	//Priority of OB Execution
  OB1_OB_NUMBR : BYTE ;	//1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;	//Reserved for system
  OB1_RESERVED_2 : BYTE ;	//Reserved for system
  OB1_PREV_CYCLE : INT ;	//Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;	//Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;	//Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;	//Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =

      L     AW     0; 
      TAW   ; 
      T     MW     0; 

      L     MW     0; 
      L     0; 
      ==I   ; 
      SPB   init; 
      SPA   nex1; 

init: L     1; 
      T     MW     0; 

nex1: NOP   0; 

      U     M     10.0; 
      FP    M     11.0; 
      SPB   vorw; 


      U     M     10.1; 
      FP    M     11.1; 
      SPB   ruek; 

      SPA   ende; 


vorw: NOP   0; 
      TAK   ; 
      SLW   1; 
      T     MW     0; 
      SPA   ende; 

ruek: NOP   0; 
      TAK   ; 
      L     1; 
      ==I   ; 
      SPBN  nex2; 
      L     W#16#8000; 
      T     MW     0; 
      SPA   ende; 

nex2: L     MW     0; 
      SRW   1; 
      T     MW     0; 

      SPA   ende; 

ende: NOP   0; 
      L     MW     0; 
      TAW   ; 
      T     AW     0; 



END_ORGANIZATION_BLOCK

Ist zwar direkt im OB1 programmiert, aber das in einen Baustein zu packen dürfte ja nicht das Problem sein.

Gruß B.A.

Danke Danke, das Programm funktioniert. Die anderen Programme sind leider fehlerhaft, oftmals fehlte der Initialschritt (A124.0). Ich versuche jetzt das Programm zu verstehen und den Unterschied zu meinem zu finden (im groben sehen sie sich ja gleich aus). Ich hoffe, dass ich bei Fragen mich nochmal an dich wenden darf.

Gruß winRARE
 
Ich fand die Pointer-Lösung halt einfach nachvollziehbar und der Code wird auch nicht unbedingt länger.
In so einem (gekapselten) Baustein tut der Pointer m.E. nicht weh.

Was aber jetzt nicht bedeutet, dass ich die Pointerlösung als den (einzigen) Königsweg betrachte...

Darf ich erfahren, was es mit "Pointer" auf sich hat?

Gruß winRARE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Pointer sind Zeiger auf Speicherstellen.
Also du kannst zur Laufzeit des Programmes berechnen zb welche stelle du im Datenbaustein, Merkerbereich,... adressieren willst.
Siehe dazu auch die Hilfe im Tia Portal und Suche mal hier im Forum.

Edit:
Ganz Wichtig: FAQ
 
Zuletzt bearbeitet:
Zurück
Oben