Перенос проекта из S7-1500 в S7-1200

Обсуждаем модели и конструкции, построенные своими руками
AntonEngineer
Сообщения: 42
Зарегистрирован: 10 дек 2019, 18:13

Перенос проекта из S7-1500 в S7-1200

Сообщение AntonEngineer »

У меня есть комплексный макет цифрового производства (Industry 4.0) 24В (арт. 554868) и ПЛК SIMATIC S7-1200. Требуется написать управляющую программу для ПЛК отдельно для манипулятора с вакуумным захватным устройством с возможностью дальнейшего взаимодействия с другими моделями производственных участков макета.

В репозитории fischertechnik на GitHub уже есть исходный код для системы управления на языке STL, но он для ПЛК S7-1500.

Можно ли портировать на S7-1200 то, что разработано для S7-1500?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение Mr.Kubikus »

После совместного анализа исходных кодов и документа didactic materials Training Factory Industry 4.0 у меня получается следующая структура:

Исходные коды находятся в папке PLC_SCL_sources:
* Cyclic_interrupt.scl - циклическая задача, вызывается с заданным периодом 1 мс
* Main.scl - фоновая задача с наименьшим приоритетом
* PLC_Variablen.xml - таблица переменных с привязкой к адресам в памяти ПЛК

Далее я разберу только код для управления горизонтальным звеном манипулятора VGR. Для остальных механизмов манипулятора используется аналогичная структура потока управления.

Циклическая задача 1 мс "Cyclic interrupt".
В этой задаче выполняется обновление состояния счетчиков импульсов, поступающих от квадратурных энкодеров.

Код: Выделить всё

633 ORGANIZATION_BLOCK "Cyclic interrupt"
643 BEGIN
651         "PRG_VGR_Axis_horizontal_Act_Pos_DB"();  // Экземпляр функционального блока PRG_VGR_Axis_horizontal_Act_Pos
652         "PRG_VGR_Axis_vertical_Act_Pos_DB"();
653         "PRG_VGR_Axis_rotate_Act_Pos_DB"();
657 END_ORGANIZATION_BLOCK

Функциональный блок "PRG_VGR_Axis_horizontal_Act_Pos"
Обновление счетчика импульсов от энкодера на горизонтальной оси.

Код: Выделить всё

459 FUNCTION_BLOCK "PRG_VGR_Axis_horizontal_Act_Pos":
469 BEGIN
470         // FB increment axis
471         #lfb_IN_DEC(inx_CHa := "IX_VGR_EncoderHorizontalAxisImp1_B3",
472                     inx_CHb := "IX_VGR_EncoderHorizontalAxisImp2_B4",
473                     ini_Ref_Wert := DINT_TO_INT("gtyp_VGR".horizontal_Axis.Config.di_Ref_Pos),
474                     inx_RST := "IX_VGR_RefSwitchHorizontalAxis_I2");
475 
476         "gtyp_VGR".horizontal_Axis.di_Increment := #lfb_IN_DEC.outi_cnt;
477 END_FUNCTION_BLOCK

Фоновая задача "Main".
В этой задаче выполняется управление позиционированием механизмов. Формирование выходных сигналов управления.

Код: Выделить всё

7155 ORGANIZATION_BLOCK "Main"
7161 BEGIN
7185         // sources VGR
7186         "PRG_VGR_Ablauf_DB"();
7187         "PRG_VGR_Set_Positioning_DB"();
7188         "PRG_VGR_Set_Park_Position_DB"();
7189         "PRG_VGR_Axis_horizontal_DB"();
7190         "PRG_VGR_Axis_vertical_DB"();
7191         "PRG_VGR_Axis_rotate_DB"();
7192         "PRG_NFC_DB"();
7218 END_ORGANIZATION_BLOCK

Функциональный блок "PRG_VGR_Axis_horizontal"
Подготовка входных параметров для вызова функционального блока FB_Axis.
Передача результатов работы FB_Axi в соответствующие переменные.
Задание положения механизма передается в FB_Axis из поля horizontal_Axis.di_Target_Position блока данных gtyp_VGR

Код: Выделить всё

3737 FUNCTION_BLOCK "PRG_VGR_Axis_horizontal"
3738 TITLE = Program Axis horizontal VGR
3739 { S7_Optimized_Access := 'TRUE' }
3740 AUTHOR : 'A.Schaefer'
3741 VERSION : 0.0
3742    VAR
3743       lx_Init { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
3744       lfb_horizontal_Axis { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "FB_Axis";
3745    END_VAR
3746 
3747 
3748 BEGIN
3749         IF #lx_Init THEN
3750 
3751             // FB Axis horizontal
3752             #lfb_horizontal_Axis(ini_Axis       := 1,
3753                         indi_Increment          := "gtyp_VGR".horizontal_Axis.di_Increment,
3754                         inx_Ref_Switch          := "IX_VGR_RefSwitchHorizontalAxis_I2",
3755                         inx_Referencing         := "gtyp_VGR".horizontal_Axis.x_Reference,
3756                         inx_Start_Positioning   := "gtyp_VGR".horizontal_Axis.x_Start_Positioning,
3757                         indi_Target_Position    := "gtyp_VGR".horizontal_Axis.di_Target_Position,
3758                         ini_PWM                 := "gtyp_VGR".horizontal_Axis.i_PWM,
3759                         inouttyp_Config         := "gtyp_VGR".horizontal_Axis.Config,
3760                         inouttyp_Setup          := "gtyp_SetupAxis");
3761 
3762             "QX_VGR_M2_HorizontalAxisForward_Q4"    := #lfb_horizontal_Axis.outx_Motor_Pos;
3763             "QX_VGR_M2_HorizontalAxisBackward_Q3"   := #lfb_horizontal_Axis.outx_Motor_Neg;
3764             "QW_VGR_PWM_Horizontal_M2"              := #lfb_horizontal_Axis.outi_Motor_PWM;
3765             "gtyp_VGR".horizontal_Axis.di_Actual_Position    := #lfb_horizontal_Axis.outdi_Actual_Position;
3766             "gtyp_VGR".horizontal_Axis.x_Referenced          := #lfb_horizontal_Axis.outx_Referenced;
3767             "gtyp_VGR".horizontal_Axis.x_Position_Reached    := #lfb_horizontal_Axis.outx_Position_Reached;
3768         ELSE
3769             #lx_Init := TRUE;
3770         END_IF;
3771 END_FUNCTION_BLOCK

Таблица переменных

Код: Выделить всё

//Выходы
%Q2.2 QX_VGR_M2_HorizontalAxisBackward_Q3  'VGR - Q3 = Motor M2 horizontal axis backward'
%Q2.3 QX_VGR_M2_HorizontalAxisForward_Q4 'VGR - Q4 = Motor M2 horizontal axis forward'
%QW17 QW_VGR_PWM_Horizontal_M2 'VGR = PWM Motor M2 horizontal axis'
Думаю, что код для манипулятора будет нормально работать на S7-1200 с минимальными изменениями. Буду рад ответить на вопросы, если что-то не понятно.
С уважением, Григорий
GitHub FB ВК
AntonEngineer
Сообщения: 42
Зарегистрирован: 10 дек 2019, 18:13

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение AntonEngineer »

Удалось составить программу парковки манипулятора в начальные координаты, но появилась следующая проблема:
При попытке установки времени цикла в 1 мс организационного блока "Cyclic interrupt", ПЛК не запустился, а в диагностическом буфере появилось событие следующего содержания:

"A processing watchdog was triggered for the requested organization block. The number of requests issued but not completely processed has reached the configured warning limit.
Possible cause: The call period for the block may be shorter than the program runtime of the block extended by the runtime of blocks in higher priority classes that are still waiting to be processed.
Note the error reaction indicated in the diagnostics buffer entry. This error reaction depends on the availability of OB 80.
Resolution:
Check the program runtime and the call period of the blocks that have been processed since the last processing request or that are still waiting to be processed."

При попытке увеличения время цикла программа запускается, но происходит некорректная обработка сигналов с энкодера, неправильно отрабатывает счётчик.
Полагаю, придётся изменять программу и настраивать High Speed Counter (HSC).
Последний раз редактировалось AntonEngineer 17 май 2021, 20:20, всего редактировалось 1 раз.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение Mr.Kubikus »

При попытке увеличения время цикла программа запускается, но происходит некорректная обработка сигналов с энкодера, неправильно отрабатывает счётчик.
Полагаю, придётся изменять программу и настраивать High Speed Counter (HSP).
Все верно. Вычислительной мощности S7-1200 не хватает для выполнения трех экземпляров функционального блока, реализующего программный квадратурный декодер. Надо использовать встроенные аппаратные блоки HSP вместо вызова FB_INC_DEC.
С уважением, Григорий
GitHub FB ВК
AntonEngineer
Сообщения: 42
Зарегистрирован: 10 дек 2019, 18:13

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение AntonEngineer »

В определённом состоянии конечного автомата программы происходит остановка без видимых на то причин. Как можно пошагово отследить, в каком месте программы (вызываемой функции) может быть проблема?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение Mr.Kubikus »

Поясните, пожалуйста, что означает "остановка"?
С уважением, Григорий
GitHub FB ВК
AntonEngineer
Сообщения: 42
Зарегистрирован: 10 дек 2019, 18:13

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение AntonEngineer »

В моём случае остановка - это переключение из предыдущего состояния конечного автомата, например 50 в текущее - 60 и прекращение выполнения кода в этом состоянии.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение Mr.Kubikus »

В каком ФБ находится проблемный конечный автомат?
С уважением, Григорий
GitHub FB ВК
AntonEngineer
Сообщения: 42
Зарегистрирован: 10 дек 2019, 18:13

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение AntonEngineer »

Проблема решена. Важно, команду "gtyp_VGR".vertical_Axis.x_Reference, операции "парковки" оси:

// homing vertical axis
"gtyp_VGR".vertical_Axis.x_Reference := TRUE;
IF NOT "gtyp_VGR".vertical_Axis.x_Referenced THEN
#li_StepCase := 20;
END_IF;

не забыть перевести в состояние FALSE, когда ось достигла концевого выключателя:

// homed vertical axis
IF "gtyp_VGR".vertical_Axis.x_Referenced THEN
"gtyp_VGR".vertical_Axis.x_Reference := FALSE;
#li_StepCase := 30;
END_IF;
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Перенос проекта из S7-1500 в S7-1200

Сообщение Mr.Kubikus »

Какой в итоге получился период у задачи Main?
С уважением, Григорий
GitHub FB ВК
Ответить