• ОБЯЗАТЕЛЬНО заполнить свой профиль НА РУССКОМ ЯЗЫКЕ КИРИЛЛИЦЕЙ.
  • НЕ НУЖНО писать свой вопрос в первую попавшуюся тему, а вместо этого создать НОВУЮ тему.
  • Дублирование сообщений приравнивается к спаму.
  • Рекламу мы не размещаем ни на каких условиях.

Обработка массива с переменными границами

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить
Аватара пользователя

Автор темы
petr2off
частый гость
частый гость
Сообщения: 475
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Благодарил (а): 7 раз
Поблагодарили: 18 раз

Обработка массива с переменными границами

Сообщение petr2off » 02 окт 2018, 10:33

Разбираюсь сейчас с возможностями S7-1200. Увидел там хитрое такое обозначение ARRAY[*] OF REAL. Для работы с массивами с переменной размерностью. Там еще парочка функций есть, для определения верхней и нижней границы диапазона UPPER_BOUND и LOWER_BOUND. И тут же грабельки полетели, со всех сторон.
1) В параметрах INPUT и OUTPUT такую нотацию не воспринимает, только в InOut.
2) При попытке загрузить такую программулину в симулятор - он через пару секунд вылетает.

Т.е. или пользоваться этим нельзя на S7-1200, или прошивка староватая, или я что то опять проглядел ?

Отправлено спустя 1 час 30 минут 47 секунд:
Появился луч света в темном царстве, в FC блоках можно использовать массивы без указания границ в INPUT и OUTPUT


UNTK_RAA
здесь недавно
здесь недавно
Сообщения: 51
Зарегистрирован: 01 мар 2010, 17:37
Имя: Алексей Алексеевич
Поблагодарили: 1 раз

Обработка массива с переменными границами

Сообщение UNTK_RAA » 02 окт 2018, 12:49

Какая версия Step7? v15 ?

Аватара пользователя

Автор темы
petr2off
частый гость
частый гость
Сообщения: 475
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Благодарил (а): 7 раз
Поблагодарили: 18 раз

Обработка массива с переменными границами

Сообщение petr2off » 02 окт 2018, 13:09

Нет V14, SP1

Аватара пользователя

Автор темы
petr2off
частый гость
частый гость
Сообщения: 475
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Благодарил (а): 7 раз
Поблагодарили: 18 раз

Обработка массива с переменными границами

Сообщение petr2off » 02 окт 2018, 18:39

Рано радовался. Все компилится, загружается. Но проработав пару секунд, выходит на ошибку. Диагностика - выход за границы памяти...

Аватара пользователя

Автор темы
petr2off
частый гость
частый гость
Сообщения: 475
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Благодарил (а): 7 раз
Поблагодарили: 18 раз

Обработка массива с переменными границами

Сообщение petr2off » 03 окт 2018, 06:17

Подвожу итоги. Опустился конечно я до крайностей, скачал мануал. Резюме - делал все правильно, просто это не работает в S7-1200, а вот в S7-1500 работает. Пикантность ситуации в том, что S7-1200 не имеет в своем арсенале STL, и как следствие - невозможность использования косвенной адресации. По этому, в качестве одной из альтернатив предлагается использование массивов. Ну и тут же эта возможность обрезается, хотя то, что это нельзя использовать для S7-1200 я не увидел в мануале, возможно не нашел. Там более 1000 страниц.

Аватара пользователя

Автор темы
petr2off
частый гость
частый гость
Сообщения: 475
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Благодарил (а): 7 раз
Поблагодарили: 18 раз

Обработка массива с переменными границами

Сообщение petr2off » 09 окт 2018, 10:05

Небольшое уточнение, оказывается в симуляторе это все работает, STEP 7 съезжает, когда к симулятору подключаешься. Причем бред какой то показывает. Типа горит светодиод ERROR, хотя симуляторе такого нет.
А вот HMI эмулятор - тот молотком - все продолжает показывать. Надеюсь, когда железо подойдет, все будет более адекватно.

Аватара пользователя

Автор темы
petr2off
частый гость
частый гость
Сообщения: 475
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Благодарил (а): 7 раз
Поблагодарили: 18 раз

Обработка массива с переменными границами

Сообщение petr2off » 12 дек 2018, 19:30

У меня все таки получилось обрабатывать массив с переменными границами в S7-1200.
Смотрится это так:
#n0 := LOWER_BOUND(ARR := #A, DIM := 1);
#n99 := UPPER_BOUND(ARR := #A, DIM := 1);

FOR #i := #n0 TO #n99 DO

#err:= MOVE_BLK_VARIANT(SRC:=#A, COUNT:=1, SRC_INDEX:=#i, DEST_INDEX:=0, DEST=>#r);
#r[0] := #r[0] + #X;
#err := MOVE_BLK_VARIANT(SRC := #r, COUNT := 1, SRC_INDEX := 0, DEST_INDEX := #i, DEST => #B);

// #B[#i] := #B[#i] + #X;
END_FOR;

Эта функция имеет входной параметр массив А и переменную X на выходе массив B, где к каждому элементу прибавлен X.
для S7-1500 достаточно вместо 3-х строчек написать #B[#i] := #A[#i] + #X;

Ответить

Вернуться в «Simatic TIA Portal»