-> Hier kostenlos registrieren
Guten Morgen allerseits.
Zu dem bereits gelösten Problemchen habe ich nun noch eine Erweiterung.
Man muss sich das System, das ich hier umzusetzen versuche, als Endlosförderband vorstellen.
In regelmässigen Abständen sind Mitnehmer, die detektiert werden.
An einer Stelle ist ein zusätzlicher Mitnehmer auf halbem Abstand der anderen Mitnehmer.
Sobald dieser Mitnehmer kommt, soll der Mitnehmerzähler auf Null gesetzt werden, und die Zählung soll erneut beginnen.
Zudem soll der Rundenzähler um 1 erhöht werden.
Ich habe es jetzt so gemacht, dass ich eine prozentuale Zeitabweichung zwischen den Mitnehmersignalen definiere und dies Abfrage, aber das funktionier nicht, weil das System immer die aktuelle Passe heranzieht.
Wahrscheinlich wäre ein Array besser, um Schwankungen besser "schlucken" zu können. (Also Array-Mittelwert)
Stehe leider noch mit Arrays auf Kriegsfuss.
Wichtig ist vielleicht auch noch zu wissen, dass die Anlage per Frequenzumrichter stufenlos in der Geschwindigkeit verstellt werden kann. Daher sollte es eben bei diesen timings eine gewisse Abweichungstoleranz geben.
Ich habe den vorhandenen Code mal folgendermassen angepasst:
Deklaration:
Weitere Problemstellungen wären eine Warnung, wenn mal ein Mitnehmer fehlt bzw. nicht gesehen wird und eine Warnung bei schwankender Geschwindigkeit.
Ach ja: Nein, dies ist keine Aufgabe für die Schule. ;-)
Ich möchte nur lernen/umsetzen.
Gruss
McNugget
Zu dem bereits gelösten Problemchen habe ich nun noch eine Erweiterung.
Man muss sich das System, das ich hier umzusetzen versuche, als Endlosförderband vorstellen.
In regelmässigen Abständen sind Mitnehmer, die detektiert werden.
An einer Stelle ist ein zusätzlicher Mitnehmer auf halbem Abstand der anderen Mitnehmer.
Sobald dieser Mitnehmer kommt, soll der Mitnehmerzähler auf Null gesetzt werden, und die Zählung soll erneut beginnen.
Zudem soll der Rundenzähler um 1 erhöht werden.
Ich habe es jetzt so gemacht, dass ich eine prozentuale Zeitabweichung zwischen den Mitnehmersignalen definiere und dies Abfrage, aber das funktionier nicht, weil das System immer die aktuelle Passe heranzieht.
Wahrscheinlich wäre ein Array besser, um Schwankungen besser "schlucken" zu können. (Also Array-Mittelwert)
Stehe leider noch mit Arrays auf Kriegsfuss.
Wichtig ist vielleicht auch noch zu wissen, dass die Anlage per Frequenzumrichter stufenlos in der Geschwindigkeit verstellt werden kann. Daher sollte es eben bei diesen timings eine gewisse Abweichungstoleranz geben.
Ich habe den vorhandenen Code mal folgendermassen angepasst:
Deklaration:
Anweisungsteil:FUNCTION_BLOCK FB_Impulsabstand
VAR_INPUT
bImpuls: BOOL;
Abweichung:INT;
rst:BOOL;
END_VAR
VAR_OUTPUT
iImpulsTime: INT;
Index_rst:BOOL;
Abw: INT;
Abdiff: INT;
RundenINT;
END_VAR
VAR
fbR_Trig: R_TRIG;
iImpulszaehler: INT;
iLowTimeNew, ILowTimeOld: UDINT;
iImpulsTimea: UDINT;
iImpulsTimeb: UDINT;
X: INT;
Rd_Zaehler:CTU;
END_VAR
Wie mache ich es besser/optimal die Runden korrekt zu zählen?fbR_TRIG(CLK:=bImpuls , Q=>);
Index_rst :=FALSE;
IF fbR_TRIG.Q THEN
iLowTimeNew:= TIME_TO_UDINT (TIME( )) ;
iImpulsTime := UDINT_TO_INT (iLowTimeNew - iLowTimeOld);
iLowTimeOld := ILowTimeNew;
END_IF
X := ((iImpulsTime/100)*Abweichung);
Abw:=(iImpulsTime-X);
Abdiff:=iImpulsTime-abw;
IF iImpulsTime<abdiff
THEN Index_rst :=TRUE;
END_IF
RD_ZAEHLER(CU:=Index_rst , Reset:=rst, cv=>Runden);
Weitere Problemstellungen wären eine Warnung, wenn mal ein Mitnehmer fehlt bzw. nicht gesehen wird und eine Warnung bei schwankender Geschwindigkeit.
Ach ja: Nein, dies ist keine Aufgabe für die Schule. ;-)
Ich möchte nur lernen/umsetzen.
Gruss
McNugget