Hallo,
ich habe einen Fehler im Baustein ACTUATOR_3P in der Version OSCAT Building 100 gefunden. Er tritt auf, wenn ein Endlagenschalter verwendet wird (SWITCH_AVAILABLE = TRUE), die automatische Diagnose erlaubt ist (ARE = TRUE und T_DIAG > T#0s) und T_EXT nicht parametriert ist (kleiner Wert gegenüber T_RUN).
Beim erstmaligen Aufrufen des Funktionsbausteins wird die Diagnose durchgeführt. Bei STATUS = 103 wird, sobald der Endlagenschalter meldet (END_POS = TRUE), der STATUS auf 104 erhöht ohne die Variable start auf tx zu setzen. Dies führt dazu das diese erste IF-Schleife von CASE 104 nicht abgearbeitet wird:
IF tx - start < T_ext THEN
OUT1 := FALSE;
OUT2 := TRUE;
ramp.IN := 0;
next_diag := tx + T_DIAG;
somit wird die Laufrichtung nicht umgeschaltet und die Variable next_diag bleibt umgesetzt auf T#0s. Dadurch bleibt die Meldung des Endlagenschalters (END_POS = TRUE) erhalten und es wird direkt auf STATUS = 100 umgeschaltet. Da aber next_diag = T#0s ist wird sofort die auto diagnose aufgerufen:
(* check for auto diagnostics *)
IF T_DIAG > T#0s AND tx > next_diag AND ARE AND NOT ARX THEN
status := 103;
start := tx;
ARX := TRUE;
und somit wieder direkt auf STATUS 103 umgeschaltet. Dort beginnt das Spiel von neuem, wenn die Zeit T_EXT abgelaufen ist (Standard T#10s).
Um den Fehler zu beheben müsst meiner Meinung nach der Code wie folgt verändert werden:
103: (* diagnostics up*)
(* run up for T_ext *)
IF tx - start < T_EXT THEN
ERROR := FALSE;
ramp.TR := T_RUN;
ramp.TF := T_RUN;
OUT1 := TRUE;
OUT2 := FALSE;
ramp.IN := 255;
ELSIF SWITCH_AVAIL AND END_POS THEN
ramp.TR := tx - start;
STATUS := 104;
start := tx; (* DIESE ZEILE NEU EINGEFÜGT! *)
ELSIF tx - start > T_EXT + T_RUN THEN
ERROR := SWITCH_AVAIL;
STATUS := 104;
start := tx;
END_IF;
MfG
Richardt