PLC, HMI, SCADA, INVERTERS, TUTORIALS, INDUSTRIAL AUTOMATION

21:50
SIEMENS STEP7 SCL Функция управления узлом реза заготовок Протекторный агрегат Дуплекс

 

// Функция управления узлом реза заготовок.
 
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


 

Категория: SIEMENS | Просмотров: 44 | Добавил: gt7600 | Теги: siemens, SCL | Рейтинг: 0.0/0
Всего комментариев: 0
avatar