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

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

Модераторы: Глоб.модераторы, специалисты Weintek

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

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

Название (номер) устройства 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
администратор
администратор
Сообщения: 18758
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 973 раза
Поблагодарили: 1854 раза

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

Сообщение Jackson »

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

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

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

Название (номер) устройства 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
администратор
администратор
Сообщения: 18758
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 973 раза
Поблагодарили: 1854 раза

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

Сообщение Jackson »

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

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

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

Сообщение keysansa »

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

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