Поскольку протокол пользуется завидной популярностью предлагаю обсуждать нюансы реализации здесь.
Возникла у нас задача перевести ряд девайсов на Modbus RTU с самопальных протоколов.
Основной камень - PIC32. Интерфейс - RS-232, RS-485.
Выбрана была библиотека FreeModbus. Поскольку порта по PIC32 не было, он был написан.
Основной функционал работает, далее полезли в нюансы.
Вопросов пока два:
1. Как корректно работать с данными при ошибке ILLEGAL DATA ADDRESS при групповом запросе на запись?
Т.е. допустим, мастер подал команду на запись группы регистров, одного либо нескольких из которых не существует.
Будет возвращена ошибка ILLEGAL DATA ADDRESS.
Корректно ли произвести запись тех данных из пакета, регистры для которых существуют или нет?
(мы пока склоняемся что нет)
2. В каком случае должна появиться ошибка ILLEGAL DATA VALUE ?
Мы по первости влупили туда проверку валидности значения, потом поняли что это неверно (нарушает иерархию протокол/приложение).
Сейчас высказывается предположение, что данная ошибка должна быть выведена при попытке неполной записи групп регистров.
Например, мы обзываем некоторые пары регистров float-ами или некоторые четверки double-ами.
Попытка частичной записи этой пары или четверки должна привести к ошибке ILLEGAL DATA VALUE.
Цитата из RFC:
02
ILLEGAL DATA ADDRESS
The data address received in the query is not an
allowable address for the server (or slave). More
specifically, the combination of reference number
and transfer length is invalid. For a controller with
100 registers, the PDU addresses the first
register as 0, and the last one as 99. If a request
is submitted with a starting register address of 96
and a quantity of registers of 4, then this request
will successfully operate (address-wise at least)
on registers 96, 97, 98, 99. If a request is
submitted with a starting register address of 96
and a quantity of registers of 5, then this request
will fail with Exception Code 0x02 “Illegal Data
Address” since it attempts to operate on registers
96, 97, 98, 99 and 100, and there is no register
with address 100.
03
ILLEGAL DATA VALUE
A value contained in the query data field is not an
allowable value for server (or slave). This
indicates a fault in the structure of the remainder
of a complex request, such as that the implied
length is incorrect. It specifically does NOT mean
that a data item submitted
for storage in a register
has a value outside the expectation of the
application program, since the MODBUS protocol
is unaware of the significance of any particular
value of any particular register.
Возникла у нас задача перевести ряд девайсов на Modbus RTU с самопальных протоколов.
Основной камень - PIC32. Интерфейс - RS-232, RS-485.
Выбрана была библиотека FreeModbus. Поскольку порта по PIC32 не было, он был написан.
Основной функционал работает, далее полезли в нюансы.
Вопросов пока два:
1. Как корректно работать с данными при ошибке ILLEGAL DATA ADDRESS при групповом запросе на запись?
Т.е. допустим, мастер подал команду на запись группы регистров, одного либо нескольких из которых не существует.
Будет возвращена ошибка ILLEGAL DATA ADDRESS.
Корректно ли произвести запись тех данных из пакета, регистры для которых существуют или нет?
(мы пока склоняемся что нет)
2. В каком случае должна появиться ошибка ILLEGAL DATA VALUE ?
Мы по первости влупили туда проверку валидности значения, потом поняли что это неверно (нарушает иерархию протокол/приложение).
Сейчас высказывается предположение, что данная ошибка должна быть выведена при попытке неполной записи групп регистров.
Например, мы обзываем некоторые пары регистров float-ами или некоторые четверки double-ами.
Попытка частичной записи этой пары или четверки должна привести к ошибке ILLEGAL DATA VALUE.
Цитата из RFC:
02
ILLEGAL DATA ADDRESS
The data address received in the query is not an
allowable address for the server (or slave). More
specifically, the combination of reference number
and transfer length is invalid. For a controller with
100 registers, the PDU addresses the first
register as 0, and the last one as 99. If a request
is submitted with a starting register address of 96
and a quantity of registers of 4, then this request
will successfully operate (address-wise at least)
on registers 96, 97, 98, 99. If a request is
submitted with a starting register address of 96
and a quantity of registers of 5, then this request
will fail with Exception Code 0x02 “Illegal Data
Address” since it attempts to operate on registers
96, 97, 98, 99 and 100, and there is no register
with address 100.
03
ILLEGAL DATA VALUE
A value contained in the query data field is not an
allowable value for server (or slave). This
indicates a fault in the structure of the remainder
of a complex request, such as that the implied
length is incorrect. It specifically does NOT mean
that a data item submitted
for storage in a register
has a value outside the expectation of the
application program, since the MODBUS protocol
is unaware of the significance of any particular
value of any particular register.