PDA

Просмотр полной версии : CODESYS V3.5. Вопросы и ответы



Страницы : 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

МихаилГл
15.11.2023, 13:48
Здравствуйте. А как можно в Cdesys v3.5 (по аналогии с V2.3 Онлайн>>Подключение>>Читать файл из ПЛК " файл.PRG" ) считать исполняемый файл из ПЛК?
https://owen.ru/forum/showthread.php?t=38688

Евгений Кислов
15.11.2023, 13:58
Здравствуйте. А как можно в Cdesys v3.5 (по аналогии с V2.3 Онлайн>>Подключение>>Читать файл из ПЛК " файл.PRG" ) считать исполняемый файл из ПЛК?

Добрый день.

Наиболее близким аналогом является вкладка Файлы узла Device:

71618

Файлы визуализации хранятся в папке PlcLogic/visu.

МихаилГл
15.11.2023, 14:02
Тогда можно и про winscp упомянуть. Подключаемся к линуксу и оттуда копируем проект и визуализацию.

iv.kmz
16.11.2023, 08:09
Если датчик избыточного или какого то не атмосферного давления, то надо "дунуть". А так он показывать будет границу.

Да, если всё более менее правильно настроили в плк, то индикатор аналогового входа должен моргать зелёным.

оранжевый мигает

МихаилГл
16.11.2023, 08:27
оранжевый мигает

А датчик как подключили? Внешнее питание подали? 4..20 без внешнего питания в плк не работает, если датчик пассивный.

Там ещё статус можно глянуть в настройках.

Nikoly@
16.11.2023, 11:04
Добрый день.

Наиболее близким аналогом является вкладка Файлы узла Device:

71618

Файлы визуализации хранятся в папке PlcLogic/visu.

Спасибо, то что надо (все прошло как по маслу).

iv.kmz
16.11.2023, 11:54
всё, решилось. минус в щите не тот подключен был.

спасибо!

iv.kmz
16.11.2023, 11:59
Здравствуйте!

ПЛК200-04 периодически виснет и перезагружается по вотчдогу. Может 3 раза в день повиснуть, может весь день без сбоев проработать.

Подскажите, где искать проблему?

RV9WFJ
17.11.2023, 21:28
На СПК110 SP17 слетели тренды, программный сброс трендов не помог. Тренды теперь пишутся с 01.01.2000, хотя время в СПК настроено верно. Как-то можно бороться с этим кроме как перезалить проект? Из за чего такое может появляться?
71694
71695
71696
71697
P.S. Судя по админке (время с момента включения) и времени на графике сбой случился из за перезагрузки по питанию. И время слетело на 01.01.2000 где-то внутри ядра трендов.

Евгений Кислов
18.11.2023, 11:11
На СПК110 SP17 слетели тренды, программный сброс трендов не помог. Тренды теперь пишутся с 01.01.2000, хотя время в СПК настроено верно. Как-то можно бороться с этим кроме как перезалить проект? Из за чего такое может появляться?
71694
71695
71696
71697
P.S. Судя по админке (время с момента включения) и времени на графике сбой случился из за перезагрузки по питанию. И время слетело на 01.01.2000 где-то внутри ядра трендов.

Добрый день.
Вам нужно выполнить сброс заводской и заново загрузить проект.
Проблема случилась именно из-за перезагрузки по питанию.
Больше информации здесь: https://owen.ru/forum/showthread.php?t=28167&p=325383&viewfull=1#post325383

Рекомендую обратить внимание на нашу библиотеку трендов: https://owen.ru/forum/showthread.php?t=38366

Евгений Кислов
18.11.2023, 11:12
Здравствуйте!

ПЛК200-04 периодически виснет и перезагружается по вотчдогу. Может 3 раза в день повиснуть, может весь день без сбоев проработать.

Подскажите, где искать проблему?

Добрый день.
Пришлите, пожалуйста, на support@owen.ru ваш проект и ссылку на эту тему.

RV9WFJ
18.11.2023, 14:33
Рекомендую обратить внимание на нашу библиотеку трендов: https://owen.ru/forum/showthread.php?t=38366
Спасибо Евгений. Пропустил ее выход, попробую модифицировать проект. Просто мне интересно стало, что это еще за время такое внутри ПЛК отдельное?

Евгений Кислов
18.11.2023, 16:54
Спасибо Евгений. Пропустил ее выход, попробую модифицировать проект. Просто мне интересно стало, что это еще за время такое внутри ПЛК отдельное?

Я думаю, это не "время внутри ПЛК", а сбой в компоненте тренда.

sssssaaaaabbbbb
20.11.2023, 08:14
Здравствуйте коллеги. ПЛК 210 перестал отвечать на пинг по ethernet на любом разьеме и по USB тоже не отвечает, хотя внешне все работает. Сброс на заводские настройки кнопкой на самом ПЛК не помог. Подскажите, есть ли еще какие способы оживить связь с ПЛК?

МихаилГл
20.11.2023, 08:18
Здравствуйте коллеги. ПЛК 210 перестал отвечать на пинг по ethernet на любом разьеме и по USB тоже не отвечает, хотя внешне все работает. Сброс на заводские настройки кнопкой на самом ПЛК не помог. Подскажите, есть ли еще какие способы оживить связь с ПЛК?

А разве кнопкой сбрасывается на заводские настройки?

sssssaaaaabbbbb
20.11.2023, 08:23
А разве кнопкой сбрасывается на заводские настройки?

Подскажите, как сбросить на заводские внешним воздействием(кнопкой)?

МихаилГл
20.11.2023, 08:27
Подскажите, как сбросить на заводские внешним воздействием?

В инструкции написано только через web морду.

Ну или перепрошить через флэшку.

Дождитесь ответа Евгения Кислова.

А вы точно ip не изменяли? Можно попробовать wireshark, и посмотреть какой у плк ip...

sssssaaaaabbbbb
20.11.2023, 08:31
В инструкции написано только через web морду.

Ну или перепрошить через флэшку.

Дождитесь ответа Евгения Кислова.

А вы точно ip не изменяли? Можно попробовать wireshark, и посмотреть какой у плк ip...

IP менял под проект, но все работал нормально. После очередной перезагрузки перестал отвечать на пинг(все IP я знаю ни на один не отвечает). Но по USB(172.16.0.1) точно не менял пароль, но тоже пинга нет.

МихаилГл
20.11.2023, 08:38
IP менял под проект, но все работал нормально. После очередной перезагрузки перестал отвечать на пинг.

Надеюсь сам ПК у вас в той же сети...

МихаилГл
20.11.2023, 08:40
А контроллер по индикации в онлайн вышел? Может вы при последней смене чего либо не сделали загрузочное приложение, и плк загрузил старую программу, или вообще пустой...

sssssaaaaabbbbb
20.11.2023, 09:25
А контроллер по индикации в онлайн вышел? Может вы при последней смене чего либо не сделали загрузочное приложение, и плк загрузил старую программу, или вообще пустой...

Индикация по Ethernet есть(зеленый светодиод Eth1 подмигивает), сам ПК в той же сети. Загрузочное приложение делал. Нашел инструкцию прошивки https://owen.ru/media/video/owen_plk210_proshivka , сделал так: скопировал 2 файла на флешку и запустил с нажатой кнопкой 71717 ПИНГ ПОЯВИЛСЯ СПАСИБО

beatitas
20.11.2023, 11:37
Доброе утро.
Не могу разобраться, как средствами CFC подключить компоновщик структуры schedule ко входу aslSchedule блока TimerSwitch, который ждёт массив из структур schedule. Возможно ли эт сделать графически блоками?

Евгений Кислов
20.11.2023, 12:27
Доброе утро.
Не могу разобраться, как средствами CFC подключить компоновщик структуры schedule ко входу aslSchedule блока TimerSwitch, который ждёт массив из структур schedule. Возможно ли эт сделать графически блоками?

Добрый день.
Насколько я помню - не массив, а указатель на schedule.
Сделать это "графическими блоками" можно.
Если с этим возникнут проблемы - напишите, пожалуйста, завтра утром мне в телеграм (в подписи).

sssssaaaaabbbbb
20.11.2023, 14:59
Евгений, не могли бы Вы записать видеоурок соединения и настройки PostgreSQL - CODESYS_3.5?

Евгений Кислов
20.11.2023, 15:15
Евгений, не могли бы Вы записать видеоурок соединения и настройки PostgreSQL - CODESYS_3.5?

Хорошо, постараюсь сделать. Но на стороне CODESYS там особо нет отличий от других СУБД, а показывать именно настройку PostgreSQL довольно сложно - у нас на тестовом сервере уже всё настроено, и в интернете множество материалов о том, как поднять свой PostgreSQL-сервер.

sssssaaaaabbbbb
20.11.2023, 15:42
Хорошо, постараюсь сделать. Но на стороне CODESYS там особо нет отличий от других СУБД, а показывать именно настройку PostgreSQL довольно сложно - у нас на тестовом сервере уже всё настроено, и в интернете множество материалов о том, как поднять свой PostgreSQL-сервер. На виртуалке бы сделали, PostgreSQL просто очень популярный. И еще есть ли у вас архив CODESYS? с примером, где Вы делали пример с SQLite3(вот на этой страничке ссылка на Ваш пример https://owen.ru/forum/showthread.php?t=33976 71727)

Евгений Кислов
20.11.2023, 15:47
На виртуалке бы сделали, PostgreSQL просто очень популярный. И еще есть ли у вас архив CODESYS? с примером, где Вы делали пример с SQLite3(вот на этой страничке ссылка на Ваш пример https://owen.ru/forum/showthread.php?t=33976 71727)

SQLite3 входит в состав нашего общего примера по SQL:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/11_Other/Example_SqlFeatures_3517v1.projectarchive

PostgreSQL действительно популярный, и инструкций по поводу того, как развернуть его на сервере - множество.
Поэтому я все же сделаю акцент на том, как работать с уже развернутой и настроенной СУБД из CODESYS.

shvitaliy
20.11.2023, 16:41
Добрый день.
В проекте два модуля программ на CFC. Как выходную переменную из первого модуля программы использовать во втором модуле программе?

Евгений Кислов
20.11.2023, 17:34
Добрый день.
В проекте два модуля программ на CFC. Как выходную переменную из первого модуля программы использовать во втором модуле программе?

Добрый день.
Поясните ваш вопрос скриншотом.

shvitaliy
20.11.2023, 18:09
Добрый день.
Поясните ваш вопрос скриншотом.

Уже ушел с работы. Есть контролер. В дереве есть основной модуль программы PRG, в котором мы пишем программу и объявляем переменные. Можно создать еще один POU модуль программы и написать в нем алгоритм. Так вот как переменную из одной программы использовать во второй? Буду благодарен за ссылку где почитать или посмотреть

МихаилГл
20.11.2023, 19:05
Уже ушел с работы. Есть контролер. В дереве есть основной модуль программы PRG, в котором мы пишем программу и объявляем переменные. Можно создать еще один POU модуль программы и написать в нем алгоритм. Так вот как переменную из одной программы использовать во второй? Буду благодарен за ссылку где почитать или посмотреть

Объявляй переменные глобально. Иначе пишешь имя pou и через точку имя переменной. Иногда требуется объявлять эти переменные как входа или выхода, но не всегда.

shvitaliy
20.11.2023, 19:41
Объявляй переменные глобально. Иначе пишешь имя pou и через точку имя переменной. Иногда требуется объявлять эти переменные как входа или выхода, но не всегда.

Почему то при объявлении переменную "глобальной", ни чего не записывается в нее. А вот при объявлении переменную выходной (var outpunt), в другом программном блоке читается отлично71736

shvitaliy
20.11.2023, 19:53
Почему то при объявлении переменную "глобальной", ни чего не записывается в нее. А вот при объявлении переменную выходной (var outpunt), в другом программном блоке читается отлично71736

Спасибо. Разобрался и с глобальной переменной, теперь все работает. А то если в одном программном блоке много логических элементов и условий, codesys жутко тормозит.
А так, работаешь в каждом блоке и ни каких тормозов.71740

МихаилГл
20.11.2023, 19:58
Спасибо. Разобрался и с глобальной переменной, теперь все работает. А то если в одном программном блоке много логических элементов и условий, codesys жутко тормозит.
А так, работаешь в каждом блоке и ни каких тормозов.71740

Пиши на st, это намного удобнее.

shvitaliy
20.11.2023, 22:03
Пиши на st, это намного удобнее.

Это следующий этап изучения )

sssssaaaaabbbbb
21.11.2023, 10:18
Здравствуйте коллеги, изучил видео с SQlite3 https://www.youtube.com/watch?v=4J6WXEwmeco . У меня вопрос: есть ли какая то возможность записывать переменные в строку SQL-запроса и есть ли такая же возможность считывать переменными данные из строки SQLite-запроса? 71755 ,накидайте пример пожалуйста.

Евгений Кислов
21.11.2023, 10:20
Здравствуйте коллеги, изучил видео с SQlite3 https://www.youtube.com/watch?v=4J6WXEwmeco . У меня вопрос: есть ли какая то возможность записывать переменные в строку SQL-запроса и есть ли такая же возможность считывать переменными данные из строки SQLite-запроса? 71755 ,накидайте пример пожалуйста.

Добрый день.
Запрос и ответ - это просто строки.
Их можно формировать и парсить.
Как формировать строки - показано в примере.
Если у вас какие-то более частные вопросы - свяжитесь со мной через телеграм, пожалуйста (в подписи).

МихаилГл
21.11.2023, 11:55
Здравствуйте коллеги, изучил видео с SQlite3 https://www.youtube.com/watch?v=4J6WXEwmeco . У меня вопрос: есть ли какая то возможность записывать переменные в строку SQL-запроса и есть ли такая же возможность считывать переменными данные из строки SQLite-запроса? 71755 ,накидайте пример пожалуйста.

Вроде уже ответили выше.

Для понимания вам стоит изучить sql. Установить, попробовать создать базу, протестировать запросы.
Это не относится к плк, а во вторых это не система реального времени.

Того примера, что выложен на сайте, вполне достаточно для понимания механизма, но если у вас нет понимания о sql - это вам мало поможет

sssssaaaaabbbbb
21.11.2023, 12:07
Добрый день.
Запрос и ответ - это просто строки.
Их можно формировать и парсить.
Как формировать строки - показано в примере.
Если у вас какие-то более частные вопросы - свяжитесь со мной через телеграм, пожалуйста (в подписи).

Спасибо БОЛЬШОЕ Евгений!!! Поддержали, рассказали и показали с примером как все работает!!!

beatitas
21.11.2023, 14:05
Добрый день.
Насколько я помню - не массив, а указатель на schedule.
Сделать это "графическими блоками" можно.
Если с этим возникнут проблемы - напишите, пожалуйста, завтра утром мне в телеграм (в подписи).



Евгений, спсибо огромное, что помогли запустить блок.

На всякий случай, для поиска и закрепления материала, продублирую тут:

Работа по расписанию. Необходимо запускать что-либо по расписанию.
С использованием блока Util.TimerSwitch. Понятно, что есть лучшие решения, но он есть в утилитах.

71765

Гончаров И.
21.11.2023, 20:44
Здравствуйте, подскажите пожалуйста как реализовать радиокнопку на 3 режима как на видео, только на языке СFC? Оператор CASE я так понял только для ST. https://www.youtube.com/watch?v=taJovYn4yjg&t=102s

МихаилГл
21.11.2023, 20:59
Здравствуйте, подскажите пожалуйста как реализовать радиокнопку на 3 режима как на видео, только на языке СFC? Оператор CASE я так понял только для ST. https://www.youtube.com/watch?v=taJovYn4yjg&t=102s

Ну сразу приходит в голову поставить три блока сравнения. Case это тоже сравнение того, что на входе...

Гончаров И.
22.11.2023, 07:54
Ну сразу приходит в голову поставить три блока сравнения. Case это тоже сравнение того, что на входе...

Спасибо, сделал)

