METHOD EvaluatePodveska : BOOL
VAR_IN_OUT
podveska : ST_Podveska; // Модифицируем оригинал
END_VAR
VAR
arrivalTime : DT;
prevVat : INT;
step : INT;
vat : INT;
techTime : TIME;
transitTime : TIME;
transitOut : TIME;
startTime : DT;
endTime : DT;
waitTime : TIME;
maxWait : TIME := gvl.maxWait;
nextVat : INT;
srcIdx : INT;
END_VAR
// Начальный момент времени
IF (podveska.currentStep >= 0) AND (podveska.currentPos >= 1) AND (podveska.currentPos <= 17) THEN
arrivalTime := MAX(GVL.sysTime, GVL.vanEndTime[podveska.currentPos]);
ELSE
arrivalTime := GVL.sysTime;
END_IF;
prevVat := podveska.currentPos;
step := podveska.currentStep + 1;
WHILE step <= 14 DO
vat := GetVatFromRecipe(podveska.processType, step);
IF vat = 0 THEN EXIT; END_IF;
// Транспорт к ванне
srcIdx := MapToTransitIndex(prevVat);
transitTime := REAL_TO_TIME(PV.transitTimed[srcIdx, vat] * 1000.0);
arrivalTime := arrivalTime + transitTime;
// Технологическое время
IF podveska.processType = E_RouteType.eTin THEN
techTime := TargetVars.recipeTin[step].duration;
ELSE
techTime := TargetVars.recipeSilver[step].duration;
END_IF;
// Время выезда к следующей ванне
IF step < 14 THEN
nextVat := GetVatFromRecipe(podveska.processType, step + 1);
IF nextVat <> 0 THEN
transitOut := REAL_TO_TIME(PV.transitTimed[vat, nextVat] * 1000.0);
ELSE
transitOut := T#0s;
END_IF;
ELSE
transitOut := T#0s;
END_IF;
// Время старта обработки – строго после полного освобождения ванны
startTime := MAX(arrivalTime, GVL.planVatBusyUntil[vat]);
IF (startTime > arrivalTime) AND ((startTime - arrivalTime) > maxWait) THEN
EvaluatePodveska := FALSE;
RETURN;
END_IF;;
endTime := startTime + techTime;
// Сохраняем в структуру подвески
podveska.simStartTime[vat] := startTime;
podveska.simBusyUntil[vat] := endTime + transitOut;
// Готовим время для следующего шага (с учётом выезда!)
arrivalTime := endTime;
prevVat := vat;
step := step + 1;
END_WHILE;
EvaluatePodveska := TRUE;