In einem byte schauen ob ein Bit für ca. 1M lang 0 ist

Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen,

Is eigentlich egal Byte oder Word, es geht mir dabei darum das ich erkenne wenn in dem Byte(Word) irgendein Bit 1m 0 ist.

Lg Chris


Geht es jetzt um Byte oder ein Wort?
Musst du auch erkennen, wenn nach dem 1. Wechsel nach null ein weiteres Bit sich ändert?

Mit den bisher vorgestellten Lösungen ist folgendes Problem:
Bit 0 wird null
Zeit startet
Nach ca 58 sec
Bit 1 wird Null
Zeit läuft ja schon, also geschieht nix.
Nach 59sec
Bit 0 wird eins
Jetzt lässt Bit 1 die Zeit weiter ablaufen,
aber das Bit 1 war nicht 1 Minute eins.

Kannst du uns das genauer bitter erklären was du willst?


Danke

bike
 
Morgen,

Also die Lösung gefällt mir sehr gut.

Lg Chris


mir schwebt ja eine lösung mit einem array[0..7] of int als timer-puffer für alle bits vor, getriggert vom plc-puls 1hz und dann über das ganze byte in geguckt, ob sich ein bit geändert hat und wenn 0, läuft die zeit für das bit los ... das ganze in einem FB und fertsch :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen,

Ich meine irgendein Bit im Word oder Byte.


Meinst Du
a) genau EIN Bit
b) genau dasselbe Bit

zu a)
wenn Du 1111 0011 für 60s lang anstehen hast, ist dann Deine Bedingung auch erfüllt?

JEP!!

zu b) wenn Du 1111 0111 für 30 Sekunden und dann 1111 1011 für 30 Sekunden hast, ist dann Deine Bedingung erfüllt?

Nein!!

Lg Chris
 
Hi,

mal eine andere Lösung. ;)

Falls Du kein SCL hast kann ich es auch als S7-Projekt hier rein stellen.
Code:
TYPE UDT1
  STRUCT
    IN : BOOL ;  
    PT : TIME ;  
    Q : BOOL ;  
    ET : TIME ;  
    STATE : BYTE ;  
    STIME : TIME ;  
    ATIME : TIME ;  
  END_STRUCT
END_TYPE


FUNCTION_BLOCK FB1

VAR_INPUT
  IN : WORD;
  ENABLE : WORD;
END_VAR
  
VAR_OUTPUT
  OUT : BOOL;  
END_VAR

VAR_TEMP
  tWORD : WORD;
    atWORD AT tWORD : ARRAY[0..15] OF BOOL;
  i : INT;
  i0 : INT;
END_VAR

VAR
  sTIMER : SFB4;
  aTIMER : ARRAY[1..16] OF UDT1;
END_VAR

BEGIN

  i0 := 0;
  
  tWORD := IN XOR ENABLE;
  
  FOR i := 1 TO 16 DO
    aTIMER[i0] := aTIMER[i];
    sTIMER(IN := atWORD[i-1], PT := T#10s);
    aTIMER[i] := aTIMER[i0]; 
  END_FOR;

  FOR i := 1 TO 16 DO
    OUT := aTIMER[i].Q;
    IF OUT THEN
      EXIT;
    END_IF;
  END_FOR;
        
END_FUNCTION_BLOCK

Kommentare sind was für Weicheier :)

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Backdoor,

mist hatte noch einen kleinen Fehler drin.

Code:
TYPE UDT1
  STRUCT
    IN : BOOL ;  
    PT : TIME ;  
    Q : BOOL ;  
    ET : TIME ;  
    STATE : BYTE ;  
    STIME : TIME ;  
    ATIME : TIME ;  
  END_STRUCT
END_TYPE


FUNCTION_BLOCK FB1

VAR_INPUT
  IN : WORD;      
  ENABLE : WORD;
END_VAR
  
VAR_OUTPUT
  OUT : BOOL;  
END_VAR

VAR_TEMP
  tWORD : WORD;
    atWORD AT tWORD : ARRAY[0..15] OF BOOL;
  i : INT;
  i0 : INT;
END_VAR

VAR
  sTIMER : SFB4;
  aTIMER : ARRAY[1..16] OF UDT1;
END_VAR

BEGIN

  i0 := 0;
  
  tWORD := (IN XOR W#16#FFFF) AND ENABLE;
  
  FOR i := 1 TO 16 DO
    aTIMER[i0] := aTIMER[i];
    sTIMER(IN := atWORD[i-1], PT := T#10s);
    aTIMER[i] := aTIMER[i0]; 
  END_FOR;

  FOR i := 1 TO 16 DO
    OUT := aTIMER[i].Q;
    IF OUT THEN
      EXIT;
    END_IF;
  END_FOR;
        
END_FUNCTION_BLOCK

"IN" sind die auf 0 abzufragenden Bits und mit "ENABLE" kann man bestimmen welche Bits "OUT" TRUE werden lassen.

Gruss Daniel
 
Zurück
Oben