-> Hier kostenlos registrieren
Mal zum Verständnis des Codes:
In Zeile 5 z.B.: oVereinzelung2(bewegung := 1);
d.h. er steuert dann den Ausgang oVereinzelung1(A11.0) an und in Zeile 17
oVereinzelung2(bewegung := 0); schaltet den A11.0 ab
richtig?
Code:
DATA_BLOCK DB32 FB32BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK FB32
TITLE='Ablauf Einschub'
VAR
bTeilEinschubGesehen:BOOL;
END_VAR
// Überwachung Teileeinschub
IF oLinearschiene_eFrei = false THEN
bTeilEinschubGesehen := true;
END_IF;
// Schrittkette
CASE BYTE_TO_INT(a1c_step) OF
1: // Warten auf Start
IF (a1c_sync = 0) THEN
sm_wsb := false;
END_IF;
2: // Prüfen ob Nest leer ist
IF oLinearschiene_eFrei = false THEN
IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
;
ELSE
sf_fehler(Fehlernummer := 1327, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));
END_IF;
sc_nextstep := a1c_step;
ELSIF oEinschub_eTeil_InHalter = true AND oDebug_BrueckenTeilInHal = false THEN
IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
;
ELSE
sf_fehler(Fehlernummer := 1324, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));
END_IF;
sc_nextstep := a1c_step;
ELSIF oDebug_BrueckenTeilInHal = true THEN
sf_fehler(Fehlernummer := 1326, Fehlerart := sk_hinweis, Diagnosenummer := BYTE_TO_INT(a1c_step));
END_IF;
bTeilEinschubGesehen := false; // Vorbereitung um Teileeinschub zu sehen
3:
sf_wait(wait_time := T#30000ms);
IF xa0_run.bLeerfahrtRundtischAktiv = true then
a1c_sync := 0;
sc_nextstep := 1;
ELSIF sc_Funktionsprogramm_nr = 1 THEN // Geistermodus
IF oZufuehrung_eTeilBereit = true THEN
sf_fehler(Fehlernummer := 1322, Fehlerart := sk_Hinweis, Diagnosenummer := BYTE_TO_INT(a1c_step));
ELSE
sm_wsb := true;
END_IF;
elsIF oZufuehrung_eTeilBereit = true THEN
sm_wsb := true;
ELSIF sm_wsb = true AND xa0_run.bLeerfahrtLinearAktiv = true THEN
xa0_run.bLeerfahrtRundtischAktiv := true;
a1c_sync := 0;
sc_nextstep := 1;
elsIF sm_wsb = true then
sf_fehler(Fehlernummer := 1320, Fehlerart := sk_Hinweis, Diagnosenummer := BYTE_TO_INT(a1c_step));
sm_wsb := false;
END_IF;
4:
oVereinzelung1(bewegung := 1);
5:
oVereinzelung2(bewegung := 1);
6:
sf_wait(wait_time := T#10000ms);
IF sc_Funktionsprogramm_nr = 1 THEN // Geistermodus
sm_wsb := true;
elsIF oZufuehrung_eTeilBereit = false THEN
sm_wsb := true;
elsIF sm_wsb = true then
sf_fehler(Fehlernummer := 1321, Fehlerart := sk_Hinweis, Diagnosenummer := BYTE_TO_INT(a1c_step));
sm_wsb := false;
END_IF;
7: ;
8:
oTeilemitnehmer(bewegung := 1);
9:
oEinschubachse(bewegung := 1);
10: // Klaus "Warten bis Endlage wirklich erreicht"
sf_wait(wait_time := T#1000ms);
11: // Gegenprüfung Sensor Spalt Linearschiene Rundschalttisch
IF bTeilEinschubGesehen = false THEN
IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
;
ELSE
sf_fehler(Fehlernummer := 1323, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));
END_IF;
sc_nextstep := a1c_step;
END_IF;
12:
xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bVorhanden := true;
xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bGebohrt := false;
xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bAbgeblasen := false;
xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bGemessen := false;
xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bBewertungGO := false;
13: // TWE@20160128 - Versuch von Nils Teilmitnehmer während Bewegung Einschubachse nach oben zu fahren.
// oEinschub_aGS := true;
// oEinschub_aAS := false;
// sf_wait(wait_time := DINT_TO_TIME(XXD_ALLG_DATEN.iVerzoegerungTeilemitneh));
// TWE@20160330 - Neuer Versuch von Nils mit Ventil "Mittelstellung entlüftet" für Einschubachse
oEinschub_aGS := false;
oEinschub_aAS := false;
sf_wait(wait_time := T#1000ms);
14:
oTeilemitnehmer(bewegung := 0);
15:
oEinschubachse(bewegung := 0);
16:
oVereinzelung1(bewegung := 0);
17:
oVereinzelung2(bewegung := 0);
18: // Prüfen ob Nest belegt ist
IF sc_Funktionsprogramm_nr = 0 AND oEinschub_eTeil_InHalter = false AND oDebug_BrueckenTeilInHal = false THEN
IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
;
ELSE
sf_fehler(Fehlernummer := 1325, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));
END_IF;
sc_nextstep := a1c_step;
END_IF;
19:
a1c_sync := 0;
sc_nextstep := 1;
ELSE:
sf_fehler(Fehlernummer := 10, Fehlerart := sk_Warnung, Diagnosenummer := BYTE_TO_INT(a1c_step));
sc_nextstep := a1c_step;
END_CASE;
END_FUNCTION_BLOCK
d.h. er steuert dann den Ausgang oVereinzelung1(A11.0) an und in Zeile 17
oVereinzelung2(bewegung := 0); schaltet den A11.0 ab
richtig?