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 и косвенной адресацией. А с новой средой программирования придется один и тот же код копировать и менять в ручную номера блоков данных, слейвов и пр.?

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

Re: S7-1200: универсальная функция Profibus

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

Автоматизатор писал(а):А с новой средой программирования придется один и тот же код копировать и менять в ручную номера блоков данных, слейвов и пр.?
Вроде и здесь есть множество способов обращения к массивам по индексу и т.п. Язык SCL, кстати, говорят, более приспособлен под это.

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

Re: S7-1200: универсальная функция Profibus

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

Михайло писал(а):Вроде и здесь есть множество способов обращения к массивам по индексу и т.п.
Предлагаешь сделать массив с номерами HW_SUBMODULE (идентификатов слейва для SFC), блоками данных?
FC_PB.jpg
Вот кусок кода: как мне сформировать указатель на приемный буфер?
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 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.

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

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". Не знаю на сколько схожи приемы. Будем пробовать.

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

Re: S7-1200: универсальная функция Profibus

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

Ну я методом тыка изучал.

1. В конце каждой строки должна быть точка с запятой ";".
2. Операция присвоения :=
3. Логическая единица - true, логический ноль - false.

Больше ничего знать не надо, все функции вытаскиваются из библиотеки. :)

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

Re: S7-1200: универсальная функция Profibus

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

Написал на SCL аналог вызова функции в Network 1, см. рисунок выше.

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

// 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

Методом тыка я тоже пописываю, но с вызовом функции тыкался долго :D

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

Re: S7-1200: универсальная функция Profibus

Сообщение CHANt »

Вложения на форуме ограничены сильно -1 мб для документации семена мало))
Приемы и пример косвенной адресации для нумерации 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 Создал буферный блок данных

Работа:
- из блока данных преобразователя в буфер копируется массив констант, слово управления, задание на скорость,
- денормализуется задание скорости,
- данные отправляются в ПЧ (из буфера),
- считываются данные ПЧ (в буфер),
- нормализуются,
- вычисляется загрузка двигателя в %,
- из буфера данные копируются в блок данных ПЧ
Код.jpg

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

// Из блока данных преобразователя частоты 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?
CHANt писал(а):Хотя, имхо, я бы вставил бы все 21 FB в проект, для эксплуатации гораздо наглядней чем в код циклов пялится)))
Подумаем, может быть, надо пробовать. Обычно делаю как удобней лично мне :p .

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

Re: S7-1200: универсальная функция Profibus

Сообщение CHANt »

Автоматизатор писал(а):В справке по Step7 v13 какая та каша. S7-300, S7-1500, S7-1200 - подходы отличаются! Надо искать руководство на SCL v13, если таковое есть.
ну вот это главный косяк, который отталкивает от 1200...Он заменил 200, но вроде бы в одну среду разработки с 300/1500, а по факту миллион ограничений - вот нафика козе баян? Ограничились бы памятью, кол-вом I/O, быстройдействием... А так - вычислительные ресурсы ого-го, а дальше засада и в разных углах...)))

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

Re: S7-1200: универсальная функция Profibus

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

CHANt писал(а):ну вот это главный косяк, который отталкивает от 1200
Совершенно согласен. Навтолкали все в одну кучу! Начал читать руководство на Step7 Basic v13. Перескакивают с пятое на десятое: косвенная адресация для S7-300, потом S1-1200, потом S7-1500. Для каждого свои особенности, начинаешь листать страницы: тут читать, тут не читать. Забываешь что искал. :green:

Вот пример: поддержка различных типов данных для разных контроллеров. И такая каша по всему документу:
Типы данных.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 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 нашел только один более-менее нормальный способ - использование функции

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

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

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

Еще у меня все еще путаница с "оптимизированными" блоками данных. Хорошо еще, что сделали возможность ставить и снимать галочку.

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

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. Завтра пойду тестировать на реальном объекте.

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

Re: S7-1200: универсальная функция Profibus

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

И не надо никакой PEEK/POKE. Это явно извращение по сравнению с классом.

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

Re: S7-1200: универсальная функция Profibus

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

Если оборвать связь, как быстро можно обнаружить обрыв? Если я правильно помню, то у меня получалось, что секунд через 10.

Это устраивает? Что за устройства?

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

Re: S7-1200: универсальная функция Profibus

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

Ну я таймаут могу за 2 секунды отловить. У меня там Moxa NPort 4510 собирает данные с четырех портов RS232 и передает в Ethernet. Я рвал RS232, а Ethernet не обрывал, не подумал...

Ответить