Просмотр полной версии : Проблема с загрузкой программы ПЛК210
Добрый день!
После запуска контроллера ПЛК210 в run. Появляется сообщение "Для данной позиции нет сходного кода". Компиляция проходит без ошибок. В стеке вызова показывает отсутствие расположения.
Как это можно вылечить?
Спасибо!
Это исключение. То есть, ошибка, связанная не с загрузкой программы, а с выполнением. Аналогия - Синий экран Windows/
Ну, например, деление на ноль создат исключение. Или обращение к несуществующей памяти.
Поэтому проверять надо код. Судя по всему, там что-то неверно написано для работы с COM-портом. Именно в твоей программе, а не в ПЛК.
Исключение пропало когда убрал из работы функцию для работы с COM -портом. Указатель показывал сразу на открытие COM-порта. На первый взгляд вроде бы все корректно.
66058
66059
Исключение пропало когда убрал из работы функцию для работы с COM -портом. Указатель показывал сразу на открытие COM-порта. На первый взгляд вроде бы все корректно.
66058
66059
Может быть проблема с библиотекой? или версией?
Евгений Кислов
20.02.2023, 16:11
Исключение пропало когда убрал из работы функцию для работы с COM -портом.
Если создать новый пустой проект и добавить в него "функцию для работы с COM-портом" - проблема повторится?
В проекте используется опрос COM-порта и обмен между панелью и контроллером. По раздельности все работает. Когда использую и то и другое сразу возникает эта проблема.
Евгений Кислов
20.02.2023, 18:13
В проекте используется опрос COM-порта и обмен между панелью и контроллером. По раздельности все работает. Когда использую и то и другое сразу возникает эта проблема.
Пока что это подтверждает гипотезу Cs-Cs о том, что в вашем коде есть ошибки в работе с памятью.
Выложите, пожалуйста, ваш проект, в котором после запуска сразу возникает исключение - посмотрим, в чем дело.
Все, что не связано с возникновением исключения - удалите из проекта.
Евгений Кислов
20.02.2023, 18:42
Архив с программой
Навскидку:
FOR i:= 0 TO 30 DO
fbRealToWord2(rInput := rWriteReal[i], wOutput1 => awWriteReal[i*2+1], wOutput2 => awWriteReal[i*2]);
OCL.SWAP_DATA(ADR(sWriteString), ADR(awWriteString), SIZEOF(awWriteString), FALSE, FALSE, FALSE);
END_FOR;
В какой элемент массива awWriteReal (с каким индексом) произойдет запись при i = 30?
Евгений Кислов
20.02.2023, 18:47
Не куда писать, спасибо)
Как раз нет - запись будет произведена куда-то (в вашем случае - внутрь COM_Control'a, потому что он там следом в порядке объявления).
В первом посте вы наблюдаете характерные последствия этого, и это в данном случае можно назвать удачей.
Когда вы удаляли часть кода проекта ("По раздельности все работает.") - вы продолжали писать куда-то, просто это становилось для вас незаметным.
Ага... а если бы был включен контроль границ массивов - то можно было бы это отследить!
Классическая ситуация: можно прям как пример для FAQ использовать!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot