Добрый день. А есть какое-то руководство по созданию проектов для HMI панелей Flexem в FStudio?
На данном этапе не могу разобраться как сделать макрос, чтобы панель в режиме Мастера читала данные адреса (например 12306) с устройства слейв по COM2, записывала значение во внутреннюю переменную (например с адресом 50), а потом в режиме слейв через COM1 передавала эти данные на верхний уровень.
Отдельно com1 и Com2 настроены. Панель видит данные с устройства, а на компьютере я вижу значение в цифровом поле, которое задаю на HMI.
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Передача данных между портами панели оператора
Модераторы: Глоб.модераторы, специалисты Flexem
-
- здесь недавно
- Сообщения: 32
- Зарегистрирован: 27 июн 2023, 09:11
- Имя: Дмитрий
- Страна: Россия
- город/регион: Екатеринбург / Свердловская область
- Поблагодарили: 1 раз
-
- специалист по FLEXEM
- Сообщения: 315
- Зарегистрирован: 14 дек 2015, 12:15
- Имя: Евгений
- Страна: Россия
- город/регион: Краснодар
- Благодарил (а): 7 раз
- Поблагодарили: 84 раза
Передача данных между портами панели оператора
Здравствуйте, по ссылке в начале темы есть "Руководство по работе с FStudio", правда пока только на английском языке.DimaDrobot писал(а): ↑27 июн 2023, 09:20 Добрый день. А есть какое-то руководство по созданию проектов для HMI панелей Flexem в FStudio?
На данном этапе не могу разобраться как сделать макрос, чтобы панель в режиме Мастера читала данные адреса (например 12306) с устройства слейв по COM2, записывала значение во внутреннюю переменную (например с адресом 50), а потом в режиме слейв через COM1 передавала эти данные на верхний уровень.
Отдельно com1 и Com2 настроены. Панель видит данные с устройства, а на компьютере я вижу значение в цифровом поле, которое задаю на HMI.
Там же в папке "ПО" с дистрибутивом есть демо проекты от производителя.
Позже сделаю и добавлю свои примеры и инструкции для обучения.
Вашу задачу можно реализовать проще через таблицу сопоставления адресов(Address Mapping)
т.е. уже есть штатный инструмент чтобы перекладывать данные из порта на порт.
1) COM2 у нас сконфигурирован как Master Modbus RTU
2) На COM1(Slave) активируем функцию Address Mapping и набиваем таблицу переменных с указанием с какого интерфейса и по какому адресу брать данные.
p.s. Я стараюсь не использовать прямую адресацию к регистрам, а создавать таблицу переменных с символьными имена и привязывать к объектам переменные по имени.
а) В таком случае вы всегда можете поменять адрес для переменной в таблице
б) Есть инструмент для импорта/экспорта переменных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- здесь недавно
- Сообщения: 32
- Зарегистрирован: 27 июн 2023, 09:11
- Имя: Дмитрий
- Страна: Россия
- город/регион: Екатеринбург / Свердловская область
- Поблагодарили: 1 раз
Передача данных между портами панели оператора
Добрый день. Спасибо за ответ.
Делаю по Вашей инструкции если включаю AdressMaping в настройках COM1 то у меня тогда комп не видит панель . программа ошибку выдает 129/130
У меня Com1 rs232,а COM2 485. Это как то может влиять на адрес мапинг?
Если отключаю адрес мапинг то комп видит панель и даже читает данные из адреса цифрового окна то что на панели задаю.
Адресную метку создал, и создал цифровой дисплей со ссылкой на адресную меткую На панели он копирует параметр из одного окна в другой, а как на комп его вытащить так и не пойму.
Делаю по Вашей инструкции если включаю AdressMaping в настройках COM1 то у меня тогда комп не видит панель . программа ошибку выдает 129/130
У меня Com1 rs232,а COM2 485. Это как то может влиять на адрес мапинг?
Если отключаю адрес мапинг то комп видит панель и даже читает данные из адреса цифрового окна то что на панели задаю.
Адресную метку создал, и создал цифровой дисплей со ссылкой на адресную меткую На панели он копирует параметр из одного окна в другой, а как на комп его вытащить так и не пойму.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- здесь недавно
- Сообщения: 32
- Зарегистрирован: 27 июн 2023, 09:11
- Имя: Дмитрий
- Страна: Россия
- город/регион: Екатеринбург / Свердловская область
- Поблагодарили: 1 раз
Передача данных между портами панели оператора
Добрый день. Подскажите пожалуйста, есть ли какие-то мысли по поводу моей задачи?
-
- специалист по FLEXEM
- Сообщения: 315
- Зарегистрирован: 14 дек 2015, 12:15
- Имя: Евгений
- Страна: Россия
- город/регион: Краснодар
- Благодарил (а): 7 раз
- Поблагодарили: 84 раза
Передача данных между портами панели оператора
Это не должно зависеть от интерфейса, хотя я сам не тестировал с RS232, нет конвертера под рукой.DimaDrobot писал(а): ↑29 июн 2023, 10:01 Добрый день. Подскажите пожалуйста, есть ли какие-то мысли по поводу моей задачи?
Учитывайте адресацию переменных и адреса устройств.
Как пример, панель читает переменную из ПЛК с адресом 11 по Modbus TCP.
Эта переменная привязывается к Modbus RTU серверу панели и теперь доступна по адресу 1.
Т.е. с ПК мы обращаемся к переменной с адресом 1.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- специалист по FLEXEM
- Сообщения: 315
- Зарегистрирован: 14 дек 2015, 12:15
- Имя: Евгений
- Страна: Россия
- город/регион: Краснодар
- Благодарил (а): 7 раз
- Поблагодарили: 84 раза
Передача данных между портами панели оператора
Второй способ это создать периодическую задачу в свойствах окна для передачи значений между переменными.DimaDrobot писал(а): ↑29 июн 2023, 10:01 Добрый день. Подскажите пожалуйста, есть ли какие-то мысли по поводу моей задачи?
-Открываете свойства окна
-выбираете вкладку "Синхронная передача данных"
-нажимаете кнопку "Добавить"
-Открывается окно "Пункт передачи данных", на вкладке "Вызов и останов" настраиваете период вызова
на вкладке "Передача данных" выбираете с какой в какую переменную данные перекладывать.
Ну и третий вариант скрипты, тоже не сильно сложно, но не имеет смысла, если не нужно никаких преобразований, условий....
да и первые два варианта наиболее просты.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 27 сен 2023, 16:03
- Имя: Илья
- Страна: Беларусь
- город/регион: Витебск
- Благодарил (а): 2 раза
- Поблагодарили: 6 раз
Передача данных между портами панели оператора
Тоже как-то приспичило сделать панель как modbus-прокси. Т.е. периодически синхронизировать внутренние регистры с содержимым удаленного устройства (или нескольких), использовать их для построения картинки/интерфейса локально, и одновременно раздавать содержимое локальных регистров по другим линиям. Можно поиграть в регистратор, да. Например в таком конфиге:
С чтением вовнутрь проблем нет. Периодический трансфер или периодический скрипт. Самое больное - это когда содержимое локального регистра меняется и надо отослать изменения в первоисточник. Вот тут я приседал знатно и перепробовал всякое. Ключевой механизм - это то, что панель может среагировать на _изменение_ содержимого регистра и что-то сделать. Как-то внятно управлять этим сложно. Один из вариантов, и возможно единственный - это позволить механизму срабатывать, настроить обратную пересылку измененного значения, но управлять _количеством_ отсылаемых слов. Допустим, у нас регистр LW5 - он и на чтение и на запись. (ему соответствует удаленный регистр 4x5) Скажем, это будет уставка какого-нибудь регулятора. Для контроля пересылки, вводим дополнительно ему LW1005. Чисто служебный регистр. Далее настраиваем: скрипт периодической подгрузки данных (таймер в свойствах окна):
Скрипт массово подгружает данные и проверяет на отличие содержимого. Это всё для того, чтобы панель по изменению содержимого не начала спамить обратно в контроллер и так по кругу. После холостого срабатывания события, оно само себе взведет адекватную длину отсылки, которая сработает в следующий раз. А следующее событие с изменением содержимого может быть спровоцировано как оператором, изменившим значение LW5, так и сторонним актором по другим интерфейсам (дублирующая панель, пульт, вышестоящая система.)
P.S.: Событие "по изменеию" - немножко волшебное. В том плане, что это оно взводится и всячески стремиться сработать. Причем момент трудно предсказать/отследить. Сбросить его можно только дав ему свершиться.
P.S.: Да, по-хорошему, скрипт и события "по изменению" надо пихать в Public - окно, чтоб работало всегда и везде. Но тут на вкус и задумку.
P.S.: ктати про ремап. По сути, это единственный способ оградить доступ master-устройств от бесконтрольного шляния по регистрам панели. Заворачивая их куда подальше от чувствительных областей.
Ремап тут не очень. По сути - это перепрыгивание через внутренние регистры в направлении "туда". Да и лишний трафик. Вот если бы он еще умел перенаправлять и write - потоки...С чтением вовнутрь проблем нет. Периодический трансфер или периодический скрипт. Самое больное - это когда содержимое локального регистра меняется и надо отослать изменения в первоисточник. Вот тут я приседал знатно и перепробовал всякое. Ключевой механизм - это то, что панель может среагировать на _изменение_ содержимого регистра и что-то сделать. Как-то внятно управлять этим сложно. Один из вариантов, и возможно единственный - это позволить механизму срабатывать, настроить обратную пересылку измененного значения, но управлять _количеством_ отсылаемых слов. Допустим, у нас регистр LW5 - он и на чтение и на запись. (ему соответствует удаленный регистр 4x5) Скажем, это будет уставка какого-нибудь регулятора. Для контроля пересылки, вводим дополнительно ему LW1005. Чисто служебный регистр. Далее настраиваем: скрипт периодической подгрузки данных (таймер в свойствах окна):
Код: Выделить всё
#include <macro.h>
int MacroMain()
{
short remote_regs[10]; //LW0..9
short local_regs[10]; //X4
short update_cnts[10]; //LW1000..1009
short i;
// Here to add macro code.
GetMem(remote_regs,@remote_regs@,0,20); //10 регистров по 2 байта
GetMem(local_regs,@local_regs@,0,20);
GetMem(update_cnts,@update_cnts@,0,20);
for(i=0;i<10;i++){
if(local_regs[i]!=remote_regs[i])
update_cnts[i] = 0;
// else
// update_cnts[i] = 1;
}
SetMem(update_cnts,@update_cnts@,0,20);
SetMem(remote_regs,@local_regs@,0,20);
return 0;
}
P.S.: Событие "по изменеию" - немножко волшебное. В том плане, что это оно взводится и всячески стремиться сработать. Причем момент трудно предсказать/отследить. Сбросить его можно только дав ему свершиться.
P.S.: Да, по-хорошему, скрипт и события "по изменению" надо пихать в Public - окно, чтоб работало всегда и везде. Но тут на вкус и задумку.
P.S.: ктати про ремап. По сути, это единственный способ оградить доступ master-устройств от бесконтрольного шляния по регистрам панели. Заворачивая их куда подальше от чувствительных областей.
У вас нет необходимых прав для просмотра вложений в этом сообщении.