PDA

Просмотр полной версии : Codesys 2.3 параметры функции по ссылки типа REAL



monteg
28.02.2016, 23:57
Здравствуйте,

Допустим, такой код


FUNCTION function3 : BOOL
VAR_INPUT
END_VAR
VAR_IN_OUT
param1 : REAL;
END_VAR
VAR
END_VAR
...
param1 := param1 + 1;
function3 := TRUE;

В "Режим эмуляции" вылетает окно с сообщением -"Доступ по несуществующему адресу! ПЛК остановлен".

Валенок
29.02.2016, 10:02
Не заморачивайся, это глючок КДС. Но только оффлайн. В онлайне все гут.

monteg
29.02.2016, 10:16
Попробовал на трех компах, двух win7 x64, одном win7 x86. Результат одинаковый. Когда "проект" заливаешь в ПЛК все хорошо, попробовал на ПЛК100 и ПЛК110. Вот ведь. А говорят чудес не бывает :)

Yegor
29.02.2016, 11:24
Ну какие чудеса, что вы прям... Просто баг компилятора или симулятора как и в случае с NaN'ами (http://owen.ru/forum/showthread.php?t=2006&p=187611&viewfull=1#post187611). Находка хорошая, в копилку, спасибо.

capzap
29.02.2016, 12:11
так то ассистент не дает функции добавить поля объявлений IN_OUT, а за ручное написание видимо немцы не предусмотрели какое нибудь запрещающее действие, поэтому только на уровне компиляции всё выясняется.
Через указзатель всё прокатит

Валенок
29.02.2016, 12:25
Если приспичила эмуляция, то как временное решение - пихнуть реал в структуру

type _real
struct
x : real;
end_struct
end_type

причем синоним
type
_real : real;
end_type
не катит


var
number2 : _real;

function3
var_in_out
param : _real;
---
param.x := param.x + 1;
...

вызов:
...
function3(number2);
...


А ввиду того что размер структуры совпадает с размером поля, то для function2 можно передать и adr(number) и adr(number.x) - без разницы

Yegor
29.02.2016, 13:03
так то ассистент не дает функции добавить поля объявлений IN_OUT... что странно, потому как IEC 61131-3 предусматривает эту секцию в функциях:

22897


только на уровне компиляции всё выясняетсяПоправка: на уровне среды исполнения. Очевидно, компилятор молча съедает код и не выдаёт ошибок.

monteg
29.02.2016, 14:08
Всем спасибо.
Для меня эта проблема не имеет особого значения. Просто всю неделю один проект делал с перерывами только на еду и сон. Вчера вечером, вроде как, закончил и решил попробовать то, что можно посмотреть без железа. И тут cds енту фигню выдал. Ведь на cds сразу не подумаешь. Начал в коде ковыряться. Мозги начали закипать. Потом создал новый "пустой" проект. Запускаю. Опять эта фигня вылезла. Тут у меня мозг окончательно взорвался и я полез на форум.
Я вчера ночью даже cds переставлял с target-ами. Хорошо, что еще windows не додумался переставить :) А сегодня на работе все и выяснилось.
За то приобрел бесценный опыт.

capzap
29.02.2016, 14:31
Всем спасибо.
Для меня эта проблема не имеет особого значения. Просто всю неделю один проект делал с перерывами только на еду и сон. Вчера вечером, вроде как, закончил и решил попробовать то, что можно посмотреть без железа. И тут cds енту фигню выдал. Ведь на cds сразу не подумаешь. Начал в коде ковыряться. Мозги начали закипать. Потом создал новый "пустой" проект. Запускаю. Опять эта фигня вылезла. Тут у меня мозг окончательно взорвался и я полез на форум.
Я вчера ночью даже cds переставлял с target-ами. Хорошо, что еще windows не додумался переставить :) А сегодня на работе все и выяснилось.
За то приобрел бесценный опыт.
если честно, то тот Ваш код можно было бы проще сделать, если бы вход сложили с константой и подали на выход, по сути зачем там буль на выходе, только потому что в КДС нет типа void. А в родительском блоке, ни чего страшного не произойдет если переменной присвоить результат функции с аргументом эта же переменная

monteg
29.02.2016, 14:41
Проект, который я выложил практического применения не имеет. Это для форума, чтобы коротко показать суть проблемы.