Modbus ошибка выполнения команды 3

  1. Обязательно представиться на русском языке кириллицей (заполнить поле «Имя»).
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему — вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома — бан без предупреждения.
  5. Рекламу и частные объявления «куплю/продам/есть халтура» мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать — читать здесь и здесь.

egorsubbotin

здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 20 янв 2022, 03:35
Имя: Егор
Страна: Россия
город/регион: Иркутск
Поблагодарили: 2 раза

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

egorsubbotin »

Всех приветствую.
Возникла проблема при опросе прибора logoscreen CF.
Прибор опрашивается по интерфейсу RS-232 OPC-сервером MasterOPC от инсат.
Длина кабеля около 2х метров.
Прибор опрашивается втечение 2х-3х минут после чего появляется признак качества BAD и опрос прекращается (запросы идут, а ответа не поступает). Помогает восстановить опрос только парезапуск самого устройства.
Подскажите пожалуйста в чем может быть проблема и каковы могут быть пути решения.

Кусок лога:

28-01-2022 11:21:32.446 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:21:16.933 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:21:11.853 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:21:06.757 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:21:01.648 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:56.490 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:55.375 COM 4::LS NT:(COM4) Rx: [0009] 09 03 04 50 00 48 43 15 02
28-01-2022 11:20:55.282 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:54.384 COM 4::LS NT:(COM4) Rx: [0009] 09 03 04 50 00 48 43 15 02
28-01-2022 11:20:54.274 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:53.384 COM 4::LS NT:(COM4) Rx: [0009] 09 03 04 50 00 48 43 15 02
28-01-2022 11:20:53.245 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:52.121 COM 4::LS NT:(COM4) Rx: [0009] 09 03 04 50 00 48 43 15 02
28-01-2022 11:20:52.060 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:51.170 COM 4::LS NT:(COM4) Rx: [0009] 09 03 04 50 00 48 43 15 02
28-01-2022 11:20:50.972 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
28-01-2022 11:20:50.091 COM 4::LS NT:(COM4) Rx: [0009] 09 03 04 50 00 48 43 15 02
28-01-2022 11:20:50.028 COM 4::LS NT:(COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D

Спасибо.

olexsa

шаман
шаман
Сообщения: 963
Зарегистрирован: 29 май 2009, 21:40
Имя: Александр
Страна: Россия
город/регион: Курган
Благодарил (а): 47 раз
Поблагодарили: 106 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

olexsa »

Эзернетом не пробовали? Вроде как тоже имеется такая функция.
Ну и классика — а производитель? Запрашивали информацию? Не знаю как сейчас, обращался к ним очень давно. Очень контактные. Только серийник запросили.

leon78

шаман
шаман
Сообщения: 979
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 25 раз
Поблагодарили: 94 раза

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

leon78 »

Попробуйте для теста настроить опрос реже. Бывает, что некоторые устройства зависают от частого опроса. Хотя у вас не слишком частый опрос — 1 раз в секунду.

Хард — это то, что можно швырнуть об стенку, а софт — это то, что можно лишь обматерить.

leon78

шаман
шаман
Сообщения: 979
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 25 раз
Поблагодарили: 94 раза

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

leon78 »

Jackson писал(а): ↑28 янв 2022, 11:30
Классика — это «протокол-то какой?»

Судя по логу, запрос по Modbus RTU: узел 9, код функции 3, 2 регистра с адреса 35h

Отправлено спустя 1 минуту 10 секунд:
Кстати, к logoscreen идёт хорошая программа для чтения архива и настройки. У неё соединение стабильное?

Хард — это то, что можно швырнуть об стенку, а софт — это то, что можно лишь обматерить.

Аватара пользователя

keysansa

эксперт
эксперт
Сообщения: 2144
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1500 раз
Поблагодарили: 141 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

keysansa »

Протокол опроса, пока все хорошо, мало что дает для понимания.
Хорошо было бы увидеть строки лога, когда прекращается обмен. Часто клиент в лог помещает RAW данные, на которых он «споткнулся». Это гораздо более интересная информация.

ЗЫ. Лучше всего, лог как раз в момент прекращения обмена.

В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

Аватара пользователя

keysansa

эксперт
эксперт
Сообщения: 2144
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1500 раз
Поблагодарили: 141 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

keysansa »

leon78 писал(а): ↑28 янв 2022, 14:34
Так в логе видно, что обмен прекращается после 28-01-2022 11:20:56.490 — запросы есть, ответов нет.

Не видно данных, которые принял приемник.

В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

Аватара пользователя

Jackson

администратор
администратор
Сообщения: 16516
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 625 раз
Поблагодарили: 1126 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Jackson »

leon78 писал(а): ↑28 янв 2022, 14:34
Так в логе видно, что обмен прекращается после 28-01-2022 11:20:56.490 — запросы есть, ответов нет.

И это, собственно, всё что видно в логе.

egorsubbotin писал(а): ↑28 янв 2022, 06:32
Прибор опрашивается по интерфейсу RS-232 OPC-сервером MasterOPC от инсат. Длина кабеля около 2х метров.

Автору не кажется ли случайно, что проблема где-то тут? :)

По вопросам работы Форума можно обратиться по этим контактам.

egorsubbotin

здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 20 янв 2022, 03:35
Имя: Егор
Страна: Россия
город/регион: Иркутск
Поблагодарили: 2 раза

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

egorsubbotin »

Jackson писал(а): ↑28 янв 2022, 11:30

olexsa писал(а): ↑28 янв 2022, 06:59Ну и классика

Это ещё не класика. Классика — это «протокол-то какой?» :)

Протокол указал в названии темы «Проблемы при опросе при прибора по RS-232 (modbus RTU)»

Отправлено спустя 4 минуты 9 секунд:
Отправлено спустя 1 минуту 10 секунд:

Отправлено спустя 1 минуту 52 секунды:

olexsa писал(а): ↑28 янв 2022, 06:59
Эзернетом не пробовали? Вроде как тоже имеется такая функция.
Ну и классика — а производитель? Запрашивали информацию? Не знаю как сейчас, обращался к ним очень давно. Очень контактные. Только серийник запросили.

Прибор снят с производства, производитель на вопросы по нему отвечает с трудом, но ждем ответов

Отправлено спустя 10 минут 18 секунд:

leon78 писал(а): ↑28 янв 2022, 11:48

Jackson писал(а): ↑28 янв 2022, 11:30
Классика — это «протокол-то какой?»

Судя по логу, запрос по Modbus RTU: узел 9, код функции 3, 2 регистра с адреса 35h

Отправлено спустя 1 минуту 10 секунд:
Кстати, к logoscreen идёт хорошая программа для чтения архива и настройки. У неё соединение стабильное?

С программой конфигуратором соединение тоже пропадает

Отправлено спустя 16 минут 47 секунд:

keysansa писал(а): ↑28 янв 2022, 14:09
Протокол опроса, пока все хорошо, мало что дает для понимания.
Хорошо было бы увидеть строки лога, когда прекращается обмен. Часто клиент в лог помещает RAW данные, на которых он «споткнулся». Это гораздо более интересная информация.

ЗЫ. Лучше всего, лог как раз в момент прекращения обмена.

Вот лог, который OPC пишет в файл

[29.01.2022 8:37:55.207] Inf : COM 4.LS NT:Старт опроса устройства
[29.01.2022 8:37:55.224] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:37:55.287] TRACE : (COM4) Rx: [0009] 09 03 04 6D 51 41 ED CE 93
[29.01.2022 8:37:55.302] Inf : COM 4.LS NT:Стоп опроса устройства (t = 95 ms) (H2 17,14,49 )
[29.01.2022 8:37:56.334] Inf : COM 4.LS NT:Старт опроса устройства
[29.01.2022 8:37:56.350] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:37:56.414] TRACE : (COM4) Rx: [0009] 09 03 04 6F 09 41 ED 4E F8
[29.01.2022 8:37:56.429] Inf : COM 4.LS NT:Стоп опроса устройства (t = 96 ms) (H2 16,31,32 )
[29.01.2022 8:37:57.463] Inf : COM 4.LS NT:Старт опроса устройства
[29.01.2022 8:37:57.479] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:02.523] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:07.574] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:12.615] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:17.659] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:22.696] Err : LS NT:Ошибка выполнения команды 3 <<Small input buffer (4 or 5)>> в устройстве 9 from LS NT:HOLDING_REGISTERS
[29.01.2022 8:38:22.696] Err : COM 4.LS NT:Включен таймаут ошибки запроса 1
[29.01.2022 8:38:22.696] Err : COM 4:Реиницилизация узла
[29.01.2022 8:38:22.825] Inf : COM 4:Порт 4 закрыт
[29.01.2022 8:38:22.825] Inf : COM 4.LS NT:Ошибка опроса устройства
[29.01.2022 8:38:33.435] Inf : COM 4:Порт 4 открыт
[29.01.2022 8:38:33.435] Inf : COM 4.LS NT:Старт опроса устройства
[29.01.2022 8:38:33.443] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:38.496] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:43.540] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:48.580] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:53.634] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:58.673] Err : LS NT:Ошибка выполнения команды 3 <<Small input buffer (4 or 5)>> в устройстве 9 from LS NT:HOLDING_REGISTERS
[29.01.2022 8:38:58.673] Err : COM 4.LS NT:Включен таймаут ошибки запроса 1
[29.01.2022 8:38:58.673] Err : COM 4:Реиницилизация узла
[29.01.2022 8:38:58.808] Inf : COM 4:Порт 4 закрыт
[29.01.2022 8:38:58.808] Inf : COM 4.LS NT:Ошибка опроса устройства
[29.01.2022 8:39:09.434] Inf : COM 4:Порт 4 открыт
[29.01.2022 8:39:09.434] Inf : COM 4.LS NT:Старт опроса устройства
[29.01.2022 8:39:09.449] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:39:14.488] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:39:19.542] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:39:24.591] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:39:29.626] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:39:34.650] Err : LS NT:Ошибка выполнения команды 3 <<Small input buffer (4 or 5)>> в устройстве 9 from LS NT:HOLDING_REGISTERS
[29.01.2022 8:39:34.650] Err : COM 4.LS NT:Включен таймаут ошибки запроса 1

