PDA

Просмотр полной версии : Не передаются параметры функции



Ильнур
30.05.2012, 15:02
Здравствуйте!!!Хотел уточнить.
Есть Функц.блок Block() в нем есть условие:
IF Условие THEN
Func(Source);
END_IF;
У этого блока есть входная переменная, и она как раз передается в функцию.
Условие истинно, т.е.должна вызваться функция и ей должен передаться параметр Source.Но параметр почему то не передается, но функция вызывается и напротив переменной знаки вопроса.Куда копать надо?

capzap
30.05.2012, 15:09
для подстраховки, можете Func(Source) заменить на Func(IN:=Source), где IN это имя объявленной входной переменной в функции, а вообще знаки вопросов и должны быть, это же функция, она не сохраняет своих внутренних значений, выполнилась и потерялась сразу же. А если хотите все же посмотреть, то попробуйте не передавать переменную в функцию, а в функции использовать глобальную переменную и перед вызовом функции присваивать глобальной переменной, то что пытаетесь передать в функцию
Когда после такого тестирования, работа функции Вас удовлетворит, вернетесь к прежнему исполнению

Ильнур
30.05.2012, 15:19
Я уже пробывал Func(IN:Source) результатов не дало(

Валенок
30.05.2012, 15:22
точка останова в функции ?

capzap
30.05.2012, 15:24
IN:Source так точно не даст, даже не откомпилится
используйте глобальную

Ильнур
30.05.2012, 15:29
сейчас по подробнее объясню:
FUNCTION SetAlarmMessage : INT
VAR_INPUT
Source: BYTE := 0;
AlarmNum: BYTE := 0;
Priority: BYTE := 0;
Data: REAL := 0;
END_VAR
VAR
Alarm_Msg: State_Message;
END_VAR
State_Message-это структура:
Тело функции:
Alarm_Msg.Source := Source;
Alarm_Msg.VarNum := AlarmNum;
Alarm_Msg.VarType := 1;

Alarm_Msg.Data := Data;
Alarm_Msg._time := tick_PLC;

Alarm_Buffer(In:=Alarm_Msg, WD:=TRUE);
TYPE State_Message :
STRUCT
Source,
VarNum,
VarType: BYTE;
Data: REAL;
_time : DWORD;
END_STRUCT
END_TYPE
а вызывается эта функция из ФБ:
IF VE1.DataInt[V_Open].New = 1 AND VE1.DataInt[V_Open].Current = 1 THEN
SetAlarmMessage(Automate_Num,101,0,1);
END_IF;
Условие выполняется и Automate_Num равен 2.Но в Alarm_Buffer не передаются параметры т.е. Source должен быть равен Automte_Num,но почему то он равен 0.

Ильнур
30.05.2012, 15:32
точка останова в функции ?

Я вообще всю прогрмму отладчиком проходил, и когда дходил до вызова функции, она вызывалась,но там были одни лишь знаки "?"

Ильнур
30.05.2012, 15:44
Есть какие нибудь мысли?

Yegor
30.05.2012, 16:51
там были одни лишь знаки "?"Это потому что вы смотрели на объявление, а не на экземпляр. Чтобы посмотреть экземпляр, закройте окно со знаками вопросов и попробуйте открыть снова из дерева проекта — появится окно, где в списке слева будет Instances, а в списке справа — все экземпляры функционального блока.

capzap
30.05.2012, 16:53
У функций нет же экземпляров

Валенок
30.05.2012, 18:12
Чудес не бывает, Ильнур сам себя запутал.
Код выкладывайте если хотите найти таракана

Ильнур
30.05.2012, 19:49
Чудес не бывает, Ильнур сам себя запутал.
Код выкладывайте если хотите найти таракана

Попробывал в режиме эмуляции прокатило,интересно)))Завтра есчо раз попробую на ПЛК.О результате обязательно сообщу, если что выложу код:)

Ильнур
31.05.2012, 09:59
Попробывал в режиме эмуляции прокатило,интересно)))Завтра есчо раз попробую на ПЛК.О результате обязательно сообщу, если что выложу код:)
Что-то не пошло на ПЛК.Скидываю прогру
ПЛК 160

Ильнур
31.05.2012, 19:27
Хотел бы спросить.Вот это программку загрузил в ПЛК, т.е. создал загрузочный вариант и попробывал отдельно без CodeSys.Все нормально отрабатывает.Может это в отладчике так и должно быть?

capzap
31.05.2012, 19:32
Хотел бы спросить.Вот это программку загрузил в ПЛК, т.е. создал загрузочный вариант и попробывал отдельно без CodeSys.Все нормально отрабатывает.Может это в отладчике так и должно быть?

во втором посте я и написал, что должны быть знаки вопросов в функции, да и на видео уже конечный результат вывел в глобальную переменную, чтоб можно было убедиться что через функцию все проходит, потому что в самой что то посмотреть неимеет смысла

Ильнур
01.06.2012, 18:51
Спасибо всем за помощь:)