PDA

Просмотр полной версии : Проблема с указателями



Flomaster
21.08.2007, 06:00
Здравствуйте все!
Столкнулся с такой проблемой при программировании ПЛК-150. Есть дискретный выход MyDOut, описанный в разделе переменных PLC_PRG как MyDOut AT %Q*: BOOL.
В разделе VAR_CONFIG переменная связана с конкретным выходом PLC_PRG.MyDOut AT %QX1.0: BOOL.

Я создаю функциональный блок, который должен менять значение на этом выходе.
FUNCTION_BLOCK FB_ChangeOutValue
VAR_INPUT
value:BOOL;
END_VAR
VAR_IN_OUT
output:BOOL;
END_VAR

VAR
ptr_Output: POINTER TO BOOL;
END_VAR

Далее в теле ФБ пишу код:

ptr_Output:=ADR(output);
ptr_Output^:=value;

Соответственно в самой программе созается переменная ChangeOutValue: FB_ChangeOutValue;

И иcпользуется так: ChangeOutValue(MyDOut, true);


При компиляции вылетает ошибка Error 4060. Причем ошибка такая вылетает при компиляции с подключенным прибором. Если компилировать в режиме эмуляции, то всё нормально. В чем может быть подвох?

Gans
21.08.2007, 09:09
Брат если без контроллера работает то это торгет файл немножечко косоват ну или кривоват :-). а по проще ваш алгоритм реализовать ни как нельзя!?

Филоненко Владислав
21.08.2007, 09:30
Уважаемый Gans, зачем Вы вводите человека в заблуждение?

Проблемы в том, что Вы, xScar2003, пытаетесь записать значение в переменную объявленную для чтения. Компилятор считает доступ по указателю потенциально опасным (возможна запись, и он прав!). И об этом он и сообщает. В помощи к среде разработки есть описания всех кодов ошибок.

Flomaster
21.08.2007, 16:45
Уважаемый Gans, зачем Вы вводите человека в заблуждение?

Проблемы в том, что Вы, xScar2003, пытаетесь записать значение в переменную объявленную для чтения. Компилятор считает доступ по указателю потенциально опасным (возможна запись, и он прав!). И об этом он и сообщает. В помощи к среде разработки есть описания всех кодов ошибок.

Я знаю, что в мануале есть описание ошибок, и видел описание этой ошибки. Но вот интересно, почему я не могу записать значение в дискретный выход? он ведь для этого и предназначен!

Филоненко Владислав
22.08.2007, 09:13
Без проекта сказать что-то по описанию сложно

Flomaster
23.08.2007, 16:47
Без проекта сказать что-то по описанию сложно

Вот выкладываю простенький примерчик, который не удается откомпилировать. В цикле увеличивается значение счетчика, при значении 1000 он обравывается в 0 и меняет значение на дискретных выходах 1 и 2 на противоположное.
В выход 1 значение пишется напрямую из программы, а в выход 2 посредстовм функционального блока. Вот в этом блоке и выдается ошибка при компиляции.

Филоненко Владислав
23.08.2007, 19:29
По видимому, проблема в следующем.
Вы создали объявление шаблонной переменной в программе, а должны были в FB, а затем создать экземпляр FB в программе и уже переменным экземпляра присваивать конкретные адреса.

Выдержка из хелпа:

FUNCTION_BLOCK locio

VAR

loci AT %I*: BOOL := TRUE;

loco AT %Q*: BOOL;

END_VAR

Объявления переменных состоят из пути (имени экземпляра) и имени переменных. Если задан не существующий путь, будет сформировано сообщение об ошибке. Ошибка возникает и в противоположной ситуации, если отсутствует определение объявленной в функциональном блоке конфигурационной переменной. Все объявленные с использованием "*" переменные должны быть определены в разделе Variable Configuration. Типы данных, указанные в шаблоне и при определении адресов, обязаны совпадать.

Для вставки списка всех необходимых определений конфигурационных переменных используйте команду ""All Instance Paths" из меню "Insert".

Пример конфигурационных переменных

Далее объявление экземпляров блока Hugo и Оtto может выглядеть, например, так:

PROGRAM PLC_PRG

VAR
Hugo: locio;
Otto: locio;
END_VAR

Конкретное распределение прямых адресов переменных реализовано в разделе ресурсов Variable Configuration:

VAR_CONFIG
PLC_PRG.Hugo.loci AT %IX1.0 : BOOL;
PLC_PRG.Hugo.loco AT %QX0.0 : BOOL;
PLC_PRG.Otto.loci AT %IX1.0 : BOOL;
PLC_PRG.Otto.loco AT %QX0.3 : BOOL;

Flomaster
24.08.2007, 08:22
Спасибо, попробую сделать так.