Ausreisser erkennen.

McNugget

Level-1
Beiträge
220
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin allerseits.

Wie würdet Ihr es machen?

Es kommen kontinuierlich Pulse über einen digitalen Einagang in gleichem zeitlichen Abstand.

Ab und an kommt ein Puls genau dazwischen.

Wie finde ich dieses Ereignis, so dass nur bei diesem Puls mit sozusagen halber Pausenweite ein Zähler angesprochen werden kann?


Grus

McNugget
 
Hi McNugget,

z.B. so
Code:
VAR
	bInTrig: BOOL;
	flTrig: R_TRIG;
	tpCountEnable: TP;
	Counter: CTU;
END_VAR
tpCountEnable(
	IN:= flTrig.Q,
	PT:= t#900ms); (* period time - tolerance *)
flTrig(CLK:= bInTrig);
Counter(CU:= tpCountEnable.Q AND  flTrig.Q);
Gruß,
witkatz
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Könnte es passieren, dass der Zähler schon bei einem regulären Puls hochzählt. Da ja bei der Flankenerkennung einer steigenden Flanke der TP schon gestartet wird und das Signal von der Flankenerkennung auch ansteht. Eventuell müsste man den R_TRIG durch einen F_TRIG ersetzen und die Zeit dann anpassen auf die Pausendauer. Oder irre ich mich da?
 
Hallo Mobi,

der Flankentrigger wird nach dem Timer aufgerufen, also kommt der Timer erst einen Zyklus später, da ist die erste Flanke schon weg. Erst folgende Flanken triggern den Counter, solange der Timer aktiv ist. Aber du hast recht es - ist zwar kurz und tricky aber nicht selbsterklärend.
Mein nächster Lösungsansatz ist hoffentlich lesbarer und verständlicher:


Code:
VAR
    tpCountEnable1: TP;
    tonCountEnable2: TON;
    Counter: CTU;
    flTrig: R_TRIG;
END_VAR
VAR_INPUT
    bInTrig: BOOL;
    tPeriod: TIME:= t#1s;
END_VAR

flTrig(CLK:= bInTrig);
tpCountEnable1(
    IN:= flTrig.Q,
    PT:= tPeriod*2/3);
tonCountEnable2(
    IN:=  tpCountEnable1.Q,
    PT:= tPeriod/3);
Counter(
    CU:= flTrig.Q
    AND tpCountEnable1.Q
    AND tonCountEnable2.Q);
@McNugget: ist das für dich brauchbar?

Gruß
witkatz
 
Das müsste eigentlich klappen, aber es reicht doch wenn du bei dem AND, nur den Ausgang vom TON nimmst, das müsste doch reichen.

Also wird der Puls detektiert, wenn er im mittleren Drittel der Pause kommt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Witkatz: Ich werde es morgen mal in meine Steuerung spielen und schauen, ob es das tut, was ich davon erwarte.

Vielen Dank für den Code.

Der erste Code war echt tricky, aber wer kann, der kann...

Bin leider bisher noch nicht in Ruhe dazu gekommen, das zu testen..


Eine Frage noch: ist der Code fehlertolerant gegenüber Geschwindigkeitsschwankungen (wenn z. B. die Geschwindigkeit über Rampe hoch oder heruntergeregelt wird)?

Nochmals vielen lieben Dank

McNugget
 
Du meinst tolerant wenn sich die Periodendauer ändert? Ja, aber nur solange sich der Puls der unregelmäßig kommt, sich in dem vorgegebenen Zeitfenster hält.
 
Super. Das scheint so zu klappen.

Klasse.. Vielen Dank.

Ich rufe diesen Baustein nun mehrfach auf und er scheint so weit ganz sauber durchzuzählen.


Noch eine weiterführende Frage:

Ich habe zwei Signale die sich etwas zeitverzögert überlappen.

Siehe Anhang.
Pulse.jpg


Wie kann ich kontrollieren, ob die vier Stati A, B, C, D in richtiger Reihenfolge eingehen?

Im Normallfall müsste ich ja immer ABCDABCDABCD usw. erhalten,


Aber wenn z. B. Sensor S1 verschmutzt ist und daher Dauersignal gibt, müsste die Folge ja BCBCBCBCBCBCB werden.


Es kann im Prinzip ja nur folgende abweichenden Fälle geben:
S1 immer High-Signal, owohl S2 einen Puls gibt,
S1 immer Low-Signal, owohl S2 einen Puls gibt,
S2 immer High-Signal, owohl S1 einen Puls gibt,
S1 immer Low-Signal, owohl S2 einen Puls gibt,
Reihenfolge DCBA (Anlage läuft rückwärts),
dauerhaftes Low-Signal von beiden Sensoren, obwohl die Anlage (durch einen weiteren Eingang) als laufend gilt,
dauerhaftes High-Signal von beiden Sensoren, obwohl die Anlage (durch einen weiteren Eingang) als laufend gilt.



Wie könnte man die verschiedenen Fehlermöglichkeiten (also alles was von der Folge ABCD abweicht) auswerten und pro möglichem Fehler Zähler hochzählen lassen?



Gruss

McNugget
 

Anhänge

  • Pulse.jpg
    Pulse.jpg
    18,8 KB · Aufrufe: 32
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist im Prinzip ein Quadratur Encoder. Dafür gibt es in der Oscat den Baustein INC_DEC, nur ohne explizite Fehlerdiagnose. Man kann über die DIR und CNT die Richtung und Geschwindigkeit überwachen.

Gruß,
witkatz
 
Hallo Witkatz. Ich habe ihn mir angeschaut.

Wie müsste ich den modifizieren um die möglichen Fehler gemeldet zu bekommen?

Wie kann ich die Folgerichtigkeit der Phasen abfragen?

Setzt man da in den Phasen Flags, die man später wieder als String rausgibt?


Zudem hat dieser Baustein doch das Problem, dass wenn ich das Programm starte und gerade die Phasen B, C oder D anstehen, ich keinen sauberen Wert erhalte, der durch 4 teilbar wäre, oder?

Zudem wertet der Baustein Flanken aus und nicht die Zustände der beiden Eingangssignale.

In meinem Fall /bei meiner Problemstellung müsste ich doch eine Art "Schrittabfrage" haben, oder?

Bin da etwas planlos..

McNugget
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo McNugget,

INC_DEC erkennt die Richtung. Wenn die Reihenfolge der Signale umkehrt - toggelt der Ausgang DIR und man könnte einen Fehler signalisieren.

Deine komplexe Fehlererkennung läuft nach meiner Meinung auf Mustererkennung hinaus. Der Ansatz mit den Buchstaben ist nicht schlecht, aber String-Bearbeitung ist langsam. Ich würde es auf binär-Ebene lösen, ansatzweise so:
Code:
FUNCTION_BLOCK FB_EncoderWatchdog
VAR
    Status: BYTE;
    Status_1: BYTE;
    Status_Muster: BYTE;
END_VAR
VAR_INPUT
    bAnlageInRun: BOOL;
    bReset: BOOL;
    S1: BOOL;
    S2: BOOL;
END_VAR
VAR_OUTPUT
    bErr: BOOL;
END_VAR

Status.0:= S1;
Status.1:= S2;
IF Status <> Status_1 THEN
    Status_1:= Status;
    Status_Muster:= SHL(Status_Muster, 2) OR Status;
END_IF
CASE Status_Muster OF
2#01_11_10_00, 2#11_10_00_01, 2#10_00_01_11, 2#00_01_11_10:
    IF bReset THEN bErr:= FALSE; END_IF
ELSE
    IF bAnlageInRun THEN bErr:= TRUE; END_IF
END_CASE
Gruß,
witkatz
 
Hallo Witkatz.

Vielen Dank, dass Du es aufgegriffen hast. Kann es heute leider nicht mehr in die Steuerung spielen um zu testen, aber werde morgen mal sehen, was es tut.

So weit ich es jetzt sehe, gibt der code aber lediglich aus, dass ein Fehler vorliegt, nicht welcher.

Für meine Zwecke wäre es sinnvoll, für jeden Fehler einen dedizierten Boolschen Ausgang zu schalten, um
a) einen Zähler pro Fehler anzusprechen
b) genau herauszufinden beim wievielen Puls der Fehler aufgetreten ist.

Bei einem "Endlos-System" kann man auf diese Weise feststellen, ob etwas das den Puls auslöst in irgendeiner weise anders beschaffen ist.

Ich werde das morgen mal so weit testen.

Die Binär Lösung finde ich schon jetzt super, allein schon aus Performancegründen.

Schönen abend noch

McNugget
 
@Witkatz: Der Code, um Ausreisser zu erkennen läuft super!

Habe ich nun ausgiebig getestet.

Vielen Dank noch mal dafür.


Zu dem Encoder_Watchdog:

Aktuell kommen für die 4 Phasen, vier Dezimalzahlen.
Aber wie überprüfe ich den korrekten Ablauf / die korrekte Abfolge?

Und wie kann ich für jeden möglichen abweichenden Abfolgentyp einen Counter zählen lassen?

Gruss

McNugget
 
Nur mal zum Verständnis:

Du bekommst nacheinander 4 verschiedene Phasen. Und diese müssen einer genauen Reihenfolge entsprechen (z.B. Phase1 Phase4 Phase2 Phase3). Sobald aber eine andere Reihenfolge auftritt willst du einen entsprechenden boolschen Ausgang schalten?
 
Genau.

Allerdings Phase1, Phase2, Phase3, Phase4.
Dazu habe ich auf der ersten Seite dieses Threads eine Zeichung angehängt, die es erklären soll.

Ich möchte wissen, ob Sensor 1 Verschmutzt ist, oder ausgefallen.
das gleiche möchte ich zu Sensor 2 wissen.

Ausserdem möchte ich, wenn eines der möglichen Fehlerevents nur ein mal eintritt, wissen, bei dem wievielten Puls das passiert ist.

Es handelt sich dabei um eine Art Endloskette mit Mitnehmern.

Diese werden immer wieder von Null hochgezählt. Der Nullpuls ist der in diesem Thread bezeichnete "Ausreisser". Da ich diesen nun finde, kann ich die Runden hochzählen.

Nun möchte ich noch bestimmen können, welcher Sensor eine Macke hat, oder welcher Mitnehmer von den Sensoren nicht korrekt gesehen wird (z.B. durch Verschleiss, oder abgerisse, oder verbogen etc.). Dann könnte ich für den Techniker eine Meldung ausgeben: "Mitnehmer 20 fehlt, bitte kontrollieren."




Gruss

McNugget
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du beschreibst es doch schon ... dein Ablauf ist der eines Inkrementalgebers und dieser spiegelt sich in einem festen Ablauf (Schrittkette) wieder. Ich würde es also im Programm genauso abbilden : in der Schrittfolge muß nach Zustand "A" dann "B" kommen. Ist das nicht so und du erhälst irgendetwas anderes, dann ist der fehlende deine Ereignis ...

Gruß
LL
 
Hallo Larry,

leider habe ich noch nicht den Fatz einer Ahnung, wie und in welcher Sprache ich eine Schrittkette definieren kann/muss, um mein Ziel zu erreichen.

Gruss


McNugget
 
... das könnte vielleich Q & D ungefähr so aussehen :
Code:
if Schritt = 0 and S1 then
   Schritt := 1 ;
elsif Schritt = 0 and S2 then
   Fehler := 1 ;
end_if ;
 
if Schritt = 1 and S2 then
   Schritt := 2 ;
elsif Schritt = 1 and not S1 then
   Fehler := 2 ;
end_if ;
 
if Schritt = 2 and not S1 then
   Schritt := 3 ;
elsif Schritt = 2 and not S2 then
   Fehler := 3 ;
end_if ;
 
if Schritt = 3 and not S2 then
   Schritt := 0 ;
elsif Schritt = 3 and S1 then
   Fehler := 4 ;
end_if ;
... da läßt sich aber bestimmt auch noch etwas mehr draus machen ... :rolleyes:

Gruß
LL
 
Zurück
Oben