Показано с 1 по 8 из 8

Тема: Проблема с указателями

  1. #1
    Пользователь Аватар для Flomaster
    Регистрация
    03.05.2007
    Адрес
    Khabarovsk
    Сообщений
    278

    Unhappy Проблема с указателями

    Здравствуйте все!
    Столкнулся с такой проблемой при программировании ПЛК-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. Причем ошибка такая вылетает при компиляции с подключенным прибором. Если компилировать в режиме эмуляции, то всё нормально. В чем может быть подвох?

  2. #2

    По умолчанию

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

  3. #3

    По умолчанию

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

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

  4. #4
    Пользователь Аватар для Flomaster
    Регистрация
    03.05.2007
    Адрес
    Khabarovsk
    Сообщений
    278

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Уважаемый Gans, зачем Вы вводите человека в заблуждение?

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

  5. #5

    По умолчанию

    Без проекта сказать что-то по описанию сложно

  6. #6
    Пользователь Аватар для Flomaster
    Регистрация
    03.05.2007
    Адрес
    Khabarovsk
    Сообщений
    278

    По умолчанию

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

  7. #7

    По умолчанию

    По видимому, проблема в следующем.
    Вы создали объявление шаблонной переменной в программе, а должны были в 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;

  8. #8
    Пользователь Аватар для Flomaster
    Регистрация
    03.05.2007
    Адрес
    Khabarovsk
    Сообщений
    278

    По умолчанию

    Спасибо, попробую сделать так.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •