S7-1200: универсальная функция Profibus
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
S7-1200: универсальная функция Profibus
Есть проект в котором надо опросить 21 преобразователь частоты SINAMIC G120 (модуль управления CU240B-2DP). Контроллер SIMATIC S7-1200 (ЦПУ CPU1214C). Среда программирования Step7 v13 sp1 up9.
Для одного преобразователя обмен я написал: используется функции SFC14 и SFC15 чтения/записии периферии, данные пишутся/читаются в отдельный блок данных, соответствующий преобразователю.
Вопрос: можно ли разработать универсальную функцию опроса, которая бы по номеру блока данных (или номеру слейва, или др. идентификатору) осуществляла бы опрос?
Для S7-300 и Step v5.5 я бы насочинял много вариантов с использованием STL и косвенной адресацией. А с новой средой программирования придется один и тот же код копировать и менять в ручную номера блоков данных, слейвов и пр.?
Для одного преобразователя обмен я написал: используется функции SFC14 и SFC15 чтения/записии периферии, данные пишутся/читаются в отдельный блок данных, соответствующий преобразователю.
Вопрос: можно ли разработать универсальную функцию опроса, которая бы по номеру блока данных (или номеру слейва, или др. идентификатору) осуществляла бы опрос?
Для S7-300 и Step v5.5 я бы насочинял много вариантов с использованием STL и косвенной адресацией. А с новой средой программирования придется один и тот же код копировать и менять в ручную номера блоков данных, слейвов и пр.?
Re: S7-1200: универсальная функция Profibus
Вроде и здесь есть множество способов обращения к массивам по индексу и т.п. Язык SCL, кстати, говорят, более приспособлен под это.Автоматизатор писал(а):А с новой средой программирования придется один и тот же код копировать и менять в ручную номера блоков данных, слейвов и пр.?
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Предлагаешь сделать массив с номерами HW_SUBMODULE (идентификатов слейва для SFC), блоками данных? Вот кусок кода: как мне сформировать указатель на приемный буфер?Михайло писал(а):Вроде и здесь есть множество способов обращения к массивам по индексу и т.п.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Пишут в STEP 7 Basic V13.0 System Manual, 02/2014:
Indirect addressing
Indirect addressing offers you the option of addressing operands whose address is not calculated until runtime. All programming languages provide general methods for indirect addressing, for example, via POINTER. In the SCL programming language, you can also use PEEK and POKE instructions.
Re: S7-1200: универсальная функция Profibus
да, именно это я и виделАвтоматизатор писал(а):Пишут в STEP 7 Basic V13.0 System Manual, 02/2014:
К сожалению, я не готов подсказать про посылку в приемный буфер и т.п. Я такое еще не делал, задача туманна для меня...
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Попробовал изобразить написанное на LAD в SCL. Есть некоторые трудности. Не могу найти внятное описание SCL функций, ситаксиса, примеров. Нашел "SIMATIC S7-SCL V5.1 для S7-300/S7-400 руководство 6ES7811-1CC04-8BA0". Не знаю на сколько схожи приемы. Будем пробовать.
Re: S7-1200: универсальная функция Profibus
Ну я методом тыка изучал.
1. В конце каждой строки должна быть точка с запятой ";".
2. Операция присвоения :=
3. Логическая единица - true, логический ноль - false.
Больше ничего знать не надо, все функции вытаскиваются из библиотеки.
1. В конце каждой строки должна быть точка с запятой ";".
2. Операция присвоения :=
3. Логическая единица - true, логический ноль - false.
Больше ничего знать не надо, все функции вытаскиваются из библиотеки.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Написал на SCL аналог вызова функции в Network 1, см. рисунок выше.
В руководстве был пример описан:
RECORD => P#DB301.DBX0.0 BYTE 6
Методом тыка я тоже пописываю, но с вызовом функции тыкался долго
Код: Выделить всё
// DPRD_DAT_SFC (SFC14) - Чтение состояния преобразователя частоты
#t_Error_Send := DPRD_DAT(LADDR := "UZ1_1~PROFINET_interface~Free_telegram", RECORD => P#DB301.DBX0.0 BYTE 6);
Но про символ => хрен догадаешься. Компилятор сам подсунул.//Символический вызов, глобальный экземпляр:
TEST.TEST_1 (FINALVAL:=10, IQ1:= VARIABLE1);
RECORD => P#DB301.DBX0.0 BYTE 6
Методом тыка я тоже пописываю, но с вызовом функции тыкался долго
Re: S7-1200: универсальная функция Profibus
Вложения на форуме ограничены сильно -1 мб для документации семена мало))
Приемы и пример косвенной адресации для нумерации DB у бергера - http://samsebeplc.ru/Doc/Siemens/Berger ... trol_r.pdf
стр. 27-15
Хотя, имхо, я бы вставил бы все 21 FB в проект, для эксплуатации гораздо наглядней чем в код циклов пялится))) ну тут как бы на вкус все фломастеры...
Приемы и пример косвенной адресации для нумерации DB у бергера - http://samsebeplc.ru/Doc/Siemens/Berger ... trol_r.pdf
стр. 27-15
Хотя, имхо, я бы вставил бы все 21 FB в проект, для эксплуатации гораздо наглядней чем в код циклов пялится))) ну тут как бы на вкус все фломастеры...
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Спасибо.CHANt писал(а):Приемы и пример косвенной адресации для нумерации DB у бергера
Что-то про Бергера я подзабыл. Но подглядел про SCL в документе "SIMATIC S7-SCL V5.1 для S7-300/S7-400 Руководство 6ES7811-1CC04-8BA0".
Однако в Step7 Basic v13 подход немного другой. Например,
нет такого типа данных.Обращение к адресам данных с помощью параметра блока BLOCK_DB
... Пусть входной параметр Data имеет тип BLOCK_DB:
Пока получилось следущее:
1 сделал функцию FC_PROFIBUS с входными параметрами в виде:
- номера блока данных преобразователя (DB_NO),
- индентификатора данных преобразователя (HW ID).
2 Создал буферный блок данных
Работа:
- из блока данных преобразователя в буфер копируется массив констант, слово управления, задание на скорость,
- денормализуется задание скорости,
- данные отправляются в ПЧ (из буфера),
- считываются данные ПЧ (в буфер),
- нормализуются,
- вычисляется загрузка двигателя в %,
- из буфера данные копируются в блок данных ПЧ
Код: Выделить всё
// Из блока данных преобразователя частоты DB_NO копируем в буфер обмена:
// - параметры привода (константы),
// - задание (слово управления и задание скорости),
POKE_BLK(area_src := 16#84, // The following areas can be selected in the source memory area: 16#84: DB
dbNumber_src := #DB_NO, // Number of the data block in the source memory area, if AREA = DB, otherwise "0"
byteOffset_src := 0, // Address in the source memory area to be written Only the 16 least significant bits are used.
area_dest := 16#84, // The following areas can be selected in the destination memory area:
dbNumber_dest := 300, // Number of the data block in the destination memory area, if AREA = DB, otherwise "0"
byteOffset_dest := 0, // Address in the destination memory area to be written Only the 16 least significant bits are used.
count := 30); // Number of bytes which are copied
// Денормализуем "DB_UZ0_BUFFER".REF_FREQUENCY - Опорная частота двигателя (задание)
"FC_DENORM"(i_Max := "DB_UZ0_BUFFER".SPEED_MAX,
i_Norm := "DB_UZ0_BUFFER".ACT_REF_SPEED,
o_DeNorm => "DB_UZ0_BUFFER".REF_FREQUENCY);
// DPWR_DAT_SFC (SFC15) - Запись команд преобразователю частоты
#FC_PROFIBUS := DPWR_DAT(LADDR := #HW_ID,
RECORD := P#DB300.DBX28.0 BYTE 4);
// DPRD_DAT_SFC (SFC14) - Чтение состояния преобразователя частоты в буфер приема
#t_Error_Send := DPRD_DAT(LADDR := #HW_ID,
RECORD => P#DB300.DBX32.0 BYTE 6);
// Нормализуем полученные значения
// "DB_UZ0_BUFFER".ACT_SPEED - Текущая скорость двигателя, об/мин
// p2000 Reference speed reference frequency 1500.00 rpm
// r63[0] CO: Speed actual value, Unsmoothed rpm
"FC_NORM"(i_Max := "DB_UZ0_BUFFER".SPEED_MAX,
i_NotNorm := "DB_UZ0_BUFFER".FREQUENCY,
o_Norm => "DB_UZ0_BUFFER".ACT_SPEED);
// "DB_UZ0_BUFFER".ACT_CURRENT - Выходной ток преобразователя, А
// p2002 Reference current 0.63 Arms
// r68[1] CO: Absolute current actual value. Smoothed with p0045 Arms
"FC_NORM"(i_Max := "DB_UZ0_BUFFER".CURRENT_MAX,
i_NotNorm := "DB_UZ0_BUFFER".CURRENT,
o_Norm => "DB_UZ0_BUFFER".ACT_CURRENT);
// "UZ1_LOADING" - Текущая загрузка двигателя, проценты
"DB_UZ0_BUFFER".LOADING := "DB_UZ0_BUFFER".ACT_CURRENT * REAL#100.0 / "DB_UZ0_BUFFER".CURRENT_NOM;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
В справке по Step7 v13 какая та каша. S7-300, S7-1500, S7-1200 - подходы отличаются! Надо искать руководство на SCL v13, если таковое есть.
Пока находится только типа этого:
In STEP 7 (TIA Portal), how can you implement indirect addressing in an SCL program?
Пока находится только типа этого:
In STEP 7 (TIA Portal), how can you implement indirect addressing in an SCL program?
Подумаем, может быть, надо пробовать. Обычно делаю как удобней лично мне .CHANt писал(а):Хотя, имхо, я бы вставил бы все 21 FB в проект, для эксплуатации гораздо наглядней чем в код циклов пялится)))
Re: S7-1200: универсальная функция Profibus
ну вот это главный косяк, который отталкивает от 1200...Он заменил 200, но вроде бы в одну среду разработки с 300/1500, а по факту миллион ограничений - вот нафика козе баян? Ограничились бы памятью, кол-вом I/O, быстройдействием... А так - вычислительные ресурсы ого-го, а дальше засада и в разных углах...)))Автоматизатор писал(а):В справке по Step7 v13 какая та каша. S7-300, S7-1500, S7-1200 - подходы отличаются! Надо искать руководство на SCL v13, если таковое есть.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Совершенно согласен. Навтолкали все в одну кучу! Начал читать руководство на Step7 Basic v13. Перескакивают с пятое на десятое: косвенная адресация для S7-300, потом S1-1200, потом S7-1500. Для каждого свои особенности, начинаешь листать страницы: тут читать, тут не читать. Забываешь что искал.CHANt писал(а):ну вот это главный косяк, который отталкивает от 1200
Вот пример: поддержка различных типов данных для разных контроллеров. И такая каша по всему документу:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Цели, которые я ставлю:CHANt писал(а):Хотя, имхо, я бы вставил бы все 21 FB в проект, для эксплуатации гораздо наглядней чем в код циклов пялится))) ну тут как бы на вкус все фломастеры...
- изучение возможностей среды разработки, SCL в частности,
- использование косвенной адресаци для программирования однотипных функций (простота тиражирования отлаженной программы),
- выяснить какая скорость разработки и отладки программы в разных редакторах.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Универсальную функцию написал. Осталось дождаться, когда придет оборудование и отработать варианты ПНР для начала на 3-х преобразователях в лаборатории.
Для написания программы в среде Step7 v5.4 мне было бы достаточно использовать одну команду "OPN" для открытия блока данных, номер которого задавался бы как входное значение функции.
Для Step7 v13 Basic и контролера S7-1200 нашел только один более-менее нормальный способ - использование функции
совместно с дополнительным буферным блоком данных.
Т.е. алгоритм получается такой:
1 Разрабатывается требуемая функция, которая работает с блоком данных устройства 1 (например, блоком данных преобразователя UZ1).
2 Создается вспомогательный блок данных (буфер) со схожей структурой.
3 Исходная функция переделывается для работы вместо данных устройства 1 с данными буфера.
4 Перед вызывом поправленной функции надо с помощью POKE_BLK скопировать данные устройства в буфер, а потом вычисленные значения записать из буфера обратно (номер источника передается как параметр).
Для написания программы в среде Step7 v5.4 мне было бы достаточно использовать одну команду "OPN" для открытия блока данных, номер которого задавался бы как входное значение функции.
Для Step7 v13 Basic и контролера S7-1200 нашел только один более-менее нормальный способ - использование функции
Код: Выделить всё
POKE_BLK(AREA_SRC := "Tag_Source_Area",
DBNUMBER_SRC := "Tag_Source_DBNumber",
BYTEOFFSET_SRC := "Tag_Source_Byte"),
AREA_DEST := "Tag_Destination_Area",
DBNUMBER_DEST := "Tag_Destination_DBNumber",
BYTEOFFSET_DEST := "Tag_Destination_Byte",
COUNT := "Tag_Count");
Т.е. алгоритм получается такой:
1 Разрабатывается требуемая функция, которая работает с блоком данных устройства 1 (например, блоком данных преобразователя UZ1).
2 Создается вспомогательный блок данных (буфер) со схожей структурой.
3 Исходная функция переделывается для работы вместо данных устройства 1 с данными буфера.
4 Перед вызывом поправленной функции надо с помощью POKE_BLK скопировать данные устройства в буфер, а потом вычисленные значения записать из буфера обратно (номер источника передается как параметр).
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Еще у меня все еще путаница с "оптимизированными" блоками данных. Хорошо еще, что сделали возможность ставить и снимать галочку.
Re: S7-1200: универсальная функция Profibus
Я тут реализовал такую штуку: мультиэкземплярный (multi-instance) FB-блок для обмена по TCP-протоколу с нестандартными устройствами. Возможно я не очень правильно называю эту штуку по определению ТИА Портала, но она работает. Получилось что-то вроде класса (class) в компьютерных языках программирования.
Суть:
1. Пишется один FB-блок с двумя функциями обмена TSEND_C и TRCV_C и обработкой принятых данных и ошибок.
2. Затем этот FB-блок вставляется в основной код, но каждый раз с добавлением нового DB и каждый раз с новым номером TCP-соединения (Connection ID).
3. Итого: всего один раз написан общий для всех соединений код обмена "ПЛК - одно устройство". TCP-соединения работают параллельно, независимо, у каждого соединения состояние хранится в индивидуальном датаблоке. В каждом датаблоке хранятся индивидуальные экземпляры TSEND_C_DB и TRCV_C_DB, а также DB-структура типа TCON_Param, которые необходимы для работы TCP-соединения.
Я использую FB-блок для работы с 10 устройствами. У меня один блок FB, вставленный в код 10 раз, и десять блоков DB. Завтра пойду тестировать на реальном объекте.
Суть:
1. Пишется один FB-блок с двумя функциями обмена TSEND_C и TRCV_C и обработкой принятых данных и ошибок.
2. Затем этот FB-блок вставляется в основной код, но каждый раз с добавлением нового DB и каждый раз с новым номером TCP-соединения (Connection ID).
3. Итого: всего один раз написан общий для всех соединений код обмена "ПЛК - одно устройство". TCP-соединения работают параллельно, независимо, у каждого соединения состояние хранится в индивидуальном датаблоке. В каждом датаблоке хранятся индивидуальные экземпляры TSEND_C_DB и TRCV_C_DB, а также DB-структура типа TCON_Param, которые необходимы для работы TCP-соединения.
Я использую FB-блок для работы с 10 устройствами. У меня один блок FB, вставленный в код 10 раз, и десять блоков DB. Завтра пойду тестировать на реальном объекте.
Re: S7-1200: универсальная функция Profibus
И не надо никакой PEEK/POKE. Это явно извращение по сравнению с классом.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: S7-1200: универсальная функция Profibus
Если оборвать связь, как быстро можно обнаружить обрыв? Если я правильно помню, то у меня получалось, что секунд через 10.
Это устраивает? Что за устройства?
Это устраивает? Что за устройства?
Re: S7-1200: универсальная функция Profibus
Ну я таймаут могу за 2 секунды отловить. У меня там Moxa NPort 4510 собирает данные с четырех портов RS232 и передает в Ethernet. Я рвал RS232, а Ethernet не обрывал, не подумал...