а как понять из-за чего возникло это исключение?
Вид для печати
Здравствуйте коллеги!. С чем может быть связано такое непоследовательное размещение рецептов в памяти ПЛК?
PPD_3
PPD_2
PPD_1
PPD_6
PPD_4
PPD_5
Вложение 88732
Там много чего непоследовательно может быть и вообще в разных местах. Я столкнулся с этим когда написал процедуру которая по указателю на первую и последнюю переменные сохраняет настройки в файл и потом их восстанавливает когда необходимо. На небольших кусках памяти она отлично работает. А когда переменных и массивов становится много то оказывается они хранятся в памяти далеко не последовательно и вообще по разным секторам. И функция SysMemCopy становится бесполезной.
Добрый день.
Если коротко - с тем, что так устроена реальная жизнь.
Все операции с чтением содержимого директорий сводятся к вызову на нижнем уровне чего-то вроде 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
Не надо вживаться, достаточно в слейве выделить группу регистров (достаточного для всех рецептов) и положить туда массив структур рецептов.
Всё будет по порядку и передаваться будет по порядку.
Длину String надо тоже ограничить, местом достаточным для записи,
вы например добавляете 5 символ в String(4), вот и съезжают структуры.
Надо поставить String(5), если меньше 10 или String(6), если до 99 рецептов
Нужно отслеживать момент изменения значения в ячейке таблицы. Нашел событие OnValueChanged. Попробовал его использовать. Событие не генерируется. Баг Codesysa? Вопрос, можно ли с этим бороться? Или как еще, в принципе, можно в коде отследить это событие?
Добрый день.
Это действительно похоже на баг CODESYS.
Если есть возможность организовать ввод через диалог NumpadOwen/KeypadOwen из библиотеки OwenVisuDialogs - то можно отследить закрытие диалога с помощью анализа полей структуры OVD.DialogsSettings.g_stClosedDialogInfo
Поле wsDialogTitle позволит понять, что был закрыт именно диалог, открытый из таблицы (соответственно, в настройках открытия диалога ввода в таблице нужно указать ему уникальный заголовок).
Но это не позволит отличить ввод нового значения от ввода того же значения, что и было.
В принципе, можно в коде циклически проверять значение каждой ячейки - совпадает ли оно с тем, которое было при прошлой проверке.
Спасибо, буду пробовать.
Еще вопрос про библиотеки.
1. Если библиотека установлена в разделе POU, то нужно ли ее устанавливать в разделе "Устройства", если Устройство не использует код из раздела "POU" ?
2. Почему папки одной версии библиотеки OSCAT BASIC выглядят по разному в Менеджерах библиотек POU и Устройств?
3. Что значит плейсхолдер POU не будет разрешен на устройстве и с чем связана ошибка ...Невозможно разрешить библиотеку плейсхолдера?
... небольшая каша в голове по этому вопросу, хотелось бы прояснить...
Где Можно ли поподробнее поизучать этот момент, лучше на русском языке.Вложение 88830Вложение 88831Вложение 88832Вложение 88833