// Функция управления узлом реза заготовок.
FUNCTION CutBlank : VOID
TITLE = 'Функция управления узлом реза заготовок.';
VAR_INPUT
IgnorePneumatic : BOOL; // Игнорировать отсутствие воздуха.
OnwardCutterTime : S5TIME; // Контрольное время движения ножа вперед.
BackwardCutterTime : S5TIME; // Контрольное время движения ножа назад.
LiftCutterTime : S5TIME; // Контрольное время движения ножа вверх.
AllowStepMode : BOOL; // Разрешение на работу в пошаговом режиме.
IgnoreUnreadiness : BOOL; // Разрешение на работу без сигнала готовности модуля счёта.
EmergencyStop : BOOL; // Аварийная остановка линии.
AutoModeRuns : BOOL; // Флаг выполнения режима автоматической работы линии.
FillingModeRuns : BOOL; // Флаг выполнения режима заправки.
EndProtectorStarted : BOOL; // Флаг выполнения режима "Конец протекторной ленты".
AutoMode : BOOL; // Флаг выбора режима автоматической работы линии.
FillingMode : BOOL; // Флаг выбора режима заправки.
ProtectorEndMode : BOOL; // Флаг выбора режима "Конец протектора".
DriveCurrSpeed : INT; // Текущая скорость привода.
CounterProgrammed : BOOL; // Модуль счёта запрограммирован.
CounterCondition : COUNTERSTATE; // Структура состояния модуля счёта.
CutSensors : CUTINPSENSORS; // Сигналы с датчиков узла реза.
InRealNullSpeedCount : DINT; // Длина заготовки, считанная с модуля счета в момент останова транспортера для отрезания, в импульсах..
CounterSlowSpeed : BOOL; // Замедлить транспортер модулем счета.
CounterNullSpeed : BOOL; // Остановить транспортер модулем счёта для отрезания заготовки.
SwitInEnableCutBlank : BOOL; // Команда с РС или с ПУ узла реза "Включить рез на заготовки" (DB10).
SwitchInEnableCoil : BOOL; // Команда с РС или с ПУ узла реза "Отключить рез на заготовки" (DB10).
SwCutBlankInAutoMode : BOOL; // Режим реза "Автомат", заданный с РС или с ПУ узла реза (DB10).
SwCutBlankInManuMode : BOOL; // Режим реза "Ручной", заданный с РС или с ПУ узла реза (DB10).
SimCutModeAuto : BOOL; // Режим реза "Автомат", заданный симулятором.
TaskLineSpeed : INT; // Заданная скорость линии.
MaxLineSpeed : INT; // Максимальная возможная скорость линии.
//BlankLengthRemainder : DINT; // Остаток длины заготовки для перехода на пониженную скорость.
BlankCountRemainder : DINT; // Остаток длины заготовки в импульсах для перехода на пониженную скорость.
SensorWheelCircleLength : REAL; // Длина окружности измерительного колеса датчика.
//PulsesPerEncoderNumber : INT; // Количество импульсов на один оборот датчика.
PulsesPerOneTurn : INT; // Количество импульсов на один оборот датчика.
Reset : BOOL; // Установка в исходное состояние.
DeskSwCutBlankInAutoMode : BOOL; // Переключатель на пульте в положении "Автоматический режим работы узла реза". I215SwCutBlankInAutoMode
END_VAR
VAR_OUTPUT
StopLine : BOOL; // Требование остановки линии из-за неисправностей в устройстве реза.
UnitState : CUTTUNITSTATE; // Выходные команды и сигналы функции управления узлом реза.
CntControl : COUNTERCONTROL; // Структура управления модулем счёта.
Faults : CUTTFAULTS; // Неисправности узла реза.
WSTDB1 : WSTPROTOCOL1; // Буфер обмена с рабочей станцией.
EnableCutBlankLampOn : BOOL; // Включить лампу "Включение ножа" на пульте управления линией.
CutAllowLineToWork : BOOL; // Разрешение для автоматической работы линии.
SpeedStoppage : BOOL; // Удержание нулевой скорости транспортера ножа.
END_VAR
VAR_IN_OUT
GivenParam : FM3501TASKPARAM; // Задаваемые параметры для модуля быстрого счёта.
NoFaults : BOOL; // Отсутствие неисправностей узла реза.
CutStarted : BOOL; // Цикл реза запущен.
StepNumber : INT; // Номер шага циклограммы.
NextStep : BOOL; // Разрешение перехода на следующий шаг.
OverrunCount : DINT; // Величина выбега (разность заданной и реальной длины заготовки).
CutModeAuto : BOOL; // Режим реза "Автомат".
EnableCutBlank : BOOL; // Включить рез на заготовки.
AutoModeSelected : BOOL; // Выбран автоматический режим реза на заготовки.
CutLift : BOOL; // нож поднят (симуляция).
END_VAR
LABEL
M1;
M3;
END_LABEL
VAR_TEMP
StartCutting : BOOL; // Задание на работу узла реза.
CurrTimeTCutterInEnd : S5TIME; // оставшееся время для таймера прихода ножа в конец реза.
CurrTimeTCutterInBegin : S5TIME; // оставшееся время для таймера прихода ножа в исходное положение.
CurrTimeTCutterToLift : S5TIME; // оставшееся время для таймера прихода ножа вверх.
//-> Сигналы от датчиков и контрольных точек:
PneumaticReady : BOOL; // Подача воздуха в пневмосистему и двигатель диска ножа включены.
CutFenceClosed : BOOL; // Ограждение ножа закрыто, аварийники ножа не сработали, толщина протектора в норме.
CutterInBeginning : BOOL; // Нож в исходном.
CutterInEnd : BOOL; // Нож в конце реза.
CutterLifted : BOOL; // Нож поднят.
WaterNoMaxLevel : BOOL; // Нет максимального уровня воды в баке.
WaterMinLevel : BOOL; // Уровень воды в баке минимальный.
CounterReady : BOOL; // Флаг готовности модуля счета.
NoCounterFaults : BOOL; // Нет неисправностей модуля счёта.
CorrectedBlankLength : DINT; // Откорректированная машинистом длина заготовки в мм.
CorrectedNullSpeedCount : DINT; // Откорректированная машинистом длина заготовки в импульсах.
RealBlankLength : DINT; // Длина заготовки, считанная с модуля счета в момент останова транспортера для отрезания, в мм.
END_VAR
BEGIN
//-> Начальная инициализация переменных:
PneumaticReady := CutSensors.PneumaticReady; // RedefinedDI.I219KnifePneumaticPower;
IF IgnorePneumatic = TRUE
THEN
PneumaticReady := TRUE;
END_IF;
CutFenceClosed := CutSensors.CutFenceClosed; // RedefinedDI.I220KnifeFenceClosed;
CutterInBeginning := CutSensors.CutterInBeginning; // RedefinedDI.I216KnifeStartPosition;
CutterInEnd := CutSensors.CutterInEnd; // RedefinedDI.I217KnifeEndPosition;
CutterLifted := CutSensors.CutterLifted; // RedefinedDI.I218KnifeRaised; // CutLift;
WaterNoMaxLevel := CutSensors.WaterNoMaxLevel; // RedefinedDI.I245CutWaterLevelNoMax;
WaterMinLevel := CutSensors.WaterMinLevel; // RedefinedDI.I244CutWaterLevelMinimal;
StopLine := FALSE;
Faults.NotAutoMode := FALSE;
Faults.NotEnableCutBlank := FALSE;
Faults.PneumaticNotReady := FALSE;
Faults.CutFenceNotClosed := FALSE;
Faults.OpposingSensorsWorking := FALSE;
Faults.CutterNotLowered := FALSE;
Faults.WaterBelowMin := FALSE;
Faults.WaterAboveMax := FALSE;
(*// Длина заготовки, откорректированная машинистом при помощи кнопок в импульсах:
CorrectedNullSpeedCount := REAL_TO_DINT(DINT_TO_REAL(GivenParam.TaskNullSpeedCount) * GivenParam.LengthFactor);
WSTDB1.CorrectedNullSpeedCount := CorrectedNullSpeedCount;
*)
// Длина заготовки в мм, откорректированная машинистом при помощи кнопок:
CorrectedBlankLength := REAL_TO_DINT(DINT_TO_REAL(GivenParam.TaskBlankLength) * GivenParam.LengthFactor); //TaskBlankLength
// Длина заготовки в мм, откорректированная машинистом при помощи кнопок для рабочей станции:
WSTDB1.CorrectedNullSpeedCount := CorrectedBlankLength;
// Длина заготовки, откорректированная машинистом, переведенная в импульсы:
CorrectedNullSpeedCount := REAL_TO_DINT(DINT_TO_REAL(CorrectedBlankLength) * INT_TO_REAL(PulsesPerOneTurn) / SensorWheelCircleLength);
//-> Проверка правильности заданий длин заготовки для управления приводом транспортёра реза:
IF CorrectedNullSpeedCount > 1000 // Проверка задания длины заготовки для останова транспортера.
THEN
Faults.TaskLengthError := FALSE; // Нет ошибки задания длины заготовки.
GivenParam.TaskLowSpeedCount := REAL_TO_DINT(DINT_TO_REAL(CorrectedNullSpeedCount) - DINT_TO_REAL(BlankCountRemainder) * INT_TO_REAL(TaskLineSpeed) / INT_TO_REAL(MaxLineSpeed));
IF GivenParam.TaskLowSpeedCount > 10
THEN
Faults.TaskLengthError := FALSE; // Нет ошибки задания длины заготовки.
ELSE
Faults.TaskLengthError := TRUE; // Ошибка задания длины заготовки.
END_IF;
ELSE
Faults.TaskLengthError := TRUE; // Ошибка задания длины заготовки.
END_IF;
CounterReady := (NOT CounterCondition.DataError) AND (NOT CounterCondition.OperatorError);
//-> Приведение в исходное:
IF AutoMode = FALSE AND // Флаг выбора режима автоматической работы линии.
FillingMode = FALSE AND // Флаг выбора режима заправки.
ProtectorEndMode = FALSE // Флаг выбора режима "Конец протектора".
THEN
StepNumber := 0;
RETURN;
END_IF;
//-> Формирование неисправности, если нож в течение заданного времени не пришёл в конец реза:
CurrTimeTCutterInEnd := S_ODT (T_NO := TCutterInEnd,
S := UnitState.OnwardCutter, // Движение ножа вперед.
TV := OnwardCutterTime, // Время работы таймера.
R := CutterInEnd, // Сброс таймера.
Q := Faults.CutterNotEnd // Нож не в конце реза.
);
//-> Формирование неисправности, если нож в течение заданного времени не пришёл в исходное положение:
CurrTimeTCutterInBegin := S_ODT (T_NO := TCutterInBeginning,
S := UnitState.BackwardCutter, // Движение ножа назад.
TV := BackwardCutterTime, // Время работы таймера.
R := CutterInBeginning, // Сброс таймера.
Q := Faults.CutterNotBeginning // Нож не в исходном положении.
);
//-> Формирование неисправности, если нож в течение заданного времени не поднялся:
CurrTimeTCutterToLift := S_ODT (T_NO := TCutterInToLift,
S := UnitState.LiftCutter, // Команда на поднятие ножа.
TV := LiftCutterTime, // Время работы таймера.
R := CutterLifted, // Сброс таймера.
Q := Faults.CutterNotLifted // Нож не поднялся.
);
//-> Установка в исходное состояние:
IF Reset = TRUE
THEN
StepNumber := 0;
CutStarted := FALSE; // Цикл реза не запущен.
UnitState.OnwardCutter := FALSE; // Снятие команды "Перемещать нож вперёд - отрезать заготовку".
UnitState.BackwardCutter := FALSE; // Снятие команды "Перемещать нож назад - вернуть в исходное положение".
UnitState.LiftCutter := FALSE; // Снятие команды "Поднять нож".
UnitState.GiveWater := FALSE; // Снятие команды "Включить подачу воды".
UnitState.NotTouchCutTransp := FALSE; // Убирание сигнала "Не трогай транспортер ножа".
Faults.NotAutoMode := FALSE; // Сброс неисправностей:
Faults.NotEnableCutBlank := FALSE; //
Faults.PneumaticNotReady := FALSE; //
Faults.CutFenceNotClosed := FALSE; //
Faults.OpposingSensorsWorking := FALSE; //
Faults.CutterNotLowered := FALSE; //
Faults.WaterBelowMin := FALSE; //
Faults.WaterAboveMax := FALSE; //
Faults.CutterNotEnd := FALSE; //
Faults.CutterNotBeginning := FALSE; //
Faults.CutterNotLifted := FALSE; //.
CntControl.OperatorErrorAcknowledg := FALSE; // Сброс ошибок модуля счета.
CntControl.LoadCMP_V1 := FALSE; // Записать длину заготовки для замедления скорости транспортера.
CntControl.LoadCMP_V2 := FALSE; // Записать длину заготовки для останова транспортера.
CntControl.AllowCount := FALSE; // Запустить модуль счета.
StopLine := FALSE;
OverrunCount := 0; // Величина выбега (разность заданной и реальной длины заготовки).
RETURN;
END_IF;
//-> Пошаговый режим для отладки:
IF AllowStepMode = TRUE
THEN
IF NextStep = TRUE
THEN
NextStep := FALSE;
GOTO M3;
ELSE
RETURN;
END_IF;
END_IF;
//-1-> Проверка состояния модуля счета и формирование сообщений о его неисправностях:
IF CounterReady = FALSE AND // Нет готовности модуля счета.
IgnoreUnreadiness = FALSE
THEN
Faults.CounterNotReady := TRUE;
ELSE
Faults.CounterNotReady := FALSE;
END_IF;
//--> Формирование сигнала отсутствия неисправностей в модуле счёта:
IF IgnoreUnreadiness = FALSE OR
Faults.CounterNotReady = TRUE
THEN
NoCounterFaults := FALSE; // Имеются неисправности узла реза.
ELSE
NoCounterFaults := TRUE; // Нет неисправностей узла реза.
END_IF;
//=3=> Выбор автоматического режима работы узла реза: //
IF SwitInEnableCutBlank = TRUE // Команда с РС или с ПУ узла реза "Включить рез на заготовки".
THEN
EnableCutBlank := TRUE; // Включить рез на заготовки.
END_IF;
IF SwitchInEnableCoil = TRUE // Команда с РС или с ПУ узла реза "Отключить рез на заготовки" (DB10).
THEN
EnableCutBlank := FALSE; // Отключить рез на заготовки.
END_IF;
IF SwCutBlankInAutoMode = TRUE // Режим реза "Автомат", заданный с РС или с ПУ узла реза (DB10).
THEN
AutoModeSelected := TRUE; // Выбран автоматический режим реза на заготовки.
END_IF;
IF SwCutBlankInManuMode = TRUE // Режим реза "Ручной", заданный с РС или с ПУ узла реза (DB10).
THEN
AutoModeSelected := FALSE; // Выбран ручной режим реза на заготовки.
END_IF;IF (EnableCutBlank = TRUE AND // Включить рез на заготовки.
AutoModeSelected = TRUE) OR // Выбран автоматический режим реза на заготовки.
SimCutModeAuto = TRUE
THEN
CutModeAuto := TRUE; // Запущен режим работы узла реза в автоматическом режиме.
ELSE
CutModeAuto := FALSE;
END_IF;
//=3=<
//=4=> Проверка постоянно контролируемых флагов состояния узла реза: //
//-> Проверка датчиков горизонтального перемещения ножа:
Faults.OpposingSensorsWorking := CutterInBeginning AND CutterInEnd; // Одновременное срабатывание датчиков поперечного перемещёния ножа.
//-> Проверка всех остальных условий:
IF NoCounterFaults = TRUE AND // Нет неисправностей модуля счёта.
CutModeAuto = TRUE AND // Автоматический режим работы устройства реза.
CutFenceClosed = TRUE AND // Толщина протектора в норме или ограждение ножа закрыто, или не сработали аварийники ножа.
PneumaticReady = TRUE AND // Пневмосистема к работе готова.
WaterMinLevel = TRUE AND // Минимальный уровень воды имеется.
WaterNoMaxLevel = TRUE AND // Нет максимального уровня воды в баке.
Faults.TaskLengthError = FALSE AND // Нет ошибки задания длины заготовки.
Faults.OpposingSensorsWorking = FALSE // Нет одновременного срабатывания датчиков горизонтального перемещения ножа.
THEN
NoFaults := TRUE;
ELSE
// 1. Диагностика неисправностей модуля счёта выполнена выше.
//-> Формирование сообщений о неисправностях:
Faults.NotEnableCutBlank := NOT EnableCutBlank; // 2.Нет команды с РС или с ПУ узла реза "Включить рез на заготовки".
Faults.NotAutoMode := NOT AutoModeSelected; // 3. Не выбран автоматический режим реза на заготовки.
Faults.CutFenceNotClosed := NOT CutFenceClosed; // 4. Толщина протектора не в норме или ограждение ножа не закрыто, или сработали аварийники ножа.
Faults.PneumaticNotReady := NOT PneumaticReady; // 5. Не нажата кнопка "Включить подачу воздуха в пневмосистему и двигатель диска ножа".
Faults.WaterBelowMin := NOT WaterMinLevel; // 6. Уровень воды в баке ниже минимального.
Faults.WaterAboveMax := NOT WaterNoMaxLevel; // 7. Уровень воды в баке выше максимального.
// 8. Дигностика неправильного задания длин заготовок выполнена выше.
// 9. Диагностика одновременного срабатывания датчиков поперечного перемещёния ножа выполнена выше.
NoFaults := FALSE; // Имеются неисправности узла реза.
END_IF;
//=4=<
//-> Поджигание лампы "Включение ножа" на пульте управления линией:
IF CutFenceClosed = TRUE AND // Толщина протектора в норме или ограждение ножа закрыто, или не сработали аварийники ножа.
PneumaticReady = TRUE AND // Пневмосистема к работе готова.
WaterMinLevel = TRUE AND // Минимальный уровень воды имеется.
WaterNoMaxLevel = TRUE // Нет максимального уровня воды в баке.
THEN
EnableCutBlankLampOn := TRUE;
ELSE
EnableCutBlankLampOn := FALSE;
END_IF;
//-<
M3:
//-5-> Аварийная остановка линии:
IF EmergencyStop = TRUE // Аварийная остановка линии.
THEN
StartCutting := FALSE;
UnitState.OnwardCutter := FALSE; // Снятие команды "Перемещать нож вперёд - отрезать заготовку".
UnitState.BackwardCutter := FALSE; // Снятие команды "Перемещать нож назад - вернуть в исходное положение".
UnitState.LiftCutter := FALSE; // Снятие команды "Поднять нож".
UnitState.GiveWater := FALSE; // Снятие команды "Включить подачу воды".
RETURN;
END_IF;
//=6=> Технологический останов линии:
IF EmergencyStop = FALSE AND // Нет аварийной остановки узла реза.
AutoModeRuns = FALSE AND // Флаг выполнения режима автоматической работы линии.
FillingModeRuns = FALSE AND // Флаг выполнения режима заправки.
EnableCutBlank = FALSE AND // Отключить рез на заготовки.
AutoModeSelected = TRUE // Выбран автоматический режим реза на заготовки.
THEN
//-1-> Нож перемещается вперёд - происходит отрезание заготовки:
IF UnitState.OnwardCutter = TRUE AND
CutterInEnd = TRUE // Ожидание срабатывания конечника "Нож в конце реза".
THEN
UnitState.OnwardCutter := FALSE; // Снятие команды "Перемещать нож вперёд - отрезать заготовку".
StepNumber := 9;
GOTO M1;
END_IF;
//-2-> Нож перемещается назад - возврат в исходное положение:
IF UnitState.BackwardCutter = TRUE AND
CutterLifted = TRUE AND // Если нож поднят.
CutterInBeginning = TRUE // Ожидание срабатывания конечника "Нож в исходном".
THEN
UnitState.BackwardCutter := FALSE; // Снятие команды "Перемещать нож назад - вернуть в исходное положение".
UnitState.LiftCutter := FALSE; // Снятие команды "Поднять нож".
StepNumber := 15;
GOTO M1;
END_IF;
//-3-> Нож в исходном положении и никуда не перемещается:
IF UnitState.OnwardCutter = FALSE AND
UnitState.BackwardCutter = FALSE AND
CutterInBeginning = TRUE
THEN
StepNumber := 0;
END_IF;
END_IF;
//=6=<
//==> Реакция узла реза на его отключение в процессе работы:
//=7=>
IF (EnableCutBlank = FALSE OR // Отключить рез на заготовки.
AutoModeSelected = FALSE) // Выбран автоматический режим реза на заготовки.
THEN
IF UnitState.OnwardCutter = TRUE AND
(CutterInEnd = FALSE OR
CutterInBeginning = FALSE)
THEN
UnitState.NotTouchCutTransp := TRUE; // Выдача сигнала "Не трогай транспортер ножа".
END_IF;
IF CutterInEnd = TRUE OR
CutterInBeginning = TRUE
THEN
UnitState.NotTouchCutTransp := FALSE; // Снятие сигнала "Не трогай транспортер ножа".
END_IF;
//-1-> Нож перемещается вперёд - происходит отрезание заготовки:
IF UnitState.OnwardCutter = TRUE AND
CutterInEnd = TRUE // Ожидание срабатывания конечника "Нож в конце реза".
THEN
UnitState.OnwardCutter := FALSE; // Снятие команды "Перемещать нож вперёд - отрезать заготовку".
UnitState.GiveWater := FALSE; // Отключение подачи воды.
StepNumber := 0;
END_IF;
//-2-> Нож перемещается назад - возврат в исходное положение:
IF UnitState.BackwardCutter = TRUE AND
CutterLifted = TRUE AND // Если нож поднят.
CutterInBeginning = TRUE // Ожидание срабатывания конечника "Нож в исходном".
THEN
UnitState.BackwardCutter := FALSE; // Снятие команды "Перемещать нож назад - вернуть в исходное положение".
UnitState.LiftCutter := FALSE; // Снятие команды "Поднять нож".
StepNumber := 0;
END_IF;
//-3-> Нож в исходном положении и никуда не перемещается:
IF CutterInBeginning = TRUE OR
CutterInEnd = TRUE
THEN
StepNumber := 0;
END_IF;
//-4-> Ожидается поднятие ножа в конце реза:
IF UnitState.LiftCutter = TRUE AND
UnitState.BackwardCutter = FALSE
THEN
UnitState.LiftCutter := FALSE; // Снятие команды "Поднять нож".
StepNumber := 0;
END_IF;
END_IF;
//=7=<
M1:
//-7-> Условие работы устройства реза заготовок:
IF EmergencyStop = FALSE AND // Нет аварийной остановки узла реза.
(AutoModeRuns = TRUE OR // Флаг выполнения режима автоматической работы линии.
FillingModeRuns = TRUE) // Флаг выполнения режима заправки.
THEN
IF NoFaults = TRUE // Отсутствие неисправностей узла реза.
THEN
StartCutting := TRUE; // Начать работу узла реза.
StopLine := FALSE;
ELSE
StartCutting := FALSE;
StopLine := TRUE; // Выдача команды на останов линии.
END_IF;
ELSE
StartCutting := FALSE;
StopLine := FALSE;
END_IF;
//-> Формирование разрешения на работу линии в автоматическом режиме:
IF CutFenceClosed = TRUE AND // Толщина протектора в норме или ограждение ножа закрыто, или не сработали аварийники ножа.
PneumaticReady = TRUE AND // Пневмосистема к работе готова.
WaterMinLevel = TRUE AND // Минимальный уровень воды имеется.
WaterNoMaxLevel = TRUE AND // Нет максимального уровня воды в баке.
DeskSwCutBlankInAutoMode = TRUE // Переключатель на пульте в положении "Автоматический режим работы узла реза".
THEN
CutAllowLineToWork := TRUE;
ELSE
CutAllowLineToWork := FALSE;
END_IF;
//---------------------------------------------------------------------
//==> Реализация циклограммы работы узла реза:
//---------------------------------------------------------------------
CASE StepNumber OF
0:
//-0-> Проверка исходного для запуска цикла отрезания заготовки:
IF StartCutting = TRUE // Имеется задание на работу.
THEN
//-> Формирование сообщений о неисправностях:
Faults.CutterNotBeginning := NOT CutterInBeginning; // Нож не в начальном положении.
Faults.CutterNotLowered := NOT CutterLifted; // Нож не опущен.
IF NoFaults = TRUE AND // Отсутствие неисправностей узла реза.
CutterInBeginning = TRUE AND // Нож в исходном положении.
CutterLifted = FALSE // Нож опущен.
//-> Установка флага запуска узла реза:
THEN
CntControl.AllowCount := TRUE; // Запустить модуль счета для подготовки к программированию.
CutStarted := TRUE; // Цикл реза запущен.
StepNumber := 1;
RETURN;
ELSE
//-> Формирование сообщений о неисправностях:
NoFaults := FALSE;
CutStarted := FALSE;
END_IF;
ELSE
CutStarted := FALSE;
END_IF;
RETURN;
//-1-> Расчёт длин заготовки для управления приводом транспортёра реза:
1:
IF CutStarted = TRUE // Цикл реза запущен.
THEN
IF Faults.TaskLengthError = FALSE AND // Нет ошибок задания длин заготовки.
CounterProgrammed = FALSE // Модуль счёта перешёл в рабочий режим.
THEN
//-> Определение длины заготовки для замедления скорости транспортера модулем счета и
// корректировка значения, с которого счетчик начинает счет, для компенсации выбега транспортёра:
CntControl.CMP_V1 := GivenParam.TaskLowSpeedCount; // - OverrunCount;
//-> Определение длины заготовки для останова транспортера модулем счета и
// корректировка значения, с которого счетчик начинает счет, для компенсации выбега транспортёра:
CntControl.CMP_V2 := CorrectedNullSpeedCount; // - OverrunCount;
StepNumber := 2;
END_IF;
END_IF;
RETURN;
.................................. Полный текст листинга см файл ниже
Скачать/Download - 000000f3.SCL
|