Ryzhij

почётный участник форума
почётный участник форума
Сообщения: 5462
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 477 раз
Поблагодарили: 650 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Ryzhij »

На уровне интерфейса RS-232 сигнал готовности порта прибора Ready анализируется? В кабеле он распаян?

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

rwg

почётный участник форума
почётный участник форума
Сообщения: 1013
Зарегистрирован: 29 апр 2014, 09:57
Имя: Рыбкин Владимир Геннадьевич
Страна: Россия
город/регион: Тверь
Благодарил (а): 47 раз
Поблагодарили: 122 раза

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

rwg »

Мне кажется, что проблема очевидная — после 2-3 минут работы у устройства зависает подпрограмма обмена по СОМ-порту. Например такое встречается у Овеновских ТРМов с прошивкой до февраля 2017 года (если правильно помню), только они перестают отвечать по Modbus RTU в случайный момент времени через несколько часов-месяцев после включения. Там приходится использовать Modbus ASCII или отключать питание прибора на пару секунд

Аватара пользователя

keysansa

эксперт
эксперт
Сообщения: 2144
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1500 раз
Поблагодарили: 141 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

keysansa »

Ryzhij писал(а): ↑29 янв 2022, 11:49
На уровне интерфейса RS-232 сигнал готовности порта прибора Ready анализируется? В кабеле он распаян?

А разве, при трехпроводном соединении RS232 и неверно установленной конфигурации синхронизации будет хоть какой-то обмен? У меня ни разу не было, что бы при установке RTS/CTS на трехпроводном соединении хоть что-то пошло.

egorsubbotin писал(а): ↑29 янв 2022, 03:45
[29.01.2022 8:38:22.696] Err : COM 4.LS NT:Включен таймаут ошибки запроса 1
[29.01.2022 8:38:22.696] Err : COM 4:Реиницилизация узла
[29.01.2022 8:38:22.825] Inf : COM 4:Порт 4 закрыт
[29.01.2022 8:38:22.825] Inf : COM 4.LS NT:Ошибка опроса устройства
[29.01.2022 8:38:33.435] Inf : COM 4:Порт 4 открыт
[29.01.2022 8:38:33.435] Inf : COM 4.LS NT:Старт опроса устройства
[29.01.2022 8:38:33.443] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:38.496] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:43.540] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:48.580] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:53.634] TRACE : (COM4) Tx: [0008] 09 03 00 35 00 02 D5 4D
[29.01.2022 8:38:58.673] Err : LS NT:Ошибка выполнения команды 3 <<Small input buffer (4 or 5)>> в устройстве 9 from LS NT:HOLDING_REGISTERS

Тут видно, что ответа от мастера нет вообще, слейв COM порт переоткрывает (делает ли Flush буферов — не понятно, но скорее всего делает, и даже если это не так, проходит 5 посылок и 5 секунд).

Я согласен с rwg, наиболее вероятно — перестает отвечать удаленное устройство. Можно, для достоверности, конечно, «поснифить» обмен, но врядли что-то новое будет, судя по опыту.

В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

olexsa

шаман
шаман
Сообщения: 963
Зарегистрирован: 29 май 2009, 21:40
Имя: Александр
Страна: Россия
город/регион: Курган
Благодарил (а): 47 раз
Поблагодарили: 106 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

olexsa »

А какие параметры настройки RS-232 у logoscreen CF?

Отправлено спустя 53 минуты 38 секунд:
А вот еще вопрос к egorsubbotin — используете интерфейсный кабель ПК с преобразователем TTL/RS232 и адаптером, или напрямую соединение между портами?

Ryzhij

почётный участник форума
почётный участник форума
Сообщения: 5462
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 477 раз
Поблагодарили: 650 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Ryzhij »

keysansa писал(а): ↑30 янв 2022, 10:07
А разве, при трехпроводном соединении RS232 и неверно установленной конфигурации синхронизации будет хоть какой-то обмен? У меня ни разу не было, что бы при установке RTS/CTS на трехпроводном соединении хоть что-то пошло.

В том и дело, что обмен будет, пока один из приборов не займется своими делами. Потом он просто перестанет принимать, ну и отвечать соответственно.

Отправлено спустя 6 минут 6 секунд:

olexa писал(а): ↑31 янв 2022, 07:16
А вот еще вопрос к egorsubbotin — используете интерфейсный кабель ПК с преобразователем TTL/RS232 и адаптером, или напрямую соединение между портами

Это вопрос из той же «оперы».

Отправлено спустя 3 минуты 55 секунд:

keysansa писал(а): ↑30 янв 2022, 10:07
Тут видно, что ответа от мастера нет вообще, слейв COM порт переоткрывает

Не отвечать может только слейв. Это дело мастера слать запросы.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

olexsa

шаман
шаман
Сообщения: 963
Зарегистрирован: 29 май 2009, 21:40
Имя: Александр
Страна: Россия
город/регион: Курган
Благодарил (а): 47 раз
Поблагодарили: 106 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

olexsa »

Ryzhij писал(а): ↑31 янв 2022, 07:26
olexa писал(а): ↑42 минуты назад
А вот еще вопрос к egorsubbotin — используете интерфейсный кабель ПК с преобразователем TTL/RS232 и адаптером, или напрямую соединение между портами

Это вопрос из той же «оперы».

Прошу прощения за назойливость, но не совсем понял, из какой именно оперы?

Отправлено спустя 2 минуты 25 секунд:
Согласно документации Logoscreen CF, для организации связи по RS232 нужен преобразователь уровней TTL в уровни RS232.

Ryzhij

почётный участник форума
почётный участник форума
Сообщения: 5462
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 477 раз
Поблагодарили: 650 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Ryzhij »

olexsa писал(а): ↑31 янв 2022, 08:03
Прошу прощения за назойливость, но не совсем понял, из какой именно оперы?

Большинство преобразователей используют усеченную схему без дополнительных сигналов, предусмотренных RS-232.

Я порылся в интернете и нашел описание интерфейса. Поиграйтесь минимальным временем задержки ответа в приборе и максимальным временем ожидания в компе, раз у нас не используются линии RTS/CTS.
Опять же надо проверить соответствие установленной скорости передачи количеству запрашиваемых данных.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Аватара пользователя

keysansa

эксперт
эксперт
Сообщения: 2144
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1500 раз
Поблагодарили: 141 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

keysansa »

Ryzhij писал(а): ↑31 янв 2022, 07:26
Не отвечать может только слейв. Это дело мастера слать запросы.

Я так же думал, но когда полез за пруфами в спецификацию modbus, увидел там, что это слейв опрашивает мастера.

Ryzhij писал(а): ↑31 янв 2022, 08:37
Опять же надо проверить соответствие установленной скорости передачи количеству запрашиваемых данных.

Согласен, это встречается. При несоответствии скоростей, прибор отвечает некоторое время, потом перестает, встречался. Не 2-3 минуты, меньше, но есть такое.

Отправлено спустя 1 минуту 38 секунд:

olexsa писал(а): ↑31 янв 2022, 08:03
Согласно документации Logoscreen CF, для организации связи по RS232 нужен преобразователь уровней TTL в уровни RS232.
Вернуться к началу

Если бы его не было, прибор бы не отвечал ни минуты, плюс, почти 100% вероятность повреждения TTL схемы.

В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

Ryzhij

почётный участник форума
почётный участник форума
Сообщения: 5462
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 477 раз
Поблагодарили: 650 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Ryzhij »

keysansa писал(а): ↑31 янв 2022, 19:14
Я так же думал, но когда полез за пруфами в спецификацию modbus, увидел там, что это слейв опрашивает мастера.

Вас обманули. Или вы что-то не поняли.
В протоколах Modbus RTU/ASCII инициатор связи именуется мастером, в Modbus-TCP эти функции выполняет клиент. Отвечают слейвы и серверы соответственно.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Ryzhij

почётный участник форума
почётный участник форума
Сообщения: 5462
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 477 раз
Поблагодарили: 650 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Ryzhij »

И?!
Я что-то не так вам написал?
Запрос в Modbus-TCP инициирует клиент.
Клиент соответствует мастеру в Modbus RTU/ASCII.
А серверу — слейв.
И сервер, и слейв по своей роли в сеансе связи никого не опрашивают, а отвечают на запросы.
С чего это мы в трёх соснах путаемся?

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Аватара пользователя

keysansa

эксперт
эксперт
Сообщения: 2144
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1500 раз
Поблагодарили: 141 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

keysansa »

Ryzhij писал(а): ↑31 янв 2022, 21:34
В протоколах Modbus RTU/ASCII инициатор связи именуется мастером,

Я просто не правильно понял, согласен.
В спецификации рассматриваются оба варианта, и TCP и RTU, но порядок обмена не разделяется. Везде один порядок обмена.

Отправлено спустя 2 минуты 7 секунд:

Ryzhij писал(а): ↑31 янв 2022, 21:55
Клиент соответствует мастеру в Modbus RTU/ASCII.

Надо просто было сразу объяснить, у меня не возникло бы вопросов.
Только добавить, что и в TCP клиент тоже мастер.

Отправлено спустя 3 минуты 25 секунд:

Ryzhij писал(а): ↑31 янв 2022, 21:55
Я что-то не так вам написал?
Запрос в Modbus-TCP инициирует клиент.

Ryzhij писал(а): ↑31 янв 2022, 07:26
Не отвечать может только слейв. Это дело мастера слать запросы.

ЗЫ. Я тоже в шоке был, не поверите.

ЗЫЫ. Но я признал ошибку, и попросил прощения.

Отправлено спустя 10 минут 30 секунд:
Где-то 200 страниц документации было переписано…

В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

Аватара пользователя

Jackson

администратор
администратор
Сообщения: 16516
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 625 раз
Поблагодарили: 1126 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Jackson »

keysansa писал(а): ↑31 янв 2022, 22:17
Надо просто было сразу объяснить, у меня не возникло бы вопросов.
Только добавить, что и в TCP клиент тоже мастер.

В TCP нет понятия «мастер» и «слейв» — там есть «клиент» и «сервер». «Мастер» в RTU — не одно и то же что «клиент» в TCP.

По вопросам работы Форума можно обратиться по этим контактам.

Аватара пользователя

Jackson

администратор
администратор
Сообщения: 16516
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 625 раз
Поблагодарили: 1126 раз

Проблемы при опросе при прибора по RS-232 (modbus RTU)

Сообщение

Jackson »

VladimirIvanov писал(а): ↑02 фев 2022, 08:11
С недавних пор, в связи с движением BLM, и применительно к RTU не рекомендуется использовать понятия «мастер» и «слейв», оптимально — «клиент» и «сервер»

Это выглядит примерно как «Не доверяю английским спецшколам в Англии, потому что совсем не так надо произносить «the table» согласно последним инструкциям ВЦСПС» (с)

По вопросам работы Форума можно обратиться по этим контактам.

Вернуться в «Интерфейсы, протоколы, связь»


Перейти

  • Работа форума
  • База знаний (Knowledge Exchange)
  • ↳   Eplan Electric P8
  • ↳   Общий F.A.Q.
  • ↳   Общие вопросы
  • ↳   Новости
  • ↳   Ошибки
  • ↳   Проект
  • ↳   Изделия
  • ↳   Устройства
  • ↳   Соединения
  • ↳   Кабели
  • ↳   Клеммы
  • ↳   ПЛК
  • ↳   Компоновка 2D
  • ↳   Макросы
  • ↳   Eplan API
  • ↳   Сценарии (Только готовые решения)
  • ↳   Внешняя обработка
  • ↳   ProPanel
  • ↳   Инструкции ProPanel (Только готовые решения)
  • ↳   Прочие направления Eplan
  • ↳   FieldSys (Топология)
  • ↳   Preplanning
  • ↳   Harness proD
  • ↳   EEC One
  • ↳   Advantech
  • ↳   F.A.Q., Инструкции
  • ↳   Allen Bradley
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Операторские панели
  • ↳   B&R Automation
  • ↳   F.A.Q.
  • ↳   Danfoss
  • ↳   DEIF A/S
  • ↳   Общие вопросы
  • ↳   UNI-LINE
  • ↳   MULTI-LINE
  • ↳   MULTI-LINE 300
  • ↳   Emerson
  • ↳   Общие вопросы
  • ↳   КИП и регуляторы
  • ↳   DeltaV
  • ↳   ОВЕН
  • ↳   Прософт-Системы
  • ↳   Общие вопросы
  • ↳   ПЛК REGUL
  • ↳   Schneider Electric
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Панели оператора
  • ↳   SCADA
  • ↳   Электротехника
  • ↳   Приводная техника
  • ↳   SIEMENS
  • ↳   Общие вопросы
  • ↳   LOGO!
  • ↳   ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
  • ↳   Simatic Step7
  • ↳   Simatic TIA Portal
  • ↳   Simatic PCS 7
  • ↳   Операторские панели
  • ↳   WinCC
  • ↳   Приводная техника (Sinamics, Micromaster, Masterdrive, Simoreg, Simotics)
  • ↳   SmartGen
  • ↳   Общие вопросы
  • ↳   Промышленные (береговые) контроллеры
  • ↳   Морские контроллеры и устройства
  • ↳   WEINTEK (операторские панели)
  • ↳   F.A.Q., Инструкции
  • ↳   Архив
  • ↳   Микроконтроллеры и электроника
  • ↳   Arduino
  • ↳   Raspberry
  • ↳   Другие микроконтроллеры
  • ↳   Электроника
  • Общие вопросы АСУТП
  • ↳   Общие вопросы
  • ↳   Вопросы от студентов
  • ↳   Литература
  • ↳   Новости и отчётность
  • ↳   Нормативы, ГОСТы, стандарты
  • ↳   Информационная безопасность
  • ↳   Проектирование и САПР
  • ↳   Системная интеграция
  • ↳   Разбор полетов
  • ↳   Работа
  • ↳   Заготовки для базы знаний
  • ↳   Производство и технология
  • ↳   MES — Системы автоматизации управления производством
  • ↳   Метрология, КИП и датчики
  • ↳   Исполнительные устройства, регуляторы
  • ↳   Средний уровень автоматизации (управляющий)
  • ↳   ПЛК Flexem
  • ↳   Алгоритмы
  • ↳   Операторские панели
  • ↳   Верхний уровень автоматизации (отображение)
  • ↳   GE iFix
  • ↳   Wonderware Intouch
  • ↳   MasterScada
  • ↳   SCADA+
  • ↳   Альфа платформа
  • ↳   Интерфейсы, протоколы, связь
  • ↳   Радиосвязь
  • ↳   Полезное ПО
  • ↳   Электротехника, энергетика и электропривод
  • ↳   Генераторы, электростанции и силовые агрегаты
  • ↳   Теплотехника
  • ↳   Подбор аналогов
  • F.A.Q.
  • ↳   Документация (вариант 1)
  • ↳   Документация (вариант 2)
  • ↳   Электротехника и электроэнергетика
  • ↳   F.A.Q. по программируемым логическим контроллерам (PLC)
  • ↳   Обсуждение F.A.Q. по PLC
  • ↳   F.A.Q. по выбору PLC
  • ↳   F.A.Q. по аппаратной части PLC
  • ↳   F.A.Q. по языкам программирования
  • ↳   F.A.Q. по структуре программ
  • ↳   F.A.Q. по взаимодействию PLC с HMI
  • О жизни
  • ↳   Для дома, для семьи
  • ↳   Комната смеха
  • ↳   Электродвижение

Содержание:

  1. Компоненты СИМП Лайт
  2. Редактор каналов
  3. Источники данных
  4. Modbus driver
  5. Коды ошибок Modbus

Расшифровка кодов ошибок Modbus:

 

01

  Принятый код функции не может быть обработан.
 

02

  Адрес данных, указанный в запросе, недоступен.
 

03

  Значение, содержащееся в поле данных запроса,
  является недопустимой величиной.
 

04

  Невосстанавливаемая ошибка имела место,
  пока ведомое устройство пыталось выполнить
  затребованное действие.
 

05

  Ведомое устройство приняло запрос и обрабатывает
  его, но это требует много времени. Этот ответ
  предохраняет ведущее устройство от генерации
  ошибки тайм-аута.
 

06

  Ведомое устройство занято обработкой команды.
  Ведущее устройство должно повторить сообщение
  позже, когда ведомое освободится.
 

07

  Ведомое устройство не может выполнить программную
  функцию, заданную в запросе. Этот код возвращается
  для неуспешного программного запроса, использующего
  функции с номерами 13 или 14. Ведущее устройство
  должно запросить диагностическую информацию или
  информацию об ошибках от ведомого.
 

08

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

10 (0A hex)

  

  Шлюз неправильно настроен или перегружен запросами 
 

11 (0B hex)

  Slave устройства нет в сети или от него нет ответа 

Содержание:

  1. Компоненты СИМП Лайт
  2. Редактор каналов
  3. Источники данных
  4. Modbus driver
  5. Коды ошибок Modbus

Расшифровка кодов ошибок Modbus:

 

01

  Принятый код функции не может быть обработан.
 

02

  Адрес данных, указанный в запросе, недоступен.
 

03

  Значение, содержащееся в поле данных запроса,
  является недопустимой величиной.
 

04

  Невосстанавливаемая ошибка имела место,
  пока ведомое устройство пыталось выполнить
  затребованное действие.
 

05

  Ведомое устройство приняло запрос и обрабатывает
  его, но это требует много времени. Этот ответ
  предохраняет ведущее устройство от генерации
  ошибки тайм-аута.
 

06

  Ведомое устройство занято обработкой команды.
  Ведущее устройство должно повторить сообщение
  позже, когда ведомое освободится.
 

07

  Ведомое устройство не может выполнить программную
  функцию, заданную в запросе. Этот код возвращается
  для неуспешного программного запроса, использующего
  функции с номерами 13 или 14. Ведущее устройство
  должно запросить диагностическую информацию или
  информацию об ошибках от ведомого.
 

08

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

10 (0A hex)

  Шлюз неправильно настроен или перегружен запросами 
 

11 (0B hex)

  Slave устройства нет в сети или от него нет ответа 

Статья посвящена промышленному протоколу ModBus — наиболее простому, а потому широко распространённому цифровому протоколу передачи данных.

Стандарт ModBus был изобретён ещё в 1979 году компанией Modicon (ныне Schneider Electric) и с того времени не утратил своей актуальности, а даже наоборот получил широкое распространение и большую популярность среди разработчиков АСУ ТП.

Преимущества:

  • прост в реализации
  • отсутствует необходимость установки специальных микросхем для реализации протокола при разработке контроллеров и устройств
  • простота диагностики и отладки
  • поддерживается большинством устройств, применяемых при построении АСУ ТП
  • высокая надёжность и достоверность при передаче данных

Недостатки:

  • ModBus сеть построена по принципу «ведущий-ведомый», где ведущее устройство может быть только одно. Поэтому обмен данными происходит только по инициативе ведущего устройства (оно по очереди опрашивает все ведомые). Если ведомому устройству нужно срочно передать данные, оно не может этого сделать, пока его не опросит «ведущий».

Общие сведения о ModBus сети

ModBus сеть объединяет одно ведущее (мастер) и несколько ведомых (слейвов). Обмен данными в сети происходит по инициативе мастера. Он может отправить запрос одному из подчинённых устройств или широковещательное сообщение сразу всем ведомым устройствам сети.

структура modbus сети

После отправки запроса мастер ожидает ответ в течение заданного времени («время таймаута»). Если в течение этого времени ответ не получен, мастер считает, что связь с ведомым отсутствует. На широковещательное сообщение ответ не предусмотрен.

Слейвы (ведомые устройства) не могут самостоятельно инициировать передачу данных. Они могут передать данные только после запроса мастера (и только те данные, которые мастер запросит).

Существует три разновидности протокола:

  • ModBus ASCII — разновидность протокола, в которой сообщения кодируются с помощью ASCII-символов. Сообщения разделяются символами «:» и CR/LF. Не очень удобен, в России используется крайне редко.
  • ModBus RTU — разновидность протокола, в которой сообщения кодируются «как есть» (числами). Между собой сообщения разделяются временной паузой в 3,5 символа при заданной скорости передачи.
  • ModBus TCP — разновидность протокола для работы поверх TCP/IP стека, требуется при соединении устройств по Ethernet.

Физический уровень протокола ModBus

Для передачи ModBus сообщений используется последовательные асинхронные интерфейсы (RS232, RS485, RS422) в случае использования протоколов ASCII и RTU и Ethernet интерфейс для протокола ModBus TCP.

Использование стандартных интерфейсов делает ModBus удобным для пользователей и разработчиков.

Типы данных ModBus

Любой узел сети ModBus — это интеллектуальное устройство (контроллер, регулятор, датчик и др.). Согласно спецификации узел сети может иметь следующие структуры данных:

  • Discrete Inputs  — состояния дискретных входов устройства, их можно только прочитать. Однобитовый тип данных.
  • Coils — состояния дискретных выходов устройства, их можно прочитать и изменить (записать новое состояние). Однобитовый тип.
  • Input Registers — 16-битные регистры, доступные только для чтения.
  • Holding Registers — 16-битные регистры свободного назначения, доступны для чтения и записи.

Указанные типы данных необязательны для всех устройств, поддерживающих ModBus. Например, Discrete Inputs и Coils характерны больше для ПЛК.

Производитель устройства сам решает, какой тип данных сделать доступным для чтения и записи по ModBus, и об этом написано в руководстве устройства. В большинстве случае пользуются типом Holding Registers, поскольку он самый универсальный.

Структура обмена данными по ModBus

Как уже было сказано, обмен данными по ModBus состоит из запросов и ответов. Ведущее устройство посылает запрос одному из подчинённых устройств, указывая в запросе его адрес, или всем устройствам сразу, указывая адрес 0.

Структура ModBus-пакета
Рис. Структура ModBus-пакета

Типовой запрос или ответ состоит из следующих блоков:

  • адрес подчинённого устройства
  • номер функции — определяет тип запрашиваемых данных и что с ними нужно сделать (прочитать/записать)
  • данные — содержит параметры функции («куда», «сколько» и «какие» данные записывать или читать)
  • блок контроля подлинности — содержит контрольную сумму для проверки целостности полученных данных.

Состав данных блоков отличается для RTU и TCP реализаций ModBus. Далее мы подробно рассотрим каждый из них.

ModBus ASCII мы не будем подробно рассматривать, поскольку он используется крайне редко. Состав пакета в ModBus ASCII такой же как и ModBus RTU, и отличается только типом кодирования и способом разделения пакетов.

Функции ModBus

Номер функции определяет тип запрашиваемых данных и что с ними нужно сделать (прочитать/записать).

Функций ModBus достаточно много и они разделены на три категории:

  • стандартные — функции, описанные в стандарте протокола. Среди них много устаревших и неиспользуемых.
  • пользовательские — диапазон номеров функций (с 65 по 72 и с 100 по 110), которые может использовать любой производитель устройств для реализации своих специфичных функций. При этом вполне возможно, что у устройств различных производителей под одинаковыми номерами будут разные по смыслу функции.
  • зарезервированные — функции, не описанные в базовом стандарте, но реализованные в устройствах различных производителей. При этом гарантируется, что данные производители зарезервировали эти номера для себя и другие производители не могут ими воспользоваться.

Однако, это всё лирика… На практике в большинстве случаев используются всего несколько функций, мы подробно поговорим о них в отдельной статье, а в этой будем рассматривать всё на примере функции Read Holding Registers (чтение регистров общего назначения).

Функция Read Holding Registers (0x03) 

Функция под номером 3 —  одна из самых употребимых функций, предназначена для чтения регистров общего назначения устройства.

В запросе указывается количество регистров, которые нужно прочитать и адрес первого из них.

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

Структура запроса ModBus
Рис. Запрос от мастера
Структура ответа ModBus
Рис. Ответ слейва

Количество байт в ответе помогает ведущему устройству по мере получения данных понять, когда все данные уже получены. То есть если мастер получил третий байт с числом 200 — это означает, что ему осталось получить еще 100 байт + 2 байта контроля целостности. Это позволит ему посчитать количество пришедших байт и закончить приём, не дожидаясь, когда закончится время таймаута, отведённое слейву на ответ.

Коды ошибок ModBus

Вместо нормального ответа, содержащего запрошенные данные, подчинённое устройство может ответить ошибкой. При этом к номеру функции в ответе добавляется код 0х80 в шестнадцатеричной системе исчисления.

Обратимся к предыдущему примеру. Там подчинённое устройство ответило без ошибки и второй байт в ответе был 0х03. Если бы ответ содержал код ошибки, то к номеру функции подчинённое устройство добавило бы 0х80 и получилось бы 0х83. Вот так:

Коды ошибок ModBus
Рис. Ответ слейва с признаком ошибки

В этом примере код ошибки 02 — это один из стандартных кодов. Вот какие они бывают:

01 — функция не поддерживается. Это значит, что, возможно, функция не стандартная или просто не реализована конкретно в этом устройстве.

02 — запрошенная область памяти не доступна. Каждое устройство содержит определённое количество данных определённого типа. Например, в устройстве доступно 100 регистров общего  назначения. Если при этом запросить чтение 101 регистров — возникнет ошибка 02.

03 — функция не поддержит запрошенное количество данных. Например, функция №3 «Read Holding Registers» позволяет читать от 1 до 2000 регистров общего назначения. Поэтому, даже если в подчинённом устройстве доступно для чтения 10 000 регистров, при запросе  более 2000 с помощью функции №3 — возникнет эта ошибка.

04 — функция выполнена с ошибкой. Такой код ошибки будет возвращён, если есть какое-то иное препятствие для нормального выполнения команды, не охваченное тремя предыдущими кодами ошибки. Проще говоря, это такая заглушка «на всякий случай», если что-то пошло не так, но в протоколе специального кода для такой ошибки не предусмотрено.

Нужно помнить, что существуют не только стандартные функции, но ещё и пользовательские и зарезервированные. Поэтому, производители устройств, которые дополнили протокол своими функциями, возможно заложили туда другие коды ошибок. Но это всё очень большая экзотика…

ModBus RTU

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

В сообщении обязательно указывается адрес получателя (или 0, если сообщение широковещательное) и номер функции.Номер функции определяет какие данные содержит сообщение и как их интерпретировать.

За номером функции идут данные. Регистры данных в ModBus 32-битные, а передаются ввиде двух 16-битных сло. Сначала идёт старший байт, затем младший.

Пример. Допустим, мы хотим прочитать из удалённого модуля сбора данных 2 регистра, начиная с первого. Адрес удалённого модуля в сети ModBus «4».  Для этого воспользуемся функцией №3 Read Holding Registers.

Функции ModbusРис. Запрос на чтение 2-х регистров, начиная с 1-го
Ответ слейва ModBusРис. Ответ от слейва на запрос

В ответе подчинённое устройство повторяет свой адрес и номер функции, далее следует количество полезных байт в ответе. Каждый регистр состоит из двух байт (сначала идёт старший, затем младший). Значение запрошенных регистров оказались равны 11 и 22 в десятичной системе исчисления (0B и 16 в шестнадцатеричной соответственно).

О  том, как использовать другие ModBus функции мы выпустим отдельную статью.

Контроль целостности пакета в ModBus RTU (CRC-16)

В предыдущем примере за байтами данных идут два байта проверки целостности пакета. Они являются результатом вычисления кода CRC-16 для всего сообщения.

Мастер, передавая запрос, вычисляет CRC-код и добавляет его в конец сообщения. Слейв, получив сообщение, проверяет сообщение на целостность согласно алгоритму CRC-16. Затем подчинённое устройство составляет ответ, точно так же вычисляет для него CRC и добавляет в конец пакета.

Подробно рассматривать алгоритм CRC-16 мы не будем, т.к. мы стараемся быть ближе к практике… А на практике программисту практически никогда не приходится писать блок вычисления CRC — в любой среде программирования можно найти соответствующую функцию или функциональный блок.

Заключение

В данной статье мы рассмотрели общую структуру протокола ModBus и его классическую разновидность ModBus RTU. Вообще говоря, ModBus RTU — это и есть «истинный Modbus» (если отбросить ModBus ASCII, который уже устарел).

В следующей статье мы поговорим о разновидности протокола ModBus TCP, который является «притягиванием за уши» классического ModBus с целью использования его в Ethernet-сетях, что, конечно же, накладывает определённые ограничения. Но об этом в следующей статье. Следите за обновлениями на LAZY SMART.


Это утверждённая версия страницы. Она же — наиболее свежая версия.

Основные понятия

Modbus — это протокол прикладного (седьмого) уровня модели OSI. Чаще всего он служит для обмена данными между устройствами автоматизации и реализован в виде «протокола ответов на запросы (request-reply protocol)».

В устройствах Wiren Board данные Modbus передаются по последовательным линиям связи RS-485. В последовательных линиях связи протокол RS-485 полудуплексный и работает по принципу «клиент-сервер». Каждое устройство в сети (кроме ведущего см. далее) имеет адрес от 1 до 247, адрес 0 используется для широковещательной передачи данных всем устройствам, а адреса 248–255 считаются зарезервированными согласно спецификации Modbus, их использование не рекомендуется.

Существует две спецификации протокола: Modbus RTU и Modbus ASCII. В Modbus RTU передается 11-битный символ, состоящий из 1 стартового бита, 8 бит данных (начиная с младшего бита), бит четности (необязателен) и 2 стоповых бита — если бит четности не передается, или 1 стоповый бит — если бит четности передается. Такой символ передает 1 байт данных. В устройствах Wiren Board по умолчанию бит контроля четности не передается и используется 2 стоповых бита. В Modbus ASCII каждый байт передается двумя символами, представляющими ASCII-коды младшей и старшей четырехбитной группы байта (пример). Modbus RTU передает больше информации при той же скорости последовательной линии, и в устройствах Wiren Board используется именно он. Все дальнейшее описание относится к Modbus RTU.

Ведущее устройство («мастер», или «клиент») периодически опрашивает «ведомое», или «сервер». Ведущее устройство не имеет адреса, передача сообщений от устройства-сервера ведущему без запроса ведущего в протоколе не предусмотрена.

Датаграмма Modbus в общем виде

Пакет данных Modbus выглядит, как это показано на рисунке. PDU (Protocol Data Unit) — общая часть пакета MODBUS, включающая код функции и данные пакета. ADU (Application Data Unit) — полный пакет MODBUS. Включает в себя специфичную для физического уровня часть пакета и PDU. Для последовательных линий в заголовке ADU передается адрес устройства, а в конце — контрольная сумма CRC16. Максимальный размер ADU в последовательных коммуникационных линиях составляет 253 байта (из максимальных, разрешенных спецификацией 256 байт вычитается 1 байт адреса и два байта контрольной суммы). Для справки — в Modbus TCP максимальная длина пакета составляет 260 байт.

Функция кодируется одним байтом и определяет, какое действие должно выполнить устройство-сервер. Значение кодов функций лежат в диапазоне от 1 до 255, причем коды от 128 до 255 зарезервированы для сообщений об ошибках со стороны устройства-сервера. Код 0 не используется. Размер блока данных может варьироваться от нуля до максимально допустимого. Если обработка запроса прошла без ошибок, то устройство-сервер возвращает пакет ADU, содержащий запрошенные данные.

  • Modbus-транзакция, прошедшая без ошибок

  • Modbus-транзакция с ошибками

При возникновении ошибки устройством возвращается код ошибки. При обычной транзакции код функции в ответе возвращается без изменений; при ошибке старший бит кода функции устанавливается в единицу (то есть код функции + 0x80). Так же есть таймаут ожидания ответа от ведомого устройства — бессмысленно долго ждать ответ, который, возможно, никогда и не придет.

Структуры данных Modbus

В Modbus принято кодировать адреса и данные в формате big-endian, то есть в формате, когда байты следуют, начиная со старшего: например, при передаче шестнадцатеричного числа 0x1234 сначала устройством будет принят байт 0x12, а затем — 0x34. Для передачи данных другого типа, например, чисел с плавающей запятой (float), текстовых строк, даты и времени суток и т.п. производитель может выбрать свой собственный способ кодирования — для расшифровки получаемых данных важно ознакомится со спецификацией производителя устройства.

Модель данных Modbus

Обмен данными с Modbus-устройствами происходит через регистры. В протоколе Modbus определяется четыре типа регистров, показанных в таблице:

Таблица Размер Доступ
Регистры флагов (Coils) 1 бит чтение и запись
Дискретные входы (Discrete Inputs) 1 бит только чтение
Регистры хранения (Holding Registers) 16-битное слово чтение и запись
Регистры ввода (Input Registers) 16-битное слово только чтение

Регистры флагов (Coils) хранят однобитные значения — то есть могут находится в состоянии 0 или 1. Такие регистры могут обозначать текущее состояние выхода (включено реле). Название «coil» буквально и означает обмотку-актюатор электромеханического реле. Регистры флагов допускают как чтение, так и запись.

Дискретные входы (Discrete Inputs) также являются однобитными регистрами, описывающими состояние входа устройства (например, подано напряжение — 1). Эти регистры поддерживают только чтение.

Регистры хранения (Holding Registers) и регистры ввода (Input Registers) представлены двухбайтовым словом и могут хранить значения от 0 до 65535 (0x0000 — 0xFFFF).
Регистры ввода допускают только чтение (например, текущее значение температуры). Регистры хранения поддерживают как чтение, так и запись (для хранения настроек). В настоящее время во многих устройствах, в частности в устройствах Wiren Board, эти регистры не разделяются. Команды на чтение регистра хранения N и регистра ввода N обратятся к одному и тому же значению в адресном пространстве устройства.

Адреса регистров

Регистры в стандарте Modbus адресуются с помощью 16-битных адресов. Адресация начинается с нуля. Адрес регистра, таким образом, может принимать значения от 0 до 65535.

Адресные пространства регистров, также называемые таблицами иди блоками, могут быть различны для всех четырёх типов регистров. Это значит, что значения регистров с одинаковым адресом, но разным типом, в общем случае разные.

Например, при чтении регистра флагов (coil) номер 42, регистра дискретного входа (Discrete), регистров ввода и хранения (Input и Holding) с теми же адресами, можно получить четыре разных значения.

Нестандартная адресация

В документации на некоторые, особенно старые, устройства адреса элементов (регистров) указываются в формате, не соответствующем стандарту. В этом формате тип элемента кодируется первой цифрой адреса, а адресация начинается не с нуля.

Например, регистр хранения с адресом 0 может записываться как 40001 или 400001, а Coil с адресом 0 как 000001.

В таблице перевода адресов в стандартный формат показаны диапазоны для двух разных нестандартных типов указания адресов и соответствующие им типы данных и диапазоны стандартных адресов.

Тип данных Стандартные адреса Стандартные адреса (hex) Нестандартные адреса (5 цифр) Нестандартные адреса (6 цифр)
Флагов (Coils) 0-65535 0x0000 — 0xFFFF 00001 — 09999 000001 — 065536
Дискретных входов (Discrete) 0-65535 0x0000 — 0xFFFF 10001 — 19999 100001 — 165536
Регистры входов (Input Registers) 0-65535 0x0000 — 0xFFFF 30001 — 39999 300001 — 365536
Регистры хранения (Holding Registers) 0-65535 0x0000 — 0xFFFF 40001 — 49999 400001 — 465536

Признаки использования нестандартной адресации:

  • Адреса записываются в десятичном формате
  • Во всех адресах пять или шесть цифр
  • Адреса с недискретными данными (показания датчиков и т.п.) начинаются на 30 или 40

Часто рядом с нестандартными адресами указываются и адреса соответствующие стандарту, обычно в шестнадцатеричном формате.
Стоит отметить, что физически в пакете данных передаются адреса в стандартном формате, независимо от способа представления их в документации.

Пример описания регистров в документации

В готовых шаблонах устройств для контроллера Wiren Board есть шаблон для однофазного счетчика электроэнергии SDM220 (/usr/share/wb-mqtt-serial/templates/config-sdm220.json). В документации от производителя «Eastron SDM
220 Modbus Smart Meter Modbus Protocol Implementation V1.0» перечислены регистры и соответствующие им измеряемые параметры, например:

Address (Register) Description Units Modbus Protocol Start Address Hex (Hi Byte Lo Byte)
30001 Line to neutral volts. Volts 00 00
30007 Current. Amps. 00 06
30013 Active power Whatts 00 0C
30019 Apparent power VoltAmps 00 12
… …

Производитель в таблице приводит и логические, и физические адреса регистров, что позволяет нам с легкостью создать шаблон устройства и проиллюстрировать связь между логическими и физическими адресами Modbus-регистров.

Фрагмент шаблона счетчика SDM220

Коды функций чтения и записи регистров

В следующей таблице приведены наиболее распространенные коды функций Modbus:

Код функции HEX Название Действие
1 0x01 Read Coils Чтение значений нескольких регистров флагов
2 0x02 Read Discrete Inputs Чтение значений нескольких дискретных входов
3 0x03 Read Holding Registers Чтение значений нескольких регистров хранения
4 0x04 Read Input Registers Чтение значений нескольких регистров ввода
5 0x05 Write Single Coil Запись одного регистра флагов
6 0x06 Write Single Register Запись одного регистра хранения
15 0x0F Write Multiple Coils Запись нескольких регистров флагов
16 0x10 Write Multiple Register Запись нескольких регистров хранения

Команды условно можно разделить по типам: чтение значений — запись значений; операция с одним значением — операция с несколькими значениями.

Формат данных запросов и ответов Modbus

Рассмотрим подробнее, как происходит обмен данными между устройством-клиентом, отправляющим запрос, и устройством-сервером, отвечающим ему.
На следующем рисунке показан обмен данными контроллера с устройством с адресом 0x01. Мы хотим прочесть 8 coil-регистров, начиная с первого.

В качестве данных мы получили шестнадцатеричное число 0x2D, то есть состояние восьми coil-регистров в двоичном виде такое: 0b10110100.


В следующей таблице приведены структуры данных запросов и ответов для основных функций Modbus.

Код функции Запрос Ответ
1 (Read Coils) и 2 (Read Discrete Inputs)
  • Адрес первого регистра флагов или входного регистра (16 бит)
  • Количество данных (8 значений на байт) (16 бит)
    • Число передаваемых байт (8 бит)
    • Значения регистров флагов или входных регистров (8 значений на байт)
    3 (Read Holding Registers) и 4 (Read Input Registers)
    • Адрес первого регистра (16 бит)
    • Количество регистров, которые нужно прочесть
      • Число передаваемых байт (8 бит)
      • Значения регистров (16 бит на 1 регистр)
      5 (Write Single Coil)
      • Адрес регистра (16 бит)
      • Значение, которое нужно записать (0 — выключить, 0xFF00 — включить)
        Ответ аналогичен запросу
        6 (WriteSingle Register)
        • Адрес регистра(16 бит)
        • Новое значение регистра (16 бит)
        Ответ аналогичен запросу
        15 (WriteMultipleCoils)
        • Адрес первого регистра флагов для записи (16 бит)
        • Количество регистров флагов для записи (16 бит)
        • Количество передаваемых байт данных для регистров флагов (8 бит)
        • Данные (8 регистров флагов на байт)
        • Адрес первого coil-регистра (16 бит)
        • Количество записанных coil-регистров(16 бит)
        16 (Write Multiple register )
        • Адрес первого регистра хранения для записи (16 бит)
        • Количество регистров хранения для записи (16 бит)
        • Количество передаваемых байт данных для регистров (8 бит)
        • Данные (16 байт на регистр)
        • Адрес первого регистра хранения (16 бит)
        • Количество записанных регистров хранения(16 бит)

        Коды исключений (ошибки) Modbus

        Если запрос не может по той или иной причине быть обработан устройством-сервером, то в ответ он отправляет сообщение об ошибке. Соообщение об ошибке содержит адрес Modbus-устройства, код функции, при выполнении которой произошла ошибка, увеличенный на 0x80, код ошибки и контрольную сумму:

        Транзакция завершилась с ошибкой

        В этом случае мы попытались обратиться к несуществующему адресу регистра 0xFFFF и попытались прочесть 8 регистров флагов. В результате мы получили код ошибки 0x03 — «В поле данных передано неверное значение».

        Наиболее распространенные коды ошибок Modbus приведены в следующей таблице:

        Код ошибки Название ошибки Что означает
        1 Illegal Function В запросе был передан недопустимый код функции
        2 Illegal Data Address Указанный в запросе адрес не существует
        3 Illegal Data Value Неверный формат запроса, например количество байт в запросе не соответствует ожидаемому.

        Примечание: несмотря на название, эта ошибка не говорит о том, что само значение регистра неправильное или ошибочное, и должна использоваться только для ошибок формата запроса.

        4 Server Device Failure Произошла невосстановимая ошибка на устройстве при выполнении запрошенной операции
        5 Acknowledge Запрос принят, выполняется, но выполнение потребует много времени; необходимо увеличить таймаут.
        6 Server Device Busy Устройство занято обработкой предыдущего запроса.
        7 Negative Acknowledge Устройство не может выполнить запрос, необходимо получить от устройства дополнительную диагностическую информацию. Возможно, требуется тех. обслуживание.
        8 Memory Parity Error Ошибка четности при обращении к внутренней памяти устройства.

        Вычисление контрольной суммы Modbus

        Для протокола Modbus RTU 16-битная контрольная сумма (CRC) вычисляется по алгоритму, описанному в спецификации Modbus, в документе «Modbus Serial Line Protocol and Implementation Guide», раздел «CRC-generation». Передающее устройство формирует два байта контрольной суммы на основе данных сообщения, а принимающее устройство заново вычисляет контрольную сумму и сравнивает с полученной. Совпадение принятой и вычисленной контрольной суммы Modbus RTU считается индикатором успешного обмена данными.

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

        Расширение протокола Modbus от Wiren Board

        Мы производим устройства, которые работают по стандартному протоколу Modbus RTU. Но протокол очень старый и имеет ряд недостатков, которые мы решили устранить с помощью своего расширения протокола.

        Всё описываемое ниже справедливо только для Modbus-устройств Wiren Board.

        Торговое название расширения протокола «Быстрый Modbus».

        Настраиваемое время задержки ответа устройством

        Устройства работают по стандарту, поэтому отвечают master-устройству через 3.5 символа после конца кадра запроса.

        Но некоторые сторонние master-устройства могут не соблюдать стандарт и после отправки запроса продолжают удерживать приемопередатчик в режиме отправки некоторое время.

        В устройствах есть специальный регистр 113, в котором можно настроить время ответа slave-устройства в миллисекундах. Нужное значение подбирается опытным путём.

        Стопбиты

        Устройства всегда ожидают от мастера 1 стопбит, а отправляют ответ с 2.

        Благодаря этому невозможно неправильно настроить стопбиты в master- и в slave-устройстве. Передача ответов более надежная даже, если мастер ожидает 1 стопбит. В последних прошивках настройка стопбита в регистре 112 игнорируется.

        Режим сплошного чтения регистров

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

        Мы добавили режим сплошного чтения, который активируется записью 1 в регистр 114. При активации можно запрашивать любой регион, который укладывается по длине в ограничения команды чтения.

        При таком запросе устройство вернёт пакет со значением регистров. Если регистры отсутствуют в устройстве, то для них будет возвращено значение 0xFFFE.

        Сканирование устройств на шине

        Обычно инсталляция содержит несколько slave-устройств в щите или в поле на одной шине RS-485. Каждое устройство имеет адрес, который пользователь может менять. Обычно при монтаже адреса slave-устройств переписываются с корпуса устройства и вносятся вручную в конфигурацию мастера. Это не очень удобно.

        Раньше для сканирования шины использовался специальный скрипт, который перебирал все возможные адреса на шине и ждал от них ответа в течение определённого времени. Процесс занимал несколько минут и зависел от настроек связи устройств: скорости, стоповых битов и т.п.

        В расширении протокола мы добавили возможность быстро сканировать шину без необходимости выжидать таймаут для каждого несуществующего адреса. Более того, при сканировании могут быть обнаружены устройства с одинаковыми адресами, которым можно задать новые адреса не отключая устройства от шины! Также функция сканирования способна обнаружить на одной шине устройства с разными настройками связи.

        Теперь можно собрать щит не обращая внимания на modbus-адреса устройств. В процессе сканирования будут прочитаны модели устройств, настройки связи, их серийные номера и адреса на шине. Притом, вы можете изменить адреса подключённых устройств, обращаясь к устройству по уникальному серийному номеру.

        Описание расширенных команд и референсная реализация утилиты сканирования доступны в репозитории.

        Поддержка быстрого Modbus в прошивках

        Устройство Версия прошивки с поддержкой «быстрого Modbus»
        WB-MRx, WB-MWAC 1.19.0
        WB-MDM3 2.6.0
        WB-LED, WB-MRGBW-D 3.2.0
        WB-MSx, WB-MSWx, WB-MIR, WB-M1W2 4.23.0
        WB-MAI11 не поддерживается
        WB-MAI6 2.0.0
        WB-MAO4 2.2.0
        WB-MAPx 2.4.0
        WB-MIO 1.6.0
        WB-REF-U 1.4.0
        WB-REF-DF 1.1.0

        Во время обмена
        данными могут возникать ошибки двух
        типов:

        • ошибки, связанные
          с искажениями при передаче данных;

        • логические ошибки.

        Ошибки первого
        типа обнаруживаются при помощи фреймов
        символов, контроля чётности и циклической
        контрольной суммы CRC-16-IBM
        (используется число-полином
        = 0xA001).

        Rtu фрейм

        В RTU режиме сообщение
        должно начинаться и заканчиваться
        интервалом тишины — временем передачи
        не менее 3.5 символов при данной скорости
        в сети. Первым полем затем передаётся
        адрес устройства.

        Вслед за последним
        передаваемым символом также следует
        интервал тишины продолжительностью не
        менее 3.5 символов. Новое сообщение может
        начинаться после этого интервала.

        Фрейм сообщения
        передаётся непрерывно. Если интервал
        тишины продолжительностью 1.5 возник во
        время передачи фрейма, принимающее
        устройство должно игнорировать этот
        фрейм как неполный.

        Таким образом,
        новое сообщение должно начинаться не
        раньше 3.5 интервала, т.к. в этом случае
        устанавливается ошибка.

        Немного об интервалах
        (речь идёт о Serial Modbus RTU): при скорости
        9600 и 11 битах в кадре (стартовый бит + 8
        бит данных + бит контроля чётности +
        стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), т.е. более
        4 мс; 1.5 * 11 / 9600 = 0,00171875, т.е. не более 1 мс.
        Для скоростей более 19200 бод допускается
        использовать интервалы 1,75 и 0,75 мс
        соотвественно.

        Логические ошибки

        Для сообщений об
        ошибках второго типа протокол Modbus RTU
        предусматривает, что устройства могут
        отсылать ответы, свидетельствующие об
        ошибочной ситуации. Признаком того, что
        ответ содержит сообщение об ошибке,
        является установленный старший бит
        кода команды. Пример кадра при выявлении
        ошибки ведомым устройством, в ответ на
        запрос приведён в (Таблица 2-1).

        1. Если Slave принимает
        корректный запрос и может его нормально
        обработать, то возвращает нормальный
        ответ.

        2. Если Slave не
        принимает какого либо значения, никакого
        ответа не отправляется. Master диагностирует
        ошибку по таймауту.

        3. Если Slave принимает
        запрос, но обнаруживает ошибку (parity,
        LRC, or CRC), никакого ответа не отправляется.
        Master диагностирует ошибку по таймауту.

        4. Если Slave принимает
        запрос, но не может его обработать
        (обращение к несуществующему регистру
        и т.д.), отправляется ответ содержащий
        в себе данные об ошибке.

        Направление
        передачи

        адрес
        подчинённого устройства

        номер
        функции

        данные
        (или код ошибки)

        CRC

        Запрос
        (Master→Slave)

        0x01

        0x77

        0xDD

        0xC7
        0xA9

        Ответ
        (Slave→Master)

        0x01

        0xF7

        0xEE

        0xE6
        0x7C

        Таблица
        2-1. Кадр ответа (Slave→Master) при возникновении
        ошибки modbus RTU

        Стандартные коды ошибок

        01
        Принятый код функции не может быть
        обработан на подчиненном.

        02
        Адрес данных указанный в запросе не
        доступен данному подчиненному.

        03
        Величина содержащаяся в поле данных
        запроса является не допустимой

        величиной
        для подчиненного.

        04
        Невосстанавливаемая ошибка имела место
        пока подчиненный пытался выполнить

        затребованное
        действие.

        05
        Подчиненный принял запрос и обрабатывает
        его, но это требует много времени.

        Этот
        ответ предохраняет главного от генерации
        ошибки таймаута.

        06
        Подчиненный занят обработкой команды.

        Главный
        должен повторить сообщение позже, когда
        подчиненный освободится.

        07
        Подчиненный не может выполнить программную
        функцию, принятую в запросе.

        Этот
        код возвращается для неудачного
        программного запроса, использующего

        функции
        с номерами 13 или 14.

        Главный
        должен запросить диагностическую
        информацию или информацию об

        ошибках
        с подчиненного.

        08
        Подчиненный пытается читать расширенную
        память, но обнаружил ошибку паритета.

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

        Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #

        Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. Разработан фирмой Modicon для использования в контроллерах с программируемой логикой (PLC). Стал стандартом де-факто в промышленности и широко применяется для организации связи промышленного электронного оборудования. Использует для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP. В настоящее время поддерживается некоммерческой организацией Modbus-IDA.

        Общее описание протокола Modbus RTU[править | править код]

        Протокол Modbus описывает единый простой формат передачи данных PDU, который в свою очередь входит в полный пакет ADU. Формат ADU меняется в зависимости от типа линии связи. Существуют три режима протокола: Modbus RTU, Modbus ASCII, Modbus TCP. Первые два используют последовательные линии связи (в основном RS-485, реже RS-422/RS-232), последний использует для передачи данных по сетям TCP/IP.

        Протокол Modbus RTU предполагает одно ведущее (запрашивающее) устройство в линии (master), которое может передавать команды одному или нескольким ведомым устройствам (slave), обращаясь к ним по уникальному в линии адресу. Синтаксис команд протокола позволяет адресовать 247 устройств на одной линии связи стандарта RS-485 (реже RS-422 или RS-232).

        Инициатива проведения обмена всегда исходит от ведущего устройства. Ведомые устройства прослушивают линию связи. Мастер подаёт запрос (посылка, последовательность байт) в линию и переходит в состояние прослушивания линии связи. Ведомое устройство отвечает на запрос, пришедший в его адрес.
        Окончание ответной посылки мастер определяет, по временному интервалу между окончанием приёма предыдущего байта и началом приёма следующего. Если этот интервал превысил время, необходимое для приёма двух байт на заданной скорости передачи, приём кадра ответа считается завершённым.
        Кадры запроса и ответа по протоколу modbus имеют фиксированный формат, приведённый в (Таблица 1-1).

        Таблица 1-1. Кадр посылки Modbus RTU

        адрес ведомого устройства номер функции данные CRC

        1 байт

        1 байт

        N < 253 (байт) 2 байта

        где:

        • адрес ведомого устройства — первое однобайтное поле кадра. Оно содержит адрес подчинённого устройства, к которому адресован запрос. Ведомые устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего ведомого устройства, который может изменяться от 1 до 254. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство;
        • номер функции — это следующее однобайтное поле кадра. Оно говорит ведомому устройству, какие данные или выполнение какого действия требует от него ведущее устройство;
        • данные — поле содержит информацию, необходимую ведомому устройству для выполнения заданной мастером функции или содержит данные, передаваемые ведомым устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции;
        • CRC — (контрольная сумма) заключительное двухбайтное поле кадра. Контрольная сумма завершает кадры запроса и ответа и применяется для проверки отсутствия ошибок в кадре посылки Modbus RTU.

        Следует отметить, что поле CRC записывается младшим байтом вперёд. Алгоритм расчёта CRC может отличаться для разных устройств.

        Адресация данных в протоколе Modbus RTU[править | править код]

        Все операции с данными привязаны к нулю, каждый вид данных (регистр, выходное/входное значение) начинаются с адреса 0000.
        Адресация к ячейке начинается с 1.

        Например:
        Флаг номер 1 программируемого контроллера имеет адрес 0000 (указывается в поле «Адрес»).

        Флаг номер 127 (DEC) имеет адрес 0x007E hex (126 dec) (указывается в поле «Адрес»).

        Запоминающий регистр 40001 будет иметь адрес 0000 в поле «Адрес» команды. Потому что код операции уже содержит в себе необходимую информацию об адресе. Операции с этими регистрами имеют смещение Адрес_регистра — 40000 = Значение Используемое В Поле «Адрес». Тип адресации команд в дальнейшем будем помечать т.о.

        смещение обозначение
        -40000 4x
        -10000 1x

        Запоминающий регистр 40108 будет иметь адрес 006B hex (107 dec)

        Контроль ошибок в протоколе Modbus RTU[править | править код]

        Во время обмена данными могут возникать ошибки двух типов:

        • ошибки, связанные с искажениями при передаче данных;
        • логические ошибки.

        Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).

        RTU фрейм[править | править код]

        В RTU режиме сообщение начинается с интервала тишины равного времени передачи 3.5 символов при данной скорости передачи в сети. Первым полем затем передается адрес устройства.

        Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.

        Фрейм сообщения передается непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство заканчивает прием сообщения и следующий байт будет воспринят как начало следующего сообщения.

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

        Логические ошибки[править | править код]

        Для сообщений об ошибках второго типа протокол Modbus RTU предусматривает, что устройства могут отсылать ответы, свидетельствующие об ошибочной ситуации. Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит кода команды. Пример кадра при выявлении ошибки ведомым устройством, в ответ на запрос приведён в (Таблица 2-1).

        1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.

        2. Если Slave не принимает какого либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.

        3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.

        4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т.д.), отправляется ответ содержащий в себе данные об ошибке.

        Таблица 2-1. Кадр ответа (Slave→Master) при возникновении ошибки modbus RTU

        Направление передачи адрес подчинённого устройства номер функции данные (или код ошибки) CRC

        Запрос (Master→Slave)

        0x01

        0x77

        0xDD

        0xC7 0xA9

        Ответ (Slave→Master)

        0x01

        0xF7

        0xEE

        0xE6 0x7C

        Стандартные коды ошибок[править | править код]

        01 Принятый код функции не может быть обработан на подчиненном.
        02 Адрес данных указанный в запросе не доступен данному подчиненному. 
        03 Величина содержащаяся в поле данных запроса является не допустимой 
           величиной для подчиненного. 
        04 Невосстанавливаемая ошибка имела место пока подчиненный пытался выполнить
           затребованное действие. 
        05 Подчиненный принял запрос и обрабатывает его, но это требует много времени. 
           Этот ответ предохраняет главного от генерации ошибки таймаута.
        06 Подчиненный занят обработкой команды. 
           Главный должен повторить сообщение позже, когда подчиненный освободится. 
        07 Подчиненный не может выполнить программную функцию, принятую в запросе. 
           Этот код возвращается для неудачного программного запроса, использующего
           функции с номерами 13 или 14.
           Главный должен запросить диагностическую информацию или информацию об 
           ошибках с подчиненного. 
        08 Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. 
           Главный может повторить запрос, но обычно в таких случаях требуется ремонт.
        

        Стандартные коды функций протокола Modbus[править | править код]

        В протокол Modbus можно выделить несколько подмножеств команд ( Таблица 3-1).

        Таблица 3-1

        Подмножество команд Диапазон кодов команд

        Стандартные команды

        1-21

        Резерв для расширенных функций

        22-64

        Пользовательские

        65-119

        Резерв для внутренних нужд

        120-255

        0x10 Preset Multiple Registers (Установка значений в несколько регистров)[править | править код]

        Тип адресации 4x

        Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле «Данные»).
        Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):

        Таблица 3-2. Пример установки значения в один регистр

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. регистров ст. байт 05 Кол. регистров мл. байт 06 Кол. байт 07 Данные ст. байт 08 Данные мл. байт 09 CRC мл. байт 10 CRC ст. байт

        Master→Slave

        0x01

        0x10

        0x00

        0x01

        0x00

        0x01

        0x02

        0xFF

        0xFF

        0xA6

        0x31

        Таблица 3-3.Ответ на команду установки значения в один регистр

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. регистров ст. байт 05 Кол. регистров мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Slave→Master

        0x01

        0x10

        0x00

        0x01

        0x00

        0x01

        0x50

        0x09

        0x03 Read Holding Registers (Чтение значений из нескольких регистров)[править | править код]

        Тип адресации 4x

        Ниже приведены примеры команда ведущего устройства (таблица 3-4) и ответ ведомого (таблица 3-5):

        Таблица 3-4. Пример чтения значения из одного регистра

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. регистров ст. байт 05 Кол. регистров мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Master→Slave

        0x01

        0x03

        0x00

        0x01

        0x00

        0x01

        0xD5

        0xCA

        Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле «Данные»).

        Таблица 3-5. Ответ на команду чтения значения из одного регистра

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Кол. Байт 03 Данные ст. байт 04 Данные мл. байт 05 CRC мл. байт 06 CRC ст. байт

        Slave→Master

        0x01

        0x03

        0x02

        0xFF

        0xFF

        0xB9

        0xF4

        0x06 Preset Single Register (Установка значения в один регистр)[править | править код]

        Тип адресации 4x

        Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):

        Таблица 3-6. Пример установки значения в один регистр

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Данные ст. байт 05 Данные мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Master→Slave

        0x01

        0x06

        0x00

        0x01

        0xFF

        0xFF

        0xD9

        0xBA

        Таблица 3-7. Ответ на команду установки значения в один регистр

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Данные ст. байт 05 Данные мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Slave→Master

        0x01

        0x06

        0x00

        0x01

        0xFF

        0xFF

        0xD9

        0xBA

        0x01 Read Coil Status (Чтение значений из нескольких регистров флагов)[править | править код]

        Тип адресации 0x

        Запрос:

        Состоит из адреса флага и количества считываемых флагов. Адресация флагов начинается с 0, количество флагов с 1.

        Ответ:

        Значение флагов передается в одном бите в поле «Данные». Трактовка флагов: 1 = ON; 0 = OFF. 0-й бит первого байта данных содержит значение флага указанного в поле «Адрес». Если запросить состояние одного флага, то в младшем бите будет возвращено значение флага, а все остальные старшие биты заполнены нулями.

        Ниже приведены примеры запроса ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7). В примере запрашивается состояние 9 флагов с адреса 1. В ответе содержится 2 байта данных, для большей ясности будем считать что все запрашиваемые флаги находятся в состоянии ON, а все остальные в состоянии OFF.

        Таблица 3-8. Пример чтения значения из одного регистра флагов

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Кол. флагов ст. байт 05 Кол. флагов мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Master→Slave

        0x01

        0x01

        0x00

        0x01

        0x00

        0x09

        0x

        0x

        Таблица 3-9. Пример ответа на запрос чтения значения из одного регистра флагов

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Количество байт 03 Данные (флаги 0-7) 04 Данные (флаги 8-15) 05 CRC мл. байт 06 CRC ст. байт

        Slave→Master

        0x01

        0x01

        0x02

        0xFF

        0x01

        0x

        0x

        0x0F Force Multiple Coils (Запись значений в несколько регистров флагов)[править | править код]

        Тип адресации 0x

        Команда:

        Состоит из адреса флага, количества изменяемых флагов, количества передаваемых байт устанавливаемых значений. Адресация флагов начинается с 0, количество флагов с 1. Устанавливаемые значения передаются начиная с байта, в котором находится младшим битом значение, устанавливаемое по адресу указываемому в поле «00 адрес подчиненного устройства».

        Ответ:

        Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.

        Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).

        Таблица 3-7. Пример команды записи значения в один из регистр флагов

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 06 Количество байт данных 07 Данные (значения для флагов биты 0-7) 08 Данные (значения для флагов биты 8-15) 09 CRC мл. байт 0A CRC ст. байт

        Master→Slave

        0x01

        0x0F

        0x00

        0x13

        0x00

        0x0A

        0x02

        0xCD

        0x01

        0x72

        0xCB

        Таблица 3-7. Пример команды записи значения в один из регистр флагов

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 05 CRC мл. байт 06 CRC ст. байт

        Slave→Master

        0x01

        0x0F

        0x00

        0x13

        0x00

        0x0A

        0x24

        0x09

        0x05 Force Single Coil (Запись значения в один флаг регистра флагов)[править | править код]

        Команда:

        Состоит из адреса флага и устанавливаемого значения. Поле «Значение флага мл. байт» всегда равно нулю (0x00), поле «Значение флага ст. байт» принимает значения 0xFF если флаг устанавливается в «1»(ON) или 0x00 если флаг устанавливается в «0»(OFF), другие значения недопустимы и не влияют на значение флага. Адресация флагов начинается с 0.

        Ответ:

        Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.

        Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).

        Таблица 4-4. Пример: команда установки значения в один флаг

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Значение флага ст. байт 05 Значение флага мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Master→Slave

        0x01

        0x05

        0x00

        0x13

        0xFF

        0x00

        0x7D

        0xFF

        Таблица 4-4. Пример: Ответ на команду установки значения в один флаг

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Значение флага ст. байт 05 Значение флага мл. байт 06 CRC мл. байт 07 CRC ст. байт

        Slave→Master

        0x01

        0x05

        0x00

        0x13

        0xFF

        0x00

        0x7D

        0xFF

        0x50 Set date and time (Установка даты и времени)[править | править код]

        Ниже приведены примеры команда ведущего устройства (таблица 5-4) и ответ ведомого (таблица 5-5):

        Таблица 5-4. Пример установки даты и времени

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Час [0..23] 03 Минута [0..59] 04 Секунды [0..59] 05 День [1..31] 06 Месяц [1..12] 07 Год [0..99] 08 Столетие [19-20] 09 CRC мл. байт 10 CRC ст. байт

        Master→Slave

        0x01

        0x50

        0x0A

        0x01

        0x00

        0x01

        0x0A

        0x02

        0x14

        0x89

        0x1C

        Таблица 5-5. Ответ на команду установки даты и времени

        Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Час [0..23] 03 Минута [0..59] 04 Секунды [0..59] 05 День [1..31] 06 Месяц [1..12] 07 Год [0..99] 08 Столетие [19-20] 09 CRC мл. байт 10 CRC ст. байт

        Slave→Master

        0x01

        0x50

        0x0A

        0x01

        0x00

        0x01

        0x0A

        0x02

        0x14

        0x89

        0x1C

        Ссылки на используемые в статье источники[править | править код]

        • Modbus-IDA некоммерческая организация, которая поддерживает данный протокол
        • Оригинальные спецификации протокола на английском языке
        • Введение в Modbus протокол
        • Описание стандартного описания протокола ModBus на английском языке
        • Реализация протокола Modicon Modbus RTU (Комплекс программ «ЗОНД»)
        • Linux C Programming Examples
        • Как Modbus работает
        • Программа испытания Modbus Simply Modbus
        • Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc.
        • FreeModbus ASCII/RTU и tcp для microcontrollers
        • Бесплатное программа для теста устройств Modbus RTU
        • форум по настройки Modbus

        Тема: Связь  (Прочитано 2445 раз)

         Выскакивают жёлтые восклицательные знаки через каждые 3 мин.  пропадает связь между Modbus uneversal server и Simple-Scada 2. В чём проблема? С Simple-Scada 1.3.3 такого не было.

        « Изменён: 26 Июля 2017, 15:25:54 от Simple_Scada »


        Здравствуйте. В журнале сервера скады выводятся какие-то сообщения связанные с OPC сервером?


        Здравствуйте, в сообщения Master OPC Modbus server на 500 тег, ошибка включения команды 3 в устройстве, и включен тайм-аут ошибки запроса 1. Вот такие сообщения, в строке качество BAD через две три минуты  связь восстанавливается что делаю нет так.


        Здравствуйте, в сообщения Master OPC Modbus server на 500 тег, ошибка включения команды 3 в устройстве, и включен тайм-аут ошибки запроса 1. Вот такие сообщения, в строке качество BAD через две три минуты  связь восстанавливается что делаю нет так.

        Simple-Scada получает качество тегов и их значения от OPC-сервера. Как Вы описали на OPC-сервере качество у тегов BAD. Именно поэтому в скаде отображаются восклицательные знаки. Нужно искать причину в связи OPC-сервера и контроллера. Возможно нужно как-то изменить конфигурацию OPC-сервера.

        С Simple-Scada 1.3.3 такого не было.

        Вы можете отключить контроль качества через Options.exe в разделе «Simple-Client —> Контроль качества». Тогда восклицательные знаки не будут отображаться при проблемах связи. Но мы бы рекомендовали не выключать контроль качества, а найти и устранить причину обрывов связи.


        Контроль качества отключил, но знаки остались, чуть реже но появляются, к Modbus OPC server подключены шесть приборов Овен УКТ 38 по температуре, вроде настройки в Modbus правильные, хотя контроллеры Simens работают  нормально  без потери связи.


        Контроль качества отключил, но знаки остались, чуть реже но появляются

        Странно, они не должны появляться с отключенной опцией. Может быть Вы отключили данную опцию на серверном компьютере, а на клиентском она включена?

        хотя контроллеры Simens работают  нормально  без потери связи.

        Здесь причина скорее всего не в контроллерах, а в связи между OPC-сервером и контроллерами.


        Кстати, все хотел спросить, но постоянно забываю. Одной из вирт. машин выделено 4 ядра. Лектус иногда загоняется до 25% (забивает поток), при этом сервер 2230 начинает потреблять 0.1% и «подвисает», пока не снимешь задачу лектуса. Может ли быть такое, что лектус запущенный сервером скады висит в том-же потоке (или что там у вас с виртуализацией) и они просто не могут более 1 ядра на двоих пользовать?


        Может ли быть такое, что лектус запущенный сервером скады висит в том-же потоке (или что там у вас с виртуализацией) и они просто не могут более 1 ядра на двоих пользовать?

        Да, такое может быть. Операционная система при необходимости распределяет потоки приложений по ядрам. Simple-Scada 2 выполняет в отдельных потоках архивацию и работу с БД, работу с OPC-серверами, работу с системой отчетов, отправку sms/e-mail сообщений и т.п. задачи. В случае загрузки основного ядра ОС может передать эти потоки на обработку другим ядрам. Но основной поток сервера, как и любого другого приложения будет на 1 ядре и могут возникнуть проблемы если он полностью загружен.


        Понравилась статья? Поделить с друзьями:
      • Mmc exe ошибка при запуске приложения 0xc0000428
      • Modbus tcp коды ошибок
      • Mlsd total commander ошибка
      • Mlp все время закрывается ошибка на телефоне samsung
      • Ml 2240 индикация ошибок