PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [41] 42

senkos
09.10.2023, 11:13
Непонятно, зачем опрашивать устройство Modbus через OPC CodeSys если можно опрашивать напрямую по Modbus?, Modbus мастер встроен в RapidScada


Что бы опрашивать напрямую по Modbus контроллер который подключен к локальной сети с адресом 192.168.1.102 нужно в конфигураторе ПЛК добавить Modbus Slave и в нем добавить TCP и например несколько переменных по 2 Byte. ПЛК будет в эти переменные записывать какие то значения а Scada по Modbus TCP считывать их?
Это верно?

1exan
09.10.2023, 11:47
Что бы опрашивать напрямую по Modbus контроллер который подключен к локальной сети с адресом 192.168.1.102 нужно в конфигураторе ПЛК добавить Modbus Slave и в нем добавить TCP и например несколько переменных по 2 Byte. ПЛК будет в эти переменные записывать какие то значения а Scada по Modbus TCP считывать их?
Это верно?

Все правильно, вот так примерно это выглядит:
70797
В принципе, в эти переменные и скада тоже может записывать (вся область памяти сетевых переменных этого ПЛК - HOLDING REGISTERS)

Ledkouq
09.10.2023, 13:17
всем привет. ПЛК63.
1.
Кодесис-Ресурсы-Конфигурация_ПЛК-WorkInd[FIX]-Параметры модуля:
Максимальное количество рабочих экранов 8 шт. Хотя в руководстве на ПЛК63 сказано 16.
В чем проблема?
Находил на форуме примеры работы с ЖКИ для плк63 на 16 экранов. грешу на таргет.

2.
я правильно понимаю что на одном рабочем экране может быть только две строки (0-ая и 1-ая)?
(т.е.) листинга между строками в рамках одно экрана - нет. есть листинг только между экранами ?

Если же все таки строк больше, то не увидел варианта прокрутки этих строк в рамках одного экрана.

kondor3000
09.10.2023, 15:38
всем привет. ПЛК63.
Если же все таки строк больше, то не увидел варианта прокрутки этих строк в рамках одного экрана.

Здесь есть примеры ПЛК63-73, по выводу на экран в том числе https://owen.ru/product/codesys_v2/example_program

Nerion
10.10.2023, 06:59
Добрый день!
Если делать одно действие(считать или записать) с одного устройства то всё нормально. Если же делать операции последовательно, то нормально выполняется только последняя. Предыдущие в подавляющем большинстве случаев остаются с какими тех данными(адрес устройства и т.д) в буфере. Запуск следующей операции делал по "complete" с предыдущей. Можно выправить ситуацию с чтением если ставить на этот complete задержку в 200 мс но это увеличивает задержку опроса устройств. В 100 мс уже не каждый раз нормально опрашивает. Как можно это поправить?

Если добавлять slave устройства через конфигурацию плк и обращаться к адресам (по типу %QW6.1.0.0) то всё нормально опрашивается. Но не удобно проверять нормальный или нет ответ от каждого устройства через Last adress, Last error modbus мастера.

1exan
10.10.2023, 07:49
Добрый день!
Если делать одно действие(считать или записать) с одного устройства то всё нормально. Если же делать операции последовательно, то нормально выполняется только последняя. Предыдущие в подавляющем большинстве случаев остаются с какими тех данными(адрес устройства и т.д) в буфере. Запуск следующей операции делал по "complete" с предыдущей. Можно выправить ситуацию с чтением если ставить на этот complete задержку в 200 мс но это увеличивает задержку опроса устройств. В 100 мс уже не каждый раз нормально опрашивает. Как можно это поправить?

Если добавлять slave устройства через конфигурацию плк и обращаться к адресам (по типу %QW6.1.0.0) то всё нормально опрашивается. Но не удобно проверять нормальный или нет ответ от каждого устройства через Last adress, Last error modbus мастера.

Код ошибки не выловили?
Может устройству после записи необходима некоторая задержка перед следующим чтением?

kondor3000
10.10.2023, 08:11
Добрый день!
Если делать одно действие(считать или записать) с одного устройства то всё нормально. Если же делать операции последовательно, то нормально выполняется только последняя. Предыдущие в подавляющем большинстве случаев остаются с какими тех данными(адрес устройства и т.д) в буфере. Запуск следующей операции делал по "complete" с предыдущей. Можно выправить ситуацию с чтением если ставить на этот complete задержку в 200 мс но это увеличивает задержку опроса устройств. В 100 мс уже не каждый раз нормально опрашивает. Как можно это поправить?

Если добавлять slave устройства через конфигурацию плк и обращаться к адресам (по типу %QW6.1.0.0) то всё нормально опрашивается. Но не удобно проверять нормальный или нет ответ от каждого устройства через Last adress, Last error modbus мастера.

Вы либо проект выложите, либо по ссылке выше посмотрите примеры, как делается обмен через би-ки.
Чтение и запись надо разнести по шагам CASE, иногда нужно сделать очистку буфера. И желательно писать, чем и какие модули вы опрашиваете.

Nerion
10.10.2023, 09:38
Код ошибки не выловили?
Может устройству после записи необходима некоторая задержка перед следующим чтением?
Ошибки вроде как нет, на сколько я понимаю. До этого с овенами и codesys никогда не работал. complete 1, exception 0. Задержка 200 да помогает, но это слишком много.


Вы либо проект выложите, либо по ссылке выше посмотрите примеры, как делается обмен через би-ки.
Чтение и запись надо разнести по шагам CASE, иногда нужно сделать очистку буфера. И желательно писать, чем и какие модули вы опрашиваете.

Здесь пытался разобраться как работает передача данных. В качестве мастера использовал ПЛК110 [М02]. Подключен к компу через USB B. В качестве slave устройства использована программа modbus slave запущенная на этом же пк и подключенная к rs-485-2 через USB-COM адаптером.

Вообще была необходимость в подключении от 4 до 12 slave(ПЧ Instart) устройств. Овен должен был раздавать им разрешение и задание, опрашивать состояние. Правда не 110, а СПК107. Но его пока не было в наличии и я думаю разница в связи будет не сильно отличаться.

andrey_dmitriev
10.10.2023, 10:19
где найти описание регистров плк150 и сп 270?

kondor3000
10.10.2023, 10:38
где найти описание регистров плк150 и сп 270?

Вы же тему создали, зачем сюда пишите? Вы видео посмотрели? Там всё есть https://owen.ru/forum/showthread.php?t=38496

kondor3000
10.10.2023, 10:44
Ошибки вроде как нет, на сколько я понимаю. До этого с овенами и codesys никогда не работал. complete 1, exception 0. Задержка 200 да помогает, но это слишком много.



Здесь пытался разобраться как работает передача данных. В качестве мастера использовал ПЛК110 [М02]. Подключен к компу через USB B. В качестве slave устройства использована программа modbus slave запущенная на этом же пк и подключенная к rs-485-2 через USB-COM адаптером.

Вообще была необходимость в подключении от 4 до 12 slave(ПЧ Instart) устройств. Овен должен был раздавать им разрешение и задание, опрашивать состояние. Правда не 110, а СПК107. Но его пока не было в наличии и я думаю разница в связи будет не сильно отличаться.

Опять на FBD библиотечный опрос. Не будет так работать чтение и запись вместе.
Если берётесь за библиотечный опрос делайте на ST, шаги в CASE разносите, например, 0 шаг чтение, 1 шаг запись,
пока идёт чтение, запись не работает, потом проверка на ошибки. Примеры есть на сайте
Обмен через библиотеки Modbus и OwenNet
https://owen.ru/product/codesys_v2/example_program
Вот простой пример чтения и записи 2 WORD разнесены по шагам.

senkos
10.10.2023, 11:04
Скада СИМП Лайт.
Подскажите пожалуйста почему нет данных с Modbus TCP? Настраивал по видео инструкции, IP ПЛК 192.168.1.102, создан ModBus(slave) c TCP и тремя переменными Word.
Через встроенный OPS Codesys данные получаю нормально.70824708257082670827

kondor3000
10.10.2023, 11:09
Скада СИМП Лайт.
Подскажите пожалуйста почему нет данных с Modbus TCP? Настраивал по видео инструкции, IP ПЛК 192.168.1.102, создан ModBus(slave) c TCP и тремя переменными Word.
Через встроенный OPS Codesys данные получаю нормально.

А зачем вы их одновременно запустили? Либо так либо так.
Через встроенный OPS Codesys вы получаете все переменные проекта, даже с ПЛК мастера, то есть слейв уже прочитан тоже,
а по ТСР, только то что в слейве

senkos
10.10.2023, 11:20
А зачем вы их одновременно запустили? Либо так либо так.


В видео была показана одновременная работа OPC и Modbus TCP.
Сейчас создал новый проект и сделал только Modbus TCP и все равно не считывает. Пишет напротив переменных красным "Нет связи". Хотя в RapidSCADA получал данные.

Или нужно в codesys отвязать OPC сервер и отключить создание описаний?

Все заработало, перезагрузил ПЛК отключением! Спасибо!
Нестабильно работает, добавляю еще переменную и уже начинаются танцы с бубном, нужно все перезапустить и то не факт что начнет считывать, как то все через раз.
Интересно MasterSCADA работает так же или все же лучше в ней все построить?

kondor3000
10.10.2023, 13:12
В видео была показана одновременная работа OPC и Modbus TCP.
Сейчас создал новый проект и сделал только Modbus TCP и все равно не считывает. Пишет напротив переменных красным "Нет связи". Хотя в RapidSCADA получал данные.

Или нужно в codesys отвязать OPC сервер и отключить создание описаний?

Все заработало, перезагрузил ПЛК отключением! Спасибо!
Нестабильно работает, добавляю еще переменную и уже начинаются танцы с бубном, нужно все перезапустить и то не факт что начнет считывать, как то все через раз.
Интересно MasterSCADA работает так же или все же лучше в ней все построить?

Значит где то пропустили настройки, у меня всё прекрасно читается по любому каналу. Все теги добавлять надо сразу и сохранить, перезагрузить проект. И никаких ошибок.
Мастер скады мне не нравятся, особенно 4D, там настолько всё извернули, получение тегов и работа с ними через заднее место, плюс тормоза и глюки.

senkos
10.10.2023, 17:02
Значит где то пропустили настройки, у меня всё прекрасно читается по любому каналу. Все теги добавлять надо сразу и сохранить, перезагрузить проект. И никаких ошибок.
Мастер скады мне не нравятся, особенно 4D, там настолько всё извернули, получение тегов и работа с ними через заднее место, плюс тормоза и глюки.

Отладил вроде все, теперь без глюков получает данные по modbus TCP.
Не подскажете как в СИМП Лайт Float переменные правильно интерпретировать? На скринах у меня в codesys переменные Float и на панель выдаются правильные данные, но в СИМПЛ Лайт не получается никак получить верные значения. Пробовал разные варианты порядок байт и тип данных.

kondor3000
10.10.2023, 17:52
Отладил вроде все, теперь без глюков получает данные по modbus TCP.
Не подскажете как в СИМП Лайт Float переменные правильно интерпретировать? На скринах у меня в codesys переменные Float и на панель выдаются правильные данные, но в СИМПЛ Лайт не получается никак получить верные значения. Пробовал разные варианты порядок байт и тип данных.

Проверьте обязательно адреса флоат, они должны быть чётные (0,2,4,6 и т. д.) и правильные. 70833 и в работе 70836
Правильный порядок байт для ТСР это LE_2_1_4_3, смотри скрин, на скрине адреса 0,1,2,3 -WORD и 4 -Float (чётный адрес)
Да и не забудьте функции записи для флоат 0х10 (16 функция), в настройках для узла надо поставить 15 и 16 функции, групповая запись бит и регистров.

senkos
11.10.2023, 08:26
Проверьте обязательно адреса флоат, они должны быть чётные (0,2,4,6 и т. д.) и правильные. 70833 и в работе 70836
Правильный порядок байт для ТСР это LE_2_1_4_3, смотри скрин, на скрине адреса 0,1,2,3 -WORD и 4 -Float (чётный адрес)
Да и не забудьте функции записи для флоат 0х10 (16 функция), в настройках для узла надо поставить 15 и 16 функции, групповая запись бит и регистров.

Благодарю Вас, все заработало как часики )), забивать 70 переменных вручную придется теперь или есть возможность чтения сразу всех регистров слейва?
Так же как передать например дискретные выходы и входы самого ПЛК, на их нужно ссылаться регистрами из слейва?

kondor3000
11.10.2023, 08:33
Благодарю Вас, все заработало как часики )), забивать 70 переменных вручную придется теперь или есть возможность чтения сразу всех регистров слейва?
Так же как передать например дискретные выходы и входы самого ПЛК, на их нужно ссылаться регистрами из слейва?

Используйте Codesys.OPС.02, все переменные проекта доступны, даже входы и выходы, если им присвоены имена. При чём с сохранением имени регистра или входа.

Если передавать через слейв, то вам придётся состояние входов, выходов самому вручную выводить в слейв. Создавать новые регистры в слейве и им присваивать состояние входов, выходов.
Только управлять входами нельзя, они физичести управляются снаружи ПЛК, их можно только читать.

west
11.10.2023, 09:33
Благодарю Вас, все заработало как часики ))забивать 70 переменных вручную придется теперь
Это разве проблема в этой СКАДе?
Создаёте один нужный тег и дублируете его сколько необходимо.

senkos
11.10.2023, 16:57
Можно ли в SimpLight делать многоэкранный проект например по типу панели СП307. Или организовать какую то логику, например при нажатии одной кнопки на экране появлялись одни компоненты, при нажатии другой уже появлялись бы другие? Как у меня сделано в панели на скрине, при нажатии кнопки Компрессор №1 показываются только его данные. 70873

Если так нельзя, то нашел еще SIMPLE SCADA кто сталкивался с такой?

In_Da_Cher_A
11.10.2023, 17:04
Можно ли в SimpLightэто не форум по СимпЛайт, но тем не менее - можно.

SIMPLE SCADAи там можно
и давайте всё-таки на форуме ОВЕНа, задавать вопросы по ОВЕНу
у каждой скады есть своя техподдержка, напишите туда

senkos
11.10.2023, 17:10
это не форум по СимпЛайт, но тем не менее - можно.
и там можно
и давайте всё-таки на форуме ОВЕНа, задавать вопросы по ОВЕНу
у каждой скады есть своя техподдержка, напишите туда


Спасибо, понял. Все же я программирую устройства Овен, которые куплены у компании Овен, поэтому и пишу на форуме компании Овен. Таким макаром тогда придется писать на форум разработчика Codesys, Windows итд...

west
11.10.2023, 19:01
Спасибо, понял. Все же я программирую устройства Овен, которые куплены у компании Овен, поэтому и пишу на форуме компании Овен. Таким макаром тогда придется писать на форум разработчика Codesys, Windows итд...
В принципе ДА, придётся, если приспичит и ничего страшного в этом нет!
А причём тут программирование устройств ОВЕН и настройка сторонней программы?
Кстати название темы тоже поглядите.

kondor3000
11.10.2023, 23:00
Можно ли в SimpLight делать многоэкранный проект например по типу панели СП307. Или организовать какую то логику, например при нажатии одной кнопки на экране появлялись одни компоненты, при нажатии другой уже появлялись бы другие? Как у меня сделано в панели на скрине, при нажатии кнопки Компрессор №1 показываются только его данные.

Если так нельзя, то нашел еще SIMPLE SCADA кто сталкивался с такой?

Может это поможет, многофункциональные кнопки https://simplight.ru/manual_next/komponenty-upravleniya/knopki
А так же контейнер

senkos
13.10.2023, 08:08
Добрый день, коллеги! Не знаю в какую тему писать, чтобы не плодить не ёмких тем, спрошу тут.
Какое устройство Овен нужно для ПИД регулирования давления воздуха трехпозиционным исполнительным механизмом без датчика положения задвижки(МЭО). Чтобы в параметрах ПИД учитывались: время хода задвижки, люфт, время минимальной работы (все как в ПИД из библиотеки PID_Regulators.lib)

EFrol
13.10.2023, 09:24
https://owen.ru/product/trm212

Easy_Enemy
16.10.2023, 22:34
Вопрос по таймерам: целесообразно ли использовать таймер отличия от глобального времени (пишем текущее время, прошедшее после запуска плк и, далее ждем, пока пройдет заданное количество времени (микросекунд/секунд/минут и пр.), сравнением переменной записанного времени с нужным периодом), как обычно решается на микроконтроллерах?
В пользу данного метода - нам не нужно создавать никаких экземпляров функций таймеров, достаточно объявить переменные нужного нам интервала, не составляет труда обновлять/останавливать/смещать таймер одной строкой, а на первый взгляд, никто особо не использует. Кто пользует - есть ли какие недостатки, кроме сброса часов после 57 дней? Пока не было потребностей касаться сего вопроса, но, система увеличилась до обработки сразу нескольких систем, где масса режимов, привязанных ко времени, и встроенные таймеры превращаются в сущий кошмар

capzap
16.10.2023, 23:25
Вопрос по таймерам: целесообразно ли использовать таймер отличия от глобального времени (пишем текущее время, прошедшее после запуска плк и, далее ждем, пока пройдет заданное количество времени (микросекунд/секунд/минут и пр.), сравнением переменной записанного времени с нужным периодом), как обычно решается на микроконтроллерах?
В пользу данного метода - нам не нужно создавать никаких экземпляров функций таймеров, достаточно объявить переменные нужного нам интервала, не составляет труда обновлять/останавливать/смещать таймер одной строкой, а на первый взгляд, никто особо не использует. Кто пользует - есть ли какие недостатки, кроме сброса часов после 57 дней? Пока не было потребностей касаться сего вопроса, но, система увеличилась до обработки сразу нескольких систем, где масса режимов, привязанных ко времени, и встроенные таймеры превращаются в сущий кошмар

Именно так и пользуюсь, не знаю откуда 57 взялась, но если используете dword/udint то можете вычислить разность из меньшего вычесть больше значение и сравнить что выдаст калькулятор если к меньшему значению прибавить верхнюю границу диапазона четырехбайтных чисел

kondor3000
16.10.2023, 23:35
Вопрос по таймерам: целесообразно ли использовать таймер отличия от глобального времени (пишем текущее время, прошедшее после запуска плк и, далее ждем, пока пройдет заданное количество времени (микросекунд/секунд/минут и пр.), сравнением переменной записанного времени с нужным периодом), как обычно решается на микроконтроллерах?
В пользу данного метода - нам не нужно создавать никаких экземпляров функций таймеров, достаточно объявить переменные нужного нам интервала, не составляет труда обновлять/останавливать/смещать таймер одной строкой, а на первый взгляд, никто особо не использует. Кто пользует - есть ли какие недостатки, кроме сброса часов после 57 дней? Пока не было потребностей касаться сего вопроса, но, система увеличилась до обработки сразу нескольких систем, где масса режимов, привязанных ко времени, и встроенные таймеры превращаются в сущий кошмар

Тоже пользуюсь, только функция TIME(); обнуляется после 49 дней, а не 57.
Если нужно считать например наработку, что считаю отдельно часы, каждый час +1 (или сменами по 8 час или сутками по 24 часа) , тогда можно считать хоть 100 лет, не проблема.

solarize
17.10.2023, 08:19
Доброго времени суток. Вопрос по ПЛК 150-А-М 220В. Разрядился аккумулятор и требует замены. В нем стоит аккумулятор ICR10440 320 mAh 3,7 V. Внимание вопрос, могу ли я поставить INR 10440 320 mAh 3,7V и кто менял в них аккумуляторы какие вы ставили на замену. Никакой информации я не нашел по этому поводу.

kondor3000
17.10.2023, 09:03
Доброго времени суток. Вопрос по ПЛК 150-А-М 220В. Разрядился аккумулятор и требует замены. В нем стоит аккумулятор ICR10440 320 mAh 3,7 V. Внимание вопрос, могу ли я поставить INR 10440 320 mAh 3,7V и кто менял в них аккумуляторы какие вы ставили на замену. Никакой информации я не нашел по этому поводу.

Если подходит по размерам, можете ставить.
Менял много раз, при отсутствии оригинала, брал на Али 3.7 В (от 150 до 450 мА) размером 25х25 мм ( 27х28 мм, 30Х26 мм), больше 30 лучше не брать, могут не влезть.
https://aliexpress.ru/item/1005004551448757.html?sku_id=12000029579867047&spm=a2g2w.productlist.search_results.1.3ded4aa6g1b qyq

Easy_Enemy
18.10.2023, 18:16
Именно так и пользуюсь, не знаю откуда 57 взялась, но если используете dword/udint то можете вычислить разность из меньшего вычесть больше значение и сравнить что выдаст калькулятор если к меньшему значению прибавить верхнюю границу диапазона четырехбайтных чисел

Отлично, спасибо!


Тоже пользуюсь, только функция TIME(); обнуляется после 49 дней, а не 57.
Если нужно считать например наработку, что считаю отдельно часы, каждый час +1 (или сменами по 8 час или сутками по 24 часа) , тогда можно считать хоть 100 лет, не проблема.

Прощу прощения, конечно 49. Засиделся) Тоже на МК так храню данные, шикарно!

solarize
19.10.2023, 14:43
Спасибо за ответ.

Traveller
20.10.2023, 12:09
Доброго времени суток всем!
Сейчас работаю над одним проектом, дошел до стадии когда нужно по RS-485 ПР200 связать с двумя модулями ввода вывода, здесь как бы проблем нет, все работает, но есть одно но!
В общем есть модуль МВ110-32ДН, он будет подключаться к шкафу управления, который будет стоять в цеху, а к самому модулю, который будет в диспетчерской, будут подключены кнопки, ну как бы такой удаленный пульт управления, на индикацию будет работать МУ110-32Р, с ним проблем нет, работает как надо, а вот с первым, в принципе тоже работает и почти как надо, но в него передается битовая маска (А-ля какая кнопка нажата) и как бы в программе работает на это дело макрос распаковки, но смысл в том что в этом макросе у меня задействованы выходы 1-16, а сам модуль ввода эти команды (нажатия кнопок) видит на входах 17-32, как бы все сдвинуто на 16 значений вниз, собственно вопрос это так и должно быть или я все же где то накосячил? :)

Тестовую программу прилагаю:
https://owen.ru/forum/attachment.php?attachmentid=71060&stc=1&d=1697792867

1exan
20.10.2023, 12:20
32 входа всё-же подразумевают два регистра по 16 бит. Попробуйте сделать количество регистров "2" в настройках переменной этого модуля

Traveller
20.10.2023, 12:48
32 входа всё-же подразумевают два регистра по 16 бит. Попробуйте сделать количество регистров "2" в настройках переменной этого модуляДа не, все тоже самое, ничего не изменилось
все же стоит себя поправить, на модуле вывода, такая же фигня, все начинается с 17-ти

1exan
20.10.2023, 13:25
Да не, все тоже самое, ничего не изменилось
все же стоит себя поправить, на модуле вывода, такая же фигня, все начинается с 17-ти

Попробуйте поменять порядок регистров для ведомых модулей
А может адрес переменных подвигать +/- 1

Traveller
20.10.2023, 13:38
Все получилось, но в совокупности! В общем поставил:
1. На обоих модулях "Кол-во регистров"- 2
2. Так же галочку "Старшим регистром вперед"

Огромное спасибо за помощь! :)

Newcomer
21.10.2023, 11:21
Добрый день

Какой ПЛК имеет большее быстродействие, ПЛК110[М02] или ПЛК210 ?

kondor3000
21.10.2023, 11:30
Добрый день

Какой ПЛК имеет большее быстродействие, ПЛК110[М02] или ПЛК210 ?

В плане передачи по RS485, однозначно быстрее ПЛК110,
по скорости работы самой программы, зависит от WEB визуализации в 210, если она есть, то 110 быстрее.
По моим наблюдениям, 110 быстрее всегда.

Newcomer
21.10.2023, 11:37
В плане передачи по RS485, однозначно быстрее ПЛК110,
по скорости работы самой программы, зависит от WEB визуализации в 210, если она есть, то 110 быстрее. Если нет по примерно одинаково.

А ПЛК210 не под Linux работает ?

kondor3000
21.10.2023, 11:48
А ПЛК210 не под Linux работает ?

Под Linux, он и сжирает всё преимущество самого процессора, который мощнее в 210

lastfun
21.10.2023, 21:56
В сп3хх 'С' (что вы называете макросами) я могу управлять свойствами объектов, координаты, видимость и прочее на уровне С?

kondor3000
22.10.2023, 13:25
В сп3хх 'С' (что вы называете макросами) я могу управлять свойствами объектов, координаты, видимость и прочее на уровне С?

Вопросы по Панелям надо задавать в соответствующей теме https://owen.ru/forum/forumdisplay.php?f=23

В примерах есть Организация обмена через макросы+ статья и Набор макросов для работы с памятью, Анимация и перемещение элементов,
в эмуляции макросы не работают.
скачивайте, читайте и пробуйте https://owen.ru/product/sp3xx/software

Traveller
27.10.2023, 12:09
Доброго времени суток!

В общем есть две ПР200, первая Slave, вторая соответственно Master, в общем вторая читает битовую маску состояния датчиков которую контролирует первая, проблема в том что если на первой передаются все биты с 1-го по 32-ой, то вторая видит только первую половину, с 1 по 16
Так это выглядит при отладке:
То что уходит:
https://owen.ru/forum/attachment.php?attachmentid=71196&stc=1&d=1698397448
То что приходит:
https://owen.ru/forum/attachment.php?attachmentid=71197&stc=1&d=1698397460

Подозреваю, что между ПР-ками я могу гонять только половину от 32-х разрядов и мне это дело нужно разделять или все же я где то накосячил? :)

1exan
27.10.2023, 12:16
Доброго времени суток!

В общем есть две ПР200, первая Slave, вторая соответственно Master, в общем вторая читает битовую маску состояния датчиков которую контролирует первая, проблема в том что если на первой передаются все биты с 1-го по 32-ой, то вторая видит только первую половину, с 1 по 16
Так это выглядит при отладке:
То что уходит:
https://owen.ru/forum/attachment.php?attachmentid=71196&stc=1&d=1698397448
То что приходит:
https://owen.ru/forum/attachment.php?attachmentid=71197&stc=1&d=1698397460

Подозреваю, что между ПР-ками я могу гонять только половину от 32-х разрядов и мне это дело нужно разделять или все же я где то накосячил? :)

А в свойствах этих переменных в мастере и слейве указали, что надо писать/читать 2 регистра, а не 1 (как по умолчанию)?

Traveller
27.10.2023, 12:34
Ну как бы да, там 2 регистра читаются, эта настойка в мастере, в слейве там этого нет...
https://owen.ru/forum/attachment.php?attachmentid=71198&stc=1&d=1698399305

kondor3000
27.10.2023, 13:03
Ну как бы да, там 2 регистра читаются, эта настойка в мастере, в слейве там этого нет...
https://owen.ru/forum/attachment.php?attachmentid=71198&stc=1&d=1698399305

В слейве нельзя поставить 2 регистра сразу, надо взять 2 регистра по отдельности с собрать их в целочисленную 32 битную переменную. 71200
Либо передавать две 16 битные маски и принимать их

Traveller
27.10.2023, 13:22
Слейв не может читать 2 регистра сразу, надо прочитать 2 регистра по отдельности с собрать их в целочисленную 32 битную переменную. 71200
Либо передавать две 16 битные маски и принимать ихЯ чет ничего не понимаю, слейв же не читает, читает мастер, что записано в слейве, ладно я к словам придираюсь, прошу прощения, в общем я понял, я могу передать только по 16 бит по очереди, а не 32 бита сразу, хотя с модулями вывода работает и сразу 32 бита... :)
В принципе я выкрутился по другому, эти 7 значений (не подразумевается, что они смогут срабатывать сразу по несколько) упаковал в двоичную маску, а ее уже считываю, как раз все уместилось... :)
https://owen.ru/forum/attachment.php?attachmentid=71201&stc=1&d=1698402067
https://owen.ru/forum/attachment.php?attachmentid=71202&stc=1&d=1698402099

Спасибо за помощь! :)

senkos
27.10.2023, 15:40
Доброго дня всем!
Вопрос про ПИД регулятор из библиотеки Pid_Regulators.lib.
Используется для регулировки давления воздуха с помощью задвижки типа МЭО.
Использую два ФБ: PID_FUNCTION и VALVE_REG_NO_POS

Вот такая проблема, почему то когда давление уставки равно давлению измеренному то ФБ управления задвижкой VALVE_REG_NO_POS постоянно выдает поочередные сигналы на открытие и закрытие через 3 секунды (это время в настройках указано как - Минимальное время остановки, сек)

Когда система отрегулирована и показания не меняются зачем он посылает постоянные короткие сигналы на открытие и закрытие которые не влияют на положение задвижки даже, но сработка реле каждые 3 секунды ушатает контакты?

capzap
27.10.2023, 15:47
Доброго дня всем!
Вопрос про ПИД регулятор из библиотеки Pid_Regulators.lib.
Используется для регулировки давления воздуха с помощью задвижки типа МЭО.
Использую два ФБ: PID_FUNCTION и VALVE_REG_NO_POS

Вот такая проблема, почему то когда давление уставки равно давлению измеренному то ФБ управления задвижкой VALVE_REG_NO_POS постоянно выдает поочередные сигналы на открытие и закрытие через 3 секунды (это время в настройках указано как - Минимальное время остановки, сек)

Когда система отрегулирована и показания не меняются зачем он посылает постоянные короткие сигналы на открытие и закрытие которые не влияют на положение задвижки даже, но сработка реле каждые 3 секунды ушатает контакты?

DBF чему равно, пробовали увеличить?

IVM
27.10.2023, 16:23
Доброго дня всем!
Вопрос про ПИД регулятор из библиотеки Pid_Regulators.lib.
Используется для регулировки давления воздуха с помощью задвижки типа МЭО.
Использую два ФБ: PID_FUNCTION и VALVE_REG_NO_POS

Вот такая проблема, почему то когда давление уставки равно давлению измеренному то ФБ управления задвижкой VALVE_REG_NO_POS постоянно выдает поочередные сигналы на открытие и закрытие через 3 секунды (это время в настройках указано как - Минимальное время остановки, сек)

Когда система отрегулирована и показания не меняются зачем он посылает постоянные короткие сигналы на открытие и закрытие которые не влияют на положение задвижки даже, но сработка реле каждые 3 секунды ушатает контакты?

Гистерезис надо пошире задать.

Валенок
27.10.2023, 16:34
Гистерезис надо пошире задать.
если Вы имели ввиду DBF - то выше Capzap предложил, если нет - то гистерезиса здесь нет.

Виктор74
27.10.2023, 19:05
Добрый день. Делаю проект на ПЛК, 160М мастер плюс блоки расширения. Локальная сеть работает по протоколу Modbus RTU. По Modbus TCP подключена панель оператора ONI, ПЛК - слейв. Сначала был сделан алгоритм управления оборудованием, отлажен с помощью визуализации. Проблемы возникли после конфигурирования (см. скриншот) Не могу понять в чем дело, в алгоритме нет переменных с объявлением «WORD».
Программа написана на CFC.
По ссылке файл алгоритма. Хотелось бы услышать критику по поводу структуры алгоритма. Т.е. алгоритм состоит из нескольких POU, для каждой технологической группы своя программа, головная программа поочередно вызывает соответствующий POUи не вызовет ли это проблем при организации коммуникаций?
https://cloud.mail.ru/public/LS54/EQitCrY5q

1exan
27.10.2023, 19:31
Добрый день. Делаю проект на ПЛК, 160М мастер плюс блоки расширения. Локальная сеть работает по протоколу Modbus RTU. По Modbus TCP подключена панель оператора ONI, ПЛК - слейв. Сначала был сделан алгоритм управления оборудованием, отлажен с помощью визуализации. Проблемы возникли после конфигурирования (см. скриншот) Не могу понять в чем дело, в алгоритме нет переменных с объявлением «WORD».
Программа написана на CFC. По коду и тексту ошибки не могу найти конкретное место в программе. Конфигуратор выдает код ошибки и цифру в скобках, можно ли по ней идентифицировать место ошибки?
По ссылке файл алгоритма. Хотелось бы услышать критику по поводу структуры алгоритма. Т.е. алгоритм состоит из нескольких POU, для каждой технологической группы своя программа, головная программа поочередно вызывает соответствующий POUи не вызовет ли это проблем при организации коммуникаций?
https://cloud.mail.ru/public/LS54/EQitCrY5q

Тыкайте в ошибку. Выделяется переменная/блок. Увидеть трудно, но возможно.
71211


71209


71210


Обычно вызов нескольких отдельных программ реализуется через "Конфигурацию задач". Если в одну задачу в вашем порядке добавить ваши программы работать будет так-же.
Коммуникациям, организованным через конфигурацию вообще помешать трудно

kondor3000
27.10.2023, 19:50
Добрый день. Делаю проект на ПЛК, 160М мастер плюс блоки расширения. Локальная сеть работает по протоколу Modbus RTU. По Modbus TCP подключена панель оператора ONI, ПЛК - слейв. Сначала был сделан алгоритм управления оборудованием, отлажен с помощью визуализации. Проблемы возникли после конфигурирования (см. скриншот) Не могу понять в чем дело, в алгоритме нет переменных с объявлением «WORD».
Программа написана на CFC.
По ссылке файл алгоритма. Хотелось бы услышать критику по поводу структуры алгоритма. Т.е. алгоритм состоит из нескольких POU, для каждой технологической группы своя программа, головная программа поочередно вызывает соответствующий POUи не вызовет ли это проблем при организации коммуникаций?
https://cloud.mail.ru/public/LS54/EQitCrY5q

На скринах ваши ошибки,
нет соединений 4 штуки, выходы надо оттянуть и увидите 71212 переменная Real присвоена в переменную WORD71213

Виктор74
27.10.2023, 20:55
Спасибо за ответ, действительно, все просто.

senkos
28.10.2023, 00:23
DBF чему равно, пробовали увеличить?

DBF - зона нечувствительности задвижки.
В данном случае она у меня равна нулю.
Рассказываю почему так сделал:
- если выставляю DBF любое число отличное от нуля то исчезает эта проблема фиктивных поочередных сигналов на LESS и MORE но появляется другая еще более опасная.
Например выставили DBF = 1%
Все работает, пид регулирует.
Но в определенный момент когда давление уходит ниже уставки и при этом значение IN_VAL было меньше DBF то не происходит полного закрытия задвижки вообще и получается провал. Когда IN_VAL больше DBF то все работает.
Тестировал несколько дней и даже заново переписал код.

capzap
28.10.2023, 08:37
DBF - зона нечувствительности задвижки.
В данном случае она у меня равна нулю.
Рассказываю почему так сделал:
- если выставляю DBF любое число отличное от нуля то исчезает эта проблема фиктивных поочередных сигналов на LESS и MORE но появляется другая еще более опасная.
Например выставили DBF = 1%
Все работает, пид регулирует.
Но в определенный момент когда давление уходит ниже уставки и при этом значение IN_VAL было меньше DBF то не происходит полного закрытия задвижки вообще и получается провал. Когда IN_VAL больше DBF то все работает.
Тестировал несколько дней и даже заново переписал код.
Ну это же не проблема, у позиционеров даже не аппаратном уровне есть параметр отсечки в граничных областях, чтоб не подтравливало если оборудование изношено. В этом случае тоже можно решить вопрос подачей дополнительного сигнала на закрытие если значение регулятора находится между нулем и dbf
ЗЫ или селектор поставить на dbf если вход ниже трёх процентов например

senkos
29.10.2023, 11:42
В этом случае тоже можно решить вопрос подачей дополнительного сигнала на закрытие если значение регулятора находится между нулем и dbf


не подскажете, каким образом или на какой вход подать сигнал на "дозакрытие"? Например реальная ситуация когда DBF = 3% то при вышеописанном рассогласовании вход уже равен 0 положению задвижки, но задвижка при этом приоткрыта. Программа думает что клапан закрыт и никаких действий не предпринимает, а по факту чуть приоткрыта задвижка. Тогда давление идет ниже уставки и ПИД уже не реагирует.

capzap
29.10.2023, 11:56
не подскажете, каким образом или на какой вход подать сигнал на "дозакрытие"? Например реальная ситуация когда DBF = 3% то при вышеописанном рассогласовании вход уже равен 0 положению задвижки, но задвижка при этом приоткрыта. Программа думает что клапан закрыт и никаких действий не предпринимает, а по факту чуть приоткрыта задвижка. Тогда давление идет ниже уставки и ПИД уже не реагирует.

ну как нибудь так _PID.DBF := SEL(G:=_PID.POS > 4.0, IN0 := 0.0, IN1 := 3.0);

senkos
29.10.2023, 12:44
ну как нибудь так _PID.DBF := SEL(G:=_PID.POS > 4.0, IN0 := 0.0, IN1 := 3.0);

Если положение задвижки меньше или равно 4 то DBF=0
Но когда DBF=0 тогда появляются эти поочередные срабатывания LESS и MORE, от которых я и хочу избавиться. Таким образом DBF=0 недопустимо при уравновешенной системе ((
На задвижку сигнал через ФБ не подать напрямую, значит получается нужно уже своим кодом обходить ФБ управления задвижкои и подавать сигнал на выходы ПЛК на принудительное дозакрытие когда _PID.POS < _PID.DBF

capzap
29.10.2023, 12:56
Если положение задвижки меньше или равно 4 то DBF=0
Но когда DBF=0 тогда появляются эти поочередные срабатывания LESS и MORE, от которых я и хочу избавиться. Таким образом DBF=0 недопустимо при уравновешенной системе ((
На задвижку сигнал через ФБ не подать напрямую, значит получается нужно уже своим кодом обходить ФБ управления задвижкои и подавать сигнал на выходы ПЛК на принудительное дозакрытие когда _PID.POS < _PID.DBF

у Вас рабочий диапазон сколько процентов? Если исполнительный механизм закрывается полностью чтоб пытаться поддержать давление согласно уставке, значит управляющий сигнал, один из, всё равно активирован и изменение DBF на него ни как не должно влиять

senkos
29.10.2023, 13:11
у Вас рабочий диапазон сколько процентов? Если исполнительный механизм закрывается полностью чтоб пытаться поддержать давление согласно уставке, значит управляющий сигнал, один из, всё равно активирован и изменение DBF на него ни как не должно влиять

Уставка выставлена 6.0, допустимые отклонения 5.8-6.2 но они нигде не прописываются.
Сейчас работает так что при давлении 6.0 сигнал на вход равен 0 (то есть задвижка закрывается полностью), как только становится 6.1 то задвижка открывается в зависимости от пропорциональной составляющей.

capzap
29.10.2023, 13:28
Уставка выставлена 6.0, допустимые отклонения 5.8-6.2 но они нигде не прописываются.
Сейчас работает так что при давлении 6.0 сигнал на вход равен 0 (то есть задвижка закрывается полностью), как только становится 6.1 то задвижка открывается в зависимости от пропорциональной составляющей.

ну пока ни чего не изменилось, не вижу повода не использовать предложенное, только цифры поменять чтоб соответствовало конкретной установке

senkos
29.10.2023, 13:33
ну пока ни чего не изменилось, не вижу повода не использовать предложенное, только цифры поменять чтоб соответствовало конкретной установке

Спасибо! Завтра проверю на реальной установке работу.

Валенок
29.10.2023, 14:08
_PID.POS < _PID.DBF
А причем тут ПИД ? VALVE_REG_NO_POS вроде как просто эмулятор положения, не ?

senkos
29.10.2023, 18:31
А причем тут ПИД ? VALVE_REG_NO_POS вроде как просто эмулятор положения, не ?

по-моему тут условное название, понятно что речь идет о ФБ заслонки VALVE_REG_NO_POS и вход у него это выход с пид-регулятора.

Millyvolt2
30.10.2023, 20:39
Здравствуйте!

У меня задача осуществлять логирование данных на флешку, как бы лог работы установки с временными метками.
Пробовал модуль Archiver, работает, но функционал крайне скуден.

Получше с библиотекой OwenLibFileAsync.lib, но при её использовании возникла проблема - в режиме отладки данные на флешку пишутся, а при запуске ПЛК в RUN флешка как будто подключается (сужу по морганию диода на ней), но файл не пишется вообще.

Может я что-то упустил в настройках проекта, например?

Millyvolt2
31.10.2023, 21:16
Если что, код архивирования

С русским проблема в кодсисе или на форуме)



(* &#206;&#242;&#235;&#224;&#226;&#235;&#232;&#226;&#224;&#242;&#252; &#232; &#231;&#224;&#239;&#232;&#241;&#251;&#226;&#224;&#242;&#252;
&#226; retain &#238;&#242;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#232; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#244;&#235;&#229;&#248;&#234;&#232; *)



(* &#215;&#242;&#229;&#237;&#232;&#229; &#242;&#229;&#234;&#243;&#249;&#232;&#245; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#232; &#228;&#224;&#242;&#251; *)

TimeAndDate.Day:=0;
TimeAndDate.DayOfWeek:=0;
TimeAndDate.dwHighMsec:=0;
TimeAndDate.dwLowMSecs:=0;
TimeAndDate.Milliseconds:=0;
TimeAndDate.Minute:=0;
TimeAndDate.Second:=0;
TimeAndDate.Hour:=0;
TimeAndDate.Year:=0;
TimeAndDate.Month:=0;
Sys_time.ulHigh:=0;
Sys_time.ulLow:=0;

GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);


IF today <> TimeAndDate.Day THEN (*&#229;&#241;&#235;&#232; &#237;&#224;&#241;&#242;&#243;&#239;&#232;&#235; &#237;&#238;&#226;&#251;&#233; &#228;&#229;&#237;&#252;, &#242;&#238; &#244;&#238;&#240;&#236;&#232;&#240;&#243;&#229;&#236; &#237;&#238;&#226;&#251;&#233; &#244;&#224;&#233;&#235; &#241; &#237;&#238;&#226;&#251;&#236; &#232;&#236;&#229;&#237;&#229;&#236; &#228;&#224;&#242;&#251;*)
name_of_file:= CONCAT(pref , UINT_TO_STRING(TimeAndDate.Day));
name_of_file:= CONCAT(name_of_file , '.');
name_of_file:= CONCAT(name_of_file , UINT_TO_STRING(TimeAndDate.Month));
name_of_file:= CONCAT(name_of_file , '.');
name_of_file:= CONCAT(name_of_file , UINT_TO_STRING(TimeAndDate.Year));
name_of_file:= CONCAT(name_of_file , '.csv');
today:= TimeAndDate.Day;
need_new_header:= TRUE; (*&#228;&#224;&#235;&#229;&#229; &#226; &#237;&#238;&#226;&#238;&#236; &#244;&#224;&#233;&#235;&#229; &#237;&#229;&#238;&#225;&#245;&#238;&#228;&#232;&#236;&#238; &#225;&#243;&#228;&#229;&#242; &#241;&#238;&#231;&#228;&#224;&#242;&#252; "&#248;&#224;&#239;&#234;&#243;" &#224;&#240;&#245;&#232;&#226;&#224;*)
END_IF

IF write_log = TRUE THEN
IF need_new_header THEN
header:= CONCAT( '', '&#196;&#224;&#242;&#224;');
header:= CONCAT( header, ';');
header:= CONCAT( header, '&#194;&#240;&#229;&#236;&#255;');
header:= CONCAT( header, ';');
header:= CONCAT( header, '$0A');
ELSE (* &#200;&#237;&#224;&#247;&#229; &#228;&#238;&#231;&#224;&#239;&#232;&#241;&#251;&#226;&#224;&#229;&#236; &#226; (&#241;&#229;&#227;&#238;&#228;&#237;&#255;&#248;&#237;&#232;&#233;) &#244;&#224;&#233;&#235; *)
header:= CONCAT('' , UINT_TO_STRING(TimeAndDate.Day));
header:= CONCAT( header, '.');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Month));
header:= CONCAT( header, '.');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Year));
header:= CONCAT( header, ';');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Hour));
header:= CONCAT( header, ':');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Minute));
header:= CONCAT( header, ':');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Second));
header:= CONCAT( header, ';');
(* &#196;&#224;&#235;&#229;&#229; - &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#251;&#229; *)

header:= CONCAT( header, ';');
header:= CONCAT( header, '$0A');
END_IF
END_IF (* write_log = TRUE*)


(* &#215;&#197;&#202;&#192;&#210;&#220; USB &#239;&#238; &#242;&#224;&#233;&#236;&#229;&#240;&#243; &#224; &#237;&#229;
&#239;&#238;&#241;&#242;&#238;&#255;&#237;&#237;&#238; *)

IF usb_check_connection = TRUE THEN
(* &#207;&#240;&#238;&#226;&#229;&#240;&#234;&#224; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#239;&#238; USB *)
usb_connection:= GetUSBSerial(0, ADR(buf));
IF usb_connection = 0 THEN
(*&#215;&#242;&#229;&#237;&#232;&#229; &#241;&#229;&#240;&#232;&#233;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224; &#239;&#240;&#238;&#248;&#235;&#238; &#243;&#241;&#239;&#229;&#248;&#237;&#238;*)
(* file_name:= 'usb:mylogfile.txt'; *)
(* file_st:= File_open_start; *)

usb_check_connection:= FALSE;

ELSIF usb_connection = -1 THEN
; (* &#211;&#241;&#242;&#240;&#238;&#233;&#241;&#242;&#226;&#238; USB &#237;&#229; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#238; *)
ELSIF usb_connection = -2 THEN
; (*&#215;&#242;&#229;&#237;&#232;&#229; &#241;&#229;&#240;&#232;&#233;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224; &#239;&#240;&#238;&#232;&#231;&#238;&#248;&#235;&#238; &#241; &#238;&#248;&#232;&#225;&#234;&#238;&#233;*)
END_IF
END_IF (* usb_check_connection = TRUE *)


IF write_log = TRUE AND usb_check_connection = FALSE THEN
IF file_opened = FALSE THEN
file_st:= File_open_start;
ELSE
file_st:= File_write_start;
END_IF
END_IF


CASE file_st OF
File_lazy:
(* &#199;&#228;&#229;&#241;&#252; &#240;&#229;&#224;&#235;&#232;&#231;&#238;&#226;&#224;&#242;&#252;
&#239;&#229;&#240;&#232;&#238;&#228;&#232;&#247;&#229;&#241;&#234;&#232;&#229; &#239;&#238;&#239;&#251;&#242;&#234;&#232; &#238;&#242;&#234;&#240;&#251;&#242;&#252; USB &#239;&#238;&#240;&#242; &#239;&#238; &#242;&#224;&#233;&#236;&#229;&#240;&#243;*)
;
File_open_start:
res:= OwenFileOpenAsync(name_of_file, 'a', ADR(f_handle));
write_log:= FALSE;
IF res = ASYNC_WORKING THEN
file_st:= File_open_check;
END_IF
File_open_check:
res:= OwenFileOpenAsync(name_of_file, 'a', ADR(f_handle));
IF res = ASYNC_DONE THEN
IF f_handle <> 0 THEN
file_st:= File_write_start;
file_opened:= TRUE;
END_IF
END_IF
File_write_start:
res:= OwenFileWriteAsync( f_handle, ADR(header), LEN(header), ADR(wr_result));
write_log:= FALSE;
IF res = ASYNC_WORKING THEN
file_st:= File_write_check;
END_IF
File_write_check:
res:= OwenFileWriteAsync( f_handle, ADR(header), LEN(header), ADR(wr_result));
IF res = ASYNC_DONE THEN
IF wr_result = LEN(header) THEN
need_new_header:= FALSE;
file_st:= File_end;
END_IF
END_IF
File_end:

(* &#205;&#192;&#228;&#238; &#231;&#224;&#234;&#240;&#251;&#226;&#224;&#242;&#252; &#244;&#224;&#233;&#235;? *)

;
END_CASE

west
31.10.2023, 23:01
С русским проблема в кодсисе или на форуме)
нет проблем, пробуйте:


(*это комментарий на русском*)

(*раскладка клавиатуры ТОЛЬКО RU:
1)при копировании кода с CDS;
2)при вставке этого кода в браузере.*)


иначе получите:


(*&#253;&#242;&#238; &#234;&#238;&#236;&#236;&#229;&#237;&#242;&#224;&#240;&#232;&#233; &#237;&#224; &#240;&#243;&#241;&#241;&#234;&#238;&#236;*)

(*&#240;&#224;&#241;&#234;&#235;&#224;&#228;&#234;&#224; &#234;&#235;&#224;&#226;&#232;&#224;&#242;&#243;&#240;&#251; &#210;&#206;&#203;&#220;&#202;&#206; RU:
1)&#239;&#240;&#232; &#234;&#238;&#239;&#232;&#240;&#238;&#226;&#224;&#237;&#232;&#232; &#234;&#238;&#228;&#224; &#241; CDS;
2)&#239;&#240;&#232; &#226;&#241;&#242;&#224;&#226;&#234;&#229; &#253;&#242;&#238;&#227;&#238; &#234;&#238;&#228;&#224; &#226; &#225;&#240;&#224;&#243;&#231;&#229;&#240;&#229;.*)

Millyvolt2
01.11.2023, 00:19
Ладно, я понял, вопрос не для новичков.

А если так: в чем может быть разница при запуске программы с ноутбука, подключенного по Ethernet к ПЛК110[М02] в режиме отладки и запуске ПЛК в режиме RUN?

senkos
01.11.2023, 09:35
Здравствуйте! Не могу понять почему функция P_izmer_pid := ROUND(P_izmer_pid, 2); работает не всегда.
На скринах видно, что в какие то циклы значение округляется до 2 знаков после точки, а в некоторые бывает что не округляется, с чем это связано?
Функция не лежит в условных операторах и выполняется при каждом цикле по идее.7127771278

kondor3000
01.11.2023, 09:41
Ладно, я понял, вопрос не для новичков.

А если так: в чем может быть разница при запуске программы с ноутбука, подключенного по Ethernet к ПЛК110[М02] в режиме отладки и запуске ПЛК в режиме RUN?

Разницы не должно быть, если она есть, возможно вы не создали загрузочный проект в ПЛК.

kondor3000
01.11.2023, 09:48
Здравствуйте! Не могу понять почему функция P_izmer_pid := ROUND(P_izmer_pid, 2); работает не всегда.
На скринах видно, что в какие то циклы значение округляется до 2 знаков после точки, а в некоторые бывает что не округляется, с чем это связано?
Функция не лежит в условных операторах и выполняется при каждом цикле по идее.7127771278

Думаю, что тут проблема не в округлении, а в самом числе REAL, таких косяков с ним довольно много.
Советую округлять не в процессе расчёта, а уже при выводе на панель или визуализацию.
Или попробуйте импортировать такой ФБ

Millyvolt2
01.11.2023, 10:44
Разницы не должно быть, если она есть, возможно вы не создали загрузочный проект в ПЛК.

я создаю загрузочный проект, у меня же всё остальное работает, при запуске ПЛК в режиме RUN

Иван Силкин
01.11.2023, 10:48
Добрый день!
Имеется ПЛК110-24.32.Р-М и модуль аналоговых входов МВ210-101. Между собой ПЛК и модуль входов общаются по Modbus TCP, при этом ПЛК - master, а модуль - slave, если я правильно понимаю. Хочу получать и передавать данные на ПЛК с WinCC v7.5 через тот же Modbus TCP, но в этом случае ПЛК получается должен быть slave.
Будет ли это работать, если в "Конфигурации ПЛК" одновременно добавить Modbus (master) и Modbus (slave)? Или мне нужен другой модуль входов (например, МВ110 с интерфейсом RS-485), который будет общаться с ПЛК по Modbus RTU (здесь ПЛК - master), а уже WinCC c ПЛК - по Modbus TCP (здесь ПЛК - slave)?

kondor3000
01.11.2023, 11:01
Добрый день!
Имеется ПЛК110-24.32.Р-М и модуль аналоговых входов МВ210-101. Между собой ПЛК и модуль входов общаются по Modbus TCP, при этом ПЛК - master, а модуль - slave, если я правильно понимаю. Хочу получать и передавать данные на ПЛК с WinCC v7.5 через тот же Modbus TCP, но в этом случае ПЛК получается должен быть slave.
Будет ли это работать, если в "Конфигурации ПЛК" одновременно добавить Modbus (master) и Modbus (slave)? Или мне нужен другой модуль входов (например, МВ110 с интерфейсом RS-485), который будет общаться с ПЛК по Modbus RTU (здесь ПЛК - master), а уже WinCC c ПЛК - по Modbus TCP (здесь ПЛК - slave)?

Добавить отдельно Мастер и слейв можно, если по ТСР слейв не будет работать по 502 порту, сделайте 503 порт.
Переменные придётся скопировать из мастера в слейв с другими именами

Тимур Назарбоев
01.11.2023, 11:02
Добрый день!
Имеется ПЛК110-24.32.Р-М и модуль аналоговых входов МВ210-101. Между собой ПЛК и модуль входов общаются по Modbus TCP, при этом ПЛК - master, а модуль - slave, если я правильно понимаю. Хочу получать и передавать данные на ПЛК с WinCC v7.5 через тот же Modbus TCP, но в этом случае ПЛК получается должен быть slave.
Будет ли это работать, если в "Конфигурации ПЛК" одновременно добавить Modbus (master) и Modbus (slave)? Или мне нужен другой модуль входов (например, МВ110 с интерфейсом RS-485), который будет общаться с ПЛК по Modbus RTU (здесь ПЛК - master), а уже WinCC c ПЛК - по Modbus TCP (здесь ПЛК - slave)?

Здравствуйте, да, ПЛК110 по сети ethernet может быть как мастером , так и слейвом одновременно. Вы можете подключить модуль и вашу программу к нему.

Иван Силкин
01.11.2023, 11:06
Добавить отдельно Мастер и слейв можно, если по ТСР слейв не будет работать по 502 порту, сделайте 503 порт.
Переменные придётся скопировать из мастера в слейв с другими именами


Здравствуйте, да, ПЛК110 по сети ethernet может быть как мастером , так и слейвом одновременно. Вы можете подключить модуль и вашу программу к нему.

Спасибо, буду пробовать!

ЕгорАА
02.11.2023, 10:25
Помогите с вопросом
ПР200
На экран вывожу переменную результат целочисленную и переменную порог тоже целочисленную, это Бары давление.
При срабатывании порога переключается клапан.
Вопрос про редактирование переменной порог, можно ли сделать редактирование не по единице а сразу по 5, в настройках не нашел такого и в интернете тоже. ЧТобы не зажимать кнопку и ждать подолгу, а сразу переменную увеличить на 5,10,15

kondor3000
02.11.2023, 10:44
Помогите с вопросом
ПР200
На экран вывожу переменную результат целочисленную и переменную порог тоже целочисленную, это Бары давление.
При срабатывании порога переключается клапан.
Вопрос про редактирование переменной порог, можно ли сделать редактирование не по единице а сразу по 5, в настройках не нашел такого и в интернете тоже. ЧТобы не зажимать кнопку и ждать подолгу, а сразу переменную увеличить на 5,10,15

Вы пишите не в тот раздел, здесь ПЛК (среда CoDeSys V2.3), вам нужно писать в раздел Программируемые реле (вопросы для новичков) или Овен Лоджик.
По вопросу сделайте булевую переменную, которая управляет SEL, к нему подключите +5 и по включении переменной, у вас будет прибавляться по 5.

Cs-Cs
02.11.2023, 13:07
можно ли сделать редактирование не по единице а сразу по 5, в настройках не нашел такого и в интернете тоже. ЧТобы не зажимать кнопку и ждать подолгу, а сразу переменную увеличить на 5,10,15
Вопрос НЕ по теме - но в ПР200 это делается так: зажимаешь Alt + Стрелки (Влево или Вправо) и выбираешь разряд, который меняется.

Millyvolt2
09.11.2023, 19:24
Не получается настроить тренд визуализации в режиме онлайн подключения к ПЛК110-30[M02]

Тренды же работают?)

71465714667146771468714697147071471

kondor3000
09.11.2023, 20:34
Не получается настроить тренд визуализации в режиме онлайн подключения к ПЛК110-30[M02]
Тренды же работают?)


Работают, для примера вывел секунды красным и минуты синим, только онлайн 71474
Настраивать надо тут, гориз. ось71475 верт. ось 71476переменные 71477Тип линии 71478

Millyvolt2
09.11.2023, 22:07
Работают, для примера вывел секунды красным и минуты синим, только онлайн

Спасибо, завтра опробую.

Не подскажете, чем отличаются принципиально тренды и трассировка (когда она работала ещё) ?
Есть ли возможность записывать тренды в файл на флешку подключенную к ПЛК? (у нас ПЛК110-30[M02]), но это не в онлайн режиме, а когда ПЛК запущен нормально автономно в RUN

kondor3000
09.11.2023, 23:08
Спасибо, завтра опробую.

Не подскажете, чем отличаются принципиально тренды и трассировка (когда она работала ещё) ?
Есть ли возможность записывать тренды в файл на флешку подключенную к ПЛК? (у нас ПЛК110-30[M02]), но это не в онлайн режиме, а когда ПЛК запущен нормально автономно в RUN

Она работает, только её надо настроить и запустить 71481
Трассировка больше подходит для быстрых процессов, максимум 1024 семпла, это на пол экрана 5000 ms, , больше растянуть нельзя.
на скрине те же сек. и мин., делённые на 10 и переведены в REAL ( просто для примера).
На флешку с ПЛК тренды не записывал, поэтому не знаю, наверное можно.
По идее, можно архивировать переменные, а потом по ним построить график в Exel.

Делал давно уже проект, у меня тренды архивировались на панели СП310, с возможностью просмотра на панели и вывода значений на флешку, там всё проще и удобней.

Millyvolt2
10.11.2023, 11:28
Она работает, только её надо настроить и запустить 71481
Трассировка больше подходит для быстрых процессов, максимум 1024 семпла, это на пол экрана 5000 ms, , больше растянуть нельзя.
на скрине те же сек. и мин., делённые на 10 и переведены в REAL ( просто для примера).
На флешку с ПЛК тренды не записывал, поэтому не знаю, наверное можно.
По идее, можно архивировать переменные, а потом по ним построить график в Exel.

Делал давно уже проект, у меня тренды архивировались на панели СП310, с возможностью просмотра на панели и вывода значений на флешку, там всё проще и удобней.


Трассировка у меня не заработала, написал сюда пост, потом увидел аналогичные посты на форуме, и ответы на них что трассировка не поддерживается более овном.
Архивирование на флешку у меня настроено, но там период секунды, а переменные отслеживать нужно с периодом в миллисекундах

Millyvolt2
10.11.2023, 12:25
Она работает, только её надо настроить и запустить
Трассировка больше подходит для быстрых процессов, максимум 1024 семпла, это на пол экрана 5000 ms, , больше растянуть нельзя.


Тренды не работают с миллисекундами, даже с сотнями мс не получилось настроить.

А у вас трассировка работает?
Если работает скиньте плз настройки

kondor3000
10.11.2023, 15:28
Тренды не работают с миллисекундами, даже с сотнями мс не получилось настроить.

А у вас трассировка работает?
Если работает скиньте плз настройки

Вот скрин, настроить число и шаг семплов, добавить переменные внизу. 71492
После настройки вывести переменные в Перо1, Перо 2 и т. д. В настройках начать трассировку и автоматическая трассировка.

Число и шаг семплов можно менять, растягивая время. Запускать можно без триггера и по триггеру,
но вот считать записанное, как раз и не получается.

Millyvolt2
10.11.2023, 16:35
Вот скрин, настроить число и шаг семплов, добавить переменные внизу.
После настройки вывести переменные в Перо1, Перо 2 и т. д. В настройках начать трассировку и автоматическая трассировка.


Вроде делаю так же, но одни нули опять в трассировке. При этом отслеживаемые значения всегда не нулевые, на последней картинке видно что ненулевые

715007150171502

kondor3000
10.11.2023, 16:41
Вроде делаю так же, но одни нули опять в трассировке. При этом отслеживаемые значения всегда не нулевые, на последней картинке видно что ненулевые


У меня ПЛК для тестирования старые, без [M02], может поэтому? И ещё у меня переменные меняются скачком, а у вас похоже стоят на месте.

Millyvolt2
10.11.2023, 17:00
У меня ПЛК для тестирования старые, без [M02], может поэтому? И ещё у меня переменные меняются скачком, а у вас похоже стоят на месте.

переменные немного меняются, тк это температуры

да, на М02 скорее всего не работает уже трассировка

Millyvolt2
14.11.2023, 13:35
Есть способ посмотреть размер оставшейся памяти на ПЛК 110-30 [M02]?
При заливке загрузочного проекта он занимает 146 кб

Millyvolt2
14.11.2023, 14:55
Не хочет компилить переменную размером 1Мб, можно сделать вывод что величина свобоной памяти у меня сейчас от 100 Кб до 1 Мб

результат компиляции:
71591

Валенок
14.11.2023, 18:20
... переменную размером 1Мб,
Таких тут нет. Но в кучу можно пихнуть до 8М

КСИ
16.11.2023, 16:11
Всем привет. Не соображу как написать в CFC (в ST грамотно не смогу) вот что: я получаю в переменную весовые данные. Нужно взять пять последовательно получаемых значений и усреднить их. затем цикл повторяется.Проблема возникла из за того что Штатный блок из Codesys выдает некорректные значения. а такой метод дает приличное приближение к среднему значению. Понимаю что нужно как-то записывать в массив и при достижении индекса 5 просуммировать значения и поделить на пять но никак не получается грамотно это написать. Пенсионер я да и киповец по образованию.

1exan
16.11.2023, 16:24
Всем привет. Не соображу как написать в CFC (в ST грамотно не смогу) вот что: я получаю в переменную весовые данные. Нужно взять пять последовательно получаемых значений и усреднить их. затем цикл повторяется.Проблема возникла из за того что Штатный блок из Codesys выдает некорректные значения. а такой метод дает приличное приближение к среднему значению. Понимаю что нужно как-то записывать в массив и при достижении индекса 5 просуммировать значения и поделить на пять но никак не получается грамотно это написать. Пенсионер я да и киповец по образованию.

5 последовательных значений - с каким периодом выборки?
Может подойдет блок FT_RMP из oscat?

pkl
16.11.2023, 16:55
Изучайте инструкции типа FIFO. Правда я не знаю есть ли подобное в Codesys.:confused:

МихаилГл
16.11.2023, 17:10
Ещё есть вопрос, 5 значений, потом следующие 5? Или 5, а потом 4 старых и 1 новое, и т.д.?

КСИ
16.11.2023, 17:46
Спасибо, ознакомился с блоком, Я использовал штатный STATISTICS_INT он так-же сглаживает, но из за того что я предварительно фильтрую случайные и не корректные значения,часть их не записывается, поэтому установление времени выборки в блок, сильно влияет на результат, вот я и хочу просто брать выборку из последних пяти правдивых значений и усреднять без привязки ко времени а просто по наличию.

Валенок
16.11.2023, 17:48
... .
Данные приходят как ? бортовой Ai(63/73/160)/модуль(какой) ?
Если модуль - что читаете? Критерии своей фильтрации?

КСИ
16.11.2023, 17:52
Да, получил 5, обсчитал затем сброс и жду следующие 5.

Валенок
16.11.2023, 17:53
Чем среднее скользящее не угодило?

КСИ
16.11.2023, 18:03
Критерий такой, каждое следующее значение меньше предыдущего, не равно 0 и расход в пределах верхней и нижней границ допуска,ну это работает вроде хорошо

КСИ
16.11.2023, 18:06
Я и не хотел ничего переделывать- заставили, ищем способ точнее дозировать компоненты

Валенок
16.11.2023, 18:14
input
value: real;
cnt_average:byte; //1..255
output
average:real;
var
i,j:byte; //byte!
m:array[0..255]of real;
---------
if value = m[i] then
return; //в опу время
end_if

i:=i +1;
m[i]:=value;
cnt_average:=max(1,cnt_average);

average :=0;
for j:=0 to cnt_average - 1 do
average :=average + m[word_to_byte(i-j)];
end_for

average:=average/cnt_average;

делаем prorgram и вставляем евоный квадратик в поле квадратиков
Две палки слева, и одна справа думаю понятно что.

Задумкин Сергей
17.11.2023, 08:32
Добрый день! Подскажите есть ли в 2.3 опция сбросить значения регистров в ноль при потере связи по modbus с устройством по аналогии с codesys 3.5 (работаю только в этой версии, но тут нужно залезть в чужую программу)

Валенок
17.11.2023, 09:06
Добрый день! Подскажите есть ли в 2.3 опция сбросить значения регистров в ноль при потере связи по modbus с устройством по аналогии с codesys 3.5 (работаю только в этой версии, но тут нужно залезть в чужую программу)
Нету за непонятностью хотелки. Я вот считаю что нужно сбрасывать в 23.

1exan
17.11.2023, 09:10
Добрый день! Подскажите есть ли в 2.3 опция сбросить значения регистров в ноль при потере связи по modbus с устройством по аналогии с codesys 3.5 (работаю только в этой версии, но тут нужно залезть в чужую программу)

Штатно - нет

capzap
17.11.2023, 09:43
Добрый день! Подскажите есть ли в 2.3 опция сбросить значения регистров в ноль при потере связи по modbus с устройством по аналогии с codesys 3.5 (работаю только в этой версии, но тут нужно залезть в чужую программу)

В штатном слейве нужно следить за переменными последний прибор и последняя ошибка, а по ним уже принимать решение в коде что обнулить, что активировать

Александр86
22.11.2023, 08:29
Добрый день. Вопрос такой - при объявлении ФБ или структуры необходимо часть переменных сделать retain persistent, а не весь блок. Как это сделать? Пытался пользоваться директивой {nonpersistent} , но что то не работает, по прежнему весь ФБ в retain.
если что - ПЛК 110 М2, версия кодесис 2.3.9.61

Николай Суриков
22.11.2023, 08:41
Ответ - никак. В справке про это четко написано.

Александр86
22.11.2023, 08:48
71787
В документе написано что можно с помощью директивы. С 5-19
Я к тому что может кто смог её использовать и получилось, либо это зависит от ПЛК либо что-то еще надо настроить что не описано. Либо - в мануале - ошибка или неверный перевод.

Николай Суриков
22.11.2023, 11:36
Так retain или persistent или retain persistent?

senkos
22.11.2023, 11:45
Добрый день коллеги!
Продолжение проекта ПЛК110 + МВ110-8ас и String:
считываю с каждого МВ данные в String и присваиваю этот string в структуру struct_original_8AC
На скрине выдает "Х = "Переполнение строки" это нормально или ненормально?
71795

TYPE struct_original_8AC :STRUCT
command : DWORD;
SRD : ARRAY[1..8] OF INT;
Read : ARRAY[1..8,1..3] OF WORD;
x : STRING(15);
END_STRUCT
END_TYPE

По структуре если считать что command равен 1 байту то получается 80 байт, но у меня command в структуре равен DWORD то есть 4 байта. Не пойму как правильно должно быть.

kondor3000
22.11.2023, 12:45
Добрый день коллеги!
Продолжение проекта ПЛК110 + МВ110-8ас и String:
считываю с каждого МВ данные в String и присваиваю этот string в структуру struct_original_8AC
На скрине выдает "Х = "Переполнение строки" это нормально или ненормально?
По структуре если считать что command равен 1 байту то получается 80 байт, но у меня command в структуре равен DWORD то есть 4 байта. Не пойму как правильно должно быть.

По этому поводу уже писал, при работе блоков, все SRD должны быть 0, все Read должны быть числами не равными 0, если есть смещение, то это сразу видно.
На command : DWORD и STRING плевать, они для выравнивания.

У вас на скрине похоже не все датчики подключены, по некоторым SRD не 0, а число как ошибка датчиков.
Так как тип стоит тип INT вместо WORD.
У меня ошибка обрыв датчика показывает 61453, а у вас -4083, а в HEX это 16#F00D - обрыв датчика.

У вас всего должно быть DWORD 4 байта +80 байт = 84 байта
И зачем вам стринг, так и не понял.

senkos
22.11.2023, 13:05
По этому поводу уже писал, при работе блоков, все SRD должны быть 0, все Read должны быть числами не равными 0, если есть смещение, то это сразу видно.
На command : DWORD и STRING плевать, они для выравнивания.

У вас на скрине похоже не все датчики подключены, по некоторым SRD не 0, а число как ошибка датчиков.
Так как тип стоит тип INT вместо WORD, то ошибка не правильно отображается, ещё и с минусом.

Подключены только пара датчиков, показания по ним верные, меня смутило наличие надписи "Переполнение строки" думал мало ли какой перекос у меня.
У меня проблема такая что изначально было сконфигурировано 7шт UMD для семи компрессоров, а по факту оказалось что нужно три и вот когда я удаляю последине 4 шт у меня перестает все работать так как возможно плывут все данные. Массивы и структуры я переделал под 3 компрессора, а вот когда удаляю UMD лишние то все плывет. Причем в Master кроме этих UMD нет ничего.71796



И зачем вам стринг, так и не понял.

В string я же получаю данные от МВ110 и он максимально 80 байт вмещает и чтобы не путаться добавили X[15]: string для удобства, чтобы "один string == один МВ110". Или вы про какой string?
У меня вот так происходит объявление структуры:


original_8AC AT %QB6.1.0 : ARRAY[1..3] OF struct_original_8AC;

kondor3000
22.11.2023, 13:24
Подключены только пара датчиков, показания по ним верные, меня смутило наличие надписи "Переполнение строки" думал мало ли какой перекос у меня.
У меня проблема такая что изначально было сконфигурировано 7шт UMD для семи компрессоров, а по факту оказалось что нужно три и вот когда я удаляю последине 4 шт у меня перестает все работать так как возможно плывут все данные. Массивы и структуры я переделал под 3 компрессора, а вот когда удаляю UMD лишние то все плывет. Причем в Master кроме этих UMD нет ничего.71796



В string я же получаю данные от МВ110 и он максимально 80 байт вмещает и чтобы не путаться добавили X[15]: string для удобства, чтобы "один string == один МВ110". Или вы про какой string

У меня программа на 7 блоков ваша, а подключены 2 блока по факту, все работает ничего не удаляя.

senkos
22.11.2023, 13:29
У меня программа на 7 блоков ваша, а подключены 2 блока по факту, все работает ничего не удаляя.

И у меня работает, но когда я удалю последние 4 UMD то все данные перекашивает - то есть в панели я вижу одни нули. Не могу понять как неподключенные пустые UMD влияют на данные которые идут в сенсорную панель

kondor3000
22.11.2023, 13:38
И у меня работает, но когда я удалю последние 4 UMD то все данные перекашивает - то есть в панели я вижу одни нули. Не могу понять как неподключенные пустые UMD влияют на данные которые идут в сенсорную панель

Кроме UMD надо ещё и структуры выровнять до 3 блоков, где было 1..7 поставить 1..3 в 5 местах71797
У меня все работает и с 3, ничего не съехало.71798

Александр86
22.11.2023, 13:48
Я хотел бы комментария, того кто в теме.
Сохраняемые и постоянные переменные в кодесисе 2.3 не одно и тоже, в отличие о текущей версии 3.5 (объявление persistent уже указывает на энергонезависимость) - это наталкивает на мысль, что директива компилятора работает с обеими областями памяти и не делает между ними разницы. Ведь в справке именно так и написано "энергонезависимая область". Более того в 3.5 есть подобная директива (прагма) {attribute 'no_instance_in_retain'} и там она кое как работает. (правда с ФБ та же беда)
Отсюда - либо опечатка, неверный перевод в мануале CDS 2.3, либо она работает иначе, есть какие-нибудь настройки, либо все зависит от целевой платформы. Вот и интересно - кто то разобрался в этой теме.

senkos
22.11.2023, 14:05
У меня все работает и с 3, ничего не съехало.

По моему все изменил на 3 компрессора, не могли бы вы проверить чего я не учел в коде?
При удалении хоть одного последнего UMD, данные в панели из структуры DATA_for_HMI становятся все по нулям:

IF Active_PID = 1 THEN (*выводим на панель данные по активному пид*)
DATA_for_HMI.P_nominal := pid_struct_1.P_Nominal;
DATA_for_HMI.P_izmerennoe := P_izmer_pid;
DATA_for_HMI.Activ_pid := Active_PID;
DATA_for_HMI.Pid_Out := PID_1.OUT;
DATA_for_HMI.DBF_Actual := GET_DBF._DBF;
DATA_for_HMI.Count_Rele := CTUInst.CV * 4;
DATA_for_HMI.Poz_zadvigki := VALVE_REG1.VALVE_REG_NO_POS.VCURPOS;
DATA_for_HMI.Impuls_Dovodki := VALVE_REG1.VALVE_REG_NO_POS.PUSH_IMP;
DATA_for_HMI.bits2_0_7.0 := VALVE_REG1.VALVE_REG_NO_POS.LESS;
DATA_for_HMI.bits2_0_7.1 := VALVE_REG1.VALVE_REG_NO_POS.MORE;
ELSIF Active_PID = 2 THEN
;
ELSIF Active_PID = 3 THEN
;
END_IF;

kondor3000
22.11.2023, 14:53
По моему все изменил на 3 компрессора, не могли бы вы проверить чего я не учел в коде?
При удалении хоть одного последнего UMD, данные в панели из структуры DATA_for_HMI становятся все по нулям:


На первый взляд всё правильно, разбираться во всём коде времени пока нет.
Советую вам проследить все параметры в программе, возможно при удалении UMD, у вас смещаются прямые адреса типа AT%QD,
которых вы бездумно напихали где не надо. Хотя вам писали адрес делать только один, указание на 1 регистр начала структуры.

senkos
22.11.2023, 15:08
На первый взляд всё правильно, разбираться во всём коде времени пока нет.
Советую вам проследить все параметры в программе, возможно при удалении UMD, у вас смещаются прямые адреса типа AT%QD,
которых вы бездумно напихали где не надо. Хотя вам писали адрес делать только один, указание на 1 регистр начала структуры.

Спасибо огромное, вы очень помогли! Так и есть смещаются адреса при удалении.

senkos
22.11.2023, 22:45
Советую вам проследить все параметры в программе, возможно при удалении UMD, у вас смещаются прямые адреса типа AT%QD,
которых вы бездумно напихали где не надо. Хотя вам писали адрес делать только один, указание на 1 регистр начала структуры.

Поторопился я радоваться ((
Проверил все прописанные адреса на структурах, причем я их в таблицу записываю, все правильно сделано, без накладок.

При добавлении UMD, адресА структур не смещаются. Так же и удаление UMD не влияет на адреса структур так как они идут по адресу QD7… а UMD привязывается к адресам QB6…

kondor3000
23.11.2023, 08:05
Поторопился я радоваться ((
Проверил все прописанные адреса на структурах, причем я их в таблицу записываю, все правильно сделано, без накладок.

При добавлении UMD, адресА структур не смещаются. Так же и удаление UMD не влияет на адреса структур так как они идут по адресу QD7… а UMD привязывается к адресам QB6…

Чудес не бывает, если адреса не смещаются при удалении UMD, то они точно смещаются при уменьшении кол-ва 4BYTE. А их для 3 компрессоров надо меньше намного.
Ну и проверку в эмуляции никто не отменял, с подстановкой чисел.
И ещё после таких сильных изменений, обязательно очистить всё, компилировать всё.

senkos
23.11.2023, 09:55
Чудес не бывает, если адреса не смещаются при удалении UMD, то они точно смещаются при уменьшении кол-ва 4BYTE. А их для 3 компрессоров надо меньше намного.
Ну и проверку в эмуляции никто не отменял, с подстановкой чисел.

Каким же образом могут влиять добавление/удаление UMD из Мастера на Регистры Slave? Адреса у них разные Например QB6.8.0 добавляю в него "Real Input module" QB6.8.0.0 и при этом на скрине видно что перестает писать значение в регистры P_izmer_pid AT %QD7.42.0
71807

Мне всего то нужно добавить еще одну панель ИП320, но теперь ни удалить ни добавить UMD не могу, где же эта паразитная привязка?
Удалил весь код основной программы, оставил только присвоение:


p1^ := original_8AC[1].Read[8,1] * 16#10000 + original_8AC[1].Read[8,2];
P_izmer_pid := all_ai[1].ai[8].value; (*давление измеренное в центральной магистрали*)


Данные в all_ai[1].ai[8].value есть но в P_izmer_pid они не присваиваются. Куда копать, подскажите пожалуйста?

kondor3000
23.11.2023, 10:57
Каким же образом могут влиять добавление/удаление UMD из Мастера на Регистры Slave? Адреса у них разные Например QB6.8.0 добавляю в него "Real Input module" QB6.8.0.0 и при этом на скрине видно что перестает писать значение в регистры P_izmer_pid AT %QD7.42.0
Данные в all_ai[1].ai[8].value есть но в P_izmer_pid они не присваиваются. Куда копать, подскажите пожалуйста?

Могу сказать только одно, у вас не соответствие размера стуруктур, размеру выделенного места в слейве. Вы что то меняете, добавляете, но не учитывая, что и выделенное место тоже надо менять и проверять соответствие. То есть всё делать пошагово, проверяя на залезает ли одна структура на другую.
Кроме того, после сильных изменений, не делаете очистить всё, компилировать всё.

Cs-Cs
23.11.2023, 10:59
Блин, ну НЕ НАДО использовать дохрена прямых адресов!
Я выкладывал то, как делаю я, вот здесь: https://owen.ru/forum/showthread.php?t=38622
а) Собираю всё в ОДНУ структуру с вложенными
б) В конфигурации ПЛК вставляю одну, первую переменную от Slave (которая у тебя "Запасная переменная 0") и её адрес назначаю указателю на структуру.
После этого всё работает "само", и адреса тоже пересчитываются "сами".

senkos
23.11.2023, 11:46
Блин, ну НЕ НАДО использовать дохрена прямых адресов!
Я выкладывал то, как делаю я, вот здесь: https://owen.ru/forum/showthread.php?t=38622
а) Собираю всё в ОДНУ структуру с вложенными
б) В конфигурации ПЛК вставляю одну, первую переменную от Slave (которая у тебя "Запасная переменная 0") и её адрес назначаю указателю на структуру.
После этого всё работает "само", и адреса тоже пересчитываются "сами".

Решил полностью переписать проект, так и сделаю. Спасибо за совет!
Только потом как мне искать адреса регистров в которых лежат эти переменные? Есть какой то программный определитель адреса?

senkos
23.11.2023, 11:49
Кроме того, после сильных изменений, не делаете очистить всё, компилировать всё.

Вот это оказалось всей причиной, благодарю вас!
Сделал очистку и компиляцию и все заработало как надо, правда вскрылись другие моменты, но я их решу уже.
Подскажите что очищает данная Очистка? Почему codesys отправляет в плк грязный код?

kondor3000
23.11.2023, 13:11
Вот это оказалось всей причиной, благодарю вас!
Сделал очистку и компиляцию и все заработало как надо, правда вскрылись другие моменты, но я их решу уже.
Подскажите что очищает данная Очистка? Почему codesys отправляет в плк грязный код?

Всё следует из того, что писал раньше. При больших изменениях новый код накладывается на старый, не удаляя накладки, в вашем случае старую структуру на новую.
Одно дело добавить в конце, что то новое и другое дело менять 7 UMD на 3, где сразу всё новое наложилось на старое.
Лучше почаще делать очистку, чем ломать потом голову, почему не работает. Кстати по поводу очистки, это уже наверно пятый раз написал за всё время.

И ещё не вставляйте большие куски в середину программы, как вы сделали с ПИДами. В случае ошибки, у вас не только новый код не заработает, но и старый в конце может перестать работать. Дописывайте всегда в конце.
Я бы стазу вынес опрос-присвоение структуры COMPRESSOR в новый ФБ или программу, а в пустой PLC_PRG уже писал программу с ПИДами.
Вместо трёх ФБ PID_1, PID_2, PID_3, написал один и сделал 3 экземпляра и вместо 3 структур PID_struct_ взял одну 3 раза.

senkos
23.11.2023, 14:08
Когда все закидываю в одну структуру мне так же нужно следить чтобы тип REAL или DWORD начинались с четного регистра?
Самому нужно выправлять это дополнительными переменными?
Например тут переменная temp_1 выравнивает и уже все REAL начинаются с четных регистров:


STRUCT
(* ОБЩИЕУСТАВКИ ДЛЯ ВСЕХ КОМПРЕССОРОВ *)
temp_1 : WORD; (* Регистр 0 *) (**)
t_ust_1st : WORD; (* Регистр 1 *)
t_ust_2st : WORD; (* Регистр 2 *)
t_ust_oil : WORD; (* Регистр 3 *)
P_ust_1st : REAL; (* Регистр 4-5 *)
P_ust_2st : REAL; (* Регистр 6-7 *)
P_ust_oil_min : REAL; (* Регистр 8-9 *)
P_ust_oil_max : REAL; (* Регистр 10-11 *)
P_ust_water : REAL; (* Регистр 12-13 *)
END_STRUCT

kondor3000
23.11.2023, 15:02
Когда все закидываю в одну структуру мне так же нужно следить чтобы тип REAL или DWORD начинались с четного регистра?
Самому нужно выправлять это дополнительными переменными?
Например тут переменная temp_1 выравнивает и уже все REAL начинаются с четных регистров:

У вас ранее всё разложено по чётным регистрам, добавляя эту структуру, у вас первые 4 WORD (тоже чётное) и далее всё опять по чётным будет.
А вот если было бы 3 WORD, то надо было бы добавить 1 пустой.

Cs-Cs
23.11.2023, 15:20
Решил полностью переписать проект, так и сделаю. Спасибо за совет!
Только потом как мне искать адреса регистров в которых лежат эти переменные? Есть какой то программный определитель адреса?
Программный - нет. Я делал так, как показано в той теме: составил в Экселе табличку, где все адреса расписал и заполнил. И уже п ней программировал панель оператора. На скриншотах в той теме это было.

Валенок
23.11.2023, 18:10
Когда все закидываю в одну структуру мне так же нужно следить чтобы тип REAL или DWORD начинались с четного регистра?
Конкретно здесь (в КДС) можно не следить. Они тут будут с четных всегда - неявные поля напихаются автоматом.
Но совет про явное указание выравнивающих полей дисциплинирует и бонусом облегчит жизнь когда будет скрещивать структуры из разных систем.

senkos
24.11.2023, 10:47
Программный - нет. Я делал так, как показано в той теме: составил в Экселе табличку, где все адреса расписал и заполнил. И уже п ней программировал панель оператора. На скриншотах в той теме это было.

Здравствуйте.
Подскажите пожалуйста, в Slave нужно теперь чтобы все подэлементы били WORD или DWORD для единой структуры? Или как у меня вначале WORD а потом все DWORD тоже будет корректно распределяться? Правда пришлось структуру объявить как QW -> MAIN_STRUCT AT %QW7.1.0 : MAIN_STRUCT;
71839

1exan
24.11.2023, 11:01
Здравствуйте.
Подскажите пожалуйста, в Slave нужно теперь чтобы все подэлементы били WORD или DWORD для единой структуры? Или как у меня вначале WORD а потом все DWORD тоже будет корректно распределяться? Правда пришлось структуру объявить как QW -> MAIN_STRUCT AT %QW7.1.0 : MAIN_STRUCT;
71839

Порядок не важен.
Но когда в структуре постоянно чередуются одно- двух- и четырёх-байтовые переменные, а также другие структуры - уследить за выравниванием и "попасть" в нужную переменную по сети будет трудно

senkos
24.11.2023, 11:40
Порядок не важен.
Но когда в структуре постоянно чередуются одно- двух- и четырёх-байтовые переменные, а также другие структуры - уследить за выравниванием и "попасть" в нужную переменную по сети будет трудно

Вот сейчас с этим и бьюсь, не могу подсчитать правильные номера регистров ((

Например массив структур как распределит переменные по регистрам, сначала первые 12 регистров будут compressors[1], потом 12 регистров compressors[2] итд?

compressors :ARRAY [1..3] OF COMPRESSOR;



TYPE COMPRESSOR :
STRUCT
bSignal1 :BYTE;(*14-0-7; 26-0-7; 38-0-7*)
bSignal2 :BYTE;(*14-8-15; 26-8-15; 38-8-15*)
t_1st :INT;(*15; 27; 39*)
t_2st :INT;(*16; 28; 40*)
t_oil :INT;(*17; 29; 41*)
P_1st :REAL;(*18; 30; 42*)
P_2st :REAL;(*20; 32; 44*)
P_oil :REAL;(*22; 34; 46*)
P_water :REAL;(*24; 36; 48*)
END_STRUCT
END_TYPE


По сути 12 *3 = 36 регистров, у меня так же 18шт DWORD задано, но все же тут получается перекос и следующая переменная хранится в последнем 36-м регистре

capzap
24.11.2023, 11:43
По сути 12 *3 = 36 регистров

а Вы делали SIZEOF на экземпляр струтктуры COMPRESSOR?

1exan
24.11.2023, 11:58
Вот сейчас с этим и бьюсь, не могу подсчитать правильные номера регистров ((

Например массив структур как распределит переменные по регистрам, сначала первые 12 регистров будут compressors[1], потом 12 регистров compressors[2] итд?

compressors :ARRAY [1..3] OF COMPRESSOR;



TYPE COMPRESSOR :
STRUCT
bSignal1 :BYTE;(*14-0-7; 26-0-7; 38-0-7*)
bSignal2 :BYTE;(*14-8-15; 26-8-15; 38-8-15*)
t_1st :INT;(*15; 27; 39*)
t_2st :INT;(*16; 28; 40*)
t_oil :INT;(*17; 29; 41*)
P_1st :REAL;(*18; 30; 42*)
P_2st :REAL;(*20; 32; 44*)
P_oil :REAL;(*22; 34; 46*)
P_water :REAL;(*24; 36; 48*)
END_STRUCT
END_TYPE


По сути 12 *3 = 36 регистров, у меня так же 18шт DWORD задано, но все же тут получается перекос и следующая переменная хранится в последнем 36-м регистре

Скорее всего первые две байтовые переменные займут не 16, а 32 байта (ДВА регистра), итого сначала получится 5 регистров, поэтому для выравнивания перед первым REAL будет пропущен ещё один регистр

kondor3000
24.11.2023, 13:50
Вот сейчас с этим и бьюсь, не могу подсчитать правильные номера регистров ((

Например массив структур как распределит переменные по регистрам, сначала первые 12 регистров будут compressors[1], потом 12 регистров compressors[2] итд?

compressors :ARRAY [1..3] OF COMPRESSOR;

По сути 12 *3 = 36 регистров, у меня так же 18шт DWORD задано, но все же тут получается перекос и следующая переменная хранится в последнем 36-м регистре

Так и есть 12 регистров занимает 1 структура COMPRESSOR, всего 3 труктуры, 36 регистров или 72 байта
12 регистров это 6 штук 4 BYTE, это всё уже обсуждалось, можно было взять и посмотреть в этой теме. Даже скрины выкладывал несколько раз. https://owen.ru/forum/showthread.php?t=10555&page=979

x:=SIZEOF(compressors); получается 72 байта, 36 регистров или 18 шт. 4BYTE. Скрин==>> 71853

И ответ зачем нужен command : DWORD; в структуре original_8AC :STRUCT размер структуры 80 байт (разница адресов S2 - S1=84 байт)

Валенок
24.11.2023, 15:44
Скорее всего первые две байтовые переменные займут не 16, а 32 байт
Не несите чушь. 8-битным не нужно выравнивание.
2 байта подряд стоящие с четного БАЙТА [или 0-ого] (не регистра) это 1 регистр (16-бит)
-
Там ровно 12 регистров


--
Какие-то странные прения. Непонимающим нужно маляром поработать, буквы через трафарет позакрашивать. Тогда сразу станет понятно как структуры к памяти прикладывать. Это одно и тоже

senkos
24.11.2023, 15:51
а Вы делали SIZEOF на экземпляр струтктуры COMPRESSOR?

точно, спасибо!
Интересный размерчик получается...
71861

Валенок
24.11.2023, 16:02
а Вы делали SIZEOF на экземпляр струтктуры COMPRESSOR?
SIZEOF в офлайне косячит (точнее - стуктуры в офлайне и онлайне отличаются)

сравните онлайн/офлайн

struct x
x : byte;
y : real;
end_struct

Валенок
24.11.2023, 16:13
..
//смещение какого-то поля экземпляра структуры в регистрах
RegAddr := DWORD_TO_WORD(adr(экземпляр_структуры.какое_то_пол е) - adr(экземпляр_структуры)) / 2

vsa
26.11.2023, 16:54
Подскажите простой и быстрый способ, как можно сразу прочитать несколько дискретных входов контроллера и поместить входные значения в 16 битное слово (WORD). Задача осложняется тем, что дискретные входные сигналы расположены вроде рядышком, но находятся в трех группах (8-и битных), как показано на скрине.71899. Хотелось бы видеть в WORD слове данные D14-D27.

1exan
26.11.2023, 17:29
Не знаю насколько быстро и просто, но что-то типа такого наверное:



B2 AT %IB1.3: BYTE;
B1 AT %IB1.2 : BYTE;
B0 AT %IB1.1 : BYTE;

wRESULT : WORD;

wRESULT := DWORD_TO_WORD(SHR(SHL(SHL(BYTE_TO_DWORD(B2),8) OR BYTE_TO_DWORD(B1),8) OR BYTE_TO_DWORD(B0),4));

vsa
26.11.2023, 18:02
Не знаю насколько быстро и просто, но что-то типа такого наверное:



B2 AT %IB1.3: BYTE;
B1 AT %IB1.2 : BYTE;
B0 AT %IB1.1 : BYTE;

wRESULT : WORD;

wRESULT := DWORD_TO_WORD(SHR(SHL(SHL(BYTE_TO_DWORD(B2),8) OR BYTE_TO_DWORD(B1),8) OR BYTE_TO_DWORD(B0),4));


Спасибо. Буду пробовать. У меня до этого момента было 14 условных операторов IF для определения, какой вход активный. И в зависимости от ситуации, я в программе в специальную переменную записывал номер активного входа (датчика). И этот номер датчика потом использовал в программе. Но вот на днях, я решил немного оптимизировать программу. И был готов установить CASE для определения активного датчика. Ведь, я думал, что CASE будет быстрее определять номер активного датчика, нежели 14 отдельных условных операторов? Ну и столкнулся с проблемой, как прочитать множество входов и записать все скопом в одно слово для CASE. Думаю, что Ваша функция будет работать быстро.

1exan
26.11.2023, 18:11
Спасибо. Буду пробовать. У меня до этого момента было 14 условных операторов IF для определения, какой вход активный. И в зависимости от ситуации, я в программе в специальную переменную записывал номер активного входа (датчика). И этот номер датчика потом использовал в программе. Но вот на днях, я решил немного оптимизировать программу. И был готов установить CASE для определения активного датчика. Ведь, я думал, что CASE будет быстрее определять номер активного датчика, нежели 14 отдельных условных операторов? Ну и столкнулся с проблемой, как прочитать множество входов и записать все скопом в одно слово для CASE. Думаю, что Ваша функция будет работать быстро.

Это oscat, там ещё много интересных функций

kondor3000
26.11.2023, 18:58
Спасибо. Буду пробовать. У меня до этого момента было 14 условных операторов IF для определения, какой вход активный. И в зависимости от ситуации, я в программе в специальную переменную записывал номер активного входа (датчика). И этот номер датчика потом использовал в программе. Но вот на днях, я решил немного оптимизировать программу. И был готов установить CASE для определения активного датчика. Ведь, я думал, что CASE будет быстрее определять номер активного датчика, нежели 14 отдельных условных операторов? Ну и столкнулся с проблемой, как прочитать множество входов и записать все скопом в одно слово для CASE. Думаю, что Ваша функция будет работать быстро.

Если так сделать, то D13 тоже попадает в WORD и биты будут не по порядку.
Можно ещё проще и ничего лишнего не будет и все биты по порядку, с D14 по D27 .


w : WORD;

w.0:=D14; w.1:=D15; w.2:=D16; w.3:=D17; w.4:=D18; w.5:=D19; w.6:=D20; w.7:=D21;
w.8:=D22; w.9:=D23; w.10:=D24; w.11:=D25; w.12:=D26; w.13:=D27;

vsa
26.11.2023, 19:27
Если так сделать, то D13 тоже попадает в WORD и биты будут не по порядку.
Можно ещё проще и ничего лишнего не будет и все биты по порядку, с D14 по D27 .


w : WORD;

w.0:=D14; w.1:=D15; w.2:=D16; w.3:=D17; w.4:=D18; w.5:=D19; w.6:=D20; w.7:=D21;
w.8:=D22; w.9:=D23; w.10:=D24; w.11:=D25; w.12:=D26; w.13:=D27;


Неожиданно. А мне понравилось. Не знал, что так можно было. Мне необходимо, как можно быстрее сформировать это слово. Спасибо.

Валенок
26.11.2023, 23:29
.., я думал, что CASE будет быстрее определять номер активного датчика, нежели 14 отдельных условных операторов?...
Напоминает продувку вилки в аэродинамической трубе для придания ей оптимальной формы чтоб быстрее съесть котлету. Эффективность такая же.
CASE же магический, поток управления сразу же перейдет к нужной позиции))

vsa
27.11.2023, 11:27
Убедительно, но интуиция подсказывает, что 16 отдельных IF будут работать медленнее, чем один CASE. Хотя...?
Ну и еще один тогда вопрос: имеется ли возможность в ПЛК110-24.69.Р(М02) работать с аппаратными прерываниями по дискретным входам? Уж очень утомительно контроллеру на каждом новом цикле работы опрашивать состояния каждого входа отдельно. А как было бы хорошо обслуживать дискретный вход только, если на нем появился сигнал. Только сразу не кидайте в меня тапки.

kondor3000
27.11.2023, 13:21
Убедительно, но интуиция подсказывает, что 16 отдельных IF будут работать медленнее, чем один CASE. Хотя...?
Ну и еще один тогда вопрос: имеется ли возможность в ПЛК110-24.69.Р(М02) работать с аппаратными прерываниями по дискретным входам? Уж очень утомительно контроллеру на каждом новом цикле работы опрашивать состояния каждого входа отдельно. А как было бы хорошо обслуживать дискретный вход только, если на нем появился сигнал. Только сразу не кидайте в меня тапки.

Даже не заморачивайтесь, ни опрос входов, ни 10-100 IF нисколько не затормозят программу. Просто IF тут вообще не нужны, а CASE - излишен.

saii
27.11.2023, 14:38
... но интуиция подсказывает, что 16 отдельных IF будут работать медленнее, чем один CASE. Хотя...
Не правильно она Вам подсказывает. Что CASE, что аналогичный набор IF'ов будут работать по времени одинаково.

vsa
28.11.2023, 08:50
Мне IF требовались для простой задачи: - присвоение номера для активного входа. Например:
...
IF D1 THEN
COD_G_POZ_1 := 1;
END_IF

IF D2 THEN
COD_G_POZ_1 := 2;
END_IF

IF D3 THEN
COD_G_POZ_1 := 3;
END_IF

...
Я в программе работаю с номерами датчиков, которые подключены к отдельным дискретным входам. Датчиков бывает 25-30 шт. Возможно имеется более красивый способ формировать номер активного датчика.

Валенок
28.11.2023, 09:24
Мне IF требовались для простой задачи: - присвоение номера для активного входа. Например:..
Не раскрыта тема D1 = D3 = TRUE

vsa
28.11.2023, 10:17
Не раскрыта тема D1 = D3 = TRUE

В нашем случае D1 никогда не равно D3. У нас транспортная тележка перемещается по рельсам. И на технологических позициях расположены бесконтактные датчики. Каждый датчик заведен на свой дискретный вход контроллера. Мне и приходится опрашивать каждый новый цикл ПЛК входы и определять какой датчик активный. Если активный, то данная технологическая позиция находится на пути следования тележки. Если ни один из входов позиционных датчиков не активны, то тележка находится между позициями. Я описал рабочую ситуацию в моей рабочей программе. Просто я решил немного упростить этот фрагмент программы. Поэтому я захотел уйти от вереницы IF на что-то попроще.

Валенок
28.11.2023, 19:09
В нашем случае D1 никогда не равно D3..
1.Только сейчас стала раскрыватся тема про "ваш случай"
2.Надеюсь вы никогда не будете стоять перед тележкой когда капнет капля кондесата или таракан решит подергать жилки Но у эльфов такого не бывает))

vsa
28.11.2023, 20:25
1.Только сейчас стала раскрыватся тема про "ваш случай"
2.Надеюсь вы никогда не будете стоять перед тележкой когда капнет капля кондесата или таракан решит подергать жилки Но у эльфов такого не бывает))

Что-то я не совсем понял по поводу пункта 2?
Если есть желание, то подскажите красивый способ, как выполнить нумерацию активного дискретного входа, как значение переменной типа WORD. Например, имеем 13 дискретных входов (нумерация с самого начала ПЛК) и имеется переменная, например, Poz. Как можно компактно (без 13 операторов IF) формировать значение переменной Poz в зависимости, какой вход активный? Например, если активный вход 5, то переменная Poz:=5. Если нет активных входов, то Poz := 0. По условию задачи несколько входов одновременно не могут быть активными. Буду признателен, если Вы поможете советом.

Валенок
28.11.2023, 20:39
Что-то я не совсем понял по поводу пункта 2?
Вариант "не должно" не канает если не нужны неожиданности.


Как можно компактно
никак


(без 13 операторов IF)
Делаете маску см. #10154 kondor3000
Ищете первый значимый бит - номер
Считаете кол-во битов - отработка тараканов

Муть с байтами из конфигурации ничего не даст в плане выигрыша. Редкий случай оптимальности копи-пасте 4 раза + правка 26 номеров. Наглядно и модифицируемо.

vsa
29.11.2023, 09:52
Спасибо. Вопрос закрыт.

mkv
01.12.2023, 15:08
Подскажите пожалуйста, как на ПЛК110 поменять адрес и скорость по RS-485. Ну никогда с ними не работал. Контроллер работает совместно с панелью оператора.(Управление вент установкой).
В меню панели оператора смены адреса и скорости нет. Библиотека с адресами есть. Захожу по RS-485 через MasterOPC Universal Modbus Server. Для смены адреса указан регистр 300. По умолчанию стоит 1. Для смены скорости указан регистр 301 (0-4800, 1-9600, 2-19200 ну и т.д). Меняю значения. Выключаю питание контроллера и заново включаю.
Вижу, что в MasterOPC Universal Modbus Server значение поменялось. Но на самом деле сервак видет ПЛК-110. Хотя в настройках самого сервера я ни адрес ни скорость не менял.
Получается в сервере выставлен адрес 1 и скорость 9600. А в котроллере стоит адрес 2 и скорость 19200. (Это я вижу в регистре 300 и 301).

senkos
01.12.2023, 15:16
Доброго дня всем! Подскажите пожалуйста по такому вопросу:
Как правильно связать типы если:
- в программе переменная X : DINT;
- в UMD переменная например Y : WORD (или какую нужно сделать чтобы правильно было?)
- в панели ИП320 это Z : DEC 1 регистр без нулей после запятой.

в коде нужно типа таких вычислений:


Z := X;
Z := Y;

kondor3000
01.12.2023, 15:21
Подскажите пожалуйста, как на ПЛК110 поменять адрес и скорость по RS-485. Ну никогда с ними не работал. Контроллер работает совместно с панелью оператора.(Управление вент установкой).
В меню панели оператора смены адреса и скорости нет. Библиотека с адресами есть. Захожу по RS-485 через MasterOPC Universal Modbus Server. Для смены адреса указан регистр 300. По умолчанию стоит 1. Для смены скорости указан регистр 301 (0-4800, 1-9600, 2-19200 ну и т.д). Меняю значения. Выключаю питание контроллера и заново включаю.
Вижу, что в MasterOPC Universal Modbus Server значение поменялось. Но на самом деле сервак видет ПЛК-110. Хотя в настройках самого сервера я ни адрес ни скорость не менял.
Получается в сервере выставлен адрес 1 и скорость 9600. А в котроллере стоит адрес 2 и скорость 19200. (Это я вижу в регистре 300 и 301).

В контроллере ПЛК110 нельзя поменять адрес и скорость через регистры. Это делается только изменением проекта, и обязательно нужен исходник.
Иначе придётся переписывать проект заново.

kondor3000
01.12.2023, 15:24
Доброго дня всем! Подскажите пожалуйста по такому вопросу:
Как правильно связать типы если:
- в программе переменная X : DINT;
- в UMD переменная например Y : WORD (или какую нужно сделать чтобы правильно было?)
- в панели ИП320 это Z : DEC 1 регистр без нулей после запятой.


Всё зависит от того, до скольких надо считать. Типы переменных можно посмотреть в справке по F1 в самом Codesys.
Если пределы -32768 ..... +32767, то можно всё конвертировать в один тип INT, если больше, то в один тип DINT

mkv
01.12.2023, 15:28
В контроллере ПЛК110 нельзя поменять адрес и скорость через регистры. Это делается только изменением проекта, и обязательно нужен исходник.
Иначе придётся переписывать проект заново.
Это плохо. Чего я и боялся. А нам исходники прошивки контроллера и панели оператора они не дали. Просто хотел новые приточки в скада систему внести. Будем подрядчика долбить, чтобы адреса и скорости поменяли.

senkos
01.12.2023, 16:01
Всё зависит от того, до скольких надо считать. Типы переменных можно посмотреть в справке по F1 в самом Codesys.
Если пределы -32768 ..... +32767, то можно всё конвертировать в один тип INT, если больше, то в один тип DINT

В codesys в ФБ нужен тип DINT. (Но у переменной значение всего лишь 0-100)
Какой тип нужно выбрать в UMD и в панели ИП320?

kondor3000
02.12.2023, 12:01
В codesys в ФБ нужен тип DINT. (Но у переменной значение всего лишь 0-100)
Какой тип нужно выбрать в UMD и в панели ИП320?

В ПЛК можно любой тип, 32 и 16 битный, а для передачи в панель лучше любой 16 битный, типа INT.
Если DINT нужен только в ФБ, то там его и конвертировать в DINT, в остальных местах и в передаче использовать INT (или WORD, т. к нет отрицательных значений).

МихаилГл
02.12.2023, 16:23
В ИП320 нет проблем с любыми типами. Зачем лишние телодвижения с конвертациями ?

В ип320 другая проблема. Всё никак не могу найти время, чтобы описать её. Но вкратце это то, что при передаче бита на слэйв, если там этот бит сразу инвертировать, то происходит чудо, бит от ип320 приходит повторно. Пришлось ставить костыль в программе контроллера.

Интересно, всё мастера rtu так делают?

Или это дребезг кнопок...

Валенок
02.12.2023, 17:59
ип мастер чтоли?

МихаилГл
02.12.2023, 18:18
ип мастер чтоли?

Да, мастер. Ещё надо проверить что будет, если удерживать кнопку нажатой, чего то это забыл глянуть. Или проверял и забыл... Надо ещё раз посмотреть.

SvirD
02.12.2023, 22:39
Всем доброго времени суток!
Делаю сп307 сп307 slave, а пр200 master. Не получается получить данные от панели. На панели внутр регистр PSB 256, на пр перемен Var1, регистр 256, бул, бит 1, функц чтения 0х01, функц записи 0х0F, статус и опрос ничего, галочки на старшие и младшие биты не стоят. Не могу понять, в чем дело. Перемычки на плате стоят на Мастере, адреса записаны одинаковые в настройках, адреса у самих пр и сп отличаются.
Помогите, пж

Валенок
02.12.2023, 23:52
Да, мастер..
Как вариант:
А уверены что для мастера-ИП320 со связью все-все норм ? Он чего-то там прислал, ответ побился и что сделает нормальный мастер ...

... происходит чудо, бит от ип320 приходит повторно..

Интересно, всё мастера rtu так делают?
А причем тут rtu ? Во всех протоколах при проблемах в итоге будет повтор если задача - гарантия отправки.

Но это всего лишь вариант. Не хотите гадать - станьте мастером сами. Будете думать о задачах а не о каких-то там обменах.

МихаилГл
03.12.2023, 01:00
В модбас ТСР такого не замечено. Но там в качестве мастера сп315. А с кнопочной сначала всё работало нормально, потом в какой то момент стало через раз работать.

А по тому, чтобы стать мастером самому... К сожалению мне приходится думать и за проектировщиков, и за наладчиков, и за эксплуатацию. Ваш сарказм не по адресу. Иногда приходится в поле показывать наладчиком куда провода подцепить, т.к. они не понимают что там нарисовано. Да и эксплуатация не лучше.. Приходит один, показывает на схеме на индуктивный датчик положения и говорит, а что это за двигатель тут...

petera
03.12.2023, 01:07
Всем доброго времени суток!
Делаю сп307 сп307 slave, а пр200 master. Не получается получить данные от панели. На панели внутр регистр PSB 256, на пр перемен Var1, регистр 256, бул, бит 1, функц чтения 0х01, функц записи 0х0F, статус и опрос ничего, галочки на старшие и младшие биты не стоят. Не могу понять, в чем дело. Перемычки на плате стоят на Мастере, адреса записаны одинаковые в настройках, адреса у самих пр и сп отличаются.
Помогите, пж
Нужно в ПР переменная Var1 - регистр 16, бит 0. Это и будет PSB256 (16 * 16 + 0 = 256)
Зачем ф.записи 0х0F ? Если всего один бит, то нужно 05.

Валенок
03.12.2023, 02:53
В модбас ТСР такого не замечено..
Да неужели ))
В 1-ых не заметил TCP в ИП320. Вы про неё начали, если что.
В 2-ых в TCP (даже не в модбас) между повторами (а физически они есть) и Вами есть немного кода который (согласно "тз" на протокол) не допускает "овербукинг". Для модбас-RTU такого "тз" - нет. И слава богу.


... К сожалению мне приходится думать и за проектировщиков, и за наладчиков, и за эксплуатацию. Ваш сарказм не по адресу...
Почем у сарказм? Вот чтоб и было время для "думать и за проектировщиков, и за наладчиков, и за эксплуатацию" а настройка связи была так, мимоходом, и предложено.

Иногда приходится в поле
Вот! Именно поэтому я и сделал своего мастера. И клиента тоже ))

МихаилГл
03.12.2023, 03:14
Я ваших терминов не понимаю. Скажу честно. Образование не то.

А про rtu и tcp я упомянул только потому, что у меня плк210 одновременно является слэйвом как для сп315 по tcp, так и для ип320 по rtu. Оба устройства управляют одними и теми же регистрами, при этом по tcp нет повтора, как в rtu. Я не интересовался стандарта до такого низкого уровня, что да как там должно провериться. Но если сервер, в роли которого выступает плк210, выдаёт ответ позднее, чем он в программе изменит этот регистр, то это не нормально.

дима86
04.12.2023, 15:03
Здравствуйте, я начинающий пользователь "Овен" и возник вопрос:
ПЛК 110-220.30.Р-М и дополнительный модуль МВ110-224.2А, я их связал по 485 в конфигурации ПЛК создал Мастера и возникла проблема как ПЛК научить обрабатывать аналоговые сигналы такие как 4-20, сопротивление с возможностью настройки диапазона(Например давление 0 - 0.7МПа и температуру -50 - +150 С) не могу понять как это сделать???
Заранее спасибо!!!

1exan
04.12.2023, 15:14
Здравствуйте, я начинающий пользователь "Овен" и возник вопрос:
ПЛК 110-220.30.Р-М и дополнительный модуль МВ110-224.2А, я их связал по 485 в конфигурации ПЛК создал Мастера и возникла проблема как ПЛК научить обрабатывать аналоговые сигналы такие как 4-20, сопротивление с возможностью настройки диапазона(Например давление 0 - 0.7МПа и температуру -50 - +150 С) не могу понять как это сделать???
Заранее спасибо!!!

Для токового сигнала 4-2мА в настройке канала задайте в модуле диапазон например в тех-же мА (4-20), полученные значения из диапазона (4-20)линейно масштабируете в ПЛК в другой нужный диапазон (0-0,7). Для термопреобразователей сопротивления модуль выдаёт значение в градусах, и тип термопреобразователя по модбас вроде поменять нельзя

kondor3000
04.12.2023, 16:19
Здравствуйте, я начинающий пользователь "Овен" и возник вопрос:
ПЛК 110-220.30.Р-М и дополнительный модуль МВ110-224.2А, я их связал по 485 в конфигурации ПЛК создал Мастера и возникла проблема как ПЛК научить обрабатывать аналоговые сигналы такие как 4-20, сопротивление с возможностью настройки диапазона(Например давление 0 - 0.7МПа и температуру -50 - +150 С) не могу понять как это сделать???
Заранее спасибо!!!

По хорошему, вы в Модуле настраиваете какой датчик подключен и диапазон датчика, а в ПЛК уже получаете готовую температуру и давление.
Показания модуля можно проверить прямо в конфигураторе, подключив датчики к модулю.

senkos
04.12.2023, 17:05
В ПЛК можно любой тип, 32 и 16 битный, а для передачи в панель лучше любой 16 битный, типа INT.
Если DINT нужен только в ФБ, то там его и конвертировать в DINT, в остальных местах и в передаче использовать INT (или WORD, т. к нет отрицательных значений).

у меня просто при конвертации из одного в другое ничего не получается. Например DINT = 10 ( это 16х 4120 0000 ) а вот при конвертации его в WORD получается 0, значит DINT_TO_WORD просто отбрасывает старшие 2 байта?

kondor3000
04.12.2023, 17:44
у меня просто при конвертации из одного в другое ничего не получается. Например DINT = 10 ( это 16х 4120 0000 ) а вот при конвертации его в WORD получается 0, значит DINT_TO_WORD просто отбрасывает старшие 2 байта?

Всё конвертируется как положено, смотри скрин, естественно до ограничения 16 битной переменной WORD (65535) 72109
Обрезать может если вы DINT (32 битную переменную, 2 регистра ) передадите по Модбас через WORD (16 битную переменную, 1 регистр)
Поэтому конвертировать надо до передачи по Модбас.

Alex_NN
04.12.2023, 19:30
Добрый вечер. Можно ли отключить активацию точки останова работы ПЛК при кликании мышкой на номер цепи в программе на LD? ПЛК160 М02.

senkos
05.12.2023, 08:41
Всё конвертируется как положено, смотри скрин, естественно до ограничения 16 битной переменной WORD (65535) 72109
Обрезать может если вы DINT (32 битную переменную, 2 регистра ) передадите по Модбас через WORD (16 битную переменную, 1 регистр)
Поэтому конвертировать надо до передачи по Модбас.

Причина тут:
У меня переменная DINT приходит из панели СП307 в двух регистрах в 16х-виде то есть 4120 0000 - это равно 10 в десятичной системе. Конвертация этого числа в WORD дает 0. Как мне правильно сконвертировать?

kondor3000
05.12.2023, 08:51
Причина тут:
У меня переменная DINT приходит из панели СП307 в двух регистрах в 16х-виде то есть 4120 0000 - это равно 10 в десятичной системе. Конвертация этого числа в WORD дает 0. Как мне правильно сконвертировать?

В таком случае считывайте как целочисленное WORD 2 раза ( 2 регистра), конвертируйте в DEC уже в ПЛК, а потом уже куда угодно, но в десятичной системе.
Было бы намного проще, если бы вы сразу написали все нюансы. Откуда в панели 2 регистровое число HEX
Раньше вы писали, что число DINT только в ФБ в ПЛК, его и надо было конвертировать в DEC.

Валенок
05.12.2023, 08:57
какой dec? там float чистой воды прилетел

senkos
05.12.2023, 10:24
В таком случае считывайте как целочисленное DWORD ( 2 регистра), конвертируйте в DEC уже в ПЛК, а потом уже куда угодно, но в десятичной системе.
Было бы намного проще, если бы вы сразу написали все нюансы. Откуда в панели 2 регистровое число HEX
Раньше вы писали, что число DINT только в ФБ в ПЛК, его и надо было конвертировать в DEC.

В панели СП307 задается параметр в рецепте размером 2 регистра (параметр равен 10 в десятичной системе или 16х4120 0000).
В окне панели он отображается как Real без знаков после запятой и передается как DWORD в плк в переменную DINT.
Далее этот параметр DINT передается в ФБ пид регулятора.
На этом этапе вроде все правильно считает.

Я подключаю панель ИП320 и в нее нужно передать этот DINT. Передаю без конвертации - отображает в ней сумасшедшее число, с конвертацией 0.

kondor3000
05.12.2023, 10:51
В панели СП307 задается параметр в рецепте размером 2 регистра (параметр равен 10 в десятичной системе или 16х4120 0000).
В окне панели он отображается как Real без знаков после запятой и передается как DWORD в плк в переменную DINT.
Далее этот параметр DINT передается в ФБ пид регулятора.
На этом этапе вроде все правильно считает.

Я подключаю панель ИП320 и в нее нужно передать этот DINT. Передаю без конвертации - отображает в ней сумасшедшее число, с конвертацией 0.

Сами себя запутали, и нас заодно, если в панели 10 REAL, то и принимайте в ПЛК, как REAL=10, а потом конвертируйте куда угодно.
REAL в панели всегда как DWORD, только представление Float.

senkos
05.12.2023, 11:26
Сами себя запутали, и нас заодно, если в панели 10 REAL, то и принимайте в ПЛК, как REAL=10, а потом конвертируйте куда угодно.
REAL в панели всегда как DWORD, только представление Float.

Благодарю вас! Все теперь работает, принимаю как Real и для ФБ конвертирую в DINT.

senkos
14.12.2023, 11:16
Доброго дня всем!
Никак не могу совладать с ПИД и режимом работы сомого ПЛК.
1) Запускаю с компьютера программу, все работает как надо, регулируется. Перед запуском делаю "Очистить все" и "Компилировать все" и даже "Сброс".
2) Загружаю программу в сам ПЛК и включаю режим "Работа". Перестает работать как нужно, как бы ПЛК начинает жить своей жизнью, не закрывает клапан когда это необходимо, на смену параметров реагирует без какой либо логики. Делал "Сброс" и удержиавал переключатель в этом положении 10 сек.

Что же творится там под капотом? Почему из codesys все работает корректно а в режиме "Работа" все не так?

kondor3000
14.12.2023, 12:38
Доброго дня всем!
Никак не могу совладать с ПИД и режимом работы сомого ПЛК.
1) Запускаю с компьютера программу, все работает как надо, регулируется. Перед запуском делаю "Очистить все" и "Компилировать все" и даже "Сброс".
2) Загружаю программу в сам ПЛК и включаю режим "Работа". Перестает работать как нужно, как бы ПЛК начинает жить своей жизнью, не закрывает клапан когда это необходимо, на смену параметров реагирует без какой либо логики. Делал "Сброс" и удержиавал переключатель в этом положении 10 сек.

Что же творится там под капотом? Почему из codesys все работает корректно а в режиме "Работа" все не так?

Очистить и компилировать всё, надо только после сильных изменений в программе. Перед загрузкой в ПЛК. Зачем вы это делаете уже в работающей программе?
ПИД регуляторы многие ведь с автонастройкой, если вы собьёте настройки, то придётся заново всё начинать настраивать.
Наоборот надо записать всё коэффициенты уже настроенного ПИДа и их сохранять.
Настраивать ПИД надо уже в загруженной в ПЛК программе.

senkos
14.12.2023, 13:00
Один из вариантов - в эмуляции частота главного цикла 64Гц, а в живом ПЛК до 1000Гц
Проект выкладывайте

запускаю не в режиме эмуляции, а Подключение -> Старт с использованием ПЛК и реальной системы

senkos
14.12.2023, 13:03
Очистить и компилировать всё, надо только после сильных изменений в программе. Перед загрузкой в ПЛК. Зачем вы это делаете уже в работающей программе?
ПИД регуляторы многие ведь с автонастройкой, если вы собьёте настройки, то придётся заново всё начинать настраивать.
Наоборот надо записать всё коэффициенты уже настроенного ПИДа и их сохранять.
Настраивать ПИД надо уже в загруженной в ПЛК программе.

Использую ПИД с сайта Овен - PID_FUNCTION. Когда выполнение идет через Codesys то подобрав коэффициенты все работает ровненько. Загружаю в ПЛК через "Создание загрузочного проекта" то там при этих же коэфф-тах уже так не работает, например величина уходит ниже уставки но ПИД не подает сигнал на задвижку, потом непонятно с чего возьмет и начнет работать и так по кругу, даже не объяснить его работу в таком режиме.

capzap
14.12.2023, 13:13
Использую ПИД с сайта Овен - PID_FUNCTION. Когда выполнение идет через Codesys то подобрав коэффициенты все работает ровненько. Загружаю в ПЛК через "Создание загрузочного проекта" то там при этих же коэфф-тах уже так не работает, например величина уходит ниже уставки но ПИД не подает сигнал на задвижку, потом непонятно с чего возьмет и начнет работать и так по кругу, даже не объяснить его работу в таком режиме.

кто мешает еще раз подключится онлайн и настроить коэффициенты по новой?

senkos
14.12.2023, 16:02
кто мешает еще раз подключится онлайн и настроить коэффициенты по новой?

Ничего не мешает, у меня настройка параметров в панели производится.
Почему то использовать предложенный ПИД регулятор без костылей не получается, он работает непредсказуемо по непонятным причинам, за пару месяцев мне не удалось обуздать его. Основные сбои - иногда он забывает что нужно закрывать заслонку )). Может полдня проработать а потом просто забудет закрыть когда нужно.

capzap
14.12.2023, 16:15
Ничего не мешает, у меня настройка параметров в панели производится.
Почему то использовать предложенный ПИД регулятор без костылей не получается, он работает непредсказуемо по непонятным причинам, за пару месяцев мне не удалось обуздать его.


Когда выполнение идет через Codesys то подобрав коэффициенты все работает ровненько.Вы утверждаете что когда с панели задаете эти коэффициенты, по тем же адресам в контроллере, они дают другой результат? повторяю вопрос, зайдя в онлайн Вы видите те же значения, которые подобрали до работы с панелью?

senkos
14.12.2023, 16:56
Вы утверждаете что когда с панели задаете эти коэффициенты, по тем же адресам в контроллере, они дают другой результат? повторяю вопрос, зайдя в онлайн Вы видите те же значения, которые подобрали до работы с панелью?

У меня панель Мастер, она отправляет эти уставки при каждом изменении в ПЛК, хранятся уставки в рецептах. При изменении уставок в режиме онлайн я вижу их изменения в переменных в Codesys, думаю так же должно быть и в офлайн.

А утверждаю я другое, то что логика работы ПИД регулятора в онлайн и в офлайн режимах разная почему то при одних и тех же настройках

capzap
14.12.2023, 17:11
У меня панель Мастер, она отправляет эти уставки при каждом изменении в ПЛК, хранятся уставки в рецептах. При изменении уставок в режиме онлайн я вижу их изменения в переменных в Codesys, думаю так же должно быть и в офлайн.

А утверждаю я другое, то что логика работы ПИД регулятора в онлайн и в офлайн режимах разная почему то при одних и тех же настройках

Тогда вопрос когда Вы запускаете регулятор в общем цикле или отдельная задача с временем запуска 100мс

Asan7
21.12.2023, 01:59
Добрый день.
На действующем объекте установлен контроллер ПЛК100.
1) Есть ли возможность выгрузить исходник программы или там находится только откомпилированный проект?
2) Есть ли возможность выгрузить откомпилированный проект для создания резервной копии.
3) Требует ли выгрузка остановки работы контроллера?
4) Какие возможные проблемы могут возникнуть при выгрузки?

kondor3000
21.12.2023, 07:50
Добрый день.
На действующем объекте установлен контроллер ПЛК100.
1) Есть ли возможность выгрузить исходник программы или там находится только откомпилированный проект?
2) Есть ли возможность выгрузить откомпилированный проект для создания резервной копии.
3) Требует ли выгрузка остановки работы контроллера?
4) Какие возможные проблемы могут возникнуть при выгрузки?

1) Только компилированный проект, исходник может быть если его туда залил разработчик (редкий случай).
2) Смотри п.1
3) нет
4) По незнанию, можно и старый удалить.

In_Da_Cher_A
21.12.2023, 08:14
2) нетЧисто теоретически, у него будет резервная копия компилированного файла.
но исходный проект - ага, невозможно

Asan7
23.12.2023, 01:37
Спасибо.
Правильная ли будет последовательность?
1. Устанавливаю Coesys 2. 3 и таргет файлы к ПЛК100.
2. Создаю пустой проект и настраиваю связь по RS232.
3. Codesys предложит загрузить новый (пустой) проект. Я отказываюсь.
4. В закладке Online выбрать "читать файл из ПЛК" и сохранить все файлы.

In_Da_Cher_A
23.12.2023, 09:07
2. Создаю пустой проектсовсем пустой кажется он не даст сделать, привяжите один вход к выходу

и настраиваю связь по RS232зачем 232? юсб чем не подходит?

В закладке Online выбрать "читать файл из ПЛК"
сначала вы идёте на вкладку Ресурсы,
выбираете - ПЛК браузер
там с помощью стандартной команды filedir
получаете список файлов, которые ПЛК сохранил в памяти

Например, для 386 системы создаются 3 файла:
default.prg, содержащий код проекта,
default.chk, содержащий контрольную сумму кодов,
default.sts, содержащий статус контроллера.
копируете имена файлов куда-то "на бумажку"

и сохранить все файлы.и при выборе "Онлайн - Читать файл из ПЛК" - по-одному (!) для каждого файла, вы указываете имя файла, какой вы хотите сохранить и куда.

sergMSTnik
23.12.2023, 11:42
Уважаемые пользователи форума. Кто подскажет нужен файл modem.cfg или нет в ПЛК, в том случае если предполагается только отправка СМС?

west
23.12.2023, 13:32
Уважаемые пользователи форума. Кто подскажет нужен файл modem.cfg или нет в ПЛК, в том случае если предполагается только отправка СМС?
из файла описания CoDeSys.cfg и modem.cfg:
Файлы конфигурации модема CoDeSys.cfg и modem.cfg необходимо записать только в случае удаленного подключения средой Codesys к ПЛК через модем.
Важно: если данные файлы присутствуют, то заданный в них порт работает только в описанном режиме.
Обязательно: Удалить данные файлы при использовании, выбранного в них порта, для других целей - связь через Конфигурацию_ПЛК, прямое обращение из программы ПЛК.

KIPSA
02.01.2024, 09:21
Всем привет! Подскажите пожалуйста неопытному новичку - как реализовать сработку одиночного импульса ровно в один цикл в 00 часов ночи, программы на языке FBD в CODESYS v23, плк 160. Прошу сильно не пиннать ( учусь). Спасибо

1exan
02.01.2024, 10:19
Всем привет! Подскажите пожалуйста неопытному новичку - как реализовать сработку одиночного импульса ровно в один цикл в 00 часов ночи, программы на языке FBD в CODESYS v23, плк 160. Прошу сильно не пиннать ( учусь). Спасибо

Очевидно надо запросить текущее время, сравнить его с требуемым и использовать R_TRIG на выходе результата сравнения

KIPSA
02.01.2024, 10:28
Очевидно надо запросить текущее время, сравнить его с требуемым и использовать R_TRIG на выходе результата сравнения

это понятно что надо сделать, вопрос был в другом - как?

МихаилГл
02.01.2024, 10:40
https://owen.ru/forum/showthread.php?t=16322

1exan
02.01.2024, 16:49
это понятно что надо сделать, вопрос был в другом - как?

Посмотрите руководство, это закроет значительное количество вопросов: Руководство пользователя ПЛК1хх [М02] (https://owen.ru/uploads/313/rp_plk1hh_m02__1-ru-75044-1.33.pdf)

west
02.01.2024, 21:39
это понятно что надо сделать, вопрос был в другом - как?
в любое время дня можно сформировать импульс по заданным параметрам (часы, минуты, секунды).
бибка SysLibTime для того и создана.

KIPSA
03.01.2024, 04:42
Все почитал, все попробывал - не получается. Если не сложно, выложите пожалуйста пример на языке FBD.

МихаилГл
03.01.2024, 08:58
Все почитал, все попробывал - не получается. Если не сложно, выложите пожалуйста пример на языке FBD.

Люди всё по домам... У многих нет дома компухтера...
В 00.00 на триггере делаешь set, в 00.01 reset.
Выход триггера посылаешь на r_trig.
А выход r_trig уже куда нужно.

KIPSA
03.01.2024, 10:27
Люди всё по домам... У многих нет дома компухтера...
В 00.00 на триггере делаешь set, в 00.01 reset.
Выход триггера посылаешь на r_trig.
А выход r_trig уже куда нужно.

Этот момент мне понятен. Я не знаю как из ПЛК вытащить текущие часы минуты и секунды чтобы потом их сравнивать. Если писать функцию на ST, то что должно быть в верхней части написано, а что в нижней?

EFrol
03.01.2024, 10:59
Что-то не думается с бадуна:
72745
72746
72747

kondor3000
03.01.2024, 11:51
Этот момент мне понятен. Я не знаю как из ПЛК вытащить текущие часы минуты и секунды чтобы потом их сравнивать. Если писать функцию на ST, то что должно быть в верхней части написано, а что в нижней?

Вот пример на CFC и ST ( лучше чем FBD). Пример для виртуального ПЛК WIN 2.4, таргет можно поменять для нужного ПЛК. 72748
Время берётся из ПЛК, есть возможность синхронизации с панелью. В блоке clock_week выставляете начальное и конечное время, при включении блока в 00.00.00, срабатывает R_Trig
В эмуляции работать не будет.

KIPSA
03.01.2024, 12:07
Что-то не думается с бадуна:
72745
72746
72747

Спасибо за помощь, но у меня версия Колеса 23. Как это реализовать на на моей версии? Я не знаю как програмно на языке ФБ или ST реализовать цепочку: " Создаем переменную такую то там то - постоянно считывает ее значение - отправляем в INT переменную на выход для дальнейшего сравнения"

KIPSA
03.01.2024, 12:09
Вот пример на CFC и ST ( лучше чем FBD). Пример для виртуального ПЛК WIN 2.4, таргет можно поменять для нужного ПЛК. 72748
Время берётся из ПЛК, есть возможность синхронизации с панелью. В блоке clock_week выставляете начальное и конечное время, при включении блока в 00.00.00, срабатывает R_Trig
В эмуляции работать не будет.

Большое спасибо, завтра попробую сделать

МихаилГл
03.01.2024, 13:19
Что-то не думается с бадуна:
72745
72746
72747

Точно после праздников не отошёл...)
Тут про версию 2.3...

west
03.01.2024, 14:54
Большое спасибо, завтра попробую сделать
Если не нужна синхронизация времени в ПЛК и достаточно двух уставок в сутки (час и минута), то можно воплотить и так.

KIPSA
03.01.2024, 23:30
Если не нужна синхронизация времени в ПЛК и достаточно двух уставок в сутки (час и минута), то можно воплотить и так.

ОГРОМНОЕ ВАМ СПАСИБО!!!! Четыре дня мучался с этой проблемой. А благодаря Вам все заработало как надо!!! Единственная просьба - если вдруг у Вас будет время свободное, прокомментируйте пожалуйста каждую строчку Вашего кода, чтобы я понял что там написано и как это все работает. Какая переменная ( оператор ) за что отвечает и почему они именно такие.

Сергей0308
04.01.2024, 00:16
Всем привет! Подскажите пожалуйста неопытному новичку - как реализовать сработку одиночного импульса ровно в один цикл в 00 часов ночи, программы на языке FBD в CODESYS v23, плк 160. Прошу сильно не пиннать ( учусь). Спасибо

Немного не по теме, в смысле, насколько это проще сделать в ОЛ:

72754

Валенок
04.01.2024, 01:46
... насколько это проще сделать в ОЛ:
72754
речь о хрени* названой "линией задержки"?
72757
Когда понятно - что это, проблем не возникает. Но на квадратик больше, да))


----------------
*хрени - потому что банальный i++, он же
72758
в ОЛ не вытягивают без этого искуственного понятия

west
04.01.2024, 11:34
Единственная просьба - если вдруг у Вас будет время свободное, прокомментируйте пожалуйста каждую строчку Вашего кода, чтобы я понял что там написано и как это все работает.
в выложенном мной ФБ имеются комментарии, надо лишь открыть его и посмотреть.

МихаилГл
04.01.2024, 12:25
в выложенном мной ФБ имеются комментарии, надо лишь открыть его и посмотреть.

Эх, как там:
Не то что нынешнее племя...

В коде самостоятельно разобраться не хотят, выложенный пример досконально не изучают...

Так никогда ничему научиться невозможно.

kondor3000
04.01.2024, 14:46
Задержка на цикл, это одна строчка кода и программа становится 1 квадратиком 72761

Валенок
04.01.2024, 15:42
Задержка на цикл, это одна строчка кода и программа становится 1 квадратиком..
Видимо речь об эквиваленте с аналогичным подкапотником.
А так, то в правой части можно убрать пару переменных в объявлении и пару строк в коде))
С Новым Годом!

KIPSA
08.01.2024, 01:52
ребят, подскажите пожалуйста где скачать Util.library 3.5.19.0, нигде не могу найти, или может у кого есть?

kondor3000
08.01.2024, 09:52
ребят, подскажите пожалуйста где скачать Util.library 3.5.19.0, нигде не могу найти, или может у кого есть?

Это не по теме вопрос, тут Codesys 2.3
Если нет Util.library 3.5.19.0, замените на Util.library 3.5.17.0, она входит в установщик Codesys 3.5.17.3

KIPSA
08.01.2024, 12:30
Это не по теме вопрос, тут Codesys 2.3
Если нет Util.library 3.5.19.0, замените на Util.library 3.5.17.0, она входит в установщик Codesys 3.5.17.3

Да, у меня версия 2.3. Жаль, я думал эта библиотека есть под мою версию

kondor3000
08.01.2024, 12:35
Да, у меня версия 2.3. Жаль, я думал эта библиотека есть под мою версию

Тогда вам подойдёт любая Util.lib для 2.3 , не важно какие там цифры. Вставьте её по пути C:\Program Files (x86)\3S Software\CoDeSys V2.3\Library
При открытии проекта, если она не добавилась автоматически, добавьте её в проект сами, в менеджере биб-к.

Easy_Enemy
09.01.2024, 21:06
Возник вопрос свалить все системы в "одну кучу" для обработки. Все системы (например, теплые полы, микроклимат, вентиляция) описаны структурами, так как в каждом помещении они идентичны. Но не хотелось бы по структурам распределять такие штуки, как, например, обработка ошибок, наработка оборудования (моторчасы), потребление систем и прочее, а хотелось бы реализовать отдельными модулями (мало ли будет добавляться что-то еще, не вносить же это в сотне мест). Так вот, есть желание натолкать весь список систем (их 8 штук (структур) от 5 до 10 контуров в каждой) в некий массив для его обработки в цикле For. Первая мысль была про eNum (как виделось - SystemNum: (Vent1, Vent2, Vent3, LC1, LC2...)), но, конечно ж компилятор выдает ошибку о задваивании. Обрабатывать системы типа For Vent[i]:=1 to .. - так же не получается, так как [i] - номер элемента массива, а объявив системы, как массив (например Vent: Array[1..3] OF..) так же не даст ничего толкового, ибо массив должен быть из структур, то есть циклу for не скормить.. Правильно ли я понимаю, что единственный выход в данный момент - решение только через указатели?..

1exan
10.01.2024, 04:57
Возник вопрос свалить все системы в "одну кучу" для обработки. Все системы (например, теплые полы, микроклимат, вентиляция) описаны структурами, так как в каждом помещении они идентичны. Но не хотелось бы по структурам распределять такие штуки, как, например, обработка ошибок, наработка оборудования (моторчасы), потребление систем и прочее, а хотелось бы реализовать отдельными модулями (мало ли будет добавляться что-то еще, не вносить же это в сотне мест). Так вот, есть желание натолкать весь список систем (их 8 штук (структур) от 5 до 10 контуров в каждой) в некий массив для его обработки в цикле For. Первая мысль была про eNum (как виделось - SystemNum: (Vent1, Vent2, Vent3, LC1, LC2...)), но, конечно ж компилятор выдает ошибку о задваивании. Обрабатывать системы типа For Vent[i]:=1 to .. - так же не получается, так как [i] - номер элемента массива, а объявив системы, как массив (например Vent: Array[1..3] OF..) так же не даст ничего толкового, ибо массив должен быть из структур, то есть циклу for не скормить.. Правильно ли я понимаю, что единственный выход в данный момент - решение только через указатели?..

Ничего не понятно
Структуры - это же только тип данных, какие обработки-наработки?
Действия - в функциональных блоках, и массивы ФБ прекрасно обрабатываются в циклах

МихаилГл
10.01.2024, 18:32
Структуры тоже нормально себя ведут в циклах.

Easy_Enemy
11.01.2024, 22:12
Ничего не понятно
Структуры - это же только тип данных, какие обработки-наработки?
Действия - в функциональных блоках, и массивы ФБ прекрасно обрабатываются в циклах


Структуры тоже нормально себя ведут в циклах.

Пардон, паскаль давно был, а в Си подход другой, запутался уже. Не получалось обработать через массив, так как неправильно "ходил" по его элементам. Уже подумал, что, если массив состоит из структур, то нельзя было обратиться по номеру элемента.. Спасибо, разобрался, выдохнул!

VladosRTU
12.01.2024, 10:03
Здраствуйте, возникла проблема, написал программу записи регистра slave устройств по ModBus RTU RS-485 вручную(ПЛК110-30). Когда прописан только код записи регистров, работает быстро как только добавил программу скорость передачи сильно упала.

kondor3000
12.01.2024, 10:18
И зачем вы эту портянку сюда выложили?
Можно же проект в Расширенных настройках прикрепить как файл .pro.
А по теме, разберитесь с одним ПИДом, а потом лепите всё в кучу.

Лосев Олег
12.01.2024, 20:20
Подскажите, второй день бьюсь. Есть BLINK в кодесис и надо время работы и время остановки задавать переменной привязанной к панеле СП310, но в панеле я не могу понять как задать параметр T# 30s , а если просто цыфрами то ничего не получается. Почти весь интернет прорыл по этому вопросу ничего не нашел.

Николай Суриков
12.01.2024, 20:29
Подскажите, второй день бьюсь. Есть BLINK в кодесис и надо время работы и время остановки задавать переменной привязанной к панеле СП310, но в панеле я не могу понять как задать параметр T# 30s , а если просто цыфрами то ничего не получается. Почти весь интернет прорыл по этому вопросу ничего не нашел.

BL.TIMELOW:=(WORD_TO_TIME(PANEL_TIMELOW))*1000
BL.TIMEHIGH:=(WORD_TO_TIME(PANEL_TIMEHIGH))*1000

Лосев Олег
12.01.2024, 20:40
Спасибо огромное.
Совсем забыл про преобразования.

Валенок
12.01.2024, 20:51
или без преобразований
BL.TIMELOW:= T#1s * PANEL_TIMELOW;
..

1exan
13.01.2024, 09:17
Здраствуйте, возникла проблема, написал программу записи регистра slave устройств по ModBus RTU RS-485 вручную(ПЛК110-30). Когда прописан только код записи регистров, работает быстро как только добавил программу скорость передачи сильно упала.

Попробуйте выполнять программы раздельно:
Создайте в диспетчере задачи две задачи -
одну с фиксированным циклом (например, 100мс) и добавьте в неё вызов программы ПИД
другую - со свободным циклом и приоритетом 15 и добавьте в неё вызов программы модбас

Traveller
16.01.2024, 15:38
Возможно задам глупый вопрос, но тем не менее.
Интересует такая вещь, есть ли в природе какая нить софтина на винду, что бы по RS-485 можно было менять обороты/частоту частотного или некоторого кол-ва частотных преобразователей, ну скажем одного бренда с компа, и да, самое важное, что выполнять эту операцию будут люди далекие от технических нюансов, по этому все настройки которые их не касаются вообще должны быть не доступны, если такой софтины нет, то возможно ли это оперативно делать при помощи Овеновского конфигуратора ПЧВ, с соблюдением того же самого условия?

Или все же это проще реализовать на панели оператора?

Спорягин Кирилл
16.01.2024, 15:48
Возможно задам глупый вопрос, но тем не менее.
Интересует такая вещь, есть ли в природе какая нить софтина на винду, что бы по RS-485 можно было менять обороты/частоту частотного или некоторого кол-ва частотных преобразователей, ну скажем одного бренда с компа, и да, самое важное, что выполнять эту операцию будут люди далекие от технических нюансов, по этому все настройки которые их не касаются вообще должны быть не доступны, если такой софтины нет, то возможно ли это оперативно делать при помощи Овеновского конфигуратора ПЧВ, с соблюдением того же самого условия?

Или все же это проще реализовать на панели оператора?

Берете преобразователь USB-RS-485 подключаете в порт USB персонального компьютера.
Берете бесплатную версию (на 32 переменные) Мастерскады 4Д от "МПС Софт" (ранее ИнСАТ), там конфигурируете чтение и запись нужных регистров в ПЧ.
Выводите это все на мнемосхему. Мнемосхема открывается в любом браузере. Т.е. Вы даже из дома сможете "вмешаться" в работу оператора.

kondor3000
16.01.2024, 15:59
Возможно задам глупый вопрос, но тем не менее.
Интересует такая вещь, есть ли в природе какая нить софтина на винду, что бы по RS-485 можно было менять обороты/частоту частотного или некоторого кол-ва частотных преобразователей, ну скажем одного бренда с компа, и да, самое важное, что выполнять эту операцию будут люди далекие от технических нюансов, по этому все настройки которые их не касаются вообще должны быть не доступны, если такой софтины нет, то возможно ли это оперативно делать при помощи Овеновского конфигуратора ПЧВ, с соблюдением того же самого условия?

Или все же это проще реализовать на панели оператора?

Любую Скаду можно использовать или например Овен OPC сервер. Только возьмете скаду попроще, типа SimpLighte (есть бесплатные версии), простая и удобная, встроенный Модбас сервер https://simplight.ru

Мастерскады 4Д не берите, сырая, глючная хрень, а весит как чугунный мост.

Спорягин Кирилл
16.01.2024, 16:04
Не слушайте.
Берите Мастерскаду 4Д.
То, что нужно для непрограммистов. Это как раз среда проектирования!
Все там отлично! Это просто излюбленная наша традиция охаивать все свое!