Подскажите как вывести на экран СП307 значение регистра если оно удовлетворяет условию A<PSW[aaa]<B, если <A то строку текста например "<AAA", если >B то ">BBB"
Вид для печати
Подскажите как вывести на экран СП307 значение регистра если оно удовлетворяет условию A<PSW[aaa]<B, если <A то строку текста например "<AAA", если >B то ">BBB"
Как вывести на экран значение таймера в формате hh:mm:ss
Здесь пример с выводом таймера в формате hh:mm:ss ( hh:mm и mm:ss ). Можно скопировать себе в проект.
А так же ГМ (графические макросы) сравнения <, >, <=, >= . ГМ не видны и работают в эмуляции.
Все ГМ и много другого можно скачать у Petera в подписи https://owen.ru/forum/showthread.php...l=1#post474247
Пусть операнд PSW[aaa] будет в PSW256, а пределы A и B как константы будут в энергонезависимых регистрах PFW1000 и PFW1001
Вложение 86776
Используем два ГМ A>B, с результатом сравнения в PSB300
Вложение 86777
и A<B c результатом сравнения в PSB301
Вложение 86778
Теперь делаем "бутерброд", последовательно размещаем друг над другом - дисплей с PSW256, статический текст "> BBB" с битом видимости PSB300, статический текст "< AAA" с битом видимости PSB301
ВСЁ
Результат:
Дайте ссылочку , где почитать про ГМ
Petera, благодарю за ответ. С бутербродом удалось додуматься самому, а вот ГМ разобраться не могу. У вас вроде посты по этому поводу есть, дайте ссылочку п-та.
Состав библиотеки на 06.06.2024
Код:|---Закрыть эмулятор.xjt
|---Оптимизация связи.xjt
|---_СЛУЖЕБНЫЕ
| |---GM.xjt
| |---_Оболочка макроса 24х24.xjt
| |---_Оболочка макроса 32х24.xjt
| `---_Оболочка макроса.xjt
|---ВИЗУАЛЬНЫЕ ГМ
| |---TOD of-on Ex.xjt
| |---TOD of-on.xjt
| |---Шкала TOD.xjt
| |---ДАТА ВРЕМЯ
| | |---Дата.xjt
| | |---Дата_сим.xjt
| | |---Часы.xjt
| | `---UNIX TIME
| | |---h_m_s.xjt
| | |---M-D h_m.xjt
| | |---M-D h_m_s.xjt
| | |---Y-M-D h_m_s.xjt
| | |---Год.xjt
| | |---ДеньГода.xjt
| | |---ДеньМесяца.xjt
| | |---ДеньНедели.xjt
| | |---ДН.xjt
| | `---Месяц.xjt
| |---ИЗМЕНЕННЫЕ
| | |---КНОПКИ
| | | `---СКРЫТЬ
| | | `---Ввод.xjt
| | `---ЛИНЕЙКИ
| | |---A
| | | |---1.xjt
| | | |---2.xjt
| | | |---3.xjt
| | | |---4.xjt
| | | |---5.xjt
| | | |---6.xjt
| | | |---7.xjt
| | | `---8.xjt
| | `---B
| | |---10.xjt
| | |---11.xjt
| | |---12.xjt
| | `---9.xjt
| |---КЛАВИАТУРЫ
| | |---N_Клава.xjt
| | `---N_КлаваМ.xjt
| |---ЛАМПЫ
| | |---ДинЛампа_H.xjt
| | |---ДинЛампа_V.xjt
| | `---ПР200
| | |---DI.xjt
| | `---DO.xjt
| |---ПАРОЛИ
| | |---AutoClose.xjt
| | |---ИндДоступа.xjt
| | |---УровеньНужно.xjt
| | `---ИНСТРУМЕНТЫ
| | |---Битовая кнопка.xjt
| | |---Ввод.xjt
| | |---Записать в ПЛК.xjt
| | |---Кнопка открОкна.xjt
| | |---Кнопка открЭкран.xjt
| | |---Кнопка с подсветкой.xjt
| | |---Кнопка событий.xjt
| | |---Операции с данными.xjt
| | |---Текстовый ввод.xjt
| | |---Цифровой ввод.xjt
| | |---Цифровой вводVD2.xjt
| | `---Читать из ПЛК.xjt
| `---Ц_ИНДИКАЦИЯ
| |---i+1.xjt
| |---i+2.xjt
| |---i+3.xjt
| |---i+4.xjt
| |---i+5.xjt
| |---i+6.xjt
| |---Штамп времени ПР200.xjt
| |---Штамп времени.xjt
| |---Штамп времени_DT.xjt
| |---Штамп времени_Reg.xjt
| |---FLOAT_EXX
| | |---A.xjt
| | `---B.xjt
| |---БАЙТЫ
| | |---Дисп_2byte.xjt
| | |---Дисп_2byteA.xjt
| | |---Дисп_2byteB.xjt
| | |---Дисп_2byteC.xjt
| | |---Дисп_2byteD.xjt
| | |---Дисп_4byteA.xjt
| | `---В РАМКЕ
| | |---Дисп_2byteAr.xjt
| | |---Дисп_2byteBr.xjt
| | |---Дисп_2byteCr.xjt
| | |---Дисп_2byteDr.xjt
| | |---Дисп_2byte_r.xjt
| | `---Дисп_4byteAr.xjt
| `---ТАЙМЕРЫ
| |---ВремяНараб.xjt
| |---ВремяНараб_00.xjt
| |---ВремяНараб_Ex.xjt
| |---ВрНараб_Ex_Bl.xjt
| |---мм_сс.xjt
| |---мм_сс_Ex.xjt
| |---чч_мм.xjt
| |---чч_мм_bl.xjt
| |---чч_мм_bl_Ex.xjt
| |---чч_мм_Ex.xjt
| |---чч_мм_сс.xjt
| |---чч_мм_сс_Ex.xjt
| `---В РАМКЕ
| |---мм_сс_R.xjt
| |---мм_сс_R_Ex.xjt
| |---чч_мм_R.xjt
| |---чч_мм_R_blink.xjt
| |---чч_мм_R_Ex.xjt
| |---чч_мм_R_Ex_blink.xjt
| |---чч_мм_сс_R.xjt
| `---чч_мм_сс_R_Ex.xjt
|---ДЛЯ ПР200
| `---Дебаггер.xjt
|---МАКРО
| |---ABS(Float).xjt
| |---имитатор.xjt
| |---БАЙТЫ
| | |---DW_to_4byte.xjt
| | |---DW_to_byte.xjt
| | |---W_to_2byte.xjt
| | `---W_to_byte.xjt
| |---ДАТАВРЕМЯ
| | |---HMS to TOD.xjt
| | |---RTC
| | | |---dayOfWeek.xjt
| | | |---ddBCD_to_Int.xjt
| | | |---dWeek.xjt
| | | |---hhBCD_to_Int.xjt
| | | |---minBCD_to_Int.xjt
| | | |---mmBCD_to_Int.xjt
| | | |---ssBCD_to_Int.xjt
| | | |---yyBCD_to_Int.xjt
| | | `---СинхрЧасов.xjt
| | `---UNIX
| | |---ExtrDATE.xjt
| | |---ExtrMonth.xjt
| | `---ВЫЧИСЛЕНИЯ
| | |---DATE.xjt
| | |---DAY_OF_MONTH.xjt
| | |---DAY_OF_WEEK.xjt
| | |---DAY_OF_YEAR.xjt
| | |---LEAP_OF_DATE.xjt
| | |---MOD_7.xjt
| | |---MONTH_OF_DATE.xjt
| | |---TIME.xjt
| | `---YEAR_OF_DATE.xjt
| |---ДЕШИФРАТОРЫ
| | |---ПоРазрядам.xjt
| | `---ПОЗИЦИОННЫЕ
| | |---DC16_enbl.xjt
| | `---DC16_tmp.xjt
| |---ЛОГИКА
| | |---2-И-НЕ.xjt
| | |---2-И-НЕ_1.xjt
| | |---2-И.xjt
| | |---2-И_1.xjt
| | |---2-ИЛИ-НЕ.xjt
| | |---2-ИЛИ-НЕ_1.xjt
| | |---2-ИЛИ.xjt
| | |---2-ИЛИ_1.xjt
| | |---3-И-НЕ.xjt
| | |---3-И-НЕ_1.xjt
| | |---3-И-НЕ_2.xjt
| | |---3-И.xjt
| | |---3-И_1.xjt
| | |---3-И_2.xjt
| | |---3-ИЛИ-НЕ.xjt
| | |---3-ИЛИ-НЕ_1.xjt
| | |---3-ИЛИ-НЕ_2.xjt
| | |---3-ИЛИ.xjt
| | |---3-ИЛИ_1.xjt
| | |---3-ИЛИ_2.xjt
| | |---4-И-НЕ.xjt
| | |---4-И.xjt
| | |---4-ИЛИ-НЕ.xjt
| | |---4-ИЛИ.xjt
| | |---XOR.xjt
| | |---_2из3.xjt
| | `---НЕ.xjt
| |---МУЛЬТИПЛЕКСОРЫ
| | |---MUX_2.xjt
| | |---MUX_4.xjt
| | |---MUX_8.xjt
| | |---SWITCH_2.xjt
| | |---SWITCH_4.xjt
| | `---SWITCH_8.xjt
| |---СЕРВИС
| | |---2utilities-system-monitor_2873.png
| | |---UnsignegExt.xjt
| | |---Имитатор Dec с упр.xjt
| | |---Имитатор Dec.xjt
| | |---Имитатор Float.xjt
| | |---Имитатор Unsigneg.xjt
| | `---Экран.png
| |---СИСТЕМНЫЕ
| | |---Таймаут Download.xjt
| | `---Таймаут PLC.xjt
| |---СРАВНЕНИЕ
| | |---DEC
| | | |---intA_eq_0.xjt
| | | |---intA_eq_B.xjt
| | | |---intA_ge_0.xjt
| | | |---intA_ge_B.xjt
| | | |---intA_gt_0.xjt
| | | |---intA_gt_B.xjt
| | | |---intA_le_0.xjt
| | | |---intA_le_B.xjt
| | | |---intA_lt_0.xjt
| | | |---intA_lt_B.xjt
| | | |---intA_ne_0.xjt
| | | `---intA_ne_B.xjt
| | |---FLOAT
| | | |---fA_eq_0.xjt
| | | |---fA_eq_B.xjt
| | | |---fA_ge_0.xjt
| | | |---fA_ge_B.xjt
| | | |---fA_gt_0.xjt
| | | |---fA_gt_B.xjt
| | | |---fA_le_0.xjt
| | | |---fA_le_B.xjt
| | | |---fA_lt_0.xjt
| | | |---fA_lt_B.xjt
| | | |---fA_ne_0.xjt
| | | `---fA_ne_B.xjt
| | `---UNSIGNED
| | |---A_eq_0.xjt
| | |---A_eq_B.xjt
| | |---A_ge_B.xjt
| | |---A_gt_B.xjt
| | |---A_le_B.xjt
| | |---A_lt_B.xjt
| | |---A_ne_0.xjt
| | `---A_ne_B.xjt
| |---ТРИГГЕРЫ
| | |---F_TRIG.xjt
| | `---R_TRIG.xjt
| `---ФУНКЦИИ
| |---Abs(Dec).xjt
| |---Abs(Float).xjt
| |---B=notA.xjt
| |---Декремент.xjt
| |---Инкремент.xjt
| |---Корень.xjt
| |---Корень_куб.xjt
| |---Сумма16.xjt
| `---Сумма20.xjt
|---МЕНЮ
| `---МЕНЮ ДОСТУПА
| |---Вызов меню.xjt
| `---Окно меню 112х70.xjt
`---ОФОРМЛЕНИЕ
|---Кн Графика.xjt
|---Рамка группы.xjt
`---НЕВИДИМКИ
|---Для окна.xjt
|---Текст дуга.xjt
`---Текст.xjt
Коллеги добрый вечер прошу помощи, сам что-то не справляюсь, в RS 485 шесть ПР и панель СП 307 Б, одна ПР 103 мастер остальные пять ведомые, и работает всё хорошо, но есть но, в каждом приборе логика завязана на времени и в каждом ПР время убегает то в + то в -, и ходить каждые три месяца с ноутом корректировать время надоело. Решил считать с СП 307 системные регистры времени 30-35, и далее экспортировать в другие ПР. Чтоб в дальнейшем подкорректировал на панели время, и везде одинаково. Но и здесь не так, регистры считываются в формате HEX не совсем корректно, секунд 90, год тоже убежал 8229, ну и всё остальное тоже соответственно. В поддержку обратился подтвердили да есть такая проблема, блока, который преобразует говорят нету, пробовал сам макрос написать, но пока работает коряво. Наверняка кто-нибудь сталкивался с этой проблемой. Но не может быть чтоб я один с этим столкнулся))))).
Конвертация времени BCD формата панелей, HEX в DEC и обратно DEC в HEX https://owen.ru/forum/showthread.php...l=1#post414783
Читаете дату и время, конвертируете функциями
В библиотеке ГМ https://owen.ru/forum/showthread.php...l=1#post475367
есть макросы для преобразовании времени панели из формата BCD (регистры PSW30..35) в обычные двоичные числа
Вложение 86793
Например
Вложение 86794
Коллеги, столкнулся со странным. Имеется панель СП310 и контроллер wago 750-890. Связь по modbus-TCP. На панели на главный экран выведены регистры связи с PLC. По некоему биту от контроллера на панели должно открываться окно. При открытии окна с очень высокой вероятностью свзяь с PLC "замирает", т.е. значения регистров связи перестают меняться и при снятии управляющего бита окно не закрывается. Попробовал перевести управление окном на экранный переключатель. Теперь окно и открывается и закрывается, но всё равно с высокой вероятностью (~70%) при открытии или при закрытии окна связь замирает. Попробовал вместо контроллера подставить modbus-эмулятор на ПК - с ним эффект пропадает (можно и битом и переключателем моргать сколько угодно – связь сохраняется).
Пробовал контроллер и панель "отсаживать" в локальную сеть, в которой кроме них больше никого нет – тоже не помогает.
С одной стороны получается, что проблема не в панели, а в контроллере. Но тогда почему замирают ВСЕ регистры связи? Панель перестаёт формировать запросы?
P.S. Если вместо открытия окна переходить на другой экран, связь тоже замирает. Я в панике!
А может панель в момент открытия окна опрашивает только те регистры, которые там нарисованы и запрограммированы к опросу? Что будет, если этот регистр/бит добавить на всё окна?
Достаточно указать один неверный адрес регистра или бита и панель начнёт тормозить. Или поставить не настроенный график (таблицу) или не подключить прописанный слейв модуль.
Надо не паниковать, а проверить адреса и удалить не нужные.
Совершенно верно, это нулевой бит 322-го регистра. Именно он в контроллере и должен отвечать за открытие этого окна. Биты 1, 2 и 3 этого же регистра должны были отвечать за открытие других окон.
Вот объявление этой переменной в CodeSys:
CV_WordOfBits_MBUSout AT %QD161 : DWORD; (* WordOfBits *)
Так вам надо сначала проверить, что этот бит приходит (или не приходит) в панель, без всяких окон. Может есть смещение адресов регистров или бит.
Проще всего поставить несколько целочисленных дисплеев с адресами 321, 322 и 323 и проверить число, в соответствии биту.
322 адрес число 1 соответствует 0 биту.
Да-да, ещё он может оказаться не 0вым, а 7мым, например, из-за особенностей модбас...
Посоветую поступить так:
1. сделать документ эксель и переписать туда все действующие регистры с ПЛК (позволит не ошибаясь и наглядно знать что используется в проекте, где есть разрывы). Заставить (временно) все эти регистры "шевелиться - менять значения", привязать прибавлялки.
2. сделать в СП3*** темповый пустой проект, с одним главным окном (прям шевелящимся горохом). Вывести туда все эти регистры числами. Станет нагляднее и виднее что шевелится, что перестает. Потом будете усложнять окна, как разберетесь в причинах
Скорее всего это должно помочь разнести проблему на части, но если нет:
Далее пробовать используя Modbus Pool/ Modbus Slave заменяя то ПЛК, то панель - искать виновное звено.
Там у Wago есть свои правила по обращению с памятью. Попробуйте поискать разрывы и если они есть, то заполните/объявите
Ещё можно убрать запросы к коилам, и переделать на запросы к битам регистра. СП это вроде может делать без проблем. Или я уже с чем то другим путаю...
С адресацией всё в порядке. В контроллере задействованы регистры с 256 по 365 (без разрывов). И пока всё крутилось на одном экране, никаких проблем не было.
В данном случае я специально для исследования проблемы оставил в панели только один запрос, не меняя программу контроллера.
Это было сделано изначально. С момента начала проекта.
Собственно, пока не понадобилось делать окна, всё на одном экране замечательно крутилось. Вот примерный вид экрана.
Вложение 87083
Я использовал mdbus32 вместо контроллера, и как уже писал, проблема при этом уходит. Вместо панели я использую скаду, которая тоже всё прекрасно читает и пишет.
Но почему панель перестаёт генерировать modbus-запросы, когда открывается или закрывается окно?
Потому что на экране есть обращение к адресу, а в Окне его может не быть, когда оно закрыто.
Вам надо использовать ФО (функц. области) , для ваших бит, читать биты и присваивать во внутренние биты PSB256 и выше, внутренними битами открывать окна, ФО сделать глобальными.
Если это возможно использовать маски бит вместо бит, копировать меньше надо будет.
Это может объяснить, почему затыкается обмен, если я управляю окном битом из контроллера. А почему это происходит при нажатии переключателя? По переключателю окно открывается/закрывается нормально, а запросов к контроллеру нет. А подставляю вместо контроллера модбас-эмулятор - запросы идут.
Если подключиться эмулятором, можно посмотреть сам запрос, который панель шлет при открытии окна. Потом сформировать в эмуляторе этот запрос и отправить в ПЛК, и посмотреть на его ответ.
А вы проверяли, скопированные регистры вообще работают?
Проверить сначала биты и регистры я предлагал ранее. Просто у Овена биты и регистры наложены, можно читать как биты отдельно, так и биты в регистрах,
а вот как у вас в ПЛК надо проверять. Делать это надо было в новом проекте, проверить, а потом уже вносить изменения в свой проект.
Протестировал ваш проект (панель мастер в эмуляции) на ПЛК110-60 (слейв живой), бит заменил на 0х0, Вложение 87085
бит работает открывает и закрывает окно, обмен из панели и в панель не прерывается. Бит записывал из ПЛК - работает,
добавлял отдельно в окне работает, отдельно на экране - работает.
2 регистра читаются панелью и 1 записывает в ПЛК кол-во запросов в панели. Почти 16000 за минуту как пулемёт.