Содержание

modbus

Универсальный модуль для устройств, работающих по протоколу ModbusRTU.

Используемый протокол - MODBUS.

http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf

plugin.peripherial:
  enable: on

  module.modbus:
    netaddr:  1
    portnum:  1
    type:     modbus
    enable:   on

    maxWriteSizeInp:  64
    maxWriteSizeReg:   6

    tags:
      - name:          inps
        type:          uint16
        region:        inpreg
        address:       0
        bits:
          idle:        1
          walk:        2
          run:         4
          speed:       0b11110000  

      - name:          outs
        type:          uint16
        region:        hldreg
        access:        wo
        address:       0
        writeSingle:   on
        writeMultiple: off

      - name:    inp00
        region:  dscinp
        address: 0

      - name:    inp01
        region:  dscinp
        address: 1
        inverted: on
        
      - name:    out00
        region:  coil
        access:  wo
        address: 0

      - name:    out01
        region:  coil
        access:  wo
        address: 1

Параметры

Числовые значения во всех конфигурационных файлах jroboplc, в т.ч. и модуля modbus, задаются в десятичном виде.

Параметр Умолчание Описание
maxWriteSizeInp 128 Максимальное количество регистров в запросе при множественной записи COIL
maxWriteSizeReg 16 Максимальное количество регистров в запросе при множественной записи HLDREG
writeSingle on Разрешение одиночной записи для всех регистров (приоритетней одноименного параметра тега)
writeMultiple on Разрешение множественной записи для всех регистров (приоритетней одноименного параметра тега)
forcedWriteWO off Принудительная запись тегов с доступом WO каждый цикл. Если off, то запись происходит только при изменении тега
tags - Список тегов. Количество тегов может быть любым.
tags
name - Имя тега
address 0 Адрес регистра
region hldreg Область регистра:
coil - дискретные выходы. Тип тега только bool
dscinp - дискретные входы. Тип тега - только bool. Доступ - только чтение
hldreg - аналоговые выходы.
inpreg - аналоговые входы. Доступ - только чтение
access rw Доступ:
ro - только чтение
wo - только запись
rw - чтение и запись
type uint16 Тип тега:
bool
int16
uint16
int32
uint32
float16
float32
string - только чтение
littleEndian off Только для int32, uint32 и float32. Меняет местами старшее и младшее слова
inverted off Инверсия значения (только для типов тега bool)
size 1 Количество регистров (только для тегов типа string)
readEnd off Последний регистр в запросе чтения
readOnce off Чтение выполняется один раз при восстановлении связи
writeSingle on Разрешение одиночной записи регистра
writeMultiple on Разрешение множественной записи регистра
enable on Разрешение чтения и записи тега
tracktag Имя тега слежения для выполнения принудительной повторной записи. Предназначено для тегов с access=WO. Тег слежения должен быть определен в этом же модуле. Запись инициируется, если последнее записанное значение отличается от значения, получаемого от тега слежения
bits - Карта дополнительных битовых тегов, где ключ - это имя тега (суффикс), а значение - битовая маска. Битовые теги доступны только для тегов типа uint16. Формат имени дополнительного битового тега:
<name>.<суффикс>

Все операции записи в битовые теги фактически являются записью в соответствующие биты основного тега. При изменении значения основного тега в результате операции чтения также изменяются значения соответствующих битовых тегов. Количество дополнительных битовых тегов может быть любым

bitTagNameUnique off Имя битового тега без имени основного тега

Порядок выполнения запросов

  1. Запись HLDREG
    1. множественная запись (команда 16)
    2. одиночная запись (команда 6)
  2. Запись COIL
    1. множественная запись (команда 15)
    2. одиночная запись (команда 5)
  3. Чтение HLDREG (команда 3)
  4. Чтение INPREG (команда 4)
  5. Чтение COIL (команда 1)
  6. Чтение DSCINP (команда 2)

Запись регистров

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

Сначала список регистров просматривается на возможность посылки команды множественной записи - если есть два и более регистра для записи со смежными адресами и у них есть разрешение на множественную запись, то данные регистры записываются командой 16 или 15. Если количество регистров для записи превышает установленный лимит, либо имеется несколько смежных адресов, между которыми есть разрыв, то команда множественной записи посылается необходимое количество раз.

Далее командой одиночной записи (6 или 5) записываются регистры, имеющие разрешение на одиночную запись и не попавшие в под множественную запись. Для одного тега посылается как минимум одна команда одиночной записи. Две команды для одного тега посылается в случае, если тег имеет тип int32 или float32, т.е. состоит из двух регистров.

Чтение регистров

Команды чтения выполняются не все, а только необходимые для соответствующих областей регистров. Это значит, что имея в списке тегов только HLDREG-теги, запросы чтения будут только для HLDREG-регистров (команда 3).

Количество запрашиваемых регистров определяется разностью самого старшего и самого младшего адресов. Например, имеем два HLDREG-тега в модуле с сетевым адресом 1:

  - name:    tag1
    type:    uint16
    address: 3
  - name:    tag2
    type:    int32
    address: 7

В этом случае будет послана команда 3 на чтение шести(а не пяти, т.к. tag2 займет два регистра) регистров начиная с 3-го адреса:

01 03 0003 0006 crc16

В случае большого разрыва между считываемыми регистрами команда чтения разбивается на несколько при помощи параметра тега readEnd:

  - name:    tag1
    type:    uint16
    address: 3
  - name:    tag2
    type:    int32
    address: 7
    readEnd: on
  - name:    tag3
    type:    int32
    address: 255

Чтение регистров будет состоять из двух запросов:

01 03 0003 0006 crc16
01 03 00FF 0001 crc16

Ответ с ошибкой

Только для версии 1.3.7 и старше.

Если опрашиваемое устройство отвечает на запрос чтения данных ошибкой, т.е. в ответе у байта кода команды взведен старший бит, то возникает ошибка связи. Узнать, какая именно команда вызывает ошибку можно при помощи консольной команды логирования ошибок: <имя_модуля>:logerror 10

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

Типовые конфигурации