Byte-Signal unterdrücken

pauly2072

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

für eine WAGO 750-849 (CoDeSys 2.3) muss ich folgendes lösen:

Über einen Eingang (KNX-Kommunikationsobjekt) erhalte ich einen 1-Byte-Wert (0-255), welcher u.a. wieder auf einen Ausgang (KNX-Kommunikationsobjekt) ausgegeben wird.

Wenn jedoch über den Eingang der Wert 0 kommt, soll die 0 erst nach 1 bis x Sekunden (parametrierbar) am Ausgang ausgegeben werden. Steht die 0 kürzer an, dann soll sie quasi unterdrückt werden. Werte 1 bis 255 sollen ungehindert passieren.

Ich bin jetzt noch nicht DER Crack, daher hoffe ich auf Eure Hilfe! :)

Vielen Dank im Voraus

Gruß

Peter
 
Z. B. so:
Code:
FUNCTION_BLOCK fblZeroDelay (* Delays output of value 0 *)
VAR_INPUT
   inpValue:BYTE; (* Input value *)
   inpDelay:TIME; (* Output delay for inpValue=0 *)
END_VAR
VAR_OUTPUT
   outValue:BYTE; (* Output value *)
END_VAR
VAR
   varTimer:TON; (* Delay timer *)
END_VAR

(* Code *)
(* inpValue=0 delay *)
varTimer(
   IN:=inpValue=0,
   PT:=inpDelay);
IF NOT varTimer.IN (* Timer not running, means inpValue>0 *)
OR varTimer.Q THEN (* Input value=0 delay elapsed *)
   (* Output inpValue *)
   outValue:=inpValue;
ELSE
   ; (* Leave outValue unchanged *)
END_IF
 
Ja genau, in AWL...

Hatts aber schon selber gemerkt. ;)

Funktioniert einwandfrei. Tut was es soll.

Du bist mein Held! :D

Danke nochmal!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun stehe ich vor dem nächsten Problem...

Hintergrund:

Ich steuere viele RGBW-DMX-Decoder mit 4 x 1-Byte 0-255 an. Die 4 Bytes kommen einzeln per KNX-Kommunikationsobjekt in die WAGO.
Wenn ich also z.B. über die Visualisierung (HS QuadCilent) einen bestimmten Farbton auswähle, kommt die dafür benötigte Kombination der 4 Farben RGBW nacheinander in der WAGO an. Dies verursacht im schlimmsten Fall nacheinander 3 verschiedene Farben der LED-Leuchtmittel, bevor dann mit dem Eintreffen der 4. Farbe die gewünschte Farbe ansteht. Diese "Lichtorgel" ist natürlich nicht sehr ansehnlich. - Ich hoffe, ich bringe das einigermaßen verständlich rüber...

Ich bräuchte nun einen Funktionsblock mit 4 x 1-Byte-Eingang + Time-Eingang und 4 x 1-Byte-Ausgang. Ich stelle mir das so vor, dass der Funktionsblock die 4 Eingangsbytes auf Veränderung überwacht und sobald sich der Wert eines der 4 Bytes verändert die 4 Eingangsbytes erst nach Ablauf der am Time-Eingang vorgegebenen Zeit alle 4 Bytes 'gleichzeitig' auf die 4 1-Byte-Ausgänge gibt.

Wäre superprima, wenn mir jemand beim Erstellen eines solchen Funktionsblockes helfen könnte!

Schönes Wochenende

Peter
 
Wenn Du meinen FB so änderst, dass der Timer nicht bei "inpValue=0" läuft, sondern bei "inpValue<>outValue", hast Du die gewünschte Funktion schon mal für ein Byte. Die Erweiterung auf 4 Bytes sollte dann kein so grosses Problem sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bräuchte nochmal Hilfe...

Mein Baustein (4Bytes to DWORD) funktioniert soweit, als dass er die 4 Eingangsbytes korrekt in das Ausgangs-DWORD schreibt. Nur der Timer macht nicht das, was er soll: Wenn es eine Wertänderung in inpValueRGBW gibt, sollen outValueR, outValueG, outValueB und outValueW um den Timerwert delayed ausgegeben (ausgeblendet) werden. Im moment wird bei Eingangswertänderung unverzögert ausgegeben.

Wo habe ich Mist gebaut?

Code:
FUNCTION_BLOCK fblDWORD_TO_4B_Delay  (* Input DWORD Output 4 x 1 Byte mit ggf. Verzögerung *)
VAR_INPUT
   inpValueRGBW:DWORD;       (* Input value RGBW (Channels 1-4) *)
   inpDelay:TIME;          (* Output delay for inpValueRGBW<>outValueRGBW *)
END_VAR
VAR_OUTPUT
   outValueR:BYTE;         (* Output value R (Channel 1) *)
   outValueG:BYTE;         (* Output value G (Channel 2) *)
   outValueB:BYTE;         (* Output value B (Channel 3) *)
   outValueW:BYTE;         (* Output value W (Channel 4) *)
END_VAR
VAR
   varTimer:TON;          (* Delay timer *)
   outValueRGBW:DWORD;       (* Only internal for comparison inpValueRGBW<>outValueRGBW for varTimer.IN *)
END_VAR

Code:
(* Code *)
(* inpValueRGBW<>outValueRGBW delay *)
varTimer(
   IN:=inpValueRGBW<>outValueRGBW,          (* Start Timer when inpValueRGBW<>outValueRGBW *)
   PT:=inpDelay);
IF NOT varTimer.IN               (* Timer not running, means inpValueRGBW=outValueRGBW *)
OR varTimer.Q THEN               (* Input inpValueRGBW<>outValueRGBW delay elapsed *)
(* Output inpValueRGBW in outValueX *)
   outValueR:=DWORD_TO_BYTE(inpValueRGBW AND 255);
   outValueG:=DWORD_TO_BYTE(SHR(inpValueRGBW,8) AND 255);
   outValueB:=DWORD_TO_BYTE(SHR(inpValueRGBW,16) AND 255);
   outValueW:=DWORD_TO_BYTE(SHR(inpValueRGBW,24) AND 255);
ELSE
   ;                    (* Leave all outValueX unchanged *)
END_IF
 outValueRGBW:=inpValueRGBW;           (* Only internal for comparison inpValueRGBW<>outValueRGBW for varTimer.IN *)
 
Zuletzt bearbeitet:
Ich vermute mal stark, dass das in der letzten Zeile so nicht funktioniert:

outValueRGBW:=inpValueRGBW;
Richtig, outValueRGBW muß aus den Ausgangswerten zusammengebastelt werden und nicht aus dem Eingangswert.
Code:
outValueRGBW := BYTE_TO_DWORD(outValueR) OR SHL(BYTE_TO_DWORD(outValueG), 8) OR SHL(BYTE_TO_DWORD(outValueB), 16) OR SHL(BYTE_TO_DWORD(outValueW), 24);

Harald
 
Zurück
Oben