Гораздо раньше.
Добавлю, что в эмуляторе и виртуальном ПЛК все работает норм.
Вы ошибаетесь. Просто из-за другого распределения памяти ошибка там не так явно видна.
Заключается она в следующем.
1. Тут вы обещаете компилятору, что на входы ptCol и ptrCol будут переданы адреса массивов, каждый из которых содержит 27 элементов:
Код:
ptCol :POINTER TO ARRAY [28..54] OF circuit; //указатели на массив данных коллекторов
ptrCol :POINTER TO ARRAY [28..54] OF circuit_ret; //указатели на массив retain данных коллекторов
2. Но фактически в вызове вы передаете адреса массивов, содержащие 6 элементов.
Код:
astCol_8 :ARRAY [49..54] OF circuit;
astrCol_8 :ARRAY [49..54] OF circuit_ret;
POU(
ptCol:= ADR(GVL.astCol_8),
ptrCol:= ADR(GVL.astrCol_8),
uiEnumStart:= 49,
uiEnumEnd:= 54,
uiStartStep:= uiStep
);
Что происходит в результате:
ptCol[28] указывает на GVL.astCol_8[49]
ptCol[29] указывает на GVL.astCol_8[50]
...
ptCol[33] указывает на GVL.astCol_8[54]
Аналогично с ptrCol.
ptCol[34] / ptrCol[34] и далее указывают куда-то - в область памяти приложения, где хранятся какие-то другие данные.
"Разыменование неверного указателя" - это когда вы "смотрите" по указателю на ячейку, где ожидаете BOOL (т.е. байт памяти со значение 0 или 1), а там хранится какое-то другое число (например, 123).
Теперь вы спросите, почему проблемы только с 52-54 элементом.
На самом деле, проблемы, как я уже сказал, начинаются с 34 элемента, просто увидите ли вы их или нет - зависит от того, как именно распределилась память при очередной компиляции.
Открыв ваш проект, я выполнил полную перекомпиляцию, и после этого гораздо более отчетливо видно, в какой момент начинаются проблемы:
2023-03-06_7-09-03.png