А смысл? Текст программы и описание переменных были перенесены в новый проект через буфер обмена.а весь проект полностью со всеми POU и тд. и тп. не пробывали!?
Закоментили в тексте программы функции прямого обращения к памяти из бибилотеки SysLibMem. Таким образом исключили возможность записи значений по каким-нибудь адресам вне диапазона ввода/вывода и внутрених переменных программы. Но останов ПЛК не ушел. Не здесь зверь зарыт.
Продолжу тему по поводу самопроизвольного останова ПЛК.
Появилось следующее предположение.
Для проекта используем контроллер ПЛК100 K.L (объемом памяти ввода/вывода 360 байт).
В PLC Configuration объявлен модуль Owen (Master) и к нему подцеплены 45 подэлемента Float variable Comm (Listen) и 21 подэлемент Float variable Comm (Write). Оба используемых типа включают в себя значение типа REAL и комманду на чтение/запись типа BYTE, т.е. всего 5 байт. Если вести подсчет напрямую получаем 45*5+21*5 = 330 байт области вывода этого контроллера. 330 байт < 360 байт, которыми ограничена область ввода/вывода, поэтому для проекта был выбран контроллер с ограниченной лицензией.
При детальном изучении размеров областей памяти во вкладке Target Settings замечено, что область входов занимает 16#7A (122) байта, а область выходов 16#EA (234) байта. Т.е. 330 байт, которые ложатся в области вывода, перекрывают допустимую область вывода для контроллера.
Вопросы:
1. Во время компиляции и загрузки проекта не ругается ни CoDeSys, ни контроллер на превышение допустимых размеров области вывода. Как контролировать попали мы в ограничение или нет? Только подсчитывать на листке бумаги?
2. Было замечено, что подэлементы Float variable Comm (Listen) и Float variable Comm (Write), которые внутри себя имеют типы REAL и BYTE, занимают в памяти контроллера не 5 байт, а 8 байт. А для области ввода/вывода эти подэлементы занимают 5 байт или 8 байт? Если 8, то тут даже прямой расчет на бумаге не поможет.
3. Самый главный вопрос. В своей программе мы перекрыли область памяти за ограниченные контроллером байты вывода и программа работает. Каких результатов ожидать? Может ли это быть причиной самопроизвольных остановов выполнения программы контроллера?
По поводу ограничения памяти и его подсчета.
1. CoDeSys следит за расходованием памяти и если память исчерпалась - сообщает о ошибке. Просто надо все переменные использовать.
2. Подсчет - действительно затруднен из-за ограничений в архитектуре ARM-процессора, а именно требования к выравниванию. Но с учётом п.1. это не так важно, т.к. при переполнении вылезет ошибка.
Т.е. Вы использовали старый проект с новым таргетом? так делать нельзя.
Для начала посоветовал бы написать простой проект, отладить его части (т.е. нормальную работу мастеров и слайвов), затем подключать по очереди программные части. Сразу написать большой проект и чтоб заработало - так не бывает.
Все переменные объявленные в PLC Configuration используются. Только коственным путем через указатель адреса.1. CoDeSys следит за расходованием памяти и если память исчерпалась - сообщает о ошибке. Просто надо все переменные использовать.
Предварительно перед написанием такого "большого" проекта были выполнены проверки, что переменные объявленные в PLC Configuration имеют определенную длину и ложатся в памяти в определенной последовательности. А если это так, то для программиста использовать в данном случае вместо 66 переменных типа REAL и 66 переменных типа BYTE всего лишь 1 указатель адреса и обьявить всего лишь одну переменную в начале массива было гораздо удобнее и быстрее.
Только что проверил. Задал последней переменной в PLC Configuration имя. Как Вы и написали, Владислав, CoDeSys выдал ошибку. И тут я все понял , и теперь буду писать проекты так, чтобы CoDeSys понял, что произошло переполнение памяти ввода/вывода. Но в целом считаю это не правильным, т.к. переменная МЭК %XXX.XX.XX уже объявлена в проекте, хоть и без имени, и среда разработки должна контролировать выход ее за пределы области ввода/вывода, а ПЛК эту переменную ест и даже обновляет соответствующие ей сетевые переменные. Прошу момент учесть во благо всех пользователей данного продукта!