Объявление

Свернуть
Пока нет объявлений.

Modbus Slave RTU плюс RETAIN переменные

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Modbus Slave RTU плюс RETAIN переменные

    Добрый день!
    Прошу порекомендовать решение следующих задач на базе ПЛК-40:

    Необходим обмен большого объема данных по ModBUS RTU между АСУТП и ПЛК АГАВА, при этом ПЛК выступает SLAVE устройством
    при реализации столкнулся со следующими особенностями:
    - использование рекомендуемого функционального блока TMBRTUSlave (из примера) работает односторонне: чтение данных из ПЛК осуществляется нормально, запись же данных в ПЛК стандартной функцией присвоения ":=" между переменными и буфером RegHoldingBuf, соответственно, невозможна, в качестве полумеры решилось объявлениием переменных в одном адресном пространстве через "AT", что не выглядит лучшим решением
    - при объявлении единого пространства через "AT" столкнулся с ограничением в 2048 адресов, это достаточно для текущей задачи, но мало для более крупных проектов
    - часть переменных (уставки) должна хранится в энергонезависимой (RETAIN) памяти ПЛК, при использовании единого адресного пространства RegHoldingBuf и переменных, объединенного через "AT", при перезагрузке ПЛК по питанию выявлено обнуление переменных RETAIN, предположительно обусловлено перезаписью нулевыми значениями из буфера RegHoldingBuf при запуске ПЛК, решено вынесением RETAIN из указанного пространства и добавлением дополнительных переменных (при загрузке чтение из RETAIN, при работе - запись в RETAIN, если значение изменилось), даже на 20 переменных такой метод неудобен и высока вероятность ошибки.

  • #2
    Сообщение от -Alhimik- Посмотреть сообщение
    Добрый день!
    Прошу порекомендовать решение следующих задач на базе ПЛК-40:

    Необходим обмен большого объема данных по ModBUS RTU между АСУТП и ПЛК АГАВА, при этом ПЛК выступает SLAVE устройством
    при реализации столкнулся со следующими особенностями:
    - использование рекомендуемого функционального блока TMBRTUSlave (из примера) работает односторонне: чтение данных из ПЛК осуществляется нормально, запись же данных в ПЛК стандартной функцией присвоения ":=" между переменными и буфером RegHoldingBuf, соответственно, невозможна, в качестве полумеры решилось объявлениием переменных в одном адресном пространстве через "AT", что не выглядит лучшим решением
    - при объявлении единого пространства через "AT" столкнулся с ограничением в 2048 адресов, это достаточно для текущей задачи, но мало для более крупных проектов
    - часть переменных (уставки) должна хранится в энергонезависимой (RETAIN) памяти ПЛК, при использовании единого адресного пространства RegHoldingBuf и переменных, объединенного через "AT", при перезагрузке ПЛК по питанию выявлено обнуление переменных RETAIN, предположительно обусловлено перезаписью нулевыми значениями из буфера RegHoldingBuf при запуске ПЛК, решено вынесением RETAIN из указанного пространства и добавлением дополнительных переменных (при загрузке чтение из RETAIN, при работе - запись в RETAIN, если значение изменилось), даже на 20 переменных такой метод неудобен и высока вероятность ошибки.
    Добрый день. Для изменения значения в приемных буферах, можно реализовать промежуточный ФБ который будет через указатель на буфер при изменении значения переменной переписывать значения в буфере. Во вложении есть Export такого ФБ.

    Пример использования: в ПО создаете массив из экземляров ФБ
    VAR
    SetPoints : array[0..50] of fbValue;
    END_VAR


    в теле программы реализуете вызовы
    Тип переменной Float
    // Давление газа в ГРУ Сигнализация минимальное значение R/W
    SetPoints[0](valuer := adr(Param._SP[0].param.minLim.Value) , pBuff := adr(RegHoldingBuf), nReg := 150, DataType := EnDataType.dtFloat);


    Тип переменной Uint
    //Задержка выключения при P воды после насосов < min ПН1-2
    SetPoints[29](valueu := adr(Pumps._feedPumps._Delays.PminWork) , pBuff := adr(RegHoldingBuf), nReg := 205, DataType := EnDataType.dtUInt);

    Где

    valuer := adr(Param._SP[0].param.minLim.Value) - передается уставка из ПО на ПКЛ,
    pBuff := adr(RegHoldingBuf) - Указатель на буфер
    nReg := 150 - начальный адрес регистра( 32 бита - Float(2 регистра) 16 бит - uint(1 регистр)
    DataType := EnDataType.dtFloat - тип данных переменной Float\Uint.


    FBValue.zip
    Вложения

    Комментарий


    • #3
      Сообщение от Пушкарев Андрей Посмотреть сообщение

      Добрый день. Для изменения значения в приемных буферах, можно реализовать промежуточный ФБ который будет через указатель на буфер при изменении значения переменной переписывать значения в буфере. Во вложении есть Export такого ФБ.

      Пример использования: в ПО создаете массив из экземляров ФБ
      VAR
      SetPoints : array[0..50] of fbValue;
      END_VAR


      в теле программы реализуете вызовы
      Тип переменной Float
      // Давление газа в ГРУ Сигнализация минимальное значение R/W
      SetPoints[0](valuer := adr(Param._SP[0].param.minLim.Value) , pBuff := adr(RegHoldingBuf), nReg := 150, DataType := EnDataType.dtFloat);


      Тип переменной Uint
      //Задержка выключения при P воды после насосов < min ПН1-2
      SetPoints[29](valueu := adr(Pumps._feedPumps._Delays.PminWork) , pBuff := adr(RegHoldingBuf), nReg := 205, DataType := EnDataType.dtUInt);

      Где

      valuer := adr(Param._SP[0].param.minLim.Value) - передается уставка из ПО на ПКЛ,
      pBuff := adr(RegHoldingBuf) - Указатель на буфер
      nReg := 150 - начальный адрес регистра( 32 бита - Float(2 регистра) 16 бит - uint(1 регистр)
      DataType := EnDataType.dtFloat - тип данных переменной Float\Uint.


      FBValue.zip
      Благодарю Вас за ответ!

      Обдумывал схожее решение, разве что без адресных ссылок с прямым сравнением значений..

      Комментарий

      Обработка...
      X