Просмотр полной версии : CODESYS V3.5. Вопросы и ответы
LogikASUTP
30.03.2026, 14:34
Исключение и место, где оно произошло. В журнале можно текст посмотреть еще
а как понять из-за чего возникло это исключение?
LogikASUTP
30.03.2026, 14:35
Исключение, у вас деление на 0 в строке.
delta должна быть хоть 0,0001, но не 0.
спасибо вам большое. Предыдущее моё сообщение не актуально
Назаров Александр
03.04.2026, 15:30
Здравствуйте коллеги!. С чем может быть связано такое непоследовательное размещение рецептов в памяти ПЛК?
PPD_3
PPD_2
PPD_1
PPD_6
PPD_4
PPD_5
88732
Там много чего непоследовательно может быть и вообще в разных местах. Я столкнулся с этим когда написал процедуру которая по указателю на первую и последнюю переменные сохраняет настройки в файл и потом их восстанавливает когда необходимо. На небольших кусках памяти она отлично работает. А когда переменных и массивов становится много то оказывается они хранятся в памяти далеко не последовательно и вообще по разным секторам. И функция SysMemCopy становится бесполезной.
Евгений Кислов
03.04.2026, 16:10
Здравствуйте коллеги!. С чем может быть связано такое непоследовательное размещение рецептов в памяти ПЛК?
PPD_3
PPD_2
PPD_1
PPD_6
PPD_4
PPD_5
88732
Добрый день.
Если коротко - с тем, что так устроена реальная жизнь.
Все операции с чтением содержимого директорий сводятся к вызову на нижнем уровне чего-то вроде readdir, для которой:
The order in which filenames are read by successive calls to
readdir() depends on the filesystem implementation; it is unlikely
that the names will be sorted in any fashion.
https://man7.org/linux/man-pages/man3/readdir.3.html
Назаров Александр
03.04.2026, 16:55
Добрый день.
Если коротко - с тем, что так устроена реальная жизнь.
Все операции с чтением содержимого директорий сводятся к вызову на нижнем уровне чего-то вроде readdir, для которой:
The order in which filenames are read by successive calls to
readdir() depends on the filesystem implementation; it is unlikely
that the names will be sorted in any fashion.
https://man7.org/linux/man-pages/man3/readdir.3.html
Там много чего непоследовательно может быть и вообще в разных местах. Я столкнулся с этим когда написал процедуру которая по указателю на первую и последнюю переменные сохраняет настройки в файл и потом их восстанавливает когда необходимо. На небольших кусках памяти она отлично работает. А когда переменных и массивов становится много то оказывается они хранятся в памяти далеко не последовательно и вообще по разным секторам. И функция SysMemCopy становится бесполезной.
Спасибо, будем вживаться в реалии.
kondor3000
03.04.2026, 17:22
Спасибо, будем вживаться в реалии.
Не надо вживаться, достаточно в слейве выделить группу регистров (достаточного для всех рецептов) и положить туда массив структур рецептов.
Всё будет по порядку и передаваться будет по порядку.
Длину String надо тоже ограничить, местом достаточным для записи,
вы например добавляете 5 символ в String(4), вот и съезжают структуры.
Надо поставить String(5), если меньше 10 или String(6), если до 99 рецептов
Назаров Александр
14.04.2026, 11:51
Нужно отслеживать момент изменения значения в ячейке таблицы. Нашел событие OnValueChanged. Попробовал его использовать. Событие не генерируется. Баг Codesysa? Вопрос, можно ли с этим бороться? Или как еще, в принципе, можно в коде отследить это событие?
Евгений Кислов
14.04.2026, 12:36
Нужно отслеживать момент изменения значения в ячейке таблицы. Нашел событие OnValueChanged. Попробовал его использовать. Событие не генерируется. Баг Codesysa? Вопрос, можно ли с этим бороться? Или как еще, в принципе, можно в коде отследить это событие?
Добрый день.
Это действительно похоже на баг CODESYS.
Если есть возможность организовать ввод через диалог NumpadOwen/KeypadOwen из библиотеки OwenVisuDialogs - то можно отследить закрытие диалога с помощью анализа полей структуры OVD.DialogsSettings.g_stClosedDialogInfo
Поле wsDialogTitle позволит понять, что был закрыт именно диалог, открытый из таблицы (соответственно, в настройках открытия диалога ввода в таблице нужно указать ему уникальный заголовок).
Но это не позволит отличить ввод нового значения от ввода того же значения, что и было.
В принципе, можно в коде циклически проверять значение каждой ячейки - совпадает ли оно с тем, которое было при прошлой проверке.
Назаров Александр
14.04.2026, 15:55
Добрый день.
Это действительно похоже на баг CODESYS.
Если есть возможность организовать ввод через диалог NumpadOwen/KeypadOwen из библиотеки OwenVisuDialogs - то можно отследить закрытие диалога с помощью анализа полей структуры OVD.DialogsSettings.g_stClosedDialogInfo
Поле wsDialogTitle позволит понять, что был закрыт именно диалог, открытый из таблицы (соответственно, в настройках открытия диалога ввода в таблице нужно указать ему уникальный заголовок).
Но это не позволит отличить ввод нового значения от ввода того же значения, что и было.
В принципе, можно в коде циклически проверять значение каждой ячейки - совпадает ли оно с тем, которое было при прошлой проверке.
Спасибо, буду пробовать.
Еще вопрос про библиотеки.
1. Если библиотека установлена в разделе POU, то нужно ли ее устанавливать в разделе "Устройства", если Устройство не использует код из раздела "POU" ?
2. Почему папки одной версии библиотеки OSCAT BASIC выглядят по разному в Менеджерах библиотек POU и Устройств?
3. Что значит плейсхолдер POU не будет разрешен на устройстве и с чем связана ошибка ...Невозможно разрешить библиотеку плейсхолдера?
... небольшая каша в голове по этому вопросу, хотелось бы прояснить...
Где Можно ли поподробнее поизучать этот момент, лучше на русском языке.88830888318883288833
Евгений Кислов
14.04.2026, 16:14
1. Нет.
2. Сложно сказать, не зная деталей предыстории. Это, например, мог организовать автор проекта по каким-то личным причинам.
3. Судя по вашему скрину - с некорректной настройкой плейсхолдеров в проекте. Можете завтра утром связаться со мной по телеграм (см. в подписи), чтобы более предметно обсудить этот вопрос.
Где Можно ли поподробнее поизучать этот момент, лучше на русском языке
https://oscat.ru/wp-content/Video/CodesysOneLove/MainPlaylist/111_LibraryPlaceholders.mp4
Назаров Александр
14.04.2026, 16:31
1. Нет.
2. Сложно сказать, не зная деталей предыстории. Это, например, мог организовать автор проекта по каким-то личным причинам.
3. Судя по вашему скрину - с некорректной настройкой плейсхолдеров в проекте. Можете завтра утром связаться со мной по телеграм (см. в подписи), чтобы более предметно обсудить этот вопрос.
https://oscat.ru/wp-content/Video/CodesysOneLove/MainPlaylist/111_LibraryPlaceholders.mp4
Евгений, спасибо большое, завтра напишу в телеграм. Кино смотрел, эти вопросы не затронуты.
Назаров Александр
15.04.2026, 14:52
1. Нет.
2. Сложно сказать, не зная деталей предыстории. Это, например, мог организовать автор проекта по каким-то личным причинам.
3. Судя по вашему скрину - с некорректной настройкой плейсхолдеров в проекте. Можете завтра утром связаться со мной по телеграм (см. в подписи), чтобы более предметно обсудить этот вопрос.
https://oscat.ru/wp-content/Video/CodesysOneLove/MainPlaylist/111_LibraryPlaceholders.mp4
Евгений, спасибо за помощь - быстро, лаконично и профессионально!!!!
Назаров Александр
16.04.2026, 12:12
Добрый день.
Это действительно похоже на баг CODESYS.
Если есть возможность организовать ввод через диалог NumpadOwen/KeypadOwen из библиотеки OwenVisuDialogs - то можно отследить закрытие диалога с помощью анализа полей структуры OVD.DialogsSettings.g_stClosedDialogInfo
Поле wsDialogTitle позволит понять, что был закрыт именно диалог, открытый из таблицы (соответственно, в настройках открытия диалога ввода в таблице нужно указать ему уникальный заголовок).
Но это не позволит отличить ввод нового значения от ввода того же значения, что и было.
В принципе, можно в коде циклически проверять значение каждой ячейки - совпадает ли оно с тем, которое было при прошлой проверке.
Диалог NumpadOwen подтянул в менеджере визуализации, назначил имя диалога. Изменение полей диалога не происходит при вызове и закрытии диалога. Что не так?
88852
88853
88854
Евгений Кислов
16.04.2026, 12:16
Диалог NumpadOwen подтянул в менеджере визуализации, назначил имя диалога. Изменение полей диалога не происходит при вызове и закрытии диалога. Что не так?
88852
88853
88854
На втором скрине видно, что вы выбрали VisuDialogs.Numpad, переопределив тем самым настройку из менеджера визуализации.
Выберите По умолчанию или OVD.NumpadOwen.
Назаров Александр
16.04.2026, 12:27
На втором скрине видно, что вы выбрали VisuDialogs.Numpad, переопределив тем самым настройку из менеджера визуализации.
Выберите По умолчанию или OVD.NumpadOwen.
Дья́вол в дета́лях. Спасибо, просмотрел.
aaaSashaMGGU
22.04.2026, 08:18
Добрый
Как вызвать метод/действие из CFC?
Да, есть вот этот FAQ: https://owen.ru/forum/showthread.php?t=28167&page=14&p=389349&viewfull=1#post389349
Но тут речь идёт про какие-то рецепты, про какую-то библиотеку рецептов
Спасибо
Евгений Кислов
22.04.2026, 08:26
Добрый
Как вызвать метод/действие из CFC?
Да, есть вот этот FAQ: https://owen.ru/forum/showthread.php?t=28167&page=14&p=389349&viewfull=1#post389349
Но тут речь идёт про какие-то рецепты, про какую-то библиотеку рецептов
Спасибо
Добрый день. Метод - по аналогии с тем, что показано по ссылке.
Действие - просто в прямоугольнике (объект "Элемент" или "Box with EN/ENO") напишите имя действия.
Если из скрина по ссылке неочевидно, как применить это к вашему проекту - то, пожалуйста, выложите проект с одним методом и действием, которые вы хотите вызвать в CFC.
Я покажу, как это сделать.
aaaSashaMGGU
22.04.2026, 08:33
Добрый день. Метод - по аналогии с тем, что показано по ссылке.
Действие - просто в прямоугольнике (объект "Элемент" или "Box with EN/ENO") напишите имя действия.
Если из скрина по ссылке неочевидно, как применить это к вашему проекту - то, пожалуйста, выложите проект с одним методом и действием, которые вы хотите вызвать в CFC.
Я покажу, как это сделать.
Всё, разобрался, спасибо!
Объект "Элемент" в данном случае не имеет входов - и его нельзя использовать (у действия ведь нет входов). А вот "Box with EN/ENO" имеет вход EN.
В общем, вот так работает:
88909
Код действия ACT:
qqq := qqq + 1;
aaaSashaMGGU
22.04.2026, 09:02
Следующий вопрос
Вызвать действие внутри PRG получилось
Также получилось вызвать действие во втором PRG из первого
Но не выходит вызвать действие из FB, объявленного внутри PRG
И уж тем более не выходит вызвать действие из FB, объявленного внутри другого PRG
Прикладываю проект...
Спасибо заранее
aaaSashaMGGU
22.04.2026, 09:14
Следующий вопрос
Вызвать действие внутри PRG получилось
Также получилось вызвать действие во втором PRG из первого
Но не выходит вызвать действие из FB, объявленного внутри PRG
И уж тем более не выходит вызвать действие из FB, объявленного внутри другого PRG
Прикладываю проект...
Спасибо заранее
Методом научного тыка определил, как нужно делать:
88914
Так работает.
Евгений, простите, что не дождался ответа
Назаров Александр
23.04.2026, 10:21
Добрый день коллеги!
При перезаливке программы, отредактированные файлы рецептов в предыдущей загрузке, затираются данными занесенными в экземпляры группы рецептов. Что нужно сделать, чтобы избежать данного сценария?
Евгений Кислов
23.04.2026, 10:32
Добрый день коллеги!
При перезаливке программы, отредактированные файлы рецептов в предыдущей загрузке, затираются данными занесенными в экземпляры группы рецептов. Что нужно сделать, чтобы избежать данного сценария?
Добрый день.
Нужно снять эту галочку:
88936
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot