Перенос проекта из S7-1500 в S7-1200
-
- Сообщения: 42
- Зарегистрирован: 10 дек 2019, 18:13
Перенос проекта из S7-1500 в S7-1200
У меня есть комплексный макет цифрового производства (Industry 4.0) 24В (арт. 554868) и ПЛК SIMATIC S7-1200. Требуется написать управляющую программу для ПЛК отдельно для манипулятора с вакуумным захватным устройством с возможностью дальнейшего взаимодействия с другими моделями производственных участков макета.
В репозитории fischertechnik на GitHub уже есть исходный код для системы управления на языке STL, но он для ПЛК S7-1500.
Можно ли портировать на S7-1200 то, что разработано для S7-1500?
В репозитории fischertechnik на GitHub уже есть исходный код для системы управления на языке STL, но он для ПЛК S7-1500.
Можно ли портировать на S7-1200 то, что разработано для S7-1500?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Перенос проекта из S7-1500 в S7-1200
После совместного анализа исходных кодов и документа didactic materials Training Factory Industry 4.0 у меня получается следующая структура:
Исходные коды находятся в папке PLC_SCL_sources:
* Cyclic_interrupt.scl - циклическая задача, вызывается с заданным периодом 1 мс
* Main.scl - фоновая задача с наименьшим приоритетом
* PLC_Variablen.xml - таблица переменных с привязкой к адресам в памяти ПЛК
Далее я разберу только код для управления горизонтальным звеном манипулятора VGR. Для остальных механизмов манипулятора используется аналогичная структура потока управления.
Циклическая задача 1 мс "Cyclic interrupt".
В этой задаче выполняется обновление состояния счетчиков импульсов, поступающих от квадратурных энкодеров.
Функциональный блок "PRG_VGR_Axis_horizontal_Act_Pos"
Обновление счетчика импульсов от энкодера на горизонтальной оси.
Фоновая задача "Main".
В этой задаче выполняется управление позиционированием механизмов. Формирование выходных сигналов управления.
Функциональный блок "PRG_VGR_Axis_horizontal"
Подготовка входных параметров для вызова функционального блока FB_Axis.
Передача результатов работы FB_Axi в соответствующие переменные.
Задание положения механизма передается в FB_Axis из поля horizontal_Axis.di_Target_Position блока данных gtyp_VGR
Таблица переменных
Думаю, что код для манипулятора будет нормально работать на S7-1200 с минимальными изменениями. Буду рад ответить на вопросы, если что-то не понятно.
Исходные коды находятся в папке 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'
-
- Сообщения: 42
- Зарегистрирован: 10 дек 2019, 18:13
Re: Перенос проекта из S7-1500 в S7-1200
Удалось составить программу парковки манипулятора в начальные координаты, но появилась следующая проблема:
При попытке установки времени цикла в 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).
При попытке установки времени цикла в 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
Все верно. Вычислительной мощности S7-1200 не хватает для выполнения трех экземпляров функционального блока, реализующего программный квадратурный декодер. Надо использовать встроенные аппаратные блоки HSP вместо вызова FB_INC_DEC.При попытке увеличения время цикла программа запускается, но происходит некорректная обработка сигналов с энкодера, неправильно отрабатывает счётчик.
Полагаю, придётся изменять программу и настраивать High Speed Counter (HSP).
-
- Сообщения: 42
- Зарегистрирован: 10 дек 2019, 18:13
Re: Перенос проекта из S7-1500 в S7-1200
В определённом состоянии конечного автомата программы происходит остановка без видимых на то причин. Как можно пошагово отследить, в каком месте программы (вызываемой функции) может быть проблема?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Перенос проекта из S7-1500 в S7-1200
Поясните, пожалуйста, что означает "остановка"?
-
- Сообщения: 42
- Зарегистрирован: 10 дек 2019, 18:13
Re: Перенос проекта из S7-1500 в S7-1200
В моём случае остановка - это переключение из предыдущего состояния конечного автомата, например 50 в текущее - 60 и прекращение выполнения кода в этом состоянии.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Перенос проекта из S7-1500 в S7-1200
В каком ФБ находится проблемный конечный автомат?
-
- Сообщения: 42
- Зарегистрирован: 10 дек 2019, 18:13
Re: Перенос проекта из S7-1500 в S7-1200
Проблема решена. Важно, команду "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;
// 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
Какой в итоге получился период у задачи Main?