Я в Си не силен, по синтаксису не скажу
но чтение (Read(PLC, 1, MODBUS_RTU_REG_4X, 531, 0, TYPE_BIT, &PSW[531]) здесь, в макросе, не делал бы
Оставил бы чтение PSW531 в функции копирования 60 регистров
Хотя может и так оставить.
Вид для печати
Не пинайте тапком, если решил задачу не оптимальным способом, но у меня все заработало.
Итак, для возможности одновременного задания уставки с ПР200, СП3ХХ и OwenCloud (или/и например со SCADA) нужно в панели оператора СП3ХХ:
1. Создать скрипт и вызывать его функциональной областью по событию "После включения панели" (режим - последовательный) :
2. Создать скрипт и вызывать его функциональной областью в цикле каждые, например, 2 секунды, режим вызова скрипта - последовательный:Код:WORD Value1=0;
WORD Value2=0;
Value1=PSW[531];
PSW[531]!=0 ? Write(PLC, 1, MODBUS_RTU_REG_4X, 531, 0, TYPE_WORD, Value1): Read(PLC, 1, MODBUS_RTU_REG_4X, 531, 0, TYPE_WORD, &PSW[531]);
Value2=PSW[514];
PSW[514]!=0 ? Write(PLC, 1, MODBUS_RTU_REG_4X, 514, 0, TYPE_WORD, Value2): Read(PLC, 1, MODBUS_RTU_REG_4X, 514, 0, TYPE_WORD, &PSW[514]);
// Комментарии:Код:WORD Value1=0;
WORD Value2=0;
Value1=PSW[531];
Value2=PSW[514];
Read(PLC, 1, MODBUS_RTU_REG_4X, 531, 0, TYPE_WORD, &PSW[600]);
if (PSW[600]!=PSW[601])
{PSW[531]=PSW[600];}
PSW[531]!=PSW[600] ? Write(PLC, 1, MODBUS_RTU_REG_4X, 531, 0, TYPE_WORD, Value1) : Read(PLC, 1, MODBUS_RTU_REG_4X, 531, 0, TYPE_WORD, &PSW[601]);
Read(PLC, 1, MODBUS_RTU_REG_4X, 514, 0, TYPE_WORD, &PSW[602]);
if (PSW[602]!=PSW[603])
{PSW[514]=PSW[602];}
PSW[514]!=PSW[602] ? Write(PLC, 1, MODBUS_RTU_REG_4X, 514, 0, TYPE_WORD, Value2) : Read(PLC, 1, MODBUS_RTU_REG_4X, 514, 0, TYPE_WORD, &PSW[603]);
// Регистры PSW[601], PSW[603] - буферные значения изменяемых уставок, при предыдущем опросе
// Регистры PSW[600], PSW[602] - буферные значения изменяемых уставок, при текущем опросе
3. В этой же функциональной области добавить функцию "Копирование группы регистров" (в моем случае 60 шт. с ) как на картинке:
Вложение 59268
Соответственно скрипт написан для возможности изменения регистров 514 и 531 в ПР200, на котором реализована вся логика работы основной программы.
У меня вопрос: Почему когда добавляешь в проект историческую таблицу, при эмуляции очень долго загружается окно эмуляции? Примерно секунд 30.
Всем привет.
Подключил к СП-307 блок входов-выходов МК110-224 (8 входов, 4 выхода)
Для чтения состояния входов использую макрос:
Read (PLC, 24, MODBUS_RTU_REG_3X, 51, 0, TYPE_WORD, &Value);
А как записать выходы? Пробую так:
Write (PLC, 24, MODBUS_RTU_REG_16, 50, 0, TYPE_WORD, &Value);
Но так не проходит. Ругается на параметр "MODBUS_RTU_REG_16".
В руководстве на блок входов-выходов МК110-224 написано, что "Регистры записываются командой 16 (0x10), считываются – командами 3 (0x03) или 4 (0x04)".
Может кто подскажет, как правильно сформировать команду записи?
Спасибо.
Во первых, что Вы изобретаете не существующие ключевые слова.
Во встроенной справке перечислены ВСЕ ДОПУСТИМЫЕ названия регистров
Вложение 59460
Воспользуйтесь встроенной автоподстановкой
- не делайте копи/пасте, а вводите ручками, посимвольно Write( , после скобки появится стандартное окно выбора регистра. выбрать нужно тип -Регистр, в опциях регистра - 4х50
Скрытый текст:
Во вторых, за выбор команды записи отвечает системный регистр PFW36.2 (для PLC порта)
Вложение 59458
Т.е. функц.областью, глобальной, с действием - После загрузки проекта, с функцией - Установить бит PFW36.2.
Вступает в действие после перезагрузки панели по питанию
Спасибо, в первой частью разобрался.
А по - поводу второй части - нужно в начале макроса установить бит 2 в PFW?
Это делается так:
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 36, 2, TYPE_BIT, 1);
И потом перезагрузить панель? (передернуть питание)
Зачем в макросе?
Вторая часть подразумевает обычную функциональную область на любом экране
Действия по установке бит 2 в PFW36 нужно делать всего ОДИН РАЗ ЗА ВСЕ ВРЕМЯ РАБОТЫ ПАНЕЛИ ПОСЛЕ ЗАГРУЗКИ ПРОЕКТА.
Если делать в начале макроса, то при каждом вызове макроса будет выполнятся запись во флеш память (PFW), ресурс перезаписи которой ограничен.
Короче, зачем этот геморрой?
Делаем
Вложение 59463 Вложение 59464Цитата:
Т.е. функц.областью, глобальной, с действием - После загрузки проекта, с функцией - Установить бит PFW36.2.
Вступает в действие после перезагрузки панели по питанию
Вложение 59465
Спасибо. Теперь стало понятно. Сделал так, как вы советовали.
Но при записи в порт PLC такой командой:
Write(PLC, 24, MODBUS_RTU_REG_4X, 50, 0, TYPE_WORD, &Value2);,
не проходит компиляция макросов. Ругается:
"Глобальный макрос: line -5: implicit cast of pointer to 'int'" (неявное приведение указателя на 'int')
Но в глобальном макросе у меня ничего нету. Он пуст.
И при чем тут line 5? Эта ошибка пропадает, если закомментировать строку №7
Вложение 59466
(это я пытаюсь подружить панель СП307 и блок МК110. Читать входы и писать выходы)
Не закрывая проект, смотри в папке конфигуратора \ARMTool
Результаты компиляции будут в папка типа "MacХХ"
Твоя "line 5" находится в файле MacХХ.c
Вложение 59467
ВНИМАНИЕ
Папок типа "MacХХ" может быть несколько, каждая новая папка создается при каждой компиляции макросов. Ищи последнюю по времени изменения