steigende/ fallende signale zählen

Beiträge
69
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
guten morgen Alle!!!

bitte könnte jemand mir sagen, was ich falsch gemacht habe...
danke im voraus für ihre beiträge.
1-ich möchte fallende flanke eines sensors S15 zählen.
2- falls die zahl der fallenden flanke von S15 kleiner 2 ist , bei fallenden flanke von einen Positioninitiator Drahterror ausgeben;
3- beim drahterror , leerlauf , werkstückt true/ false, soll Drahterror und counter zurückgesezt werden.

code im anhang
Code:
FUNCTION_BLOCK ST_station4_s
2 VAR_INPUT
3 clk_S3 : BOOL ;
4 clk_S4 : BOOL ;
5 END_VAR
6 VAR_OUTPUT
7 drahtError : BOOL ;
8 END_VAR
9 VAR
10 m : BOOL ;
11 counter : INT ;
12 m1 : BOOL ;
13 m2 : BOOL ;
14 END_VAR
15
1 IF NOT clk_S3 AND m THEN // zählen der fallenden flanken von s15
2 counter := counter + 1 ;
3 ELSIF ( NOT clk_S4 AND m1 ) AND ( counter < 2 ) THEN // wenn steigende flanke von Init. und counter kleiner 2
4 drahtError := TRUE ;
5 ELSE
6 drahtError := FALSE ;
7 END_IF
8 IF drahtError AND ( bReset AND NOT m2 ) OR Leerlauf_S3 OR NOT TranferieteS13 THEN // drahterror quittieren bei Störung oder leerlauf oder bei fehlende werkstück.
9 drahtError := FALSE ;
10 counter := 0 ;
11 END_IF
12 m := clk_S3 ;
13 m1 := clk_S4 ;
14 m2 := bReset

Anhang anzeigen Bachelor1.project.pdf
 
Zuletzt bearbeitet:
Die Variablen counter, m, m1 und m2 bleiben irgendwo gespeichert und "überleben" bis sie wieder aufgerufen werden?
Sollten sie, da es ja ein FB und kein FC ist, wenn der TE den FB aber in einer Funktion instanziert hat, dann natürlich nicht was meine nächste Idee wäre.
@TE: Wo wird der FB denn instanziert?
Du solltest Dir auch noch das Setzen und Rücksetzen von drahtError ansehen, da ist auch noch ein Fehler versteckt.
 
Welche Chance hat der counter, jemals grösser als 1 zu werden?
Ich verstehe die Logik nicht.
Eigentlich müsste er doch in einer festgelegten Zeit ungestört zählen dürfen, dann müsste ausgewertet werden, ob er einen gewissen Zählerstand erreichen konnte oder nicht.
Dann dasselbe wieder, natürlich wieder beginnend mit gelöschtem Zähler. U.s.w. ...

PS:
Ja, sollten sie, die liegen in der Instanz des FUNCTION_BLOCK
Instanz klingt mir so siemensianisch - sind wir hier denn nicht beim Thema CodeSys und IEC61131?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche Chance hat der counter, jemals grösser als 1 zu werden?
Ich verstehe die Logik nicht.
Eigentlich müsste er doch in einer festgelegten Zeit ungestört zählen dürfen, dann müsste ausgewertet werden, ob er einen gewissen Zählerstand erreichen konnte oder nicht.
Dann dasselbe wieder, natürlich beginnend mit gelöschtem Zähler. U.s.w. ...
Da kann ich Dir jetzt nicht ganz folgen, aber vielleicht sehe ich es auch nicht. Wieso kommt der Zähler nicht über 1 hinaus? Soweit die von mir schon erwähnten Variablen nicht für ein Zurücksetzen sorgen wird er doch bei jeder fallenden Flanke um 1 erhöht.
Instanz klingt mir so siemensianisch - sind wir hier denn nicht beim Thema CodeSys und IEC61131?
Vermutlich ja, aber auch da heißt es Instanz.
Instanz.PNG
 
Na klar, der counter kann grösser 1 werden. Aber hat er eine Chance > 1 zu werden, ohne vorher schon unberechtigterweise als drahtError gewertet zu werden?

Die FlankenAuswertung in der IF/ELSIF-Abfrage ist irgendwie krank. Flanken können geschlabbert werden.
In jedem Zyklus, in dem keine Flanke erkannt wird, wird drahtError auf FALSE gesetzt (drahtError bleibt also nicht bis zur Quittierung gesetzt).
Der counter wird nur bei Reset oder Leerlauf oder nicht TransferDingsBums gelöscht.
Ich frage mich, inwieweit das alles Absicht ist. Wie sieht es denn mit dem zeitlichen Ablauf von S15 und Init aus?

Wir können den Code noch lange diskutieren - ergebnislos - solange wir das DrumHerum nicht kennen ...
 
Hallo Heinileini,
schön ist sicher was anderes, zumal es fertige Flankenbausteine gibt.
Das mit dem drahtError habe ich auch schon bemerkt und in #8 schon kommentiert, da es aber wohl um eine Bachelorarbeit geht wollte ich den TE nicht so direkt darauf stoßen, sondern ihn auch etwas selber denken lassen.
Als Fehler wird der Zählerstand ja nur gewertet, wenn der Initiator-Sensor auslöst und der Zähler < 2, in wie weit das sinnvoll ist sei einmal dahingestellt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mir auffällt
- das Zählen (counter + 1) und das S/R drahtError gehört nicht in IF..ELSIF sondern in 2 unabhängige IF..THEN, weil die Bedingungen (vermutlich) gleichzeitig auftreten können.
- so wie das IF..ELSIF..ELSE formuliert ist, wird drahtError rückgesetzt (FALSE), wenn keine ausgewertete Flanke an clk_S3 und clk_S4 auftritt. Dadurch wird bReset praktisch fast nie den counter auf 0 setzen können.
- der Kommentar sagt "steigende Flanke von Init.", das Programm nimmt aber die fallende Flanke
- Warum wird von bReset die positive Flanke ermittelt? (ist oft unnötig)
- Warum setzt bReset den counter auf 0 nur wenn drahtError = TRUE ist?
- Sollte bReset nicht Vorrang vor allen anderen Signalen/Zuständen haben?
- bei dem unteren IF würde ich "vorsichtshalber" eine Klammer setzen, dann liest es sich eindeutiger:
" IF ( drahtError AND (bReset AND NOT m2) ) OR Leerlauf_S3 OR NOT TranferieteS13 THEN "
- Unschön: manche Signale werden über die FB-Schnittstelle übergeben und auf andere globale Signale wird direkt zugegriffen

Harald
 
Zurück
Oben