1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Название (номер) устройства PLC в виде переменной

Модератор: специалисты Weintek

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

Автор темы
Jackson
администратор
администратор
Сообщения: 17587
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 825 раз
Поблагодарили: 1653 раза

Название (номер) устройства PLC в виде переменной

Сообщение Jackson »

Добрый день!

Панель MT8102iE. EBPro самой свежей версии. Требуется из макроса прочитать один и тот же регистр из всех устройств ПЛК, опросив одно за другим. В макросе пишу строку вида

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

GetDataEx(data, "Genset1", 3x, 59908, 1)
Здесь "Genset1" - это название ПЛК, и таких у меня 20 штук с разными названиями. Надо в цикле опросить все. Не спрашивайте зачем - так надо.
Вопрос. Можно ли вместо названия ПЛК использовать какую-то переменную или массив переменных, чтобы 20 раз не писать один и тот же код, меняя только название ПЛК?
Цель - привести код к виду (примерно):

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

for i = 0 to 19 step 1
  GetDataEx(data, "N+i", 3x, 59908, 1)
  SetData(data, "LocalHMI", LW, 0+i, 1)
next i  
где N - некий базовый адрес первого ПЛК (точнее четвёртого - у меня это устройства PLC4...PLC23)
Может вместо "N+i" можно использовать массив меток и как-то его адресовать из макроса, подставляя нужную метку в качестве имени ПЛК? Или массив строковых переменных можно организовать, заранее присвоить им имена ПЛК и подставлять вместо "N+i"? Может есть ещё какой-то способ?

Заранее благодарен за подсказки!
По вопросам работы Форума можно обратиться по этим контактам.
Аватара пользователя

Автор темы
Jackson
администратор
администратор
Сообщения: 17587
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 825 раз
Поблагодарили: 1653 раза

Название (номер) устройства PLC в виде переменной

Сообщение Jackson »

Сам же и продолжу рассуждения.

Похоже, не получится так сделать, т.к. именем устройства в GetData может быть только строковая константа, а строковые константы здесь есть только в виде таблиц строк, но как подсунуть вместо имени устройства сюда ссылку на нужную строку нужной таблицы строк, я пока не понял.
По вопросам работы Форума можно обратиться по этим контактам.
Аватара пользователя

keysansa
эксперт
эксперт
Сообщения: 2340
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1998 раз
Поблагодарили: 176 раз

Название (номер) устройства PLC в виде переменной

Сообщение keysansa »

У weintek есть препроцессор компиляции? Define смог бы решить проблему (хотя бы частично).
ЗЫ. Пишут, что вроде есть.
ЗЫЫ. Еще пришло на ум, строковые константы современные компиляторы передают внутрь функции ссылкой. Попробуйте вместо константы передать указатель на вашу строку. Возможно, потребуется изменить опции компиляции в настройках проекта, что бы компилятор пропустил это.

Отправлено спустя 15 минут 6 секунд:
Jackson писал(а): 31 янв 2020, 22:43 GetDataEx(data, "N+i", 3x, 59908, 1)
И так у вас не получится точно. Квотирование строки скрывает переменную i. Возможно, прокатит так:
GetDataEx(data, "N"+i, 3x, 59908, 1)
разница в кавычках.
Или так:
GetDataEx(data, "N"+Int2String(i), 3x, 59908, 1)
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.
Аватара пользователя

Автор темы
Jackson
администратор
администратор
Сообщения: 17587
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 825 раз
Поблагодарили: 1653 раза

Название (номер) устройства PLC в виде переменной

Сообщение Jackson »

keysansa писал(а): 03 фев 2020, 12:49 GetDataEx(data, "N"+Int2String(i), 3x, 59908, 1)
В GetData компилятор ищет имя устройства в явном виде, вычислять его отказывается. Такие вот дела.
По вопросам работы Форума можно обратиться по этим контактам.
Аватара пользователя

keysansa
эксперт
эксперт
Сообщения: 2340
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1998 раз
Поблагодарили: 176 раз

Название (номер) устройства PLC в виде переменной

Сообщение keysansa »

Jackson писал(а): 03 фев 2020, 13:08 В GetData компилятор ищет имя устройства в явном виде, вычислять его отказывается. Такие вот дела.
Функция не вычисляет значение аргументов. Они вычисляются заранее. Просто передача "константной строки" отличается от "переменной строки".
Попробуйте вариант с указателем.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.
Ответить

Вернуться в «WEINTEK (операторские панели)»