PDA

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



AllXXX
27.05.2024, 07:57
при старте проекта в ПЛК выдает сообщение программа загружена исключение

Евгений Кислов
27.05.2024, 08:03
при старте проекта в ПЛК выдает сообщение программа загружена исключение

Добрый день.
Судя по "AccessViolation" - у вас ошибки при работе с памятью (при использовании массивов, указателей или чего-то подобного).
Можете почитать статью про отладку в CODESYS V3.5 (ссылка в подписи) - там рассматривается эта тема.

Если не разберетесь - пишите мне в телеграм (в подписи), поможем решить вашу проблему.

AllXXX
28.05.2024, 05:18
Спасибо Евгений Кислов (https://owen.ru/forum/member.php?u=67525) за оперативную помощь!!!
Моя ошибка была в том, что в индекс массива пытался записать число больше чем размер массива. Режим эмуляции данную ошибку игнорировал.



Variable: ARRAY [0..100]OF REAL;
Variable1: ARRAY [0..10] OF INT := [00, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
Было:


FOR n := 0 TO 10 BY 1 DO
FOR x := 0 TO 10 BY 1 DO
Variable[n*10+x] := … / Линейное уравнение Y = Yn + (X - Xn)*(Yk - Yn)/ (Xk - Xn)
END_FOR
END_FOR

Стало:


FOR n := 0 TO 9 BY 1 DO
FOR x := 0 TO 10 BY 1 DO
Variable[n*10+x] := … / Линейное уравнение Y = Yn + (X - Xn)*(Yk - Yn)/ (Xk - Xn)
END_FOR
END_FOR

1exan
28.05.2024, 07:14
Спасибо Евгений Кислов (https://owen.ru/forum/member.php?u=67525) за оперативную помощь!!!
Моя ошибка была в том, что в индекс массива пытался записать число больше чем размер массива. Режим эмуляции данную ошибку игнорировал.
.../ (Xk - Xn)

Проверку деления на 0 на всякий случай тоже сделайте, если еще не сделали

Cs-Cs
28.05.2024, 07:34
Ещё прям классным правилом является использование констант. Можно писать так (пишу определение и обход массива):

VAR
arrData : ARRAY [DataStart..DataMax] OF WORD;
wIndex : WORD;
END_VAR

VAR CONSTANT
DataStart : WORD := 0;
DataMax : WORD := 10;
END_VAR

FOR iIndex := DataStart TO DataMax DO
lalala := arrData[iIndex];
END_FOR
В таком случае мы используем именованные константы для границ массива. Это позволяет назвать их как надо (например, для какого-нить буфера данных назвать SMSBufferSize, что сразу понятно), и везде подставлять их значения. Если надо будет что-то поменять - то меняется константа в одном месте.

AllXXX
04.06.2024, 14:15
Хорошее замечание.
Сделал функцию так как часто использую:


FUNCTION LinearEquation : BOOL
VAR_INPUT
rArr : REFERENCE TO ARRAY[0..100] OF REAL;
iXn, iXk : INT;
rYn, rYk : REAL;
END_VAR
VAR
iX : INT;
END_VAR




IF (iXk-iXn)<>0 THEN
FOR iX := iXn TO iXk BY 1 DO
rArr[iX] := rYn + (iX-iXn)*(rYk-rYn)/(iXk-iXn);
END_FOR
END_IF