Ausreisser erkennen.

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

aus irgendwelchen Gründen kommt die Schrittkette nicht über die 2. Phase hinaus.

Der Code von Witkatz zeigt ja schon mal die vier Phasen an. Ich brächte jetzt ja nur noch eine Reihenfolgenüberwachung...

Bitte seht mir nach, wenn ich mich etwas "hakelig" ausdrücke. Habe das noch nie machen müssen und will lernen.. ;-)


Gruss

McNugget
 
:confused: ... ist denn sicher gestellt, dass deine Steuerung immer alle Impulse sauber mitbekommt ? Hast du mal irgend etwas über Signalzeiten geschrieben ?
Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

die High-Zeit der Pulse liegt zwischen 50 und 50 ms, die LOW-Zeit zwischen 100 und 200ms.

Der Task, in dem das bearbeitet wird, hat eine feste Zykluszeit von 5ms.

Maximal läuft der Task ca 3-4 Skeunden.

Normalerweise nur eine halbe ms.

Gruss

McNugget
 
Hallo Larry,

sorry, das sich erst jetzt antworten, die Anlage läuft nicht immer. Insofern muss ich immer warten, bis ich wieder schauen kann.

An dem Baustein sind die Fehler 1, 2 und 3 aktiv.

Wenn ich in den Baustein schaue, kann ich die Phasen von 0-3 erkennen.



Gruss

McNugget
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das heißt dann für mich, dass deine Signalfolge wohl anscheinend nicht immer so ist, wie du es in dem Diagramm dargestellt hast.
In "meiner Schrittkette" frage ich für den Fehler ja immer das übernächste folgende Ereignis als Fehler-Bedingung ab. Im Augenblick weiß ich jetzt nicht so recht, wie ich dir da weiterhelfen kann ...

Gruß
LL
 
Hmm.. Ich wunere mich nur, dass die alte Steuerung das kann.

Was haben die da bloss reinprogrammiert. Die kochen doch auch nur mit Wasser...

Zu Illustration habe ich mal einen Trace von vier verschiedenen Sensorbrücken reingesetzt.

Zwei Signale sind immer eine Messbrücke.

Die ersten beiden Signale sind noch die besten, da habe ich die Lichtschranken bereits optimiert.



Gruss

McNugget
 

Anhänge

  • Anlage.pdf
    23,4 KB · Aufrufe: 12
:confused: ... ich kann dir nicht so ganz folgen ... aber was ist denn mit Brücke 4 (Spur 7 + 8 ) - da fehlt doch schon mal einer ... und bei Brücke 3 (Spur 5 + 6) - die ist doch auch nicht wirklich Klasse ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau.

Das hast Du richtig erkannt.#

Ich habe bisher nur auf Sensorbrücke 1 (also Spur 1 und 2) getestet.

Es geht genau darum, die anderen Spuren so zu detektieren, dass ich genau die Aussagen treffen kann, wie Du sie mit dem Auge treffen konntest.

Ich möchte, dass die Steuerung mir etwas über die Qualität der Sensoren und der Signale gibt.

Anhand des Traces kann ich sehen, was mit den Sensoren los ist, aber ich kann ja nicht jedem User das komplette Codesys auf den Rechner installieren.

Für so etwas muss ich doch Warnungen und Meldungen generieren können.

Im Prinzip ist es immer so, dass die eine Spur (z.B. 2) die andere (z.B. 1) verifiziert.

Das alte System (das ich ablösen möchte) gibt bereits zu der vierten und dritten Brücke Meldungen aus. Und eben das möchte ich auch können.

Da die alte Steuerung noch läuft (aber wer weiss noch wie lange?), möchte ich die Funktionen so lange nachbilden, bis beide Steuerungen in etwa das gleiche tun, und dann möchte ich umstellen.

Angeblich ist es so gebaut, da die Anlage beim Stop noch mal etwas zurückdrehen könnte. So etwas habe ich ehrlich gesagt, in Jahren noch nie gesehen.

Zusätzlich ist auch noch eine Lochscheibe montiert, die zwischen zwei Pulsen einer Spur exakt 10 Pulse über einen Sensor geben soll.


Gruss

McNugget
 
Zuletzt bearbeitet:
@Larry: Hmmm, Nun habe ich Dich vollends "konfusioniert", wie??
:ROFLMAO:

Welche Ansätze gäbe es denn noch, mein Problem anzugehen?



Gruss

McNugget
 
"konfusiert ..." ?
Nein ... ich wußte nur auf deinen letzten Beitrag nichts sinnvolles zu erwidern. Ein weiterer (als der schon dargestellte) Ansatz fällt mir nicht ein. Möglicherweise möchtest du das Ganze ja etwas erweitern / modifizieren - also die Schrittkette läuft weiter und zählt nur die Fehler. Wie wäre das ...?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry, vielen Dank, dass Du noch mal antwortest.


Genau das wäre gut, weil dem alten System ähnlich.

Jetzt, wo Du so fragst, muss ich auch zugeben, dass ich Dich falsch verstanden habe.

Die Schrittkette soll im Prinzip nie stoppen, so lange die Anlage läuft, sondern bei Fehler einfach wieder im richtigen Moment einspringen.

Es muss fehlertolerant sein, da es ja im besten Falle als "Frühwarnsystem laufen soll.

Im alten System laufen vier Zähler pro Messbrücke.

Wenn dazu noch eine Info abgelegt wird, bei welchen Mitnehmernummern Fehler aufgetreten sind, lässt sich auch z. B. eine Häufung bei einem bestimmten Mitnehmer feststellen, so dass auch dieser als defekt festgestellt werden kann.

Wie könnte man diese Anforderungen un abdecken?

Gruss

McNugget
 
Zuletzt bearbeitet:
Hallo McNugget,

hast du meinen Ansatz mit Mustererkennung nicht weiterverfolgt?
Hier ein verfeinerter Algorithmus:
Code:
FUNCTION_BLOCK FB_EncoderWatchdog
VAR
    State: BYTE;
    State_1: BYTE;
    State_Pattern: BYTE;
    State_Pattern_ROL: BYTE;
    loop: INT;
    tonSignalsLow: TON;
    tonSignalsHigh: TON;
    tonTimeOut: TON;
END_VAR
VAR_INPUT
    bMachineInRun: BOOL;
    S1: BOOL;
    S2: BOOL;
END_VAR
VAR_OUTPUT
    bDirR: BOOL;
    bDirL: BOOL;
    bErrS1High: BOOL;
    bErrS1Low: BOOL;
    bErrS2High: BOOL;
    bErrS2Low: BOOL;
    bErrSignalsLow: BOOL;
    bErrSignalsHigh: BOOL;
    bErrTimeOut: BOOL;
    bPhaseError: BOOL;
END_VAR
VAR CONSTANT
    Pattern_DirR: BYTE:= 2#01_11_10_00;
    Pattern_DirL: BYTE:= 2#10_11_01_00;
    Pattern_ErrS1High: BYTE:= 2#01_11_01_11;
    Pattern_ErrS1Low: BYTE:= 2#10_00_10_00;
    Pattern_ErrS2High: BYTE:= 2#11_10_11_10;
    Pattern_ErrS2Low: BYTE:= 2#01_00_01_00;
END_VAR

State:= 0;
State.0:= S1;
State.1:= S2;
IF State <> State_1 THEN
    State_1:= State;
    State_Pattern:= SHL(State_Pattern, 2) OR State;
    tonTimeOut(IN:= FALSE);
END_IF
tonSignalsLow(IN:= bMachineInRun AND S1=FALSE AND S2=FALSE, PT:= t#1s, Q=> bErrSignalsLow);
tonSignalsHigh(IN:= bMachineInRun AND S1=TRUE AND S2=TRUE, PT:= t#1s, Q=> bErrSignalsHigh);
tonTimeOut(IN:= bMachineInRun, PT:= t#1s, Q=> bErrTimeOut);

bDirR:= FALSE; bDirL:= FALSE;bErrS1High:= FALSE;bErrS1Low:= FALSE;
bErrS2High:= FALSE;bErrS2Low:= FALSE;bPhaseError:= FALSE;
FOR loop:= 0 TO 6 BY 2 DO
    State_Pattern_ROL:= ROL(State_Pattern, loop);
    IF State_Pattern_ROL = Pattern_DirR THEN (*clockwise rotation*)
        bDirR:= bMachineInRun;
    ELSIF State_Pattern_ROL = Pattern_DirL THEN (*counterclockwise rotation*)
        bDirL:= bMachineInRun;
    ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS1High AND 2#00111111)
        OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS1High AND 2#11111100)
    THEN
        bErrS1High:= bMachineInRun;
    ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS1Low AND 2#00111111)
        OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS1Low AND 2#11111100)
    THEN
        bErrS1Low:= bMachineInRun;
    ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS2High AND 2#00111111)
        OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS2High AND 2#11111100)
    THEN
        bErrS2High:= bMachineInRun;
    ELSIF (State_Pattern_ROL AND 2#00111111) = (Pattern_ErrS2Low AND 2#00111111)
        OR (State_Pattern_ROL AND 2#11111100) = (Pattern_ErrS2Low AND 2#11111100)
    THEN
        bErrS2Low:= bMachineInRun;
    END_IF
END_FOR
IF NOT bDirR AND NOT bDirL AND NOT bErrS1High AND NOT bErrS1Low AND NOT bErrS2High AND NOT bErrS2Low THEN
    bPhaseError:= bMachineInRun;
END_IF
Wie gefällt dir das?

Gruß,
witkatz
 
Wenn dazu noch eine Info abgelegt wird, bei welchen Mitnehmernummern Fehler aufgetreten sind, lässt sich auch z. B. eine Häufung bei einem bestimmten Mitnehmer feststellen, so dass auch dieser als defekt festgestellt werden kann.

Wie könnte man diese Anforderungen un abdecken?

Vielleicht dann in etwa so :
Code:
if Schritt = 0 and S1 then
   Schritt := 1 ;
elsif Schritt = 0 and S2 then
   Fehler_1 := Fehler_1 + 1 ;
   Schritt := 1 ;
end_if ;
 
if Schritt = 1 and S2 then
   Schritt := 2 ;
elsif Schritt = 1 and not S1 then
   Fehler_2 := Fehler_2 + 1 ;
   Schritt := 2 ;
end_if ;
 
if Schritt = 2 and not S1 then
   Schritt := 3 ;
elsif Schritt = 2 and not S2 then
   Fehler_3 := Fehler_3 + 1 ;
   Schritt := 3 ;
end_if ;
 
if Schritt = 3 and not S2 then
   Schritt := 0 ;
elsif Schritt = 3 and S1 then
   Fehler_4 := Fehler_4 + 1 ;
   Schritt := 0 ;
end_if ;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Puh.

Gleich zwei aufwendige Codeansätze in 5 Minuten. Bin platt..

Ich muss das erst mal testen. (bin echt baff....)

Tausend Dank.

Das ist soo cool.

Ich wäre echt froh, wenn ich mal Euch mal mit irgend was helfen könnte.
 
So, einige Tage sind vergangen, ich hatte ein wenig Zeit zu testen und da ich morgen in Urlaub fahre, möchte ich zumindest noch ein paar Rückmeldungen verteilen.

Letztendlich habe ich den Code von Witkatz verwendet, da er sehr schöne Diagnose- und Erweiterungsmöglichkeiten für mich bietet.

@Larry: Vielen Dank für den Code und die Mühen. Ich hoffe, ich schaffe es mal irgendwann zu einem Forentreffen zum persönlich Danke sagen. (auch für die anderen Threads in denen Du antwortest.) Dein Code ist für mich zum Erlernen von ST sehr wertvoll. Da kann ich jetzt immer mal wieder nachschlagen, wie man es machen könnte (speziell die Zähler).

@Witkatz: Vielen Dank für den extrem ausgefeilten Code. Ich verstehe zwar bei weitem noch nicht alles, was Du dort mit den Bitpatterns machst, aber es funzt! Ich habe den Code mal um einige Zähler erweitert, um meine Bedingungen besser zu erfüllen.



Nun gibt es noch weitere Fragen (wahrscheinlich kann ich die Antworten darauf aber wegen meines Urlaubs erst Mitte nächster Woche umsetzen):

Wie kann ich Signalspitzen kleiner 15 ms rausfiltern?



Ich habe versucht, den Code von Witkatz aus Antwort #4 in diesem Thread in den Encoder-Code zu integrieren, da die beiden Bausteine ja mit den gleichen EIngangssignalen arbeiten. Leider mit mässigem Erfolg.

Der Mitnehmerzähler läuft nicht mehr komplett hoch sondern resettet sich immer wieder zwischendurch.

Wie müsste der Code erweitert werden, um auch die in Beitrag #4 gelösten Bedingungen zu erfüllen?

Sollte ich heute oder Morgen vormittag nichts lesen, kann ich erst nach meinem Urlaub (Mitte nächster Woche) testen und reagieren. Also bitte keinen Stress.. ;-)

Zur Demonstration (der kläglichen Versuche) habe ich mal als Textdateien den Code angefügt, der gut läuft, und den, der mistig ist.

Sollten wir uns nicht mehr lesen wünsche ich Euch Mentoren einen schönen Urlaub von mir.. ;-)
 

Anhänge

  • FB_ENCoder_Defekt.txt
    4,4 KB · Aufrufe: 6
  • FB_ENCoder_laeuft.txt
    3,9 KB · Aufrufe: 7
Zuletzt bearbeitet:
^Hallo,
egal, wann du es liest ... ob ich nächste Woche noch daran denke hier etwas zu schreiben will ich mal dahin gestellt sein lassen ... :rolleyes:
Also gleich erledigen ...

Wenn du deine Signal-Eingänge entsprellen willst, so geht das mit TON's (du hast so welche schon eingesetzt). Diese legst du von der Ansprechzeit auf den von dir gewünschten Wert (also >= 15 ms) und du wertest dann nicht mehr die Eingänge direkt aus sondern die Ausgänge der TON's.

Zu der Code-Kombination halte ich mich mal heraus (mir ist der Ciode für die Aufgabe ein bißchen zu kompliziert). Da wird dir aber Witkatz sicherlich weiter helfen.

Also dann ...
Gruß
LL
 
Hallo Witkatz,

bin gerade seit 6 Stunden vom Ski fahren zurück... War COOL! :cool:

Nein, der reset wird nicht von aussen betätigt. Diesen nutze ich nur, um per Hand ans der Visu die Counter resetten zu können.

Irgend eine Bedingung wird im "erweiterten" Code nicht sauber umgesetzt, und so kommt es zu "ausserplanmässigen" Resets.
 
Zurück
Oben