Алгоритм управления следящим приводом

Сервоприводы, шаговые двигатели, регуляторы скорости, частотные преобразователи
Аватара пользователя
CHANt
Профессионал
Сообщения: 565
Зарегистрирован: 13 окт 2012, 15:24

Re: Алгоритм управления следящим приводом

Сообщение CHANt »

А для чего, это же не Модбас. Коммуникационник по Профибасу сам разрулит прием/передачу. Поэтому надо просто вызвать нужное количество раз эту функцию с соответствующим DB.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Наверное, надо было последние сообщения писать в теме про Profibus. Однако, продолжаем...
CHANt писал(а):А для чего, это же не Модбас. Коммуникационник по Профибасу сам разрулит прием/передачу. Поэтому надо просто вызвать нужное количество раз эту функцию с соответствующим DB.
Доступ к произвольным данным преобразователя частоты Yaskawa A1000 производится с помощью команд MEMOBUS/Modbus (профиль Extended Data 2), поэтому надо писать алгоритм опроса. Интересно написать универсальный для нескольких приводов.
Пока написал для S7-300 CPU-314C-2DP простенькую функцию-заготовку под планируемую с использованием команд MEMOBUS/Modbus.

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

NETWORK
TITLE =Чтение состояния / запись команд управления UZ3
      CALL FC     1 (
           i_DB_Numb_i              := 3);
NETWORK
TITLE =Чтение состояния / запись команд управления UZ4
      CALL FC     1 (
           i_DB_Numb_i              := 4);

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

FUNCTION FC 1 : VOID
TITLE =Функция обмена данными с преобразователем по Profibus
VERSION : 0.1


VAR_INPUT
  i_DB_Numb_i : INT ;	//Номер блока данных преобразователя
END_VAR
VAR_TEMP
  t_Pointer : ANY ;	//Указатель на структуру данных для обмена
  t_Ret_Val : INT ;	//Возвращаемое значение
  t_LADDR_w : WORD ;	//Адрес данных преобразователя
  t_DB_Numb_i : INT ;	//Номер блока данных преобразователя
END_VAR
BEGIN
NETWORK
TITLE =Определяем адрес данных преобразователя

      L     #i_DB_Numb_i; 
      T     #t_DB_Numb_i; 

      OPN   DB [#t_DB_Numb_i]; 
      L     DBW    8; 
      T     #t_LADDR_w; 
NETWORK
TITLE =Чтение состояния UZ

// формируем указатель на данные для отправки
// P#DB[i_DB_Numb_i].DBX0.0 BYTE 4

      LAR1  P##t_Pointer; // загрузка начального адреса указателя в AR1

      L     B#16#10; // Load the syntax ID and
      T     LB [AR1,P#0.0]; 

      L     B#16#2; // загрузка указателя на тип данных БАЙТ
      T     LB [AR1,P#1.0]; 

      L     4; // длина данных 4 байта
      T     LW [AR1,P#2.0]; 

      L     #i_DB_Numb_i; // номер блока данных инвертора
      T     LW [AR1,P#4.0]; 

      L     P#DBX 0.0; // начало данных для записи состояния DBX0.0
      T     LD [AR1,P#6.0]; 

// считать данные с преобразователя и загрузить по адресу в указателе
      CALL SFC   14 (
           LADDR                    := #t_LADDR_w,
           RET_VAL                  := #t_Ret_Val,
           RECORD                   := #t_Pointer);

NETWORK
TITLE =Запись команд управления UZ

// формируем указатель на данные для отправки
// P#DB[i_DB_Numb_i].DBX4.0 BYTE 4

      L     P#DBX 0.0; // начало данных для отправки DBX4.0
      T     LD [AR1,P#6.0]; 

// записать данные в преобразователь из адреса в указателе
      CALL SFC   15 (
           LADDR                    := #t_LADDR_w,
           RECORD                   := #t_Pointer,
           RET_VAL                  := #t_Ret_Val);

END_FUNCTION

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

DATA_BLOCK DB 3
TITLE =1,5 кВт
FAMILY : f
NAME : UZ3
VERSION : 0.1


  STRUCT 	
   SW_8_EXT_FLT : BOOL ;	//1: During operation error (oPEDD)
   SW_9_Fault_Reset : BOOL ;	//1: During momentary power loss
   SW_10_NetCtrl_status : BOOL ;	//1: NetCtrl status
   SW_11_relay_closed : BOOL ;	//1: M1-M2 relay closed
   SW_12_PhC_output1_close : BOOL ;	//1: Photocoupler output 1 closed
   SW_13_PhC_output2_close : BOOL ;	//1: Photocoupler output 2 closed
   SW_14_Motor2 : BOOL ;	//1: Motor 2 selected
   SW_15_Zero_Servo : BOOL ;	//1: Zero Servo Complete
   SW_0_FRun : BOOL ;	//1: During run
   SW_1_Stop : BOOL ;	//1: During zero speed
   SW_2_RRun : BOOL ;	//1: During reverse run
   SW_3_Signal_Reset_Fault : BOOL ;	//1: During fault reset signal input
   SW_4_Speed : BOOL ;	//1: During speed agree
   SW_5_Drive_Ready : BOOL ;	//1: Drive ready
   SW_6_Alarm : BOOL ;	//1: Alarm
   SW_7_Fault : BOOL ;	//1: Fault
   Freg_o : WORD ;	//Выходная частота
   CW_8_EXT_FLT : BOOL ;	//Внешняя авария
   CW_9_FaultReset : BOOL ;	//Сброс аварии
   CW_10_Reserv : BOOL ;	//Reserved
   CW_11_Reserv : BOOL ;	//Reserved
   CW_12_Reserv : BOOL ;	//Reserved
   CW_13_Reserv : BOOL ;	//Reserved
   CW_14_ResetHistoriyFau : BOOL ;	//Fault Trace and Fault History Reset
   CW_15_Baseblock : BOOL ;	//Baseblock command
   CW_0_FRUN : BOOL ;	//Вперед
   CW_1_RRUN : BOOL ;	//Назад
   CW_2_MFDIC3 : BOOL ;	//Multi-function digital input command 3
   CW_3_MFDIC4 : BOOL ;	//Multi-function digital input command 4
   CW_4_MFDIC5 : BOOL ;	//Multi-function digital input command 5
   CW_5_MFDIC6 : BOOL ;	//Multi-function digital input command 6
   CW_6_MFDIC7 : BOOL ;	//Multi-function digital input command 7
   CW_7_MFDIC8 : BOOL ;	//Multi-function digital input command 8
   Freq_r : WORD ;	//Опорная частота
   UZ_Data_Addr : WORD  := W#16#100;	//Адрес данных преобразователя
  END_STRUCT ;	
BEGIN
   SW_8_EXT_FLT := FALSE; 
   SW_9_Fault_Reset := FALSE; 
   SW_10_NetCtrl_status := FALSE; 
   SW_11_relay_closed := FALSE; 
   SW_12_PhC_output1_close := FALSE; 
   SW_13_PhC_output2_close := FALSE; 
   SW_14_Motor2 := FALSE; 
   SW_15_Zero_Servo := FALSE; 
   SW_0_FRun := FALSE; 
   SW_1_Stop := FALSE; 
   SW_2_RRun := FALSE; 
   SW_3_Signal_Reset_Fault := FALSE; 
   SW_4_Speed := FALSE; 
   SW_5_Drive_Ready := FALSE; 
   SW_6_Alarm := FALSE; 
   SW_7_Fault := FALSE; 
   Freg_o := W#16#0; 
   CW_8_EXT_FLT := FALSE; 
   CW_9_FaultReset := FALSE; 
   CW_10_Reserv := FALSE; 
   CW_11_Reserv := FALSE; 
   CW_12_Reserv := FALSE; 
   CW_13_Reserv := FALSE; 
   CW_14_ResetHistoriyFau := FALSE; 
   CW_15_Baseblock := FALSE; 
   CW_0_FRUN := FALSE; 
   CW_1_RRUN := FALSE; 
   CW_2_MFDIC3 := FALSE; 
   CW_3_MFDIC4 := FALSE; 
   CW_4_MFDIC5 := FALSE; 
   CW_5_MFDIC6 := FALSE; 
   CW_6_MFDIC7 := FALSE; 
   CW_7_MFDIC8 := FALSE; 
   Freq_r := W#16#0; 
   UZ_Data_Addr := W#16#100; 
END_DATA_BLOCK
Так вот, в ТИА 13 можно подобное сделать?
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Автоматизатор писал(а):Так вот, в ТИА 13 можно подобное сделать?
Открываю руководство "STEP 7 Basic V11.0 SP2 System Manual, 04/2012", читаю
The following example shows an indirect addressing with an area-internal pointer:
Addressing in STL Description
L P#10.0 // Load pointer (P#10.0) in accumulator 1
T MD20 // Transfer pointer to the operand MD20
L MW [MD20] // Load MW10 in accumulator 1
.... // Any program
L MD [MD20] // Load MD10 in accumulator 1
.... // Any program
Addressing in STL Description
U E [MD 2] // Execute an AND logic operation with the input bit.
The address is located in the memory double word MD2.
= DIX [DBD 2] // Assign the signal state of the RLO bit to the
instance data bit. The address is located in the data
double word DBD.
L EB [DID 4] // Load the input byte in ACCU 1. The address is located
in the instance double word DID4.
AUF DB [LW 2] // Open the data block. The number of the data block is
located in the local data word LW2.
В последнем примере используется немецкая нотация U вместо A, E вместо I. Невозможно быстро читать руководство сразу на двух не родных языках в размере 3012 страниц.

У меня стоит Step7 Basic v11 sp2 up5 - нет там STL !!

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Автоматизатор писал(а):У меня стоит Step7 Basic v11 sp2 up5 - нет там STL !!
Нашел документ "Программируемые контроллеры S7-1200" (Siemens ST 70 • 2014), там написано, что STL у контроллеров S7-1200 нет! Замечательно, просто чудесно работают немецкие программисты! Будем искать другие варианты. Надоело уже надеяться, что эти пидоры исправятся.

Как вариант: VIPA SLIO + Step7 v5.5

Аватара пользователя
CHANt
Профессионал
Сообщения: 565
Зарегистрирован: 13 окт 2012, 15:24

Re: Алгоритм управления следящим приводом

Сообщение CHANt »

Автоматизатор писал(а):Как вариант: VIPA SLIO + Step7 v5.5
Да, вариант со Step7 v5.5 , будет лучшим. Может в версии ТИА 20 что то и измениться, но, сейчас, для 1200 полный облом. Только если разрабатывать огроменейшую программу :D
Я, кстати, из-за этой проблемы с ТИА "проиграл" войну между конфигурируемыми устройствами и программируемыми контроллерами, для небольших систем (40-60 сигналов). Ибо S7-300 дорог, а c TIA под 1200 одни непонятки, опять кучу программья покупать, и заказчику очень его не хочется. А варианты профибаса с ПЧ и прочие автотюнинги пида, заку нравятся очень. Пичалька.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Михайло »

Автоматизатор
А мне кажется проблемы-то не существует. Я вот допустим наоборот люблю тот стиль программирования, когда 10 раз повторяешь один и тот же код, чем заморачиваться с циклами и указателями....
Тебе нужно написать все ту же функцию, которая по номеру привода будет выполнять чтение/запись SFC14/SFC15? Надо будет посмотреть на работе, я подобный функционал не использовал.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Михайло писал(а):А мне кажется проблемы-то не существует
Михайло писал(а):Надо будет посмотреть на работе, я подобный функционал не использовал.
Я хочу использовать весь набор, который был у Step7 v5.5 и есть у других производителей. Я хочу сам решать, как и что реализовывать и какими средствами. Не хочу ограничивать себя LD.
Если написать и отладить универсальную типовую программу, потратить чуть больше времени, зато потом не иметь проблем.
Например, для S7-1200 я написал программу опроса 7 инверторов по Модбас. Я ее копирую в очередной проект, ничего не изменяя. В блоке данных указываю, что в этот раз надо опрашивать только 3 инвертора, например. Мне не надо копаться в коде и вспоминать что там куда копируется.

Для S7-300 с помощью косвенной адресации написал блок, который подсчитывает время нахождения в состоянии. Поэтому в самих переходах не надо ничего писать, сбрасывать таймеры и пр.

Это общепринятый подход. С момента выхода S7-1200 прошло уже около 5 лет - а результат где?

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Алгоритм управления следящим приводом

Сообщение ward »

возьми 312 + OP77B, немного дороже 1214 будет

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

ward писал(а):возьми 312 + OP77B, немного дороже 1214 будет
В этот раз уже заказал S7-1200. В следующий раз буду думать. А 312 небось скоро снимут с производства :(
В принципе после последних обновлений Step7 v5.5 меня удовлетворяет. Ну, по крайней мере, не раздражает, как ТИА.

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Алгоритм управления следящим приводом

Сообщение ward »

Да, мне тоже старый добрый степ нравится, 1200 хороши для простых задач, например, упаковщик или наподобие, где сигналов дискретных 10-15, аналоговых парочка...

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Продолжаем работать в данном вопросе. По-простому реализовать управление не получилось. Надо делать регулятор положения. Причем срочно.

Описание задачи:
Есть привод вращения оправки (ПВО), есть привод перемещения оправки (ППО). Есть график, описывающий зависимость положения ППО от угла поворота ПВО. Положение в промежуточных точках вычисляется по приведенной формуле (точки соединены отрезками прямой, для простоты).
График.jpg
На приводе ПВО есть энкодер с разрешением 16384 имп./оборот по которому можно контролировать скорость и угол поворота оправки.
Положение ППО контролируется по датчику линейных перемещений.
Все привода с частотным управлением, задание скорости и команды на вращение поступают из контроллера в преобразователи частоты по Profibus.
Скорость вращения оправки изменяется в зависимости от технологии и точно определить заранее проблематично.

Вопрос:
Как реализовать систему слежения за положением?
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Михайло »

Железо-то опиши. Я так понимаю S7-1200. Или S7-300?
А привод какой?

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

В очередной раз начал вспоминать ТАУ - ПИД регулятор. Но все забылось напрочь - только названия помню, а как реализовать не понимаю. Вот приводят формулу ПИД регулятора:
u(t) = u(t — 1) + P (t) + I (t) + D (t);
P (t) = Kp * {e (t) — e (t — 1)};
I (t) = I * e (t);
D (t) = Kd * {e (t) — 2 * e (t — 1) + e (t — 2)};

Если забить на I и D, оставить только P, то как это будет выглядеть в программной реализации?

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Михайло писал(а):Железо-то опиши. Я так понимаю S7-1200. Или S7-300?
А привод какой?
Есть разница? Контроллер S7-1200 CPU1214C TIA Basic v13 sp1 upd9. Привода Yaskawa A1000.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

У меня получилось, что в формуле:
u(t) = u(t — 1) + Kp * {e (t) — e (t — 1)}
u(t) - текущее задание скорости преобразователю частоты
u(t — 1) - предыдущее задание скорости
Kp - коэффициент пропорциональности (100)
e (t) - рассогласование (разность между положением, которое должно быть согласно графику, и текущим положением оправки, согласно показанием датчика)
e (t — 1) - рассогласование на предыдущем шаге.

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

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Михайло »

Ну сначала нужно разобраться с величинами H и N. Я так понимаю, в начальный момент времени t=0 уже обеспечено H(0)=0 и N(0)=0. Далее мы начинаем вращать ПВО произвольным образом (для простоты - с постоянной скоростью, с рампами разгона и торможения), соответственно величина N растет. ПЛК пересчитывает величину H по измеренному значению N согласно графику H(N). Данное требуемое значение величины H подается на вход частотника ППО в качестве задания по положению. Нужно научить преобразователь A1000 отрабатывать положение. Это видимо самое главное и самое сложное. Так?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Михайло »

Вообще регулятор положения должен быть П-регулятор. Это значит, что постоянные времени интегрирования и дифференцирования нужно обнулить или прямо отключить.

Я нашел мануал A1000 на русском языке, тут на 155-й странице ПИД-регулятор разрисован. Не очень понятно, как на вход ПИД-регулятора подать уставку H и подать сигнал обратной связи Hфакт через Profibus.

Как вариант, использовать готовый ПИД-регулятор в S7-1200. Найди в библиотеке PID_Compact. На вход Setpoint подать желаемое значение H, вычисленное по функции H(N). На вход Input подать фактическое значение H, измеренное по энкодеру. Обе величины привести к одной единице измерения, например, к миллиметру. Выход П-регулятора - это есть задание скорости частотнику ППО.

Остальные параметры настраивать по месту. Ограничение скорости - за это отвечает ограничение (limiter) на выходе ПИД-регулятора.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Михайло писал(а):Данное требуемое значение величины H подается на вход частотника ППО в качестве задания по положению
Я думал реализовать П-регулятор в ПЛК. Поэтому задание частотнику остается по прежнему скорость.

Посмотрю варианты использования штатных регуляторов контроллера и преобразователя. Но мне не нравится такие решения: регулятор в ПЧ имеет смысл осваивать при серийном использовании. К ПИД регулятору в контроллере S7-1200 очень настороженное отношение. Наверняка немецкие программисты наворотили всего, разобраться трудно, а работает криво.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Автоматизатор писал(а):У меня получилось, что в формуле:
u(t) = u(t — 1) + Kp * {e (t) — e (t — 1)}
Вроде теоретически такую штуку написать получилось. Вызывается раз в 10 мс в прерываниях.
Есть сомнения: как будет работать если отправлять задание инвертору по Profibus? Где вызывать SFB15: в самом прерывании, или в основной программе? Цикл программы в среднем 8 мс.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор »

Михайло писал(а):Я нашел мануал A1000 на русском языке, тут на 155-й странице ПИД-регулятор разрисован. Не очень понятно, как на вход ПИД-регулятора подать уставку H и подать сигнал обратной связи Hфакт через Profibus.
На вход регулятора подается аналоговый сигнал или импульсный. Может можно через профибас писать цыфру в аналоговый вход? Но это все равно не универсальное решение.

В институтах же на ТАУ всякое делали! сами

Ответить