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

Тема: ПРавильное оформление функции

  1. #1

    По умолчанию ПРавильное оформление функции

    Добрый день знатоки.
    Разрабатываю на ПЛК-210-3 (но не суть). Опыта в работе именно на CODESYS маловато. Помогите решить задачу.
    Суть: необходимо записывать параметры в серводрайвер по MODBUS. Запись осуществляется по переднему фронту переменной (GVL.stServo[roller_drive].stRWFlags.xWrIntPosReg3). В Приложении этим занимается отдельная задача с периодичностью 250 мс. После записи я опять-же по фронту переменной (GVL.stServo[roller_drive].stRWFlags.xRdIntPosReg3) считываю данные и проверяю соостветствие. Если данные совпадают - запись успешна, если нет - ОШИБКА. Код примерно такой :
    CASE iCalcMarkSet OF
    /// Записываем параметры в серво и проверяем корректность записи {{{
    0:
    GVL.stServo[roller_drive].stWrServo.stIntPos[3].unIntPos.dwDWORD :=
    GVL.stServoDrivePrms[roller_drive].dwStretchLenInPos3;
    GVL.stServo[roller_drive].stWrServo.stIntPos[3].wIntPosSPD :=
    GVL.stServoDrivePrms[roller_drive].wRpmInPos3;
    GVL.stServo[roller_drive].stRWFlags.xWrIntPosReg3 := TRUE;
    iCalcMarkSet := 1;
    1:
    GVL.stServo[roller_drive].stRWFlags.xWrIntPosReg3 := FALSE;
    GVL.stServo[roller_drive].stRWFlags.xRdIntPosReg3 := TRUE;
    iCalcMarkSet := 2;
    2:
    GVL.stServo[roller_drive].stRWFlags.xRdIntPosReg3 := FALSE;
    xErrWrMarkSetPrms := FALSE;
    IF GVL.stServo[roller_drive].stRdServo.stIntPos[3].unIntPos.dwDWORD = GVL.stServoDrivePrms[roller_drive].dwStretchLenInPos3
    AND GVL.stServo[roller_drive].stRdServo.stIntPos[3].wIntPosSPD = GVL.stServoDrivePrms[roller_drive].wRpmInPos3 THEN
    iCalcMarkSet := 3;
    ELSE
    xErrWrMarkSetPrms := TRUE;
    iCalcMarkSet := -1;
    stBtnState.xBtn.MarkSet := FALSE;
    END_IF
    3:

    Вопросов несколько:
    1. МОжно ли проверить успешность записи флагами самого MODBUS и если да - как это сделать?
    2. Т.к. я записываю данные множество раз - хочу реализовать функцию (или функциональный блок). Но не хочу использовать циклов (очень нежелательно). Как это правильно сделать - использовать VAR_STAT тоже не хочется, вызывать несколько раз функцию- вызвал, записал данные, взвел флаг записи. Снова вызвал - снял флаг, снова вызвал - взвел флаг чтения ну и так далее.
    Подскажите - как оптимально решить задачу такого рода?
    Заранее признателен

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    6,652

    По умолчанию

    Добрый день.

    1. Это возможно. Нужно использовать режим записи Приложение.
    https://faq.codesys.com/pages/viewpa...ageId=24510480

    Пример в FAQ не совсем полный, но после изучения входов/выходов ModbusChannel - всё должно стать понятно.

    2. Что именно вы хотите вынести в функцию и каковы критерии оптимальности? ("как оптимально решить задачу такого рода")

  3. #3

    По умолчанию

    Попробую объяснить:
    Я отправил данные слейв-устройству. Есть ли встроенные переменные - значения которых содержат информацию о том, успешно ли данные обработаны слейвом (записаны в регистры), не произошло ли ошибки при передаче, приеме, подтверждении отправленных данных? Или мне самостоятельно, в коде, нужно проверять запись данных опросом слейва на чтение?
    Вот в чем вопрос первый.

    А второй, по функции: я хотел-бы запись и контроль успешной записи реализовать в отдельную функцию. Но...
    В моем понимании проблема заключается в том, что на запись данных требуется время (отправить пакет по шине, получить ответ от слейва как минимум 50 мс.). Тогда мне в функции нужно либо реализовать цикл чтобы дождаться окончания отправки пакета слейв-устройству. После этого запросить данные, опять- таки дождаться ответа слейва. Потом проверить и вернуться в основную программу. Очевидно таким образом реализованная функция будет медленной. Вот и вопрос, как реализовать такую функцию без цикла?
    А может есть системные переменные, о которых я не знаю, содержащие информацию о результате отправки последнего пакета по шине (например)?
    Изображения Изображения

  4. #4

    По умолчанию

    Вот у меня скрин работающей шины. Я правильно понимаю что если после передачи данных устройству переменная xError = FALSE то данные записаны успешно?MODBUS.PNG

  5. #5
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    6,652

    По умолчанию

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    Вот у меня скрин работающей шины. Я правильно понимаю что если после передачи данных устройству переменная xError = FALSE то данные записаны успешно?MODBUS.PNG
    Признак успешной записи для конкретного канала опроса (iChannelIndex) - это xDone = TRUE.

  6. #6

    По умолчанию

    НУ тоже задача не очень прозрачная. в программе, по таймингам нужно успеть отловить значение iChannelIndex = требуемый к***** и дождаться чтобы xDone принял значение True. О, возникла идея - а что если создать задачу по событию фронт xDone и назначить PRG в которую передавать требуемый iChannelIndex и только после этого "писать" данные в канал ну и потом спокойно обрабатывать значения xDone xError?

  7. #7
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    6,652

    По умолчанию

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    НУ тоже задача не очень прозрачная. в программе, по таймингам нужно успеть отловить значение iChannelIndex = требуемый к***** и дождаться чтобы xDone принял значение True. О, возникла идея - а что если создать задачу по событию фронт xDone и назначить PRG в которую передавать требуемый iChannelIndex и только после этого "писать" данные в канал ну и потом спокойно обрабатывать значения xDone xError?
    Возможно, вам будет проще обмен через библиотеку реализовать:
    https://youtu.be/8HdrbW9blsk

Похожие темы

  1. Ответов: 1
    Последнее сообщение: 09.08.2016, 16:43
  2. Правильное подключение НПТ-1
    от Игоррь в разделе Эксплуатация
    Ответов: 5
    Последнее сообщение: 14.04.2016, 16:33
  3. оформление по ЕСПД
    от Barboris в разделе Трёп (Курилка)
    Ответов: 3
    Последнее сообщение: 31.10.2012, 01:25
  4. Ответов: 17
    Последнее сообщение: 12.01.2012, 12:14
  5. Оформление подпрограммы
    от YuG в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 26.04.2011, 15:54

Ваши права

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