Entprellung vieler Eingänge bei ILC 150 ETH

Portisch

Level-1
Beiträge
149
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich bin gerade dabei mir zu überlegen wie ich am besten ca. 70 Eingänge entprelle...

Muss ich jeden Eingang mit einem eigenen Debounce bearbeiten oder kann die SPS vielleicht das selber?
Oder kann man das in einer FOR Schleife machen?

Wenn man das mit einem Debounce für jeden Eingang macht kommt ja ganz schön viel Code zusammen.

EDIT:
Vielleicht so?
Code:
TYPE
 S_BIT : STRUCT
   EDGE : BOOL;
   Q : BOOL;
   tn : UDINT;   
 END_STRUCT;
END_TYPE
TYPE
 INPUTS_DW : Array[0..31] OF S_BIT;
 INPUTS_BYTE : Array[0..7] OF S_BIT;
END_TYPE

Code:
IF NOT init THEN
 FOR i := 0 TO 31 DO
  inp[i].EDGE := FALSE;
  inp[i].Q := FALSE;
 END_FOR;
 init := TRUE;
END_IF;
  
T_PLC_MS(); (* read system timer *)
tx := T_PLC_MS.T_PLC_MS;
FOR i := 0 TO 31 DO
 (* set edge if input got high *)
 IF BIT_OF_DWORD(INPUTS,i) THEN
  IF NOT inp[i].EDGE THEN
   inp[i].EDGE := TRUE;
   inp[i].tn := tx;
  END_IF;
 END_IF;
 (* check inputs with high edge if debounce time elapsed *)
 IF BIT_OF_DWORD(INPUTS,i) AND inp[i].EDGE THEN
  IF tx - inp[i].tn >= TIME_TO_UDINT(Entprellzeit) THEN
   inp[i].Q := TRUE;
  END_IF;
 ELSIF NOT BIT_OF_DWORD(INPUTS,i) THEN (* check if input is false *)
  inp[i].EDGE := FALSE;
  inp[i].Q := FALSE;
 END_IF;
END_FOR;
BIT1 := inp[0].Q;
BIT2 := inp[1].Q;
BIT3 := inp[2].Q;
BIT4 := inp[3].Q;
BIT5 := inp[4].Q;
BIT6 := inp[5].Q;
BIT7 := inp[6].Q;
BIT8 := inp[7].Q;
BIT9 := inp[8].Q;
BIT10 := inp[9].Q;
BIT11 := inp[10].Q;
BIT12 := inp[11].Q;
BIT13 := inp[12].Q;
BIT14 := inp[13].Q;
BIT15 := inp[14].Q;
BIT16 := inp[15].Q;
BIT17 := inp[16].Q;
BIT18 := inp[17].Q;
BIT19 := inp[18].Q;
BIT20 := inp[19].Q;
BIT21 := inp[20].Q;
BIT22 := inp[21].Q;
BIT23 := inp[22].Q;
BIT24 := inp[23].Q;
BIT25 := inp[24].Q;
BIT26 := inp[25].Q;
BIT27 := inp[26].Q;
BIT28 := inp[27].Q;
BIT29 := inp[28].Q;
BIT30 := inp[29].Q;
BIT31 := inp[30].Q;
BIT32 := inp[31].Q;
 
Zuletzt bearbeitet:
Ich weiß zwar nicht wozu es dienen soll ALLE Eingänge zu entprellen, aber versuch mal in der Hardwarekonfig beim Interbus das über die Vorgabezykluszeit zu machen.
 
Als Hinweis:
Habe nun einen eigenen Thread der mit 10ms Zykluszeit läuft. Dort wird im ersten Durchlauf die Flanke überprüft und wenn im zweiten Durchlauf (also 20ms später) der Input immer noch High ist wird er weitergereicht. Andere Lösungen forderten ca. 30% CPU Last. Mit dieser Methode ~0,1% - also eigentlich nichts.
 
Zurück
Oben