PDA

Просмотр полной версии : Ошибка ПО из-за возможного перекрытия в памяти



alekstani
18.09.2022, 18:27
Добрый день!
При отладке программы обнаружилась ошибка, вероятно из-за перекрытия в памяти.
В отладочном режиме при прохождении шага в переменную fl_Measure_mode значение TRUE не присваивается.
Проверил в коде присвоения для переменных типа Array, визуально не нашел выходы за пределы диапазона массивов.
В диагностическом модуле Codesys "Память" у вышеназванной переменной стоит 0.
Подскажите, пожалуйста, как пользоваться данным модулем, т.е. откуда берется этот 0?
В чем может быть причина ошибки?

P.s. Справа от вышеназванной переменной в модуле "Память" располагаются элементы массива dwMachIconColor, после того как я закоментировал
участки кода с этим массивом, ошибка ушла. Массив определен с 1-го элемента (не с нулевого как обычно). Не создается ли средой автоматически 0-й элемент
массива все-равно? Может быть в этом причина?

ferret_maybe
19.09.2022, 05:43
По трём картинкам отладить код и решить вашу проблему... Думаю данных для выдачи советов недостаточно. Выложите код.

Cs-Cs
19.09.2022, 07:22
Выложите пожалуйста весь код и объявления, которые относятся к массиву и его обходу.
Явно же где-то идёт выход за границы массива или данных.

Нет, никаких "нулевых" элементов массива не создаётся. Всё работает даже для [10..20] - пофиг, память будет распределена верно.

Также хотелось спросить: то, что fbMeasureMode вызывается только при совпадении условия (IF...) - это так задумано специально или это тоже ошибка? ОБЫЧНО FBШки вызываются постоянно, но с разными параметрами.

Что ещё можно сделать:
а) Проверить, не используются ли в проекте жёстко заданные адреса (как любили делать в CodeSys 2.3) через %xxx-что-то-там (использовал один раз, намучился, не стал даже учить)
б) Почитать справку и найти в ней функцию проверки границ массива, которую можно переопределить и через неё отвлеживать выход за границы массивов. Я про это слышал, но ещё не пользовался, поэтому даю информацию на уровне "что-то такое есть". Искать в справке "CheckBounds".
Вроде как в FAQ была возможность записывать события в системный журнал от имени визуализации (на английском). Я пользуюсь таким кодом:

Sys_DelayedLogText := 'PLC Started with FIRST (DT = 0) run - MinMax/Avg Reset';
Sys_DelayedLogLevel := LogClass.LOG_WARNING;

VisuElems.Visu_Output(Sys_DelayedLogText, Sys_DelayedLogLevel);
Эту фишку можно использовать для того, чтобы записать в лог выход за границы массива в том самом POU CheckBounds.
в) Во всяких циклах обхода массивов можно можно использовать функции типа LOWER_BOUND/UPPER_BOUND, которые подставят размерность массивов и не дадут загнать цикл за границы.

Но лучше дать нам код сюда.

alekstani
19.09.2022, 08:14
Спасибо большое за развернутый ответ. Да, действительно идет перекрытие памяти, при определенных условиях происходит выход за границу указанного массива (dwMachIconColor).