Re: Алгоритм управления следящим приводом
Добавлено: 23 июл 2014, 05:10
А для чего, это же не Модбас. Коммуникационник по Профибасу сам разрулит прием/передачу. Поэтому надо просто вызвать нужное количество раз эту функцию с соответствующим DB.
RAZRAB.RU Форум по автоматизации производства
http://razrab.ru/
Доступ к произвольным данным преобразователя частоты Yaskawa A1000 производится с помощью команд MEMOBUS/Modbus (профиль Extended Data 2), поэтому надо писать алгоритм опроса. Интересно написать универсальный для нескольких приводов.CHANt писал(а):А для чего, это же не Модбас. Коммуникационник по Профибасу сам разрулит прием/передачу. Поэтому надо просто вызвать нужное количество раз эту функцию с соответствующим DB.
Код: Выделить всё
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
Открываю руководство "STEP 7 Basic V11.0 SP2 System Manual, 04/2012", читаюАвтоматизатор писал(а):Так вот, в ТИА 13 можно подобное сделать?
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
В последнем примере используется немецкая нотация U вместо A, E вместо I. Невозможно быстро читать руководство сразу на двух не родных языках в размере 3012 страниц.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.
Нашел документ "Программируемые контроллеры S7-1200" (Siemens ST 70 • 2014), там написано, что STL у контроллеров S7-1200 нет! Замечательно, просто чудесно работают немецкие программисты! Будем искать другие варианты. Надоело уже надеяться, что эти пидоры исправятся.Автоматизатор писал(а):У меня стоит Step7 Basic v11 sp2 up5 - нет там STL !!
Да, вариант со Step7 v5.5 , будет лучшим. Может в версии ТИА 20 что то и измениться, но, сейчас, для 1200 полный облом. Только если разрабатывать огроменейшую программуАвтоматизатор писал(а):Как вариант: VIPA SLIO + Step7 v5.5
Михайло писал(а):А мне кажется проблемы-то не существует
Я хочу использовать весь набор, который был у Step7 v5.5 и есть у других производителей. Я хочу сам решать, как и что реализовывать и какими средствами. Не хочу ограничивать себя LD.Михайло писал(а):Надо будет посмотреть на работе, я подобный функционал не использовал.
В этот раз уже заказал S7-1200. В следующий раз буду думать. А 312 небось скоро снимут с производстваward писал(а):возьми 312 + OP77B, немного дороже 1214 будет
Есть разница? Контроллер S7-1200 CPU1214C TIA Basic v13 sp1 upd9. Привода Yaskawa A1000.Михайло писал(а):Железо-то опиши. Я так понимаю S7-1200. Или S7-300?
А привод какой?
Я думал реализовать П-регулятор в ПЛК. Поэтому задание частотнику остается по прежнему скорость.Михайло писал(а):Данное требуемое значение величины H подается на вход частотника ППО в качестве задания по положению
Вроде теоретически такую штуку написать получилось. Вызывается раз в 10 мс в прерываниях.Автоматизатор писал(а):У меня получилось, что в формуле:
u(t) = u(t — 1) + Kp * {e (t) — e (t — 1)}
На вход регулятора подается аналоговый сигнал или импульсный. Может можно через профибас писать цыфру в аналоговый вход? Но это все равно не универсальное решение.Михайло писал(а):Я нашел мануал A1000 на русском языке, тут на 155-й странице ПИД-регулятор разрисован. Не очень понятно, как на вход ПИД-регулятора подать уставку H и подать сигнал обратной связи Hфакт через Profibus.