PDA

Просмотр полной версии : Проблема с загрузкой программы ПЛК210



shtrm
20.02.2023, 14:35
Добрый день!

После запуска контроллера ПЛК210 в run. Появляется сообщение "Для данной позиции нет сходного кода". Компиляция проходит без ошибок. В стеке вызова показывает отсутствие расположения.
Как это можно вылечить?

Спасибо!

Cs-Cs
20.02.2023, 15:07
Это исключение. То есть, ошибка, связанная не с загрузкой программы, а с выполнением. Аналогия - Синий экран Windows/
Ну, например, деление на ноль создат исключение. Или обращение к несуществующей памяти.
Поэтому проверять надо код. Судя по всему, там что-то неверно написано для работы с COM-портом. Именно в твоей программе, а не в ПЛК.

shtrm
20.02.2023, 16:05
Исключение пропало когда убрал из работы функцию для работы с COM -портом. Указатель показывал сразу на открытие COM-порта. На первый взгляд вроде бы все корректно.
66058
66059

shtrm
20.02.2023, 16:08
Исключение пропало когда убрал из работы функцию для работы с COM -портом. Указатель показывал сразу на открытие COM-порта. На первый взгляд вроде бы все корректно.
66058
66059

Может быть проблема с библиотекой? или версией?

Евгений Кислов
20.02.2023, 16:11
Исключение пропало когда убрал из работы функцию для работы с COM -портом.

Если создать новый пустой проект и добавить в него "функцию для работы с COM-портом" - проблема повторится?

shtrm
20.02.2023, 18:02
В проекте используется опрос COM-порта и обмен между панелью и контроллером. По раздельности все работает. Когда использую и то и другое сразу возникает эта проблема.

Евгений Кислов
20.02.2023, 18:13
В проекте используется опрос COM-порта и обмен между панелью и контроллером. По раздельности все работает. Когда использую и то и другое сразу возникает эта проблема.

Пока что это подтверждает гипотезу Cs-Cs о том, что в вашем коде есть ошибки в работе с памятью.
Выложите, пожалуйста, ваш проект, в котором после запуска сразу возникает исключение - посмотрим, в чем дело.
Все, что не связано с возникновением исключения - удалите из проекта.

shtrm
20.02.2023, 18:33
Архив с программой

Евгений Кислов
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?

shtrm
20.02.2023, 18:44
Не куда писать, спасибо)

Евгений Кислов
20.02.2023, 18:47
Не куда писать, спасибо)

Как раз нет - запись будет произведена куда-то (в вашем случае - внутрь COM_Control'a, потому что он там следом в порядке объявления).
В первом посте вы наблюдаете характерные последствия этого, и это в данном случае можно назвать удачей.
Когда вы удаляли часть кода проекта ("По раздельности все работает.") - вы продолжали писать куда-то, просто это становилось для вас незаметным.

Cs-Cs
20.02.2023, 20:41
Ага... а если бы был включен контроль границ массивов - то можно было бы это отследить!
Классическая ситуация: можно прям как пример для FAQ использовать!