Свежие обсуждения
Микроконтроллеры

Необходима реализация MODBUS-протокола на МК

1 2

Прошу подсказать интернет-ресурсы с информацией на эту тему. Знает ли кто-нибудь, есть ли МК, поддерживающие этот протокол, или как его программировать в обычный МК?

 

www.fractal.com.ru
Вроде у них всё реализовано на Пиках и открыто всё ПО

 

Heckfy: Прошу подсказать интернет-ресурсы с информацией на эту тему. Знает ли кто-нибудь, есть ли МК, поддерживающие этот протокол, или как его программировать в обычный МК?

В MODBUS есть 2 режима : ASCII mode и RTU mode - первый для сообщений в текстовом виде, второй - бинарных. Первый обладает большой избыточностью, но зато не чувствителен к временн`ым разрывам пакетов данных, второй быстрее, но работает по тайм-аутам, и если в передающем/приемном устройстве возможны временн`ые разрывы передаваемых/принимаемых пакетов, могут быть грабли. Все это если не брать во внимание мультимастерный MODBUS+ .
Легко реализуется программно на любом достаточно мощном и быстром МК. Для начала нужно определиться с набором команд, форматом передаваемых данных. И если в этом будет ясность, реализация не составит труда. А мое личное мнение - протокол не самый удачный, и мы его реализовывали всегда слегка "модифицированным", и он был уж не совсем MODBUS, а намного лучше.

 

Не вникал, но по теме.
http://freemodbus.berlios.de/index.php

129373.rar

 

продолжение

129374.rar

 

вот описание основы основ ModBus в переводе

129470.rar

 

а это по всей видимости оригинал

129471.zip

 

Я ориентируюсь на AVRы, у большинства из них есть поддержка USART-протокола и количество различных бит в пакете можно менять. Можно ли задействовать его? Мне необходимо только передавать дискретные (1 бит) и 16-битные значения в SCADA Trase Mode и обратно. Опыт был с ПЛК Momentum - обмен происходил без драйверов по MODBUS TCP IP - необходимо только было правильно указать адреса переменных, и все шло, только передачу переменных float из Trase Mode в контроллер так и не удалось получить. Здесь же не знаю с чего начать. Кстати, уважаемый Bul_d_Ozer, можно ли пример кода (желательно на С)? И достаточно ли будет 16МГц на МК?

 

Как я понял, каждый байт оформляется посылкой (к примеру):
Старт 0 1 2 3 4 5 6 7 Стоп Стоп
Отправляем такой фрейм:
Тишина Адрес(8бит) Функция(8бит) Данные(n бит) CRC(16бит) Тишина
Вопрос: если n>8, будут ли данные разделены по пакетам, или пойдут единым пакетом?
То же самое CRC: он будет в двух пакетах, или в одном?
USART протокол в AVRах поддерживает максимум 9 бит между старт- и стоп-битами, так что CRC единым пакетом передать не удасться…

 

Heckfy: Тишина Адрес(8бит) Функция(8бит) Данные(n бит) CRC(16бит) Тишина
Вопрос: если n>8, будут ли данные разделены по пакетам, или пойдут единым пакетом?
То же самое CRC: он будет в двух пакетах, или в одном?
USART протокол в AVRах поддерживает максимум 9 бит между старт- и стоп-битами, так что CRC единым пакетом передать не удасться…

И данные, и адрес, и команда, и CRC передаются побайтно. Последовательность байт от одной "тишины" ( некоторые называют это паузой) до другой и есть пакет, внутри которого, естественно, маленькие "паузочки" ( стоп-биты ), отделяющие один байт от другого и дающие возможность схемам USARTа на передающей и приемной стороне синхронизироваться.
Все это относится к RTU mode, в ASCII mode начало пакета определяется специальным кодом, и к паузам в передаче режим некритичен. И здесь прием-передача побайтно. А передача длинными n-битными посылками в асинхронном режиме - это для любителей геморроя на свою голову. Во всяком случае, imho, к MODBUS это отношения не имеет.