Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 26

Тема: вопросы начинающего

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от xScar2003 Посмотреть сообщение
    ...я считал, что в CoDeSys есть так обработчики событий...изменилось значение на дискретном входе - вызвалось событие.
    При желании так можно. Нужно использовать конфигуратор задач.
    1) Сделать циклическую задачу и не забыть в нее вставить PLC_PRG
    2) Наделать задач, вызываемых по событиям (Triggered by event) и связать с ними соотв-е программы, событие – любая глобальная логическая переменная.

    Однако:
    1) Это не есть общепринятый метод программирования на языках МЭК.
    2) Выигрыша по скорости нет.
    3) Можно запутаться в последовательности событий.

    Я бы оставил с опросом по триггерам. Здесь все понятно и проще будет потом поправить, когда уже глухо забудется что к чему было приделано.

  2. #2

    По умолчанию

    галочка не выход, а прятание головы в песок.
    просто установите среду разработки 2.3.8.1 - там эта проблема решена

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

    По умолчанию

    Создал я, значит, функциональный блок, который описывает одно устройство. В программе создается вектор MyVector таких функциональный блоков, длина которого равна количеству устройств. В состав блока входят AT-переменные привязанные к входам и выходам ПЛК. Когда я пытаюсь обратиться из какой-либо точки программы к такой переменной, например MyVector[1].MyOutput, выдается ошибка 4020.

    Выход MyOutput описан в разделе Variable_Configuration: PLC_PRG.MyVector[1].MyOutput AT %QX1.0: BOOL;.
    Вот, собственно, вопрос: как правильно обратиться к такой переменной?

  4. #4

    По умолчанию

    Описание ошибки:
    <
    4020
    "Variable with write access or direct address required for 'ST', 'STN', 'S', 'R'"

    Замените первый операнд переменной, имеющей доступ на запись.
    >
    Видимо где -то в программе есть присвоение значения этой переменной.

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

    По умолчанию

    Цитата Сообщение от Малышев Олег Посмотреть сообщение
    Описание ошибки:
    <
    4020
    "Variable with write access or direct address required for 'ST', 'STN', 'S', 'R'"

    Замените первый операнд переменной, имеющей доступ на запись.
    >
    Видимо где -то в программе есть присвоение значения этой переменной.
    Да, описание ошибки я читал, но вот только не понял, что оно означает... Присвоений значений нигде нет, есть только привязка дискретного выхода к переменной функционального блока.

  6. #6

    По умолчанию

    Цитата Сообщение от Малышев Олег Посмотреть сообщение
    Описание ошибки:
    <
    4020
    "Variable with write access or direct address required for 'ST', 'STN', 'S', 'R'"

    Замените первый операнд переменной, имеющей доступ на запись.
    >
    Видимо где -то в программе есть присвоение значения этой переменной.
    Да, тут только доступ по указателю - это защита от дурака.

  7. #7

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Да, тут только доступ по указателю - это защита от дурака.

    Столкнулся с подобной задачей. Не могу победить. Подскажите, пжлст, что делаю не так.

    1. Создал функциональный блок fbGate.
    В нем 1 пин выход, 1 вход
    VAR
    pin_in AT %I*: BOOL;
    pin_out AT %Q*: BOOL;
    END_VAR

    2. В Global_Variables создал
    pGates: ARRAY[0..1] OF POINTER TO fbGate; (* Массив указателей *)
    Gate_1 : fbGate; (* экземпляр 1*)
    Gate_2: fbGate; (* экземпляр 2*)

    3. В VAR_CONFIG описал пины:
    Gate_1.pin_out AT %QX2.1.2 : BOOL;
    Gate_1.pin_in AT %IX1.0.0: BOOL;
    Gate_2.pin_out AT %QX2.1.3 : BOOL;
    Gate_2.pin_in AT %IX1.0.1: BOOL;

    4. В PROGRAM PLC_PRG инициализировал указатели

    pGates[0] :=ADR(Gate_1);
    pGates[1] :=ADR(Gate_2);

    5 Далее обращаюсь к пременной
    pGates[0]^.pin_out:= TRUE;

    Компилятор ругается Ошибка 4020!

  8. #8

    По умолчанию

    Скорее всего компилятор берет выражение PLC_PRG.MyVector[1].MyOutput AT %QX1.0 не как декларацию а как обращение.
    Видимо нужно объявить массив указателей на ФБ. Потом объявить экземпляры ФБ например fb_1:myFB;...fb_n:myFB

    Привязывать как fb_1.MyOutput AT %QX1.0: BOOL
    и проинициализировать массив указателей на fb.

    Игорь Викторович, возможно есть не такой корявый метод?

  9. #9

    По умолчанию

    Объявляем в ФБ
    VAR
    MyOutput: AT %Q*: BOOL;
    END_VAR
    А Variable_Configuration определяем
    VAR_CONFIG
    PLC_PRG.MyVector[1].MyOutput AT %QX1.0 : BOOL;
    END_VAR
    и поидее все работает, правда на ОВЕН непробовал но поидее должно быть также.

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

    По умолчанию

    Цитата Сообщение от Nekit Посмотреть сообщение
    Объявляем в ФБ
    VAR
    MyOutput: AT %Q*: BOOL;
    END_VAR
    А Variable_Configuration определяем
    VAR_CONFIG
    PLC_PRG.MyVector[1].MyOutput AT %QX1.0 : BOOL;
    END_VAR
    и поидее все работает, правда на ОВЕН непробовал но поидее должно быть также.
    Вот именно, что на этом этапе всё работает. А вот если попытаться в теле основной программы обратиться к MyVector[1].MyOutput, чтобы на выход подать, например, TRUE, то компилятор выдает ошибку. Сейчас попробую через указатель достучаться к переменной.

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Ваши права

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