Гончаров И.
22.11.2023, 14:41
Возникло еще несколько вопросов по элементам визуализации. Подскажите пожалуйста.
1. Планируется сделать вход в конфигурирование только при наличии ключа. Ключ физический на дверце т.е. используется дискретный вход. Как сделать так, чтобы визуализация переключалась только при наличии ключа ну и желательно, чтобы при вытаскивании ключа визуализация возвращалась на главный экран.
2. На главном экране имеется 4 контролируемые зоны. Как сделать, для каждой зоны, изменение цвета заливки в зависимости от состояния? У одной зоны может быть 4 состояния: 1) Не активен - цвет серый 2) Активен - цвет зеленый 3) Внимание - цвет желтый 3) Авария - цвет красный71801
3. Возможно ли сделать так, чтобы при открытой визуализации, значок этой визуализации, который отображается на этом экране менял цвет заливки. Как на скрине 71800 Я так понял, что должна быть какая то переменная, которая при открытии визуализации переключает цвет заливки. Получается надо как то отслеживать какая визуализация открыта. На скрине просто привязал другую переменную.

Евгений Кислов
22.11.2023, 16:01
Возникло еще несколько вопросов по элементам визуализации. Подскажите пожалуйста.
1. Планируется сделать вход в конфигурирование только при наличии ключа. Ключ физический на дверце т.е. используется дискретный вход. Как сделать так, чтобы визуализация переключалась только при наличии ключа ну и желательно, чтобы при вытаскивании ключа визуализация возвращалась на главный экран.
2. На главном экране имеется 4 контролируемые зоны. Как сделать, для каждой зоны, изменение цвета заливки в зависимости от состояния? У одной зоны может быть 4 состояния: 1) Не активен - цвет серый 2) Активен - цвет зеленый 3) Внимание - цвет желтый 3) Авария - цвет красный71801
3. Возможно ли сделать так, чтобы при открытой визуализации, значок этой визуализации, который отображается на этом экране менял цвет заливки. Как на скрине 71800 Я так понял, что должна быть какая то переменная, которая при открытии визуализации переключает цвет заливки. Получается надо как то отслеживать какая визуализация открыта. На скрине просто привязал другую переменную.

1. См. переменную VisuElems.CURRENTVISU, п. 10.3.1 здесь:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Visu_v3.0.pdf

Обратите внимание, что при ее использовании визуализации будут переключаться для всех клиентов синхронно (и на экране СПК, и в web-визуализации).

2. См. вкладку параметров Переменные цвета и ее описание на стр. 42 (ссылка выше)

3. См. информацию из п. 1 и 2.

sssssaaaaabbbbb
22.11.2023, 19:37
Евгений Спасибо за видео c Postgre!!!

Евгений Кислов
22.11.2023, 20:17
Евгений Спасибо за видео c Postgre!!!

Пожалуйста. =)

Ильнур
23.11.2023, 11:05
Добрый день!

Можно ли скопировать файл с ПК на карту памяти или на ПЛК (210)?
И какие библиотеку смотреть, если это возможно сделать?

Евгений Кислов
23.11.2023, 11:26
Добрый день!

Можно ли скопировать файл с ПК на карту памяти или на ПЛК (210)?
И какие библиотеку смотреть, если это возможно сделать?

Добрый день.
Это возможно.
Как именно с точки зрения пользователя должно быть организовано копирование? В какой момент и после каких событий оно должно произойти?

Ильнур
23.11.2023, 11:35
Добрый день.
Это возможно.
Как именно с точки зрения пользователя должно быть организовано копирование? В какой момент и после каких событий оно должно произойти?

По нажатию кнопки происходит копирование. Путь файла передается в ПЛК в виде строки.

Евгений Кислов
23.11.2023, 12:23
По нажатию кнопки происходит копирование. Путь файла передается в ПЛК в виде строки.

Если нужно, чтобы именно ПЛК выступал инициатором копирования - то надо на ПК развернуть FTP-сервер (или web-сервер).
См. пример:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/08_Sockets/Example_CurlFeatures_3517v1_Spk1xx.projectarchive

Ильнур
23.11.2023, 12:34
Если нужно, чтобы именно ПЛК выступал инициатором копирования - то надо на ПК развернуть FTP-сервер (или web-сервер).
См. пример:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/08_Sockets/Example_CurlFeatures_3517v1_Spk1xx.projectarchive

А второй вариант, если с верхнего уровня выполнить копирование файла с ПК на ПЛК?

Евгений Кислов
23.11.2023, 12:37
А второй вариант, если с верхнего уровня выполнить копирование файла с ПК на ПЛК?

Тогда см. п. 9.7:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Faq_v.3.1.pdf

Валерий Сергеевич
23.11.2023, 22:19
Доброго времени суток, коллеги. Кто-нибудь сталкивался с подобной проблемой?
71825
ОС: Windows 11 22H2 (22621.2715)
Проц: Intel Xeon E5-2670 v2, 2900 MHz
Мать: OEM X79G
Чипсет: Intel Patsburg C600/X79, Intel Ivy Bridge-EP
ОЗУ: 32692 МБ (Registered ECC DDR3 SDRAM)
Видео: AMD Radeon RX 580 2048SP (8 ГБ)

sssssaaaaabbbbb
24.11.2023, 14:46
Уважаемые коллеги, кто ниб пробовал синхронизировать время ВП110 с плк210 ? Вообще это возможно, чтоб ВП110 брала время у ПЛК210?

Евгений Кислов
24.11.2023, 15:01
Уважаемые коллеги, кто ниб пробовал синхронизировать время ВП110 с плк210 ? Вообще это возможно, чтоб ВП110 брала время у ПЛК210?

Добрый день.
Проще всего отображать время в визуализации CODESYS, которую будет отображать ВП - и не обращать внимание на время на верхнем баре ВП.
Способов синхронизации времени ВП от ПЛК нет.

Евгений Кислов
24.11.2023, 15:02
Доброго времени суток, коллеги. Кто-нибудь сталкивался с подобной проблемой?
71825
ОС: Windows 11 22H2 (22621.2715)
Проц: Intel Xeon E5-2670 v2, 2900 MHz
Мать: OEM X79G
Чипсет: Intel Patsburg C600/X79, Intel Ivy Bridge-EP
ОЗУ: 32692 МБ (Registered ECC DDR3 SDRAM)
Видео: AMD Radeon RX 580 2048SP (8 ГБ)

Добрый день.
Мы не сталкивались. Характеристики ПК выглядят более, чем подходящими.
У вас этот эффект при каждой попытке установки проявляется?

sssssaaaaabbbbb
24.11.2023, 15:53
Добрый день.
Проще всего отображать время в визуализации CODESYS, которую будет отображать ВП - и не обращать внимание на время на верхнем баре ВП.
Способов синхронизации времени ВП от ПЛК нет.

Тогда сообщите разработчикам ВП110, чтоб они галочку сделали скрывать/отображать время на панели

Евгений Кислов
24.11.2023, 19:38
Тогда сообщите разработчикам ВП110, чтоб они галочку сделали скрывать/отображать время на панели

Хорошо, передам.

Валерий Сергеевич
24.11.2023, 21:41
Добрый день.
Мы не сталкивались. Характеристики ПК выглядят более, чем подходящими.
У вас этот эффект при каждой попытке установки проявляется?

Да, каждый раз.

МихаилГл
24.11.2023, 21:50
Да, каждый раз.

Это вроде хуананжи? У меня первой ревизии примерно с таким же железом, правда вин10. SP17 встаёт без проблем. SP14 не ставил.

Евгений Кислов
25.11.2023, 14:28
Да, каждый раз.

Сегодня волею случая устанавливал SP14 Patch 3 на Win11 21H2 (сборка 22000.318 - несколько более ранняя, чем у вас).
Все прошло корректно.

Перед началом установки инсталлятор решил скачать какой-то апдейт для рантайма Visual C++.

71888

Когда вы пробовали установить CODESYS - у вас появлялось такое окно?
Был ли у ПК доступ к интернету в этот момент?
Пробовали ли отключать антивирус и брэндмауэр на время установки?

Гончаров И.
25.11.2023, 23:18
1. См. переменную VisuElems.CURRENTVISU, п. 10.3.1 здесь:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Visu_v3.0.pdf

Обратите внимание, что при ее использовании визуализации будут переключаться для всех клиентов синхронно (и на экране СПК, и в web-визуализации).

Прошу по подробнее рассказать про эту переменную, как ее на языке СFC применить? Примерно как должно быть я понимаю, а как все связать нет.

Евгений Кислов
26.11.2023, 11:33
Прошу по подробнее рассказать про эту переменную, как ее на языке СFC применить? Примерно как должно быть я понимаю, а как все связать нет.

Напишите мне во вторник утром в телеграм, пожалуйста (в подписи), и обеспечьте удаленный доступ по AeroAdmin или AnyDesk.

beatitas
29.11.2023, 16:37
Добрый день.
не получается разобраться - почему не работают RS триггеры, при подаче сигнала на SET - Q1 не активируется у
waterTankDirtyFillToHiRS: RS;
waterTankCleanFillToHiRS: RS;

При этом триггеры
waterTankDirtyRS: RS;
waterTankCleanRS: RS;

Работают как и ожидалось.

72002

RV9WFJ
29.11.2023, 16:42
Буква F у переменной не смущает?

beatitas
29.11.2023, 17:20
Буква F у переменной не смущает?

Буква F стоит потому что переменная которая должны запускать SET1 триггеров, была зафиксирована для снятия скриншота и демонстрации проблемы. Если переменной передавать сигнал с кнопки (waterTankCleanFillToHi), а не фиксировать - результат тот же.

DmitryMalina
29.11.2023, 17:26
Здравствуйте, может кто знает?
Хочу WebVisu сделать https, сейчас работает только http. Codesys runtime стоит на Raspberry Pi, пробовал через Security Agent, сертификат создал, но ничего не происходит и в журнале ошибка : "Failed to read certificate './PKI/cert/server.cer' in namespace 'WebServer'".

МихаилГл
29.11.2023, 17:30
Буква F стоит потому что переменная которая должны запускать SET1 триггеров, была зафиксирована для снятия скриншота и демонстрации проблемы. Если переменной передавать сигнал с кнопки (waterTankCleanFillToHi), а не фиксировать - результат тот же.

Значит вы сбрасываете этот бит до того как он приходит на триггер, либо далее у вас инициализируется сигнал ресет, хотя не похоже. Но чудес не бывает, где то ошибка.

beatitas
29.11.2023, 17:41
Значит вы сбрасываете этот бит до того как он приходит на триггер, либо далее у вас инициализируется сигнал ресет, хотя не похоже. Но чудес не бывает, где то ошибка.

Михаил, спасибо. Нашёл, но ничего не понял - почему так работает:
Наверху выход блока таймера через R_TRIG подключен к этой переменной: waterTankCleanFillToHi

Получается в том месте он должен записываться только после того как на тригер прилетит Rising Edge - в него уйдёт сигнал TRUE длительностью 1 такт ?
В остальных случаях блок не записывается?

Сейчас перенёс весь блок с таймером вниз страницы - заработало как ожидалось. Значит триггер записывает переменную?

Или выход R_TRIG каждый такт генерирует FALSE, кроме того такта в который видит передний фронт?

МихаилГл
29.11.2023, 17:47
Я не всматривался в код. Просто у кодесиса своя последовательность выполнения программы согласно стандарта. Сначала входа, потом блоки, у которых определены входа а затем те, у которых определились входа, и последними обратные связи, и то, иногда в следующем цикле.

Иногда бывает на LD или ST можно не туда воткнуть, а тут надо быть особо внимательным.

И да, ртриг работает только один такт, дальше вход надо обнулить, чтоб ещё один импульс получить.

kondor3000
29.11.2023, 18:44
Получается в том месте он должен записываться только после того как на тригер прилетит Rising Edge - в него уйдёт сигнал TRUE длительностью 1 такт ?
В остальных случаях блок не записывается?

Сейчас перенёс весь блок с таймером вниз страницы - заработало как ожидалось. Значит триггер записывает переменную?

Или выход R_TRIG каждый такт генерирует FALSE, кроме того такта в который видит передний фронт?

Ничего R_TRIG не генерирует, пока на него на подашь TRUE. После этого идёт импульс, длительностью в 1 цикл. В остальное время на выходе FALSE.
Просто если в коде в одну и туже переменную, сначала записывается TRUE, а ниже в неё же записывается FALSE, в итоге оба выхода будут FALSE.
Это надо знать и использовать где надо, а новички часто путаются из-за этого.
Тоже самое будет если сначала в переменной присваивается 2+3=5, а ниже в ней же 5+5=10, то в обоих местах вы увидите 10.

ETL_Роман
30.11.2023, 11:15
Евгений, создал загрузочное приложение в CoDeSYS, добавил в архив .zip. Загрузил на контроллер (New_Name2), запустил, все отлично
Нажимаю сохранить приложение в web-конфигураторе, в память контроллера записывается (New_Name3), пытаюсь его запустить, но оно просто не запускается
720077200872009

Евгений Кислов
30.11.2023, 11:24
Евгений, создал загрузочное приложение в CoDeSYS, добавил в архив .zip. Загрузил на контроллер (New_Name2), запустил, все отлично
Нажимаю сохранить приложение в web-конфигураторе, в память контроллера записывается (New_Name3), пытаюсь его запустить, но оно просто не запускается
720077200872009

Добрый день.
Пожалуйста, свяжитесь со мной через телеграм (в подписи) и обеспечьте удаленный доступ по AnyDesk.

sssssaaaaabbbbb
01.12.2023, 11:14
Здравствуйте уважаемые коллеги. Вопрос по SQLite. Как можно вставить певрое слово на картинке. В примере к сожалению не рассматривается такая ситуация. Когда одна замена, все получается, но когда две, то не получается.72038 здесьнужно вместо #WSTRING0# вставить Recept_ . То что получается в результате на картике - нижняя строка.

Евгений Кислов
01.12.2023, 11:20
Здравствуйте уважаемые коллеги. Вопрос по SQLite. Как можно вставить певрое слово на картинке. В примере к сожалению не рассматривается такая ситуация. Когда одна замена, все получается, но когда две, то не получается.72038 здесьнужно вместо #WSTRING0# вставить Recept_ . То что получается в результате на картике - нижняя строка.

Добрый день.
Во второй строке первым аргументом функции должна быть Delete_SQL_OneStroka, а не константа шаблона SQL-выражения.
В примере, естественно, рассматривается такая ситуация.

sssssaaaaabbbbb
01.12.2023, 11:41
Добрый день.
Во второй строке первым аргументом функции должна быть Delete_SQL_OneStroka, а не константа шаблона SQL-выражения.
В примере, естественно, рассматривается такая ситуация.

УРА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

sssssaaaaabbbbb
01.12.2023, 13:26
И еще впрос коллеги: есть ли возможность базу данных SQLite перенести на SD-карту?

Евгений Кислов
01.12.2023, 13:27
И еще впрос коллеги: есть ли возможность базу данных SQLite перенести на SD-карту?

Да, такая возможность есть.
Например, см. функцию SysFileCopy в библиотеке SysFile.

shvitaliy
01.12.2023, 17:01
Добрый день. Прошу помощи в реализации алгоритма.
При появлении положительного сигнала, нужно выдать один положительный импульс.
А, при исчезновении положительного сигнала, нужно тоже выдать один положительный импульс

МихаилГл
01.12.2023, 17:09
Добрый день. Прошу помощи в реализации алгоритма.
При появлении положительного сигнала, нужно выдать один положительный импульс.
А, при исчезновении положительного сигнала, нужно тоже выдать один положительный импульс

Подаёшь этот сигнал на два элемента одновременно, первый r-trig, второй f-trig...

shvitaliy
01.12.2023, 18:13
Ставил я их ) видимо импульс проходит настолько быстро, что не заметно. Поставлю tof и посмотрю. Спасибо

МихаилГл
01.12.2023, 18:18
Ставил я их ) видимо импульс проходит настолько быстро, что не заметно. Поставлю tof и посмотрю. Спасибо

Длительность одного цикла, от 10 мкс.
Поставь rs триггер на каждый и проверь. На сет один сигнал, на ресет другой, и наоборот. Ну или таймер на выключение, с ним длительность можно отрегулировать.

beatitas
05.12.2023, 10:27
Доброе утро.
Прошу помощи по организации структур и правильному расположению.

есть набор данных:

---- Эти по идее должны быть persistent

rTempSetPoint
rTempHysteresis
rTempAlarmLimitHi
rTempAlarmLimitLo


----- А вот эти меняются
xAlarmOutOfRange

----- причём вот эту структуру очень удобно привязывать к физическому сходу, сразу объявляя 3 поля
ANALOG_SENSOR_VALUE
rValue REAL Измеренное значение
uiCycleTime UINT Циклическое время
eStatus ANALOG_SENSOR_ERRORS Код статуса входа

Сначала демал сделать:

TYPE TEMP_POINT EXTENDS ANALOG_SENSOR_VALUE :
STRUCT
rTempSetPoint
rTempHysteresis
rTempAlarmLimitHi
rTempAlarmLimitLo
xAlarmOutOfRange
END_STRUCT
END_TYPE

1) Но потом не понял можно ли как то из получившейся расширенной структуры вытащить структуру ANALOG_SENSOR_VALUE для привязки к физическим аналоговым входам. Чтобы не каждому каналу прописывать отдельную переменную, а сразу к 3, как это можно сделать если объявлять ANALOG_SENSOR_VALUE
2) Как лучше поступать с уставкой, гистерезисом и верхним/нижним пределом для каждого датчика?
Разделить на 2 отдельные структуры и запихать одну в персист? или объявлять в коде один раз?
Можно ли в персист сразу выдавать элементам структуры изначальные значения?

kondor3000
05.12.2023, 13:54
Откуда вы берёте вообще входы? С какого модуля ? Сколько модулей?

Чтобы потом поместить их в структуру
ANALOG_SENSOR_VALUE
rValue REAL Измеренное значение
uiCycleTime UINT Циклическое время
eStatus ANALOG_SENSOR_ERRORS Код статуса входа

sssssaaaaabbbbb
05.12.2023, 14:55
Здравствуйте коллеги, вопрос такой: на ПЛК210 на дискретных входах висят сигналы(у меня аварийные), мне их нужно протестировать, как они в программе работают. Сигналы на TRUE, если я их фиксирую на FALSE, то через случайное время от 2 до 20 секунд они переходят на TRUE и потом опять на FALSE. Подскажите это нормально? Наверное через какое то количество циклов происходит самопроизвольный переход?72141

Евгений Кислов
05.12.2023, 15:03
Доброе утро.
Прошу помощи по организации структур и правильному расположению.

есть набор данных:

---- Эти по идее должны быть persistent

rTempSetPoint
rTempHysteresis
rTempAlarmLimitHi
rTempAlarmLimitLo


----- А вот эти меняются
xAlarmOutOfRange

----- причём вот эту структуру очень удобно привязывать к физическому сходу, сразу объявляя 3 поля
ANALOG_SENSOR_VALUE
rValue REAL Измеренное значение
uiCycleTime UINT Циклическое время
eStatus ANALOG_SENSOR_ERRORS Код статуса входа

Сначала демал сделать:

TYPE TEMP_POINT EXTENDS ANALOG_SENSOR_VALUE :
STRUCT
rTempSetPoint
rTempHysteresis
rTempAlarmLimitHi
rTempAlarmLimitLo
xAlarmOutOfRange
END_STRUCT
END_TYPE

1) Но потом не понял можно ли как то из получившейся расширенной структуры вытащить структуру ANALOG_SENSOR_VALUE для привязки к физическим аналоговым входам. Чтобы не каждому каналу прописывать отдельную переменную, а сразу к 3, как это можно сделать если объявлять ANALOG_SENSOR_VALUE
2) Как лучше поступать с уставкой, гистерезисом и верхним/нижним пределом для каждого датчика?
Разделить на 2 отдельные структуры и запихать одну в персист? или объявлять в коде один раз?
Можно ли в персист сразу выдавать элементам структуры изначальные значения?

1) Нет, так не получится. В состав TEMP_POINT входят только поля ANALOG_SENSOR_VALUE, а не ее экземпляр.
2) Как вам удобнее. Вы лучше знаете особенности своей задачи - если в целом проект не особо большой, то можно оставить одну структуру и объявлять ее экземпляры как PERSISTENT. Задать начальные значения полям структуры в этом случае можно.

Евгений Кислов
05.12.2023, 15:04
Здравствуйте коллеги, вопрос такой: на ПЛК210 на дискретных входах висят сигналы(у меня аварийные), мне их нужно протестировать, как они в программе работают. Сигналы на TRUE, если я их фиксирую на FALSE, то через случайное время от 2 до 20 секунд они переходят на TRUE и потом опять на FALSE. Подскажите это нормально? Наверное через какое то количество циклов происходит самопроизвольный переход?72141

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

sssssaaaaabbbbb
05.12.2023, 15:09
Добрый день. Это не нормально.
Выложите простейший проект, в котором у меня получится это воспроизвести - тогда можно будет дать какие-то комментарии.

Попозже, пока на объекте работы веду

beatitas
05.12.2023, 17:03
Откуда вы берёте вообще входы? С какого модуля ? Сколько модулей?

Чтобы потом поместить их в структуру
ANALOG_SENSOR_VALUE
rValue REAL Измеренное значение
uiCycleTime UINT Циклическое время
eStatus ANALOG_SENSOR_ERRORS Код статуса входа

Входы с AI модулей MB210-101. Их в сети этого плк 5 штук. то есть до 40 сигналов. по факту скорее всего 27. Просто вентмашины на разных этажах поэтому отдельные модули.



1) Нет, так не получится. В состав TEMP_POINT входят только поля ANALOG_SENSOR_VALUE, а не ее экземпляр.
2) Как вам удобнее. Вы лучше знаете особенности своей задачи - если в целом проект не особо большой, то можно оставить одну структуру и объявлять ее экземпляры как PERSISTENT. Задать начальные значения полям структуры в этом случае можно.

Евгений, благодарю.
То есть при наличии всего 40 сигналов структуры можно целиком можно объявлять в Persistent, включая оперативные сигналы - заначения датчиков и ошибок?

но объявлять их можно только так

stPoolWaterTempSp: TEMP_POINT_SETTINGS; (*Уставка температуры воды в бассейне*)
stPoolWaterTempSp.rSetPoint: REAL :=28;
stPoolWaterTempSp.rHysteresys: REAL :=0.5;
stPoolWaterTempSp.rAlarmLimitHi: REAL :=30;
stPoolWaterTempSp.rAlarmLimitLo: REAL :=26;

"короткое" объявление работать не будет?

Евгений Кислов
05.12.2023, 17:38
То есть при наличии всего 40 сигналов структуры можно целиком можно объявлять в Persistent, включая оперативные сигналы - заначения датчиков и ошибок?

В PERSISTANT можно объявлять всё, что угодно, пока там хватает места (всего под RETAIN и PERSISTANT суммарно выделено чуть меньше 64 Кб).


"короткое" объявление работать не будет?

Что вы называете "коротким" объявлением?

sssssaaaaabbbbb
06.12.2023, 14:14
Добрый день. Это не нормально.
Выложите простейший проект, в котором у меня получится это воспроизвести - тогда можно будет дать какие-то комментарии.

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

Евгений Кислов
06.12.2023, 15:57
Но не может же моя программа...

Может.


Можете что то посоветовать?

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

beatitas
06.12.2023, 16:58
В PERSISTANT можно объявлять всё, что угодно, пока там хватает места (всего под RETAIN и PERSISTANT суммарно выделено чуть меньше 64 Кб).



Что вы называете "коротким" объявлением?

Спасибо.

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


Но не смог разобраться как передавать начальные значения

Сделал так:

Создал структуру:



TYPE CYCLE_TIMER :
STRUCT
xEnable: BOOL; (*Разрешение на работу*)
todStartTime: TOD; (*Время начала цикла*)
usiDuration: USINT; (*Длительность цикла*)
byDaysEnabled: BYTE; (*Дни включения цикла*)
usiDurationMin: USINT; (*Минимальная длительность цикла*)
usiDurationMax: USINT; (*Максимальная длительность цикла*)
tStopTime: TIME; (*Время окончания работы блока*)
END_STRUCT
END_TYPE


Объявил её в PersistentVars и передал ей начальные значения:


stWaterSypplyTimer: CYCLE_TIMER; (**)
stWaterSypplyTimer.todStartTime: TOD :=TOD#1:00:00; (*Время начала цикла водоподготовки*)
stWaterSypplyTimer.usiDuration: USINT :=10; (*Длительность цикла водоподготовки в часах*)
stWaterSypplyTimer.xEnable: BOOL :=TRUE; (*Разрешение на работу цикла водоподготовки*)
stWaterSypplyTimer.byDaysEnabled: BYTE :=2#0111_1111; (*Дни включения цикла водоподготовки младший бит понедельник старший воскресенье*)
stWaterSypplyTimer.usiDurationMin: USINT :=1;
stWaterSypplyTimer.usiDurationMax: USINT :=22;


В итоге кодсис ругается:



------ Компиляция : Приложение: Device.Application -------
типизировать код...
[WARNING] PLC200: Менеджер библиотек [Device: Plc Logic: Application]: C0100: Библиотека CmpTargetVisu не добавлена в Менеджер библиотек, либо не найдено корректной лицензии
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 34): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rSetPoint: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 35): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rHysteresys: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 36): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rAlarmLimitHi: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 37): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rAlarmLimitLo: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 6): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.todStartTime: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 7): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.usiDuration: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 8): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.xEnable: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 9): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.byDaysEnabled: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 10): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.usiDurationMin: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 11): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.usiDurationMax: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 21): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.xEnable: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 22): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.todStartTime: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 23): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.usiDuration: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 24): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.byDaysEnabled: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 25): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.usiDurationMin: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 26): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.usiDurationMax: переменная используется как плейсхолдер


Не понимаю, как тогда правильно передавать начальные значения для элементов структуры?

Заранее спасибо.

МихаилГл
06.12.2023, 17:06
Можешь это сделать в коде программы...
If xxx=false then
...
xxx:=true
Endif

beatitas
06.12.2023, 17:10
Можешь это сделать в коде программы...
If xxx=false then
...
xxx:=true
Endif

xInit?

Просто не хотелось это в код пихать - POU несколько, хотелось держать всё в одном месте. Или элементам скруктуры можно передавать значения только из кода?

МихаилГл
06.12.2023, 17:13
xInit?

Просто не хотелось это в код пихать - POU несколько, хотелось держать всё в одном месте. Или элементам скруктуры можно передавать значения только из кода?

Вроде можно в самой структуре... Правда я не уверен.

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

А во вторых сто мешает создать pou, которая запускается один раз. Код тот же, только там свою pou втыкаешь, а в самой pou всё переменные по умолчанию пишешь. Но если надо именно persistent, то придётся и её воткнуть туда...

Евгений Кислов
06.12.2023, 17:18
Не понимаю, как тогда правильно передавать начальные значения для элементов структуры?

Заранее спасибо.

См. видео:
https://youtu.be/KjVlFH2lF4k?si=Vo3MlSZJlIteSTt2

МихаилГл
06.12.2023, 17:32
См. видео:
https://youtu.be/KjVlFH2lF4k?si=Vo3MlSZJlIteSTt2

Тут маленькая проблема... А персистент переменные при таком объявлении при перезагрузке контроллера опять реинициализируются?

Евгений Кислов
06.12.2023, 17:32
Тут маленькая проблема... А персистент переменные при таком объявлении при перезагрузке контроллера опять реинициализируются?

Конечно же, нет.
Они сохранят те значения, которые имели до перезагрузки.

beatitas
06.12.2023, 19:29
См. видео:
https://youtu.be/KjVlFH2lF4k?si=Vo3MlSZJlIteSTt2

Благодарю, всё оказалось очень просто и выглядит крайне компактно и эстетично) как и хотел:



VAR_GLOBAL PERSISTENT RETAIN
//generalVocationMode BOOL :=FALSE; (* Режим отпуска*)
stPoolWaterTempSp: TEMP_POINT_SETTINGS
:= (rSetPoint :=28, rSetPointMin :=20, rSetPointMax :=30, rAlarmLimitLo :=19, rAlarmLimitHi :=31, rHysteresys :=0.5);
stWaterSypplyTimer: CYCLE_TIMER
:= (xEnable := TRUE, todStartTime :=TOD#1:00:00, usiDuration :=10, usiDurationMin :=1, usiDurationMax :=22, byDaysEnabled :=2#0111_1111);
stPoolFilterBackwashTimer: CYCLE_TIMER
:= (xEnable :=TRUE, todStartTime :=TOD#11:00:00, usiDuration :=10, usiDurationMin :=1, usiDurationMax :=20, byDaysEnabled :=2#0100_0000);


poolCirculationPump1Enabled: BOOL :=TRUE; (*Разрешение на работу циркуляционного насоса бассейна №1*)
poolCirculationPump2Enabled: BOOL :=TRUE; (*Разрешение на работу циркуляционного насоса бассейна №2*)
END_VAR



Две переменные прошли на ура. а вот одна не сдаётся)


[WARNING] PLC200: Менеджер библиотек [Device: Plc Logic: Application]: C0100: Библиотека CmpTargetVisu не добавлена в Менеджер библиотек, либо не найдено корректной лицензии
[ERROR] PLC200: PersistentVars [Device: Plc Logic: Application]: C0142: Локальная переменная с именем 'Dummy__stPoolWaterTempSp' уже задана в 'PersistentVars'
[ERROR] PLC200: PersistentVars [Device: Plc Logic: Application]: C0142: Локальная переменная с именем 'Dummy__stPoolWaterTempSp__rSetPoint' уже задана в 'PersistentVars'

Евгений Кислов
06.12.2023, 19:48
Пришлите мне на почту или в телеграм ваш проект - посмотрим, в чем дело с третьей.

Upd. - помогла команда удаления пустых промежутков.

72182

beatitas
06.12.2023, 20:03
Пришлите мне на почту или в телеграм ваш проект - посмотрим, в чем дело с третьей.

Спасибо огромно за помощь.

Если кто то будет искать поиском по форуму как я:

ПКМ на области ввода переменных и в контекстном меню -> Упорядочить список и удалить пустые промежутки

Николай Суриков
06.12.2023, 20:42
ПКМ на области ввода переменных и в контекстном меню -> Упорядочить список и удалить пустые промежутки

72183
Простите, а что я делаю не так? :rolleyes:

Евгений Кислов
06.12.2023, 20:45
72183
Простите, а что я делаю не так? :rolleyes:

У вас на скриншоте список глобальных переменных, а не Persistent-переменных.

Гончаров И.
07.12.2023, 08:08
Добрый день, подскажите пожалуйста, столкнулся с такой проблемой (КДС 3.5 sp17 язык CFC). При объявлении переменных, в том числе и автообъявление КДС зависает и в диспетчере устройств не отвечает 72186 приходится ждать от 1 до 5 минут. После того как развиснет, переменные объявляются без проблем и в любом количестве. Но как только я перехожу на холст, то опять зависает на 1-5 мин и после того как отвиснет на холсте можно делать что хочешь. Но как добавишь новый элемент и его надо объявить, все зависает и все зависания происходят повторно. Если ли какие то способы решить эту проблему?
Нашел похожую тему https://owen.ru/forum/showthread.php?t=35163 Неужели КДС не тянет, если делать программу на CFC с 200-300 блоками?

RV9WFJ
07.12.2023, 08:15
Скорее что-то поставилось криво, но может и не тянет. Вы бы параметры машины указали, а то может вы его на машину 90х годов ставите :-)

Евгений Кислов
07.12.2023, 08:16
Добрый день, подскажите пожалуйста, столкнулся с такой проблемой (КДС 3.5 sp17 язык CFC). При объявлении переменных, в том числе и автообъявление КДС зависает и в диспетчере устройств не отвечает 72186 приходится ждать от 1 до 5 минут. После того как развиснет, переменные объявляются без проблем и в любом количестве. Но как только я перехожу на холст, то опять зависает на 1-5 мин и после того как отвиснет на холсте можно делать что хочешь. Но как добавишь новый элемент и его надо объявить, все зависает и все зависания происходят повторно. Если ли какие то способы решить эту проблему?
Нашел похожую тему https://owen.ru/forum/showthread.php?t=35163 Неужели КДС не тянет, если делать программу на CFC с 200-300 блоками?

Добрый день.
На данный момент основной способ решения проблемы - это отказаться от программ с сотнями блоков на холсте и объединять их в функции и ФБ (тем самым уменьшив число элементов на одном "уровне абстракции" холста).
В будущем, возможно, будет проведена оптимизация редактора CFC с целью повышения его производительности.

72187

Гончаров И.
07.12.2023, 10:52
Добрый день.
На данный момент основной способ решения проблемы - это отказаться от программ с сотнями блоков на холсте и объединять их в функции и ФБ (тем самым уменьшив число элементов на одном "уровне абстракции" холста).
В будущем, возможно, будет проведена оптимизация редактора CFC с целью повышения его производительности.

72187

Я создал 20шт ФБ, вроде стало лучше, но все равно подвисает. Потом решил эти 20шт ФБ в 1 запихнуть. Получился 1 ФБ с примерно 350 выходами и 150 входами. Заменил 20 на 1 и КДС вообще завис на мертво. Хорошо хоть создал копию перед этой авантюрой. Влияют ли как то блоки с большим количеством входов и/или выходов на производительность КДС? Просто по ощущениям, я количество блоков уменьшил, сделал блоки с большим количеством входов-выходов а программа на это реагирует еще хуже.

kondor3000
07.12.2023, 11:00
Я создал 20шт ФБ, вроде стало лучше, но все равно подвисает. Потом решил эти 20шт ФБ в 1 запихнуть. Получился 1 ФБ с примерно 350 выходами и 150 входами. Заменил 20 на 1 и КДС вообще завис на мертво. Хорошо хоть создал копию перед этой авантюрой. Влияют ли как то блоки с большим количеством входов и/или выходов на производительность КДС? Просто по ощущениям, я количество блоков уменьшил, сделал блоки с большим количеством входов-выходов а программа на это реагирует еще хуже.

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

Гончаров И.
07.12.2023, 11:17
С таким количеством входов выходов у вас и будет подвисать, программу надо оптимизировать,
входы и выходы выводить только нужные, булевые сразу упаковывать в маски или вообще использовать глобальные переменные.
После глобальных изменений, всегда делайте очистить всё, компилировать всё.
И комп надо уже более мощный с большой оперативкой.

Рабочий ПК, ОЗУ 16Гб вроде как должно хватать. А вот почему происходят зависания только когда делаешь переключение? Например когда выстраиваешь связи между блоками все хорошо, а как только хочешь объявить переменную тут же зависает. Потом ты можешь объявлять сколько угодно переменных, но как только возвращаешься на холст где блоки то опять зависает

vitalij
08.12.2023, 06:26
Здравствуйте. как решить такую проблему при подключении к ПЛК210 по кабелю usb в среде windows 7 все отлично соединение устанавливается , а на windows 10 нет соединения. Как решить данную проблему?

Евгений Кислов
08.12.2023, 06:37
Здравствуйте. как решить такую проблему при подключении к ПЛК210 по кабелю usb в среде windows 7 все отлично соединение устанавливается , а на windows 10 нет соединения. Как решить данную проблему?

Добрый день.
Как вы определяете, что на windows 10 нет соединения?

Евгений Кислов
08.12.2023, 07:22
нет соединения через веб конфигуратор с ообщение превышен тайм аут. так же и в codesys узел недоступен. а на windows 7 все идеально

RNDIS адаптер при этом появляется на ПК?

vitalij
08.12.2023, 07:32
RNDIS адаптер при этом появляется на ПК?

да. есть. в диспетчере устройств и так же виртуальная сеть появляется все как на windows 7 .

Евгений Кислов
08.12.2023, 07:36
да. есть. в диспетчере устройств и так же виртуальная сеть появляется все как на windows 7 .

А пинг до контроллера есть?

vitalij
08.12.2023, 07:45
другие браузеры имеются?

имеются. но не помогает

vitalij
08.12.2023, 07:50
А пинг до контроллера есть?

72214 пинг есть

Евгений Кислов
08.12.2023, 07:51
72214 пинг есть

Тогда обеспечьте доступ по AeroAdmin или AnyDesk.
Мои контакты в подписи.

Евгений Кислов
08.12.2023, 07:54
не могу обеспечить. работаю на предприятии

Тогда обратитесь к сотрудникам IT-отдела или вашему руководителю и объясните, в связи с чем возникла такая необходимость.
Или, возможно, этот вопрос не является принципиальным и проще просто продолжить использовать ПК с Win7.

vitalij
08.12.2023, 09:10
Тогда обратитесь к сотрудникам IT-отдела или вашему руководителю и объясните, в связи с чем возникла такая необходимость.
Или, возможно, этот вопрос не является принципиальным и проще просто продолжить использовать ПК с Win7.

разобрался. если кому на будущее поможет. то в исключение вставить .............72231

beatitas
13.12.2023, 19:53
Добрый вечер

Хотел уточнить - может это известная проблема. Компилятор периодически ругается на библиотеку MQTT.
Саму библиотеку не менял никак - просто скачал по ссылке с сайта ОВЕН-гита.
Или это нормально что автор так лихо конвертирует переменные?




[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 100, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'WORD': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 130, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 131, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 132, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 133, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 134, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 135, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 136, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 137, Столбец 1 (Реализ.)): C0197: Неявная конверсия из 'DWORD' в 'REAL': возможна потеря информации
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 144, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 155, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 165, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 175, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 185, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 286, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 286, Столбец 1 (Реализ.)): C0196: Неявная конверсия из типа без знака 'UINT' в тип со знаком 'INT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 303, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'WORD': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 316, Столбец 1 (Реализ.)): C0196: Неявная конверсия из типа без знака 'WORD' в тип со знаком 'INT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 317, Столбец 1 (Реализ.)): C0196: Неявная конверсия из типа без знака 'WORD' в тип со знаком 'INT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 321, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 367, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'WORD': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 377, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
[WARNING] mqtt client library, 3.5.13.27 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 379, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака

Евгений Кислов
13.12.2023, 20:11
Добрый день.
Исходники библиотеки открыты - так что можете лично проанализировать код, связанный с каждым из предупреждений.

shvitaliy
15.12.2023, 07:12
Добрый день. Подскажите пожалуйста, как реализовать циклический переключатель выходов на счетчиках? Всю голову сломал. Необходимо, чтобы на каждом импульсе входа, переключались выходы.
Допустим на вход пришел первый импульс, включился первый выход. Потом пришел второй импульс, первый выход выключился и включился второй. Потом пришел третий импульс, второй выход выключился, третий выход включился.
Потом пришел четвертый импульс, третий выход выключился и включился первый. И так по кругу. Подобное реализовано у меня в Лого.

RV9WFJ
15.12.2023, 08:25
Добрый день. Подскажите пожалуйста, как реализовать циклический переключатель выходов на счетчиках? Всю голову сломал. Необходимо, чтобы на каждом импульсе входа, переключались выходы.
Допустим на вход пришел первый импульс, включился первый выход. Потом пришел второй импульс, первый выход выключился и включился второй. Потом пришел третий импульс, второй выход выключился, третий выход включился.
Потом пришел четвертый импульс, третий выход выключился и включился первый. И так по кругу. Подобное реализовано у меня в Лого.


FUNCTION_BLOCK Primer
VAR_INPUT
IN: BOOL;
END_VAR
VAR_OUTPUT
OUT1, OUT2, OUT3, OUT4: BOOL;
END_VAR
VAR
axOut: ARRAY[0..3] OF BOOL;
RTrig: R_TRIG;
x, i: INT;
END_VAR

RTrig(CLK:=IN);

IF RTrig.Q THEN

x:=x+1;
IF x>=4 THEN x:=0; END_IF

FOR i:=0 TO 3 DO
axOut[i]:= FALSE;
END_FOR

axOut[x] := TRUE;

END_IF

OUT1:= axOut[0];
OUT2:= axOut[1];
OUT3:= axOut[2];
OUT4:= axOut[3];

vitalij
15.12.2023, 12:00
72386

Делаю согласно инструкции, но вот такая проблема? как решить?

Евгений Кислов
15.12.2023, 12:06
72386

Делаю согласно инструкции, но вот такая проблема? как решить?

Добрый день.
В вашем случае ПЛК не смог установить TCP-соединение со слэйвом.
Нужно проверить, правильный ли задан IP-адрес и есть ли вообще пинг между ПЛК и слэйвом (в web-конфигураторе: Сеть/Диагностика)

vitalij
15.12.2023, 12:16
Добрый день.
В вашем случае ПЛК не смог установить TCP-соединение со слэйвом.
Нужно проверить, правильный ли задан IP-адрес и есть ли вообще пинг между ПЛК и слэйвом (в web-конфигураторе: Сеть/Диагностика)

пинг есть 72387

МихаилГл
15.12.2023, 13:00
Не забудьте проверить порт и ID.
И то что приборы в одной подсети...

Евгений Кислов
15.12.2023, 13:36
пинг есть 72387

Свяжитесь со мной через телеграм (в подписи) и обеспечьте удаленный доступ по AnyDesk - разберемся.

shvitaliy
15.12.2023, 16:06
FUNCTION_BLOCK Primer
VAR_INPUT
IN: BOOL;
END_VAR
VAR_OUTPUT
OUT1, OUT2, OUT3, OUT4: BOOL;
END_VAR
VAR
axOut: ARRAY[0..3] OF BOOL;
RTrig: R_TRIG;
x, i: INT;
END_VAR

RTrig(CLK:=IN);

IF RTrig.Q THEN

x:=x+1;
IF x>=4 THEN x:=0; END_IF

FOR i:=0 TO 3 DO
axOut[i]:= FALSE;
END_FOR

axOut[x] := TRUE;

END_IF

OUT1:= axOut[0];
OUT2:= axOut[1];
OUT3:= axOut[2];
OUT4:= axOut[3];


Спасибо! Работает

beatitas
16.12.2023, 16:35
добрый день.
А возможно ли выдёргивать комментарий из строки с переменной, как это делает CodeSYS в ассистенте ввода. или обязательно надо задавать имя переменной в отдельной строковой переменной?


Например:


(*AI 01*) stPoolWaterTemp: ANALOG_SENSOR_VALUE; (*Датчик температуры воды в бассейне*)


В ассистенте ввода отображается как:



stPoolWaterTemp: ANALOG_SENSOR_VALUE(VAR_GLOBAL)

Датчик температуры воды в бассейне


Можно ли так же содержание комментария вытаскивать в переменную, для того чтобы отправлять в Telegram название датчика с его ошибкой в человекочитаемом формате?
Или лучше забить в отдельные строковые переменные все названия?

Евгений Кислов
16.12.2023, 16:50
Добрый день.

Или лучше забить в отдельные строковые переменные все названия?

Так будет проще.

beatitas
16.12.2023, 16:57
Добрый день.


Так будет проще.

Евгений, спасибо.

beatitas
16.12.2023, 18:52
А как переносить строки в Telegram?

На питоне просто добавлял \n или <b></b>внутрь строки

при отправке строки из кодсиса - <b></b> просто пропадают, не выделяя текст. Как буд то их съедает Кодсис - при запущенном приложении, внутри строки их уже нет.
А \n приходит как текст не перенося строку.

Евгений Кислов
16.12.2023, 19:28
А как переносить строки в Telegram?

На питоне просто добавлял \n или <b></b>внутрь строки

при отправке строки из кодсиса - <b></b> просто пропадают, не выделяя текст. Как буд то их съедает Кодсис - при запущенном приложении, внутри строки их уже нет.
А \n приходит как текст не перенося строку.

Дело точно не в CODESYS.
Я когда-то давно добивался нужного поведения - и жирности, и переноса строки, и т. д.
Кажется, дело было в аргументе parse_mode метода sendMessage.
https://core.telegram.org/bots/api#sendmessage

Попробуйте разные варианты его использования (для разных вариантов используется разная разметка).

Upd. - освежил воспоминания.
parse_mode=HTML
<b>Первая жирная строка</b>%0AВторая обычная строка

Или можете непосредственно на Python написать скрипт и вызывать его из CODESYS с нужными аргументами - наши контроллеры это поддерживают.
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/11_Other/Example_PythonSharedMemory_3517v1.zip

Николай Суриков
16.12.2023, 22:22
А как переносить строки в Telegram?

На питоне просто добавлял \n или <b></b>внутрь строки

при отправке строки из кодсиса - <b></b> просто пропадают, не выделяя текст. Как буд то их съедает Кодсис - при запущенном приложении, внутри строки их уже нет.
А \n приходит как текст не перенося строку.

Съешь еще этих мягких французских булок %0Aда выпей чаю.

meta11ist87
17.12.2023, 11:20
Вопрос. Контроллером ПЛК210 через апи забираю с ОвенКлауд(далее ОК) значение температуры.
Как проверить достоверность этого параметра?
Чтоб выдать сигнал, когда параметр в ОК не менялся определённое кол-во времени или почему-то перестали поступать данные с ОК(например канал упал).

Николай Суриков
17.12.2023, 11:40
Вопрос. Контроллером ПЛК210 через апи забираю с ОвенКлауд(далее ОК) значение температуры.
Как проверить достоверность этого параметра?
Чтоб выдать сигнал, когда параметр в ОК не менялся определённое кол-во времени или почему-то перестали поступать данные с ОК(например канал упал).

https://api.owencloud.ru/#parameter


Описание возвращаемых полей:
Возвращается json-массив объектов с полями:
id - идентификатор параметра
values - массив с одним объектом.
d - unix timestamp, когда было получено значение
v - значение параметра
e - код ошибки при чтении
f - отформатированное значение (в т.ч. учитывается код ошибки)
Сравнивайте метку времени (d) и принимайте соответствующее решение.

beatitas
17.12.2023, 12:29
Съешь еще этих мягких французских булок %0Aда выпей чаю.

Спасибо.


Дело точно не в CODESYS.
Я когда-то давно добивался нужного поведения - и жирности, и переноса строки, и т. д.
Кажется, дело было в аргументе parse_mode метода sendMessage.
https://core.telegram.org/bots/api#sendmessage

Попробуйте разные варианты его использования (для разных вариантов используется разная разметка).

Upd. - освежил воспоминания.
parse_mode=HTML
<b>Первая жирная строка</b>%0AВторая обычная строка

Или можете непосредственно на Python написать скрипт и вызывать его из CODESYS с нужными аргументами - наши контроллеры это поддерживают.
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/11_Other/Example_PythonSharedMemory_3517v1.zip

Благодарю. Долго бы я пытался заставить работать \n, если бы не подсказка %0A :D

vitalij
18.12.2023, 09:47
Не забудьте проверить порт и ID.
И то что приборы в одной подсети...

спасибо. помогло. был не внимателен к ID

МихаилГл
18.12.2023, 10:56
спасибо. помогло. был не внимателен к ID

Хотя многие тут пишут, что ID для ModBus TCP не важен... Иногда без него никак (вернее всегда).

shvitaliy
19.12.2023, 05:11
Добрый день. Подскажите пожалуйста, как фиксировать время? Нужно по событию переменной "bool" фиксировать время возникновения события и исчезновение события с записью времени в энергонезависимую переменную.

Евгений Кислов
19.12.2023, 06:11
Добрый день. Подскажите пожалуйста, как фиксировать время? Нужно по событию переменной "bool" фиксировать время возникновения события и исчезновение события с записью времени в энергонезависимую переменную.

Добрый день. Используйте ФБ R_TRIG и F_TRIG из библиотеки Standard - они генерируют единичный импульс при изменении входной BOOL-переменной от FALSE к TRUE (R_TRIG) и от TRUE к FALSE (F_TRIG) соответственно.

vitalij
19.12.2023, 06:33
Здравствуйте. как будет лучше, если при использовании библиотеки owencommunication в плане TCP сделать опрос слейвов исходя ,что у каждого слейва свой порт допустим 502,503,504..... или у каждого одинаковый порт 502 и обработка опроса соответсвенно последовательна... а если же каждому слейву задать уникальные порты 502,503,504... то обработка как бы параллеьно опрос в программе, то есть в программе создать при разных портах на слейвах количество клиентов и слейвов одинаково. как будет из этих двух случаев быстрее и эффективнее?

Евгений Кислов
19.12.2023, 06:44
Добрый день.


или у каждого одинаковый порт 502 и обработка опроса соответсвенно последовательна

Это не так. У каждого слэйва свой уникальный IP-адрес, и с каждым из слэйвов будет установлено отдельное TCP-соединение - независимо от номера его порта и того факта, совпадает ли он с номерами портов других слэйвов, или нет.


как будет из этих двух случаев быстрее и эффективнее?

Оба случая равнозначны.

shvitaliy
19.12.2023, 07:37
Добрый день. Используйте ФБ R_TRIG и F_TRIG из библиотеки Standard - они генерируют единичный импульс при изменении входной BOOL-переменной от FALSE к TRUE (R_TRIG) и от TRUE к FALSE (F_TRIG) соответственно.

Спасибо. Это я понимаю. Как записывать "время" импульса в переменную?

Евгений Кислов
19.12.2023, 07:38
Далее в переменную тип time, а ее преобразовать в word и передать удаленно?

Зависит от того, что именно вы хотите сделать.

shvitaliy
19.12.2023, 08:31
Зависит от того, что именно вы хотите сделать.

Мне это время надо передать в скаду

Евгений Кислов
19.12.2023, 08:50
Мне это время надо передать в скаду

Что вам мешает это сделать?

beatitas
20.12.2023, 11:44
Добрый день. Подскажите пожалуйста, как фиксировать время? Нужно по событию переменной "bool" фиксировать время возникновения события и исчезновение события с записью времени в энергонезависимую переменную.

Криво, в сравнении с ST, но копмилируется) Дальше пишите в retain. Если нужно время в другом формате - смотрите в структуре stRTC - там есть всё необходимое.

72498

Спорягин Кирилл
20.12.2023, 11:54
День добрый, коллеги.

Подскажите, как удалить соединение со своим СПК110.

Поясню проблему. Хочу передать проект стороннему человеку, и навсякий случай, чтобы он по ошибке не перезалил мне панель, хочу удалить активное соединение, но оно упрямо сохраняется.
Что делал:
1. Менял тип устройства
2. Пересохранял проект как (с другим именем)
3. Выбирал это соединение и удалял его (когда строка выделена, нажимал на Del).

В какой-то момент вместо IP адреса соединения в строке соединения стал писать некий ID 20 цифр (5 групп по 4 цифры).
Но и по этому ID он упорно устанавливает соединение с моей панелью.

Все вышеописанное поясняет картинка.

Спасибо.72500

beatitas
20.12.2023, 11:56
Помогите, пожалуйста, разобраться - где я накосячил.

Хочу отправлять ошибки сенсоров в телеграм. Появилась проблема с ENUM ANALOG_SENSOR_ERROR.

72499

Вот в таком виде конструкция работает - ошибка датчика читается. Сообщение приходит в телеграмм.

А вот после запихивания этой конструкции в отдельный ФБ - начинает ругаться на

[ERROR] PLC200: sensor_Error_To_Telegram [Device: Plc Logic: Application](Элемент 0 (Реализ.)): C0358: 'eStatus' - неподходящее значение для типа ENUM 'ANALOG_SENSOR_ERRORS'

72501

72502

Евгений Кислов
20.12.2023, 12:27
Помогите, пожалуйста, разобраться - где я накосячил.

Хочу отправлять ошибки сенсоров в телеграм. Появилась проблема с ENUM ANALOG_SENSOR_ERROR.

72499

Вот в таком виде конструкция работает - ошибка датчика читается. Сообщение приходит в телеграмм.

А вот после запихивания этой конструкции в отдельный ФБ - начинает ругаться на

[ERROR] PLC200: sensor_Error_To_Telegram [Device: Plc Logic: Application](Элемент 0 (Реализ.)): C0358: 'eStatus' - неподходящее значение для типа ENUM 'ANALOG_SENSOR_ERRORS'

72501

72502

У eStatus должен быть тип Mx210Assistant.ANALOG_SENSOR_ERRORS

Евгений Кислов
20.12.2023, 12:30
День добрый, коллеги.

Подскажите, как удалить соединение со своим СПК110.

Поясню проблему. Хочу передать проект стороннему человеку, и навсякий случай, чтобы он по ошибке не перезалил мне панель, хочу удалить активное соединение, но оно упрямо сохраняется.
Что делал:
1. Менял тип устройства
2. Пересохранял проект как (с другим именем)
3. Выбирал это соединение и удалял его (когда строка выделена, нажимал на Del).

В какой-то момент вместо IP адреса соединения в строке соединения стал писать некий ID 20 цифр (5 групп по 4 цифры).
Но и по этому ID он упорно устанавливает соединение с моей панелью.

Все вышеописанное поясняет картинка.

Спасибо.72500

Добрый день.
Вы сняли эту галочку?

72504

beatitas
20.12.2023, 12:49
У eStatus должен быть тип Mx210Assistant.ANALOG_SENSOR_ERRORS

Спасибо огромное! Всё заработало)

Спорягин Кирилл
20.12.2023, 12:58
Добрый день.
Вы сняли эту галочку?

72504

Да, снял. После чего пересохранил проект.

Делал еще "Очистить все".

Но пока соединение сохраняется.

Евгений Кислов
20.12.2023, 13:02
Да, снял. После чего пересохранил проект.

Делал еще "Очистить все".

Но пока соединение сохраняется.

Попробуйте сами пока что перенести проект на другой ПК и проверить. Или закрыть и открыть CODESYS заново.
Я думаю, у вас на ПК информация о соединении просто прокэшировалась.

bango
20.12.2023, 16:20
Прошу помощи по рефакторингу. Задача есть мотор асинхронный кнопка ПУСК без фиксации кнопка СТОП с фиксацией и контроль за АВАРИЯМИ по току и температуре.

//интерфейс аварий
INTERFACE IAlarm
// Метод выключения Аварии
METHOD AlarmOff : BOOL
VAR_INPUT
END_VAR
// Метод включения Аварии
METHOD AlarmOn : BOOL
VAR_INPUT
END_VAR

// Интерфей Моторов
INTERFACE IMotor
// выключить мотор
METHOD MotorOff : BOOL
VAR_INPUT
END_VAR
// включить Мотор
METHOD MotorOn : BOOL
VAR_INPUT
END_VAR

---------------------------------------------
// класс мотор с отслеживанием аварии
FUNCTION_BLOCK classMotor IMPLEMENTS IMotor, IAlarm
VAR_INPUT
onMotor: BOOL;// запуск мотора
offMotor: BOOL;// выключение мотора
alarmKz: BOOL; //авария короткого замыкания
alarmTemp: BOOL;//авария по температуре
END_VAR
VAR_OUTPUT
motorOut: BOOL;//выход мотора
motorAlarmOut: BOOL;// выход аварии мотора
END_VAR
VAR
// Логика работы
motorTrigRs: Standard.RS;
statusMotor: BOOL;
statusAlarm: BOOL;
END_VAR
// запуск мотора
motorTrigRs(SET:= onMotor, RESET1:= offMotor OR motorAlarmOut);
IF motorTrigRs.Q1 THEN
MotorOn();
ELSE
MotorOff();
END_IF
motorOut:= statusMotor;
// отследить аварию мотора
IF alarmKz OR alarmTemp THEN
AlarmOn();
ELSE
AlarmOff();
END_IF
motorAlarmOut:= statusAlarm;

(* Метод выключения Аварии*)
METHOD AlarmOff : BOOL
statusAlarm:= FALSE;
(* Метод включения Аварии*)
METHOD AlarmOn : BOOL
statusAlarm:= TRUE;
(* выключить мотор*)
METHOD MotorOff : BOOL
statusMotor:= FALSE;
(* включить Мотор*)
METHOD MotorOn : BOOL
statusMotor:= TRUE;
--------------------------------------------
PROGRAM PLC_PRG
VAR
// блок моторов
// входы
InStartMotor_2:BOOL;// пуск мотора
InStopMotor_2: BOOL;// стоп мотора
// авария мотора
InAlarmKz_2,InAlarmTemp_2: BOOL;

// выходы мотора
Q_2Motor: BOOL;
Q_2Alarm: BOOL;

// объект мотор
objMotor_2: classMotor;
END_VAR


objMotor_2(onMotor:= InStartMotor_2,offMotor:= InStopMotor_2,// включить мотор
alarmKz:= InAlarmKz_2,alarmTemp:= InAlarmTemp_2,// отслеживаем аварию
motorOut=> Q_2Motor,motorAlarmOut=> Q_2Alarm);// визуализация выходов мотора и аварии

МихаилГл
20.12.2023, 16:32
Прошу помощи по рефакторингу. Задача есть мотор асинхронный кнопка ПУСК без фиксации кнопка СТОП с фиксацией и контроль за АВАРИЯМИ по току и температуре.

//интерфейс аварий
INTERFACE IAlarm
// Метод выключения Аварии
METHOD AlarmOff : BOOL
VAR_INPUT
END_VAR
// Метод включения Аварии
METHOD AlarmOn : BOOL
VAR_INPUT
END_VAR

// Интерфей Моторов
INTERFACE IMotor
// выключить мотор
METHOD MotorOff : BOOL
VAR_INPUT
END_VAR
// включить Мотор
METHOD MotorOn : BOOL
VAR_INPUT
END_VAR

---------------------------------------------
// класс мотор с отслеживанием аварии
FUNCTION_BLOCK classMotor IMPLEMENTS IMotor, IAlarm
VAR_INPUT
onMotor: BOOL;// запуск мотора
offMotor: BOOL;// выключение мотора
alarmKz: BOOL; //авария короткого замыкания
alarmTemp: BOOL;//авария по температуре
END_VAR
VAR_OUTPUT
motorOut: BOOL;//выход мотора
motorAlarmOut: BOOL;// выход аварии мотора
END_VAR
VAR
// Логика работы
motorTrigRs: Standard.RS;
statusMotor: BOOL;
statusAlarm: BOOL;
END_VAR
// запуск мотора
motorTrigRs(SET:= onMotor, RESET1:= offMotor OR motorAlarmOut);
IF motorTrigRs.Q1 THEN
MotorOn();
ELSE
MotorOff();
END_IF
motorOut:= statusMotor;
// отследить аварию мотора
IF alarmKz OR alarmTemp THEN
AlarmOn();
ELSE
AlarmOff();
END_IF
motorAlarmOut:= statusAlarm;

(* Метод выключения Аварии*)
METHOD AlarmOff : BOOL
statusAlarm:= FALSE;
(* Метод включения Аварии*)
METHOD AlarmOn : BOOL
statusAlarm:= TRUE;
(* выключить мотор*)
METHOD MotorOff : BOOL
statusMotor:= FALSE;
(* включить Мотор*)
METHOD MotorOn : BOOL
statusMotor:= TRUE;
--------------------------------------------
PROGRAM PLC_PRG
VAR
// блок моторов
// входы
InStartMotor_2:BOOL;// пуск мотора
InStopMotor_2: BOOL;// стоп мотора
// авария мотора
InAlarmKz_2,InAlarmTemp_2: BOOL;

// выходы мотора
Q_2Motor: BOOL;
Q_2Alarm: BOOL;

// объект мотор
objMotor_2: classMotor;
END_VAR


objMotor_2(onMotor:= InStartMotor_2,offMotor:= InStopMotor_2,// включить мотор
alarmKz:= InAlarmKz_2,alarmTemp:= InAlarmTemp_2,// отслеживаем аварию
motorOut=> Q_2Motor,motorAlarmOut=> Q_2Alarm);// визуализация выходов мотора и аварии

А что тут непонятного? В prg функциональному блоку передаются значения кнопок, в блоке тупо включить/выключить. Ну ещё парочка интерфейсов, в которых я не разбираюсь...

sssssaaaaabbbbb
21.12.2023, 14:12
Здравствуйте коллеги, подскажите пожалуйста, как подключиться к симплскаде от ПЛК210? говорят, что можно как то через символьные переменные и по ОПС серверу(arOPC). Что нужно включить или настроить у ПЛК 210. чтоб подключиться?72537

Евгений Кислов
21.12.2023, 16:56
Здравствуйте коллеги, подскажите пожалуйста, как подключиться к симплскаде от ПЛК210? говорят, что можно как то через символьные переменные и по ОПС серверу(arOPC). Что нужно включить или настроить у ПЛК 210. чтоб подключиться?72537

Добрый день.
Посмотрите примеры в этом документе:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_OPC_v3.0.pdf

sssssaaaaabbbbb
21.12.2023, 17:10
Как мне считать эти цифры? 72539

Евгений Кислов
21.12.2023, 17:18
Как мне считать эти цифры? 72539

Выберите функцию 04.

sssssaaaaabbbbb
21.12.2023, 17:25
Выберите функцию 04.

72540 это я уже делал

Евгений Кислов
21.12.2023, 17:30
72540 это я уже делал

Используйте вместо Modbus Poll другое ПО, в котором есть логи - например, Modbus Universal MasterOPC
https://masteropc.ru/download

beatitas
21.12.2023, 18:20
Добрый вечер.
Подскажите пожалуйста, как правильно организовать задержку в цикле.
Поскольку из-за того что в string можно затолкать всего 255 символов, курл со всеми токенами и ботАйДи занимает 164 символа UTF-8 оставляя на сообщение около 45 символов UTF16

Оттого появилась задача - отправлять сообщения в телеграм с задержкой в 2 секунды в связи с ограничением API не более 30 сообщений в минуту и не более 1 в секунд.

Хотел затолкать TON прямо в начало цикла, типа wait. но не понимаю как его правильно прикрутить.




IF eStatus <> Mx210Assistant.ANALOG_SENSOR_ERRORS.NO_ERROR

THEN xSensorError := TRUE;
wsErrorMessage := ANALOG_SENSOR_ERROR_TO_WSTRING(eStatus);
wsMessage := WCONCAT(wsSensorName,wsErrorMessage);

sCommand := OSU.ReplaceAllSubstrings(c_sCommand, '#TOKEN#', sToken);
sCommand := OSU.ReplaceAllSubstrings(sCommand, '#CHAT_ID#', sChatId);
sCommand := OSU.ReplaceAllSubstrings(sCommand, '#PARSE_MODE#', sParseMode);

STU.ConvertUTF16toUTF8(ADR(wsMessage), ADR(sUtf8Message), SIZEOF(sUtf8Message), FALSE);

sCommand := OSU.ReplaceAllSubstrings(sCommand, '#TEXT#', sUtf8Message);


ELSIF rValue > rHiSpDeviationLevel OR rValue < rLowSpDeviationLevel
THEN
rValueRound := OSCAT_BASIC.ROUND(rValue,2);
wsValueText := TO_WSTRING(rValueRound);
wsSetPointText := TO_WSTRING(rSetPoint);
wsMaxDevPerc := TO_WSTRING(iMaxDeviationPercent);

awsMessage[1] := wsSensorName;
awsMessage[2] := OSU.WCONCAT8("Отклонился от уставки", wsSetPointText, " более чем на ", wsMaxDevPerc, "%");
awsMessage[3] := OSU.WCONCAT4("Текущее значение датчика", wsValueText, wsUnitsName, "");


FOR i := 1 TO 3 DO

sCommand := OSU.ReplaceAllSubstrings(c_sCommand, '#TOKEN#', sToken);
sCommand := OSU.ReplaceAllSubstrings(sCommand, '#CHAT_ID#', sChatId);
sCommand := OSU.ReplaceAllSubstrings(sCommand, '#PARSE_MODE#', sParseMode);

STU.ConvertUTF16toUTF8(ADR(awsMessage[i]), ADR(sUtf8Message), SIZEOF(sUtf8Message), FALSE);

sCommand := OSU.ReplaceAllSubstrings(sCommand, '#TEXT#', sUtf8Message);
END_FOR



ELSE
xSensorOK := TRUE;

END_IF

sssssaaaaabbbbb
21.12.2023, 18:34
Используйте вместо Modbus Poll другое ПО, в котором есть логи - например, Modbus Universal MasterOPC
https://masteropc.ru/download
не получается
72542

Cs-Cs
21.12.2023, 19:13
beatitas Я делал на СМСках от обратного: брал таймер BLNIK и раз в NN секунд просматривал очередь сообщений.
Если там что-то было - отправлял.

Евгений Кислов
21.12.2023, 20:18
не получается
72542

Выложите лог OPC-сервера и ваш проект CODESYS.

sssssaaaaabbbbb
22.12.2023, 08:11
Выложите лог OPC-сервера и ваш проект CODESYS.
https://cloud.mail.ru/public/C9Yc/Se5dJF2sY

beatitas
22.12.2023, 09:51
beatitas Я делал на СМСках от обратного: брал таймер BLNIK и раз в NN секунд просматривал очередь сообщений.
Если там что-то было - отправлял.

Благодарю.
Буду пробовать, но это усложняет задачу на написание буфера для очереди сообщений. Пока вообще не понимаю с какой стороны к нему подходить и на чём основывать. SQL базу прикручивать, как это делается в вебе? Но он точно нужен, на случай массового отвала датчиков)

Евгений Кислов
22.12.2023, 09:59
Благодарю.
Буду пробовать, но это усложняет задачу на написание буфера для очереди сообщений. Пока вообще не понимаю с какой стороны к нему подходить и на чём основывать. SQL базу прикручивать, как это делается в вебе? Но он точно нужен, на случай массового отвала датчиков)

Если все страдания из-за гипотезы о том, что "в string можно затолкать всего 255 символов" - то она неверна.
https://owen.ru/forum/showthread.php?t=28167&page=4&p=289762&viewfull=1#post289762
https://owen.ru/forum/showthread.php?t=28167&page=11&p=361101&viewfull=1#post361101

Cs-Cs
22.12.2023, 10:04
Пока вообще не понимаю с какой стороны к нему подходить и на чём основывать.
Но он точно нужен, на случай массового отвала датчиков)
Я делал примерно так:
1. Структура - описание элемента очереди. У неё была строка сообщения, номер адресата (для СМСок) и флаг "активно" (Active).
Этот флаг был нужен алгоритму перебора очереди, чтобы понимать что этот элемент ещё не отправлен.

2. Массив этих структур - сама очередь. Выбрал его жёсткие границы и сделал их в виде константы с названием типа MAX_QUEUE_SIZE для того, чтобы во всех циклах и проверках её использовать, и не было жёстко заданных магических чисел из-за которых циклы выйдут за границы массива.
Это объявляется примерно так:
VAR CONSTANT
MAX_QUEUE_SIZE : WORD := 64;
END_VAR
VAR
arrQueue : ARRAY [1..MAX_QUEUE_SIZE] OF SMSItem;
END_VAR

3. Функция "Добавить в очередь". Она в цикле перебирает весь этот массив и ищет элемент, в котором Active = FALSE, заполняет его нужными данными и ставит Active = TRUE.
Это простой цикл с условием: как только нашли Active = FALSE, делаем нужное действие и по EXIT; выходим из цикла.

4. Функция "Обработка очереди". Там тоже цикл. Но он ищет первый элемент с Active = TRUE и закидывает данные из него в модем, а сам элемент помечает как Active = FALSE. Выход - тоже по EXIT;.
Её мы и вызываем по таймеру не чаще, чем нужно.

Во! =)

capzap
22.12.2023, 10:04
Буду пробовать, но это усложняет задачу на написание буфера для очереди сообщений.Пока вообще не понимаю с какой стороны к нему подходить и на чём основывать.

https://owen.ru/forum/showthread.php?t=25216&p=221238&viewfull=1#post221238

Евгений Кислов
22.12.2023, 10:06
https://cloud.mail.ru/public/C9Yc/Se5dJF2sY

Вы зачем-то этому параметру 100 задали.
Задайте 0 - и все станет нормально.

72556

sssssaaaaabbbbb
22.12.2023, 10:12
Вы зачем-то этому параметру 100 задали.
Задайте 0 - и все станет нормально.

72556

СПАСИБО!!!!!

beatitas
22.12.2023, 10:13
https://owen.ru/forum/showthread.php?t=25216&p=221238&viewfull=1#post221238

Благодарю, пошёл качать 2.3)


Я делал примерно так:
1. Структура - описание элемента очереди. У неё была строка сообщения, номер адресата (для СМСок) и флаг "активно" (Active).
Этот флаг был нужен алгоритму перебора очереди, чтобы понимать что этот элемент ещё не отправлен.

2. Массив этих структур - сама очередь. Выбрал его жёсткие границы и сделал их в виде константы с названием типа MAX_QUEUE_SIZE для того, чтобы во всех циклах и проверках её использовать, и не было жёстко заданных магических чисел из-за которых циклы выйдут за границы массива.
Это объявляется примерно так:
VAR CONSTANT
MAX_QUEUE_SIZE : WORD := 64;
END_VAR
VAR
arrQueue : ARRAY [1..MAX_QUEUE_SIZE] OF SMSItem;
END_VAR

3. Функция "Добавить в очередь". Она в цикле перебирает весь этот массив и ищет элемент, в котором Active = FALSE, заполняет его нужными данными и ставит Active = TRUE.
Это простой цикл с условием: как только нашли Active = FALSE, делаем нужное действие и по EXIT; выходим из цикла.

4. Функция "Обработка очереди". Там тоже цикл. Но он ищет первый элемент с Active = TRUE и закидывает данные из него в модем, а сам элемент помечает как Active = FALSE. Выход - тоже по EXIT;.
Её мы и вызываем по таймеру не чаще, чем нужно.

Во! =)

Спасибо огромное. Уже после того как ляпнул про БД - вспомнил про массив структур. Пока не понимаю до конца как правильно обрабатывать это циклом, но буду пробовать повторить)

Cs-Cs
22.12.2023, 10:32
beatitas Пожалуйста!

capzap
22.12.2023, 11:39
Благодарю, пошёл качать 2.3)

не обязательно, oscat библиотека доступна и в 3.5

beatitas
22.12.2023, 19:36
не обязательно, oscat библиотека доступна и в 3.5

Благодарю. Нашёл в OSCAT.basic FIFO12/32. Завтра попробую переделать для wstring. Но всё равно пока не понимаю с какой стороны к нему задержку прикручивать. Если я правильно понимаю - то BLINK на RD. Но как тогда писать - сенсоры же опрашиваются внутри одного цикла ПЛК. Или можно его несколько раз триггерить за цикл? Надо эксперементировать))

capzap
22.12.2023, 19:44
Записывать нужно всё сколько событий придет, а читать через заданное время, на чем не принципиально, блинк это или таймер или в отдельной задаче с нужным временем цикла

bango
25.12.2023, 09:15
нужно мнение спеца по ООП хочу сделать библиотеку что бы каждый раз не писать кучу кода.

sssssaaaaabbbbb
25.12.2023, 16:04
Здравствуйте коллеги, пытаюсь со скады достучаться до ПЛК210(символьные переменные включил 72614 ) по CoDeSys.OPC.DA при этом появляется сообщение с ошибкой 72615 . Подскажите, как то можно достучаться со скады до ПЛК по OPC.DA?

МихаилГл
25.12.2023, 16:10
Здравствуйте коллеги, пытаюсь со скады достучаться до ПЛК210(символьные переменные включил 72614 ) по CoDeSys.OPC.DA при этом появляется сообщение с ошибкой 72615 . Подскажите, как то можно достучаться со скады до ПЛК по OPC.DA?

Opc ua использовать надо, а не da

Судя по скрину это simple scada. С неё не пробовал, но думаю это возможно, т.к. с rapid и master scada всё нормально идёт через opc ua.

sssssaaaaabbbbb
25.12.2023, 16:52
Opc ua использовать надо, а не da

Судя по скрину это simple scada. С неё не пробовал, но думаю это возможно, т.к. с rapid и master scada всё нормально идёт через opc ua.

Спасибо!!!

vitalij
26.12.2023, 14:39
Здравствуйте . к плк 210 две недели без проблем мог подключаться по веб интрефейсу. решил так же как обычно подключиться и сегодня и вот такой результат:

/usr/lib/lua/5.1/luci/dispatcher.lua:507: bad argument #1 to 'pairs' (table expected, got nil)
stack traceback:
[C]: in function 'pairs'
/usr/lib/lua/5.1/luci/dispatcher.lua:507: in function 'createtree'
/usr/lib/lua/5.1/luci/dispatcher.lua:220: in function 'dispatch'
/usr/lib/lua/5.1/luci/dispatcher.lua:112: in function </usr/lib/lua/5.1/luci/dispatcher.lua:111>


это как считается нормально? без причин

vitalij
26.12.2023, 14:47
если часто такие будут проблемы

/usr/lib/lua/5.1/luci/dispatcher.lua:507: bad argument #1 to 'pairs' (table expected, got nil)
stack traceback:
[C]: in function 'pairs'
/usr/lib/lua/5.1/luci/dispatcher.lua:507: in function 'createtree'
/usr/lib/lua/5.1/luci/dispatcher.lua:220: in function 'dispatch'
/usr/lib/lua/5.1/luci/dispatcher.lua:112: in function </usr/lib/lua/5.1/luci/dispatcher.lua:111>

и если мне понадобится менять настройки в контроллере, то есть ли альтернативные варианты, обойтись без веб интерфейса??????????????????

Test_driver
26.12.2023, 15:02
Здравия, Всем!
Прошёл обучение на СПК на CFC, понятия поверхностные имею, сильно не бейте.
Хочу "подружить" по Modbus "левое" устройство.
Вопрос:
1. На вкладке "Канал Modbus" в Codesys двигал их (каналы) кнопками "Выше/Ниже", в результате на вкладке "Соотнесение каналов" появились дубли. Уже был ответ, что перебивать заново. Зачем тогда этот функционал "Выше/Ниже", если это приводит к необратимым последствиям? Как правильно пользоваться этими кнопками (двигать каналы)? И можно ли? Можно-ли переименовать канал без последствий? И как?
2. Код функции требуется 0x10. Нашёл на форуме, что через библиотеку OwenCommunication. А как по конкретнее? Через блок OCL.COM_Control, а также следом через OCL.MB_SerialRequest?
3. Сколько каналов можно организовать в Codesys, из опыта работы, чтоб особо не тормозило?

Евгений Кислов
26.12.2023, 16:22
если часто такие будут проблемы

/usr/lib/lua/5.1/luci/dispatcher.lua:507: bad argument #1 to 'pairs' (table expected, got nil)
stack traceback:
[C]: in function 'pairs'
/usr/lib/lua/5.1/luci/dispatcher.lua:507: in function 'createtree'
/usr/lib/lua/5.1/luci/dispatcher.lua:220: in function 'dispatch'
/usr/lib/lua/5.1/luci/dispatcher.lua:112: in function </usr/lib/lua/5.1/luci/dispatcher.lua:111>

и если мне понадобится менять настройки в контроллере, то есть ли альтернативные варианты, обойтись без веб интерфейса??????????????????

Добрый день.
Вы ранее перепрошивали этот контроллер?

Евгений Кислов
26.12.2023, 16:28
Здравия, Всем!
Прошёл обучение на СПК на CFC, понятия поверхностные имею, сильно не бейте.
Хочу "подружить" по Modbus "левое" устройство.
Вопрос:
1. На вкладке "Канал Modbus" в Codesys двигал их (каналы) кнопками "Выше/Ниже", в результате на вкладке "Соотнесение каналов" появились дубли. Уже был ответ, что перебивать заново. Зачем тогда этот функционал "Выше/Ниже", если это приводит к необратимым последствиям? Как правильно пользоваться этими кнопками (двигать каналы)? И можно ли? Можно-ли переименовать канал без последствий? И как?
2. Код функции требуется 0x10. Нашёл на форуме, что через библиотеку OwenCommunication. А как по конкретнее? Через блок OCL.COM_Control, а также следом через OCL.MB_SerialRequest?
3. Сколько каналов можно организовать в Codesys, из опыта работы, чтоб особо не тормозило?

Добрый день.

1. Эту ошибку исправили в версии плагина Modbus 4.3.0.0.
2. Запрос с кодом функции 0x10 можно отправить как через OwenCommunication (и в этом случае ваше описание верно; подробнее см. в документе CODESYS V3.5. Modbus), так и через канал в дереве проекта (о которых вы спрашиваете в предыдущем вопросе).
3. Если речь о RS-485 - то сколько угодно, потому что в каждый момент времени обрабатывается только один канал.
Естественно, чем больше каналов, тем больше будет полный период опроса всех каналов в пределах данной шины.

Test_driver
26.12.2023, 16:32
...и если мне понадобится менять настройки в контроллере, то есть ли альтернативные варианты, обойтись без веб интерфейса??????????????????

Там, "на борту", 1 - microUSB (RNDIS) - Для настройки и программирования ПЛК210 по USB. Поставляется в комплекте с ПЛК210. Длина: 1,8 м.
Правда не так оперативно, с ноутбуком надо подходить, но без "сетки" можно так же управлять.

Test_driver
26.12.2023, 16:54
Евгений Кислов! Вы гениальный человек! - Сообщений 11 657.
Благодарю за оперативный ответ!
... пошёл "курить" плагин Modbus. Вопросов стало не меньше.

Обновил Modbus до - 4.3.0.0.package (27-Jul-2023 13:02, 14M).
Пофиксены ошибки:

MODBUS-59 Bug: Old channels are not deleted after moving and reconfiguration (Старые каналы не удаляются после перемещения и реконфигурации);
MODBUS-146 ModbusEditorBug: number of channels is limited to 10 (Редактор Modbus: количество каналов ограничено 10)
... и много других.

Буду тестировать. Код функции 0x10 не увидел, вероятно, я ещё чего-то не догоняю "в дереве проекта".

Вопрос: есть ли некие такие правила неписанные или писанные, что и какие каналы создавать в начале, а какие в конце?
Например, сначала все Input`ы (запись в выходы), а потом "Читать" все входы или наоборот. Что для контроллера приоритетней в первую очередь и менее нагрузочно?
Читать 100 каналов (параметров) это нормально? Или перебор? Или такое "чтение" сделать - по событию, раз в минуту, допустим?

vitalij
27.12.2023, 05:50
Добрый день.
Вы ранее перепрошивали этот контроллер?

Не перепрешивал. Мне очень важно, есть ли альтернатива без веб интерфейса,если понадобится менять настройки,,???

vitalij
27.12.2023, 05:54
Там, "на борту", 1 - microUSB (RNDIS) - Для настройки и программирования ПЛК210 по USB. Поставляется в комплекте с ПЛК210. Длина: 1,8 м.
Правда не так оперативно, с ноутбуком надо подходить, но без "сетки" можно так же управлять.

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

Евгений Кислов
27.12.2023, 06:48
Не перепрешивал. Мне очень важно, есть ли альтернатива без веб интерфейса,если понадобится менять настройки,,???

Есть, но это будет довольно трудоемко и у нас нет готовой документации по этому поводу.
Для начала я бы рекомендовал вам перепрошить ПЛК на ту же версию прошивки, что в нем сейчас, с помощью USB- или SD-накопителя со сбросом настроек (с файлом reset_plc).

Евгений Кислов
27.12.2023, 06:51
Буду тестировать. Код функции 0x10 не увидел, вероятно, я ещё чего-то не догоняю "в дереве проекта".

72642

16 - это 0x10


Вопрос: есть ли некие такие правила неписанные или писанные, что и какие каналы создавать в начале, а какие в конце?
Например, сначала все Input`ы (запись в выходы), а потом "Читать" все входы или наоборот. Что для контроллера приоритетней в первую очередь и менее нагрузочно?

Для контроллера это не имеет значения.


Читать 100 каналов (параметров) это нормально? Или перебор? Или такое "чтение" сделать - по событию, раз в минуту, допустим?

Критерии "нормальности" для конкретной системы определяете вы (или автор ТЗ), равно как и настройки опроса (циклический или событийный, периоды и т. д.).

Test_driver
27.12.2023, 09:45
О, Да!
16 - это 0x10 !!!
В Codesys коды функций в десятеричном формате! То есть 3 и 6 это 0x3 и 0x6, это и сбивает с толку, вернее, не задумываешься "что, почём"...
Спасибо, Евгений!

Вопрос: Множественная запись осуществляется по 0х10 - указывается длина. А как реализуется множественное чтение? Сложно организовать? На форуме есть посты, в которых пишут о том, что считывают за раз 96 бит, потом "разбирают" по байтам.

Евгений Кислов
27.12.2023, 09:55
О, Да!
16 - это 0x10 !!!
В Codesys коды функций в десятеричном формате! То есть 3 и 6 это 0x3 и 0x6, это и сбивает с толку, вернее, не задумываешься "что, почём"...
Спасибо, Еагений!

Вопрос: Множественная запись осуществляется по 0х10 - указывается длина. А как реализуется множественное чтение? Сложно организовать? На форуме есть посты, в которых пишут о том, что считывают за раз 96 бит, потом "разбирают" по байтам.

Несложно. Для функций чтения тоже "указывается длина".

Test_driver
27.12.2023, 11:17
Несложно. Для функций чтения тоже "указывается длина".

То есть, "Сдвиг" - это лишь начальный адрес с которого происходит чтение? И далее нужно отдавать себе отчёт, что произойдёт последовательное чтение (и нужно ли это), скажем 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205 - при длине, равное 6 ?

vitalij
27.12.2023, 11:25
Есть, но это будет довольно трудоемко и у нас нет готовой документации по этому поводу.
Для начала я бы рекомендовал вам перепрошить ПЛК на ту же версию прошивки, что в нем сейчас, с помощью USB- или SD-накопителя со сбросом настроек (с файлом reset_plc).

попробывал сделать через Putty перезагрузку ПЛК210 и стал работать веб-интерфейс. если у кого возникнет такая проблема на будущее, как решение

Евгений Кислов
27.12.2023, 11:58
попробывал сделать через Putty перезагрузку ПЛК210 и стал работать веб-интерфейс. если у кого возникнет такая проблема на будущее, как решение

Я сейчас еще раз обдумал вашу ситуацию и понял, что эта известная проблема, решаемая с помощь хотфикса:
https://ftp.owen.ru/CoDeSys3/10_Firmware/_hotfix/2.4.hotfix.zip

Перезагрузка - лишь временное решение, спустя какое-то время вы опять увидите это сообщение, если не установите хотфикс.

vitalij
27.12.2023, 12:14
Я сейчас еще раз обдумал вашу ситуацию и понял, что эта известная проблема, решаемая с помощь хотфикса:
https://ftp.owen.ru/CoDeSys3/10_Firmware/_hotfix/2.4.hotfix.zip

Перезагрузка - лишь временное решение, спустя какое-то время вы опять увидите это сообщение, если не установите хотфикс.

спасибо. попробую

vitalij
27.12.2023, 12:22
Я сейчас еще раз обдумал вашу ситуацию и понял, что эта известная проблема, решаемая с помощь хотфикса:
https://ftp.owen.ru/CoDeSys3/10_Firmware/_hotfix/2.4.hotfix.zip

Перезагрузка - лишь временное решение, спустя какое-то время вы опять увидите это сообщение, если не установите хотфикс.

только прошивка у меня 1.3............ но не 2.4...........

Евгений Кислов
27.12.2023, 12:25
только прошивка у меня 1.3............ но не 2.4...........

Тогда у вас не получится установить хотфикс (но на той прошивке и не было проблем, которых он решал).
В этом случае рекомендую все же перепрошиться на вашу текущую версию прошивки со сбросом настроек.

bango
28.12.2023, 12:15
как отобразить рсский язык пишет иероглифы 72680

Евгений Кислов
28.12.2023, 12:19
как отобразить рсский язык пишет иероглифы 72680

Для отображения кириллицы в визуализации используйте тип WSTRING.

bango
28.12.2023, 12:34
все разобрался. спасибо Евгений посмотрел твое видео по переключению языков.

Test_driver
28.12.2023, 13:04
В Сodesys на вкладке "Modbus Slave Init" можно настроить запись параметров при включении и эта процедура записи разовая.

Вопросы:
1. С программистской точки зрения можно-ли (и нужно-ли) контролировать этот процесс, что запись прошла? Скажем, через глобальные переменные (или как - Init не в var`e?)?
2. Евгений, а в каком формате у Вас проходят уроки, мне мало опыта и знаний? Видео? А как проходят задания? Дом, работа, не всегда свободен.

Евгений Кислов
28.12.2023, 13:16
В Сodesys на вкладке "Modbus Slave Init" можно настроить запись параметров при включении и эта процедура записи разовая.

Вопросы:
1. С программистской точки зрения можно-ли (и нужно-ли) контролировать этот процесс, что запись прошла? Скажем, через глобальные переменные (или как - Init не в var`e?)?
2. Евгений, а в каком формате у Вас проходят уроки, мне мало опыта и знаний? Видео? А как проходят задания? Дом, работа, не всегда свободен.

1. Можно контролировать - это разумный подход.
2. Наш московский учебный центр проводит очные обучающие курсы:
https://owen.ru/edu

Также есть региональные учебные центры:
https://owen.ru/ruc

Test_driver
28.12.2023, 13:25
1. Можно контролировать - это разумный подход.
2. Наш московский учебный центр проводит очные обучающие курсы:
https://owen.ru/edu

Также есть региональные учебные центры:
https://owen.ru/ruc

Был, проходил (Москва), там для старта, получить понятия. Мне мало.
На https://stepik.org смотрю у Вас есть "массивы", язык ST, Подключение контроллера к облачному сервису OwenCloud...

А то вот пишут struct и в дерево проекта в какой-то модуль, а я ещё эту тему не "просёк"

Евгений Кислов
28.12.2023, 13:29
Был, проходил (Москва), там для старта, получить понятия. Мне мало.
На https://stepik.org смотрю у Вас есть "массивы", язык ST, Подключение контроллера к облачному сервису OwenCloud...

На Stepik бесплатный курс - вы можете проходить его в любое удобное вам время.

bango
29.12.2023, 10:50
а есть продвинутый курс заочно как Stepik. Этот курс прошол.

Евгений Кислов
29.12.2023, 11:02
а есть продвинутый курс заочно как Stepik. Этот курс прошол.

Более продвинутых курсов у нас нет.

bango
29.12.2023, 11:08
Жалко, а планируете сделать. Мне очень понравился курс.

Евгений Кислов
29.12.2023, 11:13
Жалко, а планируете сделать. Мне очень понравился курс.

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

bango
29.12.2023, 11:20
Ну точно не знаю но хотелось бы увидеть применение паттернов и алгоритмов.

Евгений Кислов
29.12.2023, 11:22
Ну точно не знаю но хотелось бы увидеть применение паттернов и алгоритмов.

Каких именно паттернов и алгоритмов?

Party3AH
29.12.2023, 11:29
Здравствуйте,
может кто-то сталкивался с проблемой логина web-визуализации с помощью ввода с клавиатуры.
Использую ПЛК210-4, для работы визуализации нужно авторизоваться, делаю это через кнопку, которая открывает стандартный диалог Visu.Login.
72706
Логин и пароль хочу вводить с клавиатуры, поэтому выбираю в настройках web-визуализации - "Ввод с клавиатуры".
72707

Проблема:
Открываю браузер, в нём ввожу логин и пароль, при нажатии Enter или кнопки "ОК" - возникает какая-то пустая область, и визуализация зависает. Ничего не могу нажать, отменить, можно только вводить символы в строку пароля безрезультатно.
72708

Разные браузеры выдают такую же картину (пробую в Chrome и Edge).
В самом Codesys-онлайн всё работает отлично.
Проблема лечится, если выбрать ввод не с клавиатуры, а "Сенсорная панель" - тогда визуализация работает нормально.
Пробовал также Логин из библиотеки OwenVisu - такая же проблема.

bango
29.12.2023, 11:33
Ну допустим фабрика паттерн как применять его достоинства и недостатки и тд и тп и агоритмы типа пузырька. Я конечно понимаю что эти паттерны и алгоритмы для больших проектов. Может быть я не прав и такой курс излишний но когда учишся в компании, намного интересний чем когда учиш один.

Евгений Кислов
29.12.2023, 11:42
Здравствуйте,
может кто-то сталкивался с проблемой логина web-визуализации с помощью ввода с клавиатуры.
Использую ПЛК210-4, для работы визуализации нужно авторизоваться, делаю это через кнопку, которая открывает стандартный диалог Visu.Login.
72706
Логин и пароль хочу вводить с клавиатуры, поэтому выбираю в настройках web-визуализации - "Ввод с клавиатуры".
72707

Проблема:
Открываю браузер, в нём ввожу логин и пароль, при нажатии Enter или кнопки "ОК" - возникает какая-то пустая область, и визуализация зависает. Ничего не могу нажать, отменить, можно только вводить символы в строку пароля безрезультатно.
72708

Разные браузеры выдают такую же картину (пробую в Chrome и Edge).
В самом Codesys-онлайн всё работает отлично.
Проблема лечится, если выбрать ввод не с клавиатуры, а "Сенсорная панель" - тогда визуализация работает нормально.
Пробовал также Логин из библиотеки OwenVisu - такая же проблема.

Добрый день.
Установите в менеджере визуализации галочку Поддержка клиентских анимаций и наложение исходных элементов.
Альтернативный вариант - использовать диалог LoginOwen2 из библиотеки OwenVisuDialogs.

Евгений Кислов
29.12.2023, 11:47
Ну допустим фабрика паттерн как применять его достоинства и недостатки и тд и тп и агоритмы типа пузырька. Я конечно понимаю что эти паттерны и алгоритмы для больших проектов. Может быть я не прав и такой курс излишний но когда учишся в компании, намного интересний чем когда учиш один.

Про паттерн "Фабрика" (и другие паттерны из книги "Банды четырех" (https://ru.wikipedia.org/wiki/Design_Patterns)) множество информации в интернете и литературе (начать можно как раз с упомянутой книги).
То же самое касается алгоритмов - про них много написано и в книгах, и в сети.
Паттерны и алгоритмы не привязаны к языкам и средам разработки - поэтому не очень понятно, зачем нам описывать то, что уже множество раз хорошо описали до нас.

bango
29.12.2023, 11:58
Да вы правы это все разжовано в интернете. Я просто не пойму в какую сторону двигатся для развития.

Party3AH
29.12.2023, 13:45
Спасибо большое, с галочкой всё заработало!

DmitriiAnyushin
09.01.2024, 16:25
Добрый день! Подскажите пожалуйста, какая версия SNMP у контроллера ПЛК210?

Евгений Кислов
09.01.2024, 16:29
Добрый день! Подскажите пожалуйста, какая версия SNMP у контроллера ПЛК210?

Добрый день.
v2c

DmitriiAnyushin
09.01.2024, 16:30
А если клиент v3, то они никак работать не будут?

Евгений Кислов
09.01.2024, 16:33
А если клиент v3, то они никак работать не будут?

Если клиент поддерживает только v3 с её продвинутой криптографией - то не будут.

DmitriiAnyushin
09.01.2024, 16:41
Все понятно. Спасибо!

Test_driver
15.01.2024, 10:41
Евгений, здравствуйте!
"Напал" на Ваш канал на известном видео хостинге. Это кладезь полезной информации.
Вы "вещаете" в основном на языке ST.

1. Мне интересно Ваше мнение. Всё-таки на ST, как программисту, удобнее писать задачи? Чем, скажем на "релюшках" (LD)?
На ST писать код, вроде как, более полноценный код, Ифы, Циклы, указатели там разные..., все дела...

2. Нубский вопрос. А совместить CFC с ST ? Это делается в CodeSys? Ткните ссылку на пример? Или в двух словах - да, нет. Спасибо.

Евгений Кислов
15.01.2024, 10:56
Евгений, здравствуйте!
"Напал" на Ваш канал на известном видео хостинге. Это кладезь полезной информации.
Вы "вещаете" в основном на языке ST.

1. Мне интересно Ваше мнение. Всё-таки на ST, как программисту, удобнее писать задачи? Чем, скажем на "релюшках" (LD)?
На ST писать код, вроде как, более полноценный код, Ифы, Циклы, указатели там разные..., все дела...

2. Нубский вопрос. А совместить CFC с ST ? Это делается в CodeSys? Ткните ссылку на пример? Или в двух словах - да, нет. Спасибо.

Добрый день.

1. Мое мнение - каждый разработчик может выбрать для себя тот язык (или набор языков), который считает наболее подходящим для решения конкретной задачи.
2. В проекте CODESYS можно создавать POU на разных языках (например - программа на CFC, в который вызываются экземпляры ФБ, написанных на ST).

Test_driver
15.01.2024, 11:21
Добрый день.

1. Мое мнение - каждый разработчик может выбрать для себя тот язык (или набор языков), который считает наболее подходящим для решения конкретной задачи.
2. В проекте CODESYS можно создавать POU на разных языках (например - программа на CFC, в который вызываются экземпляры ФБ, написанных на ST).

Благодарю! На курсах показали разок, это POU. "Будем посмотреть", спасибо за лаконичный ответ и пинок в нужное направление.
CFC - классная вещь, всё наглядно и быстро, через библиотеки и т.д. Но иногда надо "хитрую" функцию "приклеить".
Симбиоз CFC и ST - танк!

Николай Суриков
17.01.2024, 15:37
Коллеги прошу подсказки.
Дано: СПК107 подключен по LAN к роутеру в который вставлен USB модем.
Из-за специфики объекта роутер включается на небольшой промежуток времени для передачи архивных данных.
Как из кода программы определить наличие доступа к интернету?

МихаилГл
17.01.2024, 15:41
Коллеги прошу подсказки.
Дано: СПК107 подключен по LAN к роутеру в который вставлен USB модем.
Из-за специфики объекта роутер включается на небольшой промежуток времени для передачи архивных данных.
Как из кода программы определить наличие доступа к интернету?

Ну как вариант реализовать tcp сервер, который будет постоянно слушать порт. А извне посылать JSON запрос, и когда контроллер увидит запрос, он выдаст JSON ответ. И к роутеру привязка формальна выходит. Включили роутер, контроллер увидел запрос, выдал ответ.

saii
18.01.2024, 09:23
Коллеги прошу подсказки.
Дано: СПК107 подключен по LAN к роутеру в который вставлен USB модем.
Из-за специфики объекта роутер включается на небольшой промежуток времени для передачи архивных данных.
Как из кода программы определить наличие доступа к интернету?

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

МихаилГл
18.01.2024, 09:38
Коллеги прошу подсказки.
Дано: СПК107 подключен по LAN к роутеру в который вставлен USB модем.
Из-за специфики объекта роутер включается на небольшой промежуток времени для передачи архивных данных.
Как из кода программы определить наличие доступа к интернету?

В продолжение моего способа:


PROGRAM POU_TCP_SERVER
VAR
fbTcpServer: NBS.TCP_Server; //ФБ TCP-сервера
//Массив структур для обработки подключений
astClients: ARRAY [1..usiMaxConnections] OF DUT_TCP_CONNECTION;
usiActiveClientCounter: USINT; //Число подключенных клиентов
i: INT; //Счетчик для цикла
R_TRIG_0: ARRAY [1..usiMaxConnections] OF R_TRIG;
TON_RES_Y: ARRAY [1..usiMaxConnections] OF TON;
TRX_ALM: TON;
ix: INT;
END_VAR
VAR CONSTANT
//Максимальное число подключенных клиентов
usiMaxConnections: USINT := 5;
END_VAR
VAR_INPUT
Com_From_JSON: BOOL;
Com_From_Main: BOOL;
END_VAR



//создаем сервер на заданном порту
IF usiActiveClientCounter= 5 THEN
//если количество активных клиентов достигло 5, перезапускаем сервер и сбрасываем все подключения
fbTcpServer
(
xEnable:= FALSE
);
usiActiveClientCounter:= 0;
TargetVars.stBuzzer.xSet:= TRUE;
ELSE
fbTcpServer
(
xEnable:= TRUE,
ipAddr := ,
uiPort := 48888
);
END_IF

TRX_ALM(in:= TargetVars.stBuzzer.xSet, PT:=T#3S);
IF TRX_ALM.Q THEN
TargetVars.stBuzzer.xSet:= FALSE;
END_IF

IF fbTcpServer.xError THEN
; //обработка ошибок
END_IF
//создаем обработчики подключений для клиентов
FOR i:= 1 TO usiMaxConnections DO
astClients[i].fbTcpConnection
(
xEnable:=fbTcpServer.xBusy AND NOT astClients[i].fbTcpConnection.xDone,
hServer:=fbTcpServer.hServer
);
IF astClients[i].fbTcpConnection.xError THEN
; //обработка ошибок
END_IF
//отслеживаем подключение клиента
astClients[i].fbAddClient(CLK:=astClients[i].fbTcpConnection.xActive);
//регистрируем подключение нового клиента
IF astClients[i].fbAddClient.Q THEN
usiActiveClientCounter := usiActiveClientCounter + 1;
END_IF
//регистрируем отключение одного из клиентов
IF astClients[i].fbTcpConnection.xDone THEN
usiActiveClientCounter := usiActiveClientCounter - 1;
END_IF
CASE astClients[i].eState OF
DUT_TCP_SERVER_STATE.CREATE: //проверяем, что подключился клиент
IF astClients[i].fbTcpConnection.xActive THEN
astClients[i].eState:=DUT_TCP_SERVER_STATE.LISTEN;
END_IF
DUT_TCP_SERVER_STATE.LISTEN: //получаем данные от клиента
astClients[i].fbTcpRead
(
xEnable := astClients[i].fbTcpConnection.xActive,
hConnection := astClients[i].fbTcpConnection.hConnection,
pData := ADR(astClients[i].sClientString),
szSize := SIZEOF(astClients[i].sClientString)
);
//если получен запрос от клиента - подготавливаем ответ
IF astClients[i].fbTcpRead.xReady THEN
astClients[i].sClientString:= OSU.Between(astClients[i].sClientString, '{', '}');
IF astClients[i].sClientString = '1' THEN
Com_From_JSON := TRUE;
END_IF
Com_From_Main := TRUE;
astClients[i].eState:=DUT_TCP_SERVER_STATE.X_Start;
ELSIF astClients[i].fbTcpRead.xError THEN
; //обработка ошибок
END_IF
DUT_TCP_SERVER_STATE.X_Start:
R_TRIG_0[i](CLK := Com_From_Main);
TON_RES_Y[i](IN := R_TRIG_0[i].CLK, PT := T#50MS);
IF TON_RES_Y[i].Q THEN

MEM.MemFill(ADR(astClients[i].sInverseString), SIZEOF(astClients[i].sInverseString), 16#20);
MEM.MemFill(ADR(astClients[i].sInverseString1000), SIZEOF(astClients[i].sInverseString1000), 16#20);

IF astClients[i].sClientString = '1' THEN
astClients[i].sInverseString:= POU_JSON_CMD1.JSON_STR;
ELSIF astClients[i].sClientString = '2' THEN
astClients[i].sInverseString:= POU_JSON_CMD2.JSON_STR;
ELSIF astClients[i].sClientString = '3' THEN
astClients[i].sInverseString:= POU_JSON_CMD3.JSON_STR;
ELSIF astClients[i].sClientString = '4' THEN
astClients[i].sInverseString:= POU_JSON_CMD4.JSON_STR;
ELSIF astClients[i].sClientString = '5' THEN
astClients[i].sInverseString:= POU_JSON_CMD5.JSON_STR;
ELSIF astClients[i].sClientString = '1000' THEN
astClients[i].sInverseString1000:= POU_Main.STR1000;
ELSE
astClients[i].sInverseString:= '{"Info":"Неизвестный запрос!"}';
END_IF

FOR ix:= 1 TO 25 DO
astClients[i].sInverseString := CONCAT(astClients[i].sInverseString, ' ');
END_FOR;

astClients[i].eState:=DUT_TCP_SERVER_STATE.SEND;
END_IF
DUT_TCP_SERVER_STATE.SEND: //отправляем ответ клиенту
Com_From_Main := FALSE;
R_TRIG_0[i](CLK := FALSE);
TON_RES_Y[i](IN := FALSE);
IF astClients[i].sClientString <> '1000' THEN
astClients[i].fbTcpWrite
(
xExecute := TRUE,
hConnection := astClients[i].fbTcpConnection.hConnection,
pData := ADR(astClients[i].sInverseString),
szSize := SIZEOF(astClients[i].sInverseString)
);
ELSIF astClients[i].sClientString = '1000' THEN
astClients[i].fbTcpWrite
(
xExecute := TRUE,
hConnection := astClients[i].fbTcpConnection.hConnection,
pData := ADR(astClients[i].sInverseString1000),
szSize := SIZEOF(astClients[i].sInverseString1000)
);
END_IF
//если ответ успешно отправлен - продолжаем слушать порт, ожидая следующего запроса
IF astClients[i].fbTcpWrite.xDone THEN
astClients[i].fbTcpWrite(xExecute:=FALSE);
astClients[i].eState:=DUT_TCP_SERVER_STATE.LISTEN;
ELSIF astClients[i].fbTcpWrite.xError THEN
; //обработка ошибок
END_IF
END_CASE
END_FOR

sco-scorpion
18.01.2024, 13:13
Добрый день.
Подскажите правильно я реализую пересчет оборотов энкодера в плк MB210-212?

PetrAfonin
18.01.2024, 15:45
Добрый день.
Много искал, но не нашёл.
CODESYS 3 периодически выдает сообщение "Безопасности" об отсутствии некоторых сертификатов
73013

Евгений Кислов
18.01.2024, 16:20
Добрый день.
Много искал, но не нашёл.
CODESYS 3 периодически выдает сообщение "Безопасности" об отсутствии некоторых сертификатов
73013

Добрый день.
Срок действия сертификатов TLS в ПЛК подходит к концу.
Если вы их не используете - то можете просто удалить.

PetrAfonin
19.01.2024, 11:56
Добрый день.
Срок действия сертификатов TLS в ПЛК подходит к концу.
Если вы их не используете - то можете просто удалить.

Спасибо за подсказку

Эдуард_Н
20.01.2024, 17:48
Подскажите, если в настройках узла модем выбран 3 порт, нужно ли удалять выделенное на скрине с лева ?73025

Евгений Кислов
20.01.2024, 17:52
Подскажите, если в настройках узла модем выбран 3 порт, нужно ли удалять выделенное на скрине с лева ?73025

Да, нужно удалить.

Эдуард_Н
20.01.2024, 19:31
Да, нужно удалить.

Сильно мешать будет?

Евгений Кислов
20.01.2024, 19:39
Сильно мешать будет?

Скорее всего, компонент модема уже просто не сможет открыть COM-порт, потому что его захватит Modbus COM.

PetrAfonin
22.01.2024, 13:35
Добрый день.
Подскажите где поискать системные биты для ПЛК200(210) - в частности интересует бит старта контроллера?

Евгений Кислов
22.01.2024, 13:39
Добрый день.
Подскажите где поискать системные биты для ПЛК200(210) - в частности интересует бит старта контроллера?

Добрый день.
https://www.owen.ru/forum/showthread.php?t=28167&p=304642&viewfull=1#post304642

PetrAfonin
22.01.2024, 16:15
Добрый день.
https://www.owen.ru/forum/showthread.php?t=28167&p=304642&viewfull=1#post304642

Не получается.
Вернее получается, но возникла другая проблема.
После перезагрузки все работает, но своеобразно.
Сперва везде 0, если поставил значение в параметре инициализации, то загружено значение инициализации.
При старте ПЛК загружаются нули. Если сделал код по подсказке, то сперва загружаются нужные значения, затем снова нули.
Выбор типа переменной:RETAIN, PERSISTENT,RETAIN PERSISTENT - ни как не влияет.
Контроллер работает в режиме Slave по ModBUS TCP. Мастер панель. Как бы так то работает, но
Создавал PERSISTENT переменные - тоже не помогает. При перезагрузке значения обнуляются.
Так же если просто контроллер обесточить и снова запитать - значения обнуляются.

Подскажите, что можно сделать?

PetrAfonin
22.01.2024, 16:23
Не получается.
Вернее получается, но возникла другая проблема.
После перезагрузки все работает, но своеобразно.
Сперва везде 0, если поставил значение в параметре инициализации, то загружено значение инициализации.
При старте ПЛК загружаются нули. Если сделал код по подсказке, то сперва загружаются нужные значения, затем снова нули.
Выбор типа переменной:RETAIN, PERSISTENT,RETAIN PERSISTENT - ни как не влияет.
Контроллер работает в режиме Slave по ModBUS TCP. Мастер панель. Как бы так то работает, но
Создавал PERSISTENT переменные - тоже не помогает. При перезагрузке значения обнуляются.
Так же если просто контроллер обесточить и снова запитать - значения обнуляются.

Подскажите, что можно сделать?

Еще так же в ПЛК не установлена MicroSD, в ближайшее время установлю.
Но переменных для сохранения около 70 - возможно ли так, что памяти не хватает для хранения?

Евгений Кислов
22.01.2024, 16:33
Не получается.
Вернее получается, но возникла другая проблема.
После перезагрузки все работает, но своеобразно.
Сперва везде 0, если поставил значение в параметре инициализации, то загружено значение инициализации.
При старте ПЛК загружаются нули. Если сделал код по подсказке, то сперва загружаются нужные значения, затем снова нули.
Выбор типа переменной:RETAIN, PERSISTENT,RETAIN PERSISTENT - ни как не влияет.
Контроллер работает в режиме Slave по ModBUS TCP. Мастер панель. Как бы так то работает, но
Создавал PERSISTENT переменные - тоже не помогает. При перезагрузке значения обнуляются.
Так же если просто контроллер обесточить и снова запитать - значения обнуляются.

Подскажите, что можно сделать?


Свяжитесь со мной завтра утром через телеграм (в подписи) и продемонстрируйте вашу проблему по AnyDesk.

kondor3000
22.01.2024, 19:52
Сперва везде 0, если поставил значение в параметре инициализации, то загружено значение инициализации.
При старте ПЛК загружаются нули. Если сделал код по подсказке, то сперва загружаются нужные значения, затем снова нули.
Выбор типа переменной:RETAIN, PERSISTENT,RETAIN PERSISTENT - ни как не влияет.
Контроллер работает в режиме Slave по ModBUS TCP. Мастер панель. Как бы так то работает, но
Подскажите, что можно сделать?

Если значения появляются, а потом обнуляются, значит программа или мастер перезаписывает эти переменные, RETAIN, PERSISTENT не тут не помогут,
надо сделать, что бы они не перезаписывались мастером или программой, а только читались (присваивались в конце программы).