УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

ModBus ASCII


Автор Повідомлення
Повідомлення створено: 15. 04. 2010 [13:57]
ruslan
Руслан Нургалин
Автор теми
Зареєстрован(а) с: 25.06.2009
Повідомлення: 15
Запрос:
:060300030001F3 [0D] [0A]
Ответ:
:0603040005FC945E [0D] [0A]

[Повідомлення редагувалось 1 раз(ів), останній раз 15.04.2010 в 14:01.]
Повідомлення створено: 15. 04. 2010 [14:13]
kuzulis
Денис Шиенков
Зареєстрован(а) с: 10.07.2009
Повідомлення: 128
у меня на запрос:
адрес у-ва = 6
код ф = 3
стартовый регистр = 0
кол-во = 1

выдает это:

:060300030001F3[0d][0a]


Упс.. неуспел icon_smile.gif

[Повідомлення редагувалось 2 раз(ів), останній раз 15.04.2010 в 14:15.]
Повідомлення створено: 15. 04. 2010 [14:22]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
Значит контрольная сумма в OpenSCADA теперь считается правильно. А вот ответ на запрос от данного прибора нестандартный. Выдаёт 4-байтное значение регистра.
:0603040005FC945E [0D] [0A]
06 адрес, 03 выполненная команда, 04 кол-во байт, далее 4 байта данных старшими байтами вперёд (число 0x0005FC94), 5E LRC

[Повідомлення редагувалось 2 раз(ів), останній раз 15.04.2010 в 14:36.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 15. 04. 2010 [15:26]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
almaz wrote:

Значит контрольная сумма в OpenSCADA теперь считается правильно.

Исходя из всего вышесказанного у меня по этому поводу уже есть сомнения. Кстати, нашёл библиотеку от Moxa и там имеем:

u8 LRC( const u8 *buf, int len)
{
unsigned char ch=0;

if ( len <= 0 || buf == 0 )
return(MB_ERROR_PARAMETER);

while ( len-- )
ch += (unsigned char)*buf++;

return(ch);
}


almaz wrote:

А вот ответ на запрос от данного прибора нестандартный. Выдаёт 4-байтное значение регистра.
:0603040005FC945E [0D] [0A]
06 адрес, 03 выполненная команда, 04 кол-во байт, далее 4 байта данных старшими байтами вперёд (число 0x0005FC94), 5E LRC

А вот по этому поводу я бы связался с разработчиком. Что-бы безосновательно заявлять подобное не повадно было:

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


Learn, learn and learn better than work, work and work.
Повідомлення створено: 15. 04. 2010 [15:36]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
Вырезка из официальной спецификации:
Primary tables: Object type : Type of : Comments
Discretes Input: Single bit : Read-Only : This type of data can be provided by an I/O system.
Coils: Single bit : Read-Write : This type of data can be alterable by an application program.
Input Registers: 16-bit word : Read-Only : This type of data can be provided by an I/O system
Holding Registers: 16-bit word : Read-Write : This type of data can be alterable by an application program.








Learn, learn and learn better than work, work and work.
Повідомлення створено: 15. 04. 2010 [15:51]
kuzulis
Денис Шиенков
Зареєстрован(а) с: 10.07.2009
Повідомлення: 128
Хм... это получается, что разработчики не врали icon_smile.gif.. и в Open Scada нужно убирать проверку поля quantity_bytes в принятом PDU чтобы это не считалось ошибкой! (если конечно такая проверка есть)

ЗЫ: для Coils и Holding Registers

[Повідомлення редагувалось 2 раз(ів), останній раз 15.04.2010 в 15:54.]
Повідомлення створено: 15. 04. 2010 [15:59]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
kuzulis wrote:

Хм... это получается, что разработчики не врали icon_smile.gif.. и в Open Scada нужно убирать проверку поля quantity_bytes в принятом PDU чтобы это не считалось ошибкой! (если конечно такая проверка есть)

Врали, в OpenSCADA quantity_bytes вообще не проверяется. Однако сейчас уже проверяется соответствие размера PDU. И это никаким образом не оправдывает нарушение стандарта и откровенную ложь!


Learn, learn and learn better than work, work and work.
Повідомлення створено: 15. 04. 2010 [16:02]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
По контрольной сумме не всё понятно. Наткнулся при поиске как минимум на 4 варианта LRC. Википедия даёт следующее:
http://en.wikipedia.org/wiki/Modbus
отсюда ссылка ведёт вот сюда
http://en.wikipedia.org/wiki/Longitudinal_redundancy_check

А там алгоритм вот какой:
Set LRC = 0
For each byte b in the buffer
do
Set LRC = LRC XOR b
end do

Кроме того есть два варианта выбора байт для сложения: байты передаваемые в линию и байты до кодирования в ASCII.

Но, судя по описаниям многих устройств, они работают с той LRC которая сейчас в коде...

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 15. 04. 2010 [16:05]
kuzulis
Денис Шиенков
Зареєстрован(а) с: 10.07.2009
Повідомлення: 128

Врали, в OpenSCADA quantity_bytes вообще не проверяется.


ИМХО, не врали, т.к. в стандарте что вы привели написано, что размер регистра может быть изменен как угодно!!! Вот они и увеличили его до 4-х байт.


Однако сейчас уже проверяется соответствие размера PDU. И это никаким образом не оправдывает нарушение стандарта и откровенную ложь!

хм.. а почему тогда у топикстарьера не читаются остальные "регистры" ? в чем может быть проблема?

в том что запросили 1 16-ти битный регистр - а получили 2 "как бы 16-ти" битных регистра?

Повідомлення створено: 15. 04. 2010 [16:06]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
almaz wrote:

Но, судя по описаниям многих устройств, они работают с той LRC которая сейчас в коде...

Тогда оставляем до следующего прецедента.

Learn, learn and learn better than work, work and work.



4388