Files
Adeco_20220119-01/TC3_CNCPLCBase/OEM/FB_WZWKette.TcPOU
Matthias Heisig 51d6e7e5c4 Initial commit
2024-10-22 14:22:54 +02:00

399 lines
11 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.6">
<POU Name="FB_WZWKette" Id="{de78c7b1-582b-4c7b-bb52-35e58f49ffdc}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_WZWKette
VAR_INPUT
bExecute : BOOL;
bReset : BOOL;
uiToolPocket : DINT := 1;
bInfeedEnabled : BOOL;
uiMaxToolPockets : UINT := 51;
END_VAR
VAR_OUTPUT
bDone : BOOL;
bError : BOOL;
nErrorId : INT;
END_VAR
VAR
uiZSW1 AT %I* : UINT;
uiAKTSATZ AT %I* : UINT;
uiZSW2 AT %I* : UINT;
uiX_IST AT %I* : UINT;
uiX_IST2 AT %I* : UINT;
uiSTW1 AT %Q* : UINT;
uiSATZANW AT %Q* : UINT;
uiSTW2 AT %Q* : UINT;
uiMDI_TARPOS AT %Q* : UINT;
uiMDI_TARPOS2 AT %Q* : UINT;
uiMDI_VELOCITY AT %Q* : UINT;
uiMDI_VELOCITY2 AT %Q* : UINT;
uiMDI_ACC AT %Q* : UINT;
uiMDI_DEC AT %Q* : UINT;
uiMDI_MOD AT %Q* : UINT;
rtStart : R_TRIG;
rtReset : R_TRIG;
ftError : F_TRIG;
nState : INT := 0;
nErrorState : INT := -1;
dwTargetPosition : DWORD;
dwCurrentPosition : DWORD;
dwTargetSpeed : DWORD := 17260; // MAX 17260
wTargetPositionLow : WORD;
wTargetPositionHigh : WORD;
wZSW1 : WORD;
wSATZANW : WORD;
wZSW2 : WORD;
wSTW1 : WORD;
wAKTSATZ : WORD;
wSTW2 : WORD;
wMDI_MOD : WORD;
tofReset : TOF;
tonWaitAktive : TON;
bTest : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// VERSION FÜR EPOS
// Einlesen
wZSW1 := UINT_TO_WORD(uiZSW1);
wAKTSATZ := UINT_TO_WORD(uiAKTSATZ);
wZSW2 := UINT_TO_WORD(uiZSW2);
dwCurrentPosition := UINT_TO_DWORD(uiX_IST);
dwCurrentPosition := SHL(dwCurrentPosition, 16) + UINT_TO_DWORD(uiX_IST2);
IF uiToolPocket > 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);]]></ST>
</Implementation>
<LineIds Name="FB_WZWKette">
<LineId Id="162" Count="0" />
<LineId Id="181" Count="0" />
<LineId Id="184" Count="0" />
<LineId Id="490" Count="0" />
<LineId Id="182" Count="0" />
<LineId Id="580" Count="0" />
<LineId Id="579" Count="0" />
<LineId Id="581" Count="0" />
<LineId Id="585" Count="0" />
<LineId Id="584" Count="0" />
<LineId Id="583" Count="0" />
<LineId Id="586" Count="2" />
<LineId Id="276" Count="0" />
<LineId Id="183" Count="0" />
<LineId Id="163" Count="0" />
<LineId Id="280" Count="0" />
<LineId Id="279" Count="0" />
<LineId Id="281" Count="0" />
<LineId Id="283" Count="0" />
<LineId Id="282" Count="0" />
<LineId Id="284" Count="0" />
<LineId Id="382" Count="0" />
<LineId Id="381" Count="0" />
<LineId Id="380" Count="0" />
<LineId Id="525" Count="0" />
<LineId Id="524" Count="0" />
<LineId Id="526" Count="0" />
<LineId Id="540" Count="0" />
<LineId Id="539" Count="0" />
<LineId Id="544" Count="0" />
<LineId Id="678" Count="0" />
<LineId Id="677" Count="0" />
<LineId Id="679" Count="0" />
<LineId Id="511" Count="0" />
<LineId Id="510" Count="0" />
<LineId Id="512" Count="0" />
<LineId Id="530" Count="0" />
<LineId Id="527" Count="1" />
<LineId Id="805" Count="0" />
<LineId Id="742" Count="0" />
<LineId Id="741" Count="0" />
<LineId Id="743" Count="0" />
<LineId Id="373" Count="0" />
<LineId Id="372" Count="0" />
<LineId Id="374" Count="0" />
<LineId Id="386" Count="3" />
<LineId Id="385" Count="0" />
<LineId Id="446" Count="0" />
<LineId Id="407" Count="0" />
<LineId Id="465" Count="1" />
<LineId Id="390" Count="0" />
<LineId Id="379" Count="0" />
<LineId Id="674" Count="0" />
<LineId Id="865" Count="0" />
<LineId Id="383" Count="0" />
<LineId Id="866" Count="2" />
<LineId Id="384" Count="0" />
<LineId Id="391" Count="0" />
<LineId Id="376" Count="0" />
<LineId Id="471" Count="0" />
<LineId Id="393" Count="2" />
<LineId Id="392" Count="0" />
<LineId Id="447" Count="0" />
<LineId Id="408" Count="0" />
<LineId Id="467" Count="1" />
<LineId Id="396" Count="3" />
<LineId Id="410" Count="0" />
<LineId Id="377" Count="0" />
<LineId Id="401" Count="3" />
<LineId Id="400" Count="0" />
<LineId Id="448" Count="0" />
<LineId Id="409" Count="0" />
<LineId Id="469" Count="1" />
<LineId Id="405" Count="1" />
<LineId Id="411" Count="3" />
<LineId Id="417" Count="4" />
<LineId Id="449" Count="0" />
<LineId Id="416" Count="0" />
<LineId Id="439" Count="1" />
<LineId Id="422" Count="0" />
<LineId Id="424" Count="1" />
<LineId Id="423" Count="0" />
<LineId Id="431" Count="6" />
<LineId Id="427" Count="0" />
<LineId Id="450" Count="0" />
<LineId Id="486" Count="2" />
<LineId Id="451" Count="2" />
<LineId Id="457" Count="7" />
<LineId Id="454" Count="0" />
<LineId Id="472" Count="0" />
<LineId Id="940" Count="0" />
<LineId Id="932" Count="1" />
<LineId Id="473" Count="0" />
<LineId Id="934" Count="0" />
<LineId Id="474" Count="1" />
<LineId Id="935" Count="0" />
<LineId Id="941" Count="0" />
<LineId Id="936" Count="1" />
<LineId Id="939" Count="0" />
<LineId Id="938" Count="0" />
<LineId Id="569" Count="4" />
<LineId Id="455" Count="0" />
<LineId Id="476" Count="0" />
<LineId Id="478" Count="7" />
<LineId Id="477" Count="0" />
<LineId Id="491" Count="5" />
<LineId Id="498" Count="7" />
<LineId Id="497" Count="0" />
<LineId Id="506" Count="2" />
<LineId Id="673" Count="0" />
<LineId Id="509" Count="0" />
<LineId Id="869" Count="3" />
<LineId Id="415" Count="0" />
<LineId Id="378" Count="0" />
<LineId Id="675" Count="0" />
<LineId Id="547" Count="0" />
<LineId Id="542" Count="0" />
<LineId Id="545" Count="0" />
<LineId Id="532" Count="1" />
<LineId Id="375" Count="0" />
<LineId Id="179" Count="0" />
<LineId Id="165" Count="0" />
<LineId Id="180" Count="0" />
<LineId Id="441" Count="0" />
<LineId Id="185" Count="0" />
<LineId Id="285" Count="0" />
</LineIds>
</POU>
</TcPlcObject>