0 AND uiToolPocket < 51 THEN dwTargetPosition := DINT_TO_DWORD(3672000 - ((uiToolPocket - 1) * 72000)); ELSE dwTargetPosition := 0; END_IF // Führung durch PLC wSTW1.10 := 1; // Absolute positionierung wMDI_MOD.0 := 1; // Positionierung absolut kürzester Weg wMDI_MOD.1 := 0; // Start bei steigender Flanke rtStart(CLK := bExecute); // Reset rtReset(CLK := bReset); // Error trigger ftError(CLK := wZSW1.3); // Fehlerzustand weitergeben bError := wZSW1.3; // Fehlerzustand IF (wZSW1.3 = 1) AND (nState < 99) THEN nErrorState := nState; nState := 99; END_IF // Reset der Achse tofReset(IN := bReset, PT := T#250MS); wSTW1.7 := tofReset.Q; CASE nState OF 0: // Idle -> Einschalten wStW1.0 := 0; // Ein wStW1.1 := 0; // Nicht Austrudel wStW1.2 := 0; // Kein Schnellhalt wStW1.3 := 0; // Betrieb freigeben wSTW1.4 := 0; // EPOS nicht Verwerfen wSTW1.5 := 0; // EPOS kein Zwischenhalt wSTW1.6 := 0; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 0; // MDI aktivieren IF rtStart.Q AND bInfeedEnabled THEN bDone := FALSE; IF dwTargetPosition <> dwCurrentPosition THEN nState := 10; ELSE nState := 70; END_IF END_IF 10: // Warten auf Einschaltbereit -> Betriebsbereit wStW1.0 := 0; // Ein wStW1.1 := 1; // Nicht Austrudel wStW1.2 := 1; // Kein Schnellhalt wStW1.3 := 1; // Betrieb freigeben wSTW1.4 := 1; // EPOS nicht Verwerfen wSTW1.5 := 0; // EPOS kein Zwischenhalt wSTW1.6 := 0; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 0; // MDI aktivieren IF wZSW1.0 THEN // Einschaltbereit nState := 20; END_IF 20: // Warten auf Betriebsbereit wStW1.0 := 1; // Ein wStW1.1 := 1; // Nicht Austrudel wStW1.2 := 1; // Kein Schnellhalt wStW1.3 := 1; // Betrieb freigeben wSTW1.4 := 1; // EPOS nicht Verwerfen wSTW1.5 := 0; // EPOS kein Zwischenhalt wSTW1.6 := 0; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 0; // MDI aktivieren IF wZSW1.1 THEN // Betriebsbereit nState := 30; END_IF 30: // Betriebsbereit -> Bewegungsparameter setzen wStW1.0 := 1; // Ein wStW1.1 := 1; // Nicht Austrudel wStW1.2 := 1; // Kein Schnellhalt wStW1.3 := 1; // Betrieb freigeben wSTW1.4 := 1; // EPOS nicht Verwerfen wSTW1.5 := 1; // EPOS kein Zwischenhalt wSTW1.6 := 0; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 1; // MDI aktivieren // Beschleunigungsausgabe uiMDI_ACC := 16384; uiMDI_DEC := 16384; // Positionsausgabe in zwei udint uiMDI_TARPOS := DWORD_TO_UINT(SHR(dwTargetPosition, 16)); uiMDI_TARPOS2 := DWORD_TO_UINT(dwTargetPosition); // Geschwindigkeitsausgabe uiMDI_VELOCITY := DWORD_TO_UINT(SHR(dwTargetSpeed, 16)); uiMDI_VELOCITY2 := DWORD_TO_UINT(dwTargetSpeed); IF wAKTSATZ.15 THEN // MDI aktiviert nState := 40; END_IF 40: // Warten auf Fahrauftrag quittierung wStW1.0 := 1; // Ein wStW1.1 := 1; // Nicht Austrudel wStW1.2 := 1; // Kein Schnellhalt wStW1.3 := 1; // Betrieb freigeben wSTW1.4 := 1; // EPOS nicht Verwerfen wSTW1.5 := 1; // EPOS kein Zwischenhalt wSTW1.6 := 1; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 1; // MDI aktivieren // Workaraound für kurze Fahrwege (optimierungsbedarf) tonWaitAktive(In := TRUE, PT := T#1S); IF wZSW1.12 AND (NOT wZSW1.10) THEN // Verfahrauftrag aktiv tonWaitAktive(In := FALSE); nState := 45; END_IF // Workaraound siehe oben IF wZSW1.12 AND tonWaitAktive.Q AND (ABS(dwCurrentPosition - dwTargetPosition) < 10) THEN tonWaitAktive(In := FALSE); nState := 45; END_IF 45: // Warten auf in position IF wZSW1.10 THEN nState := 50; END_IF 50: // MDI abschalten wStW1.0 := 1; // Ein wStW1.1 := 1; // Nicht Austrudel wStW1.2 := 1; // Kein Schnellhalt wStW1.3 := 1; // Betrieb freigeben wSTW1.4 := 0; // EPOS nicht Verwerfen wSTW1.5 := 0; // EPOS kein Zwischenhalt wSTW1.6 := 0; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 0; // MDI aktivieren IF NOT wAKTSATZ.10 THEN nState := 60; END_IF 60: // Ausschalten wStW1.0 := 0; // Ein wStW1.1 := 1; // Nicht Austrudel wStW1.2 := 1; // Kein Schnellhalt wStW1.3 := 1; // Betrieb freigeben wSTW1.4 := 0; // EPOS nicht Verwerfen wSTW1.5 := 0; // EPOS kein Zwischenhalt wSTW1.6 := 0; // EPOS Verfahrauftrag aktivieren 0 -> 1 wSATZANW.15 := 0; // MDI aktivieren IF NOT wZSW1.1 THEN nState := 0; bDone := TRUE; END_IF 70: // Stehen schon an der Position, nichts machen bDone := TRUE; nState := 0; 99: // Fehler bError := TRUE; IF ftError.Q OR (wZSW1.3 = 0) THEN nState := 0; END_IF END_CASE // Ausgabe uiSTW1 := WORD_TO_UINT(wStw1); uiSATZANW := WORD_TO_UINT(wSATZANW); uiSTW2 := WORD_TO_UINT(wStw2); uiMDI_MOD := WORD_TO_UINT(wMDI_MOD);]]>