»»

Практическая работа с ModBus

2015-10-05 в 23:13

Привет всем!

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

Начнём с того, что я покажу и назову необходимые железки кроме стандартного набора ардуинщика. В первую очередь, для работы, нам нужно создать шину RS485 и подключиться к ней. В роли шины RS485 обычно используют витую пару для большей помехоустойчивости, но в примере шина 0.5 м и скорость используем 9600, так что нам побоку как помехи так и терминаторы=).

В общем, шиной у нас будут стандартные соединительные провода для макетки. Для подключения ПК к шине - USB-RS485 переходничёк (на фото в разобранном виде внизу). Ардуинки же подключаем при помощи модулей, они вторые сверху. Или используя ADM485, или аналог. Все подобные схемы имеют 8 контактов, 4 из которых к ардуинке (к трём контактам), 2 к питанию и 2(A,B) - шина.

Дальше на фото мы видим как проста схема подключения ADM485 к ардуинке.

adm485 arduino

Следующее фото - Добавляем светодиод, которым будем баловаться.

Втыкаем A и B.

Цепляем отдельное питание для модуля - Конечное устройство готово.

rs485 arduino

Теперь нам нужно скачать и установить qModbus Master лежит здесь.

Выставляем правильный порт, и скорость 9600.
Дальше выставляем Slave ID в двойку - это номер ведомого. Он указывается в исходниках.
Глянем в код, что нам нужно слать чтобы зажечь светодиод?

Код
void io_poll() { //первый бит первого регистра на ногу ledPin.
digitalWrite( ledPin, bitRead( au16data[0], 0 ));
}

Эта функция у нас вызывается из loop, в ней мы обрабатываем наш массив регистров, к которому имеет доступ мастер. Сейчас мы делаем только одно - берём из первого регистра первый бит и пихаем его в ledPin.
Значит нам нужно записать бит - это функция 0x05. Start Address = 0, как вы уже догадались. Ниже в таблице мы ставим 1 или 0. Нажимаем read/write и светодиод загорается или тухнет.

Если в приложении открыть bus monitor и в нём нажать start, то можно посмотреть, что конкретно шлётся и что приходит в ответ.

По аналогии, можно выставить или считать любой пин, задействовать АЦП и ШИМ, управлять сервоприводами. Тема модбаса на этом далеко не закрыта, и в одной из следующих статей мы напишем полноценную универсальную прошивку для конечных устройств на базе Arduino.

Про ModBus https://ru.wikipedia.org/wiki/Modbus
Про rs485 https://ru.wikipedia.org/wiki/RS-485

Исходники:

Код

/*
Скетч для работы с датчиком движения на микросхеме biss0001
Источник: http://tehnopage.ru/
Группа Вконтакте https://vk.com/programerge
*/

#include "ModbusRtu.h"
#define SPEED 9600
#define ID 2 // адрес ведомого
#define btnPin 3 // номер входа, подключенный к кнопке
#define stlPin 13 // номер выхода индикатора работы
// расположен на плате Arduino
#define ledPin 12 // номер выхода светодиода
#define RS485_TX_ENABLED 2 // номер выхода для DE RE
#define BUFFER_SIZE 11 //размер массива регистров доступных для изменений по modbus
#define SERIAL_PORT_NUMBER 0 // номер UART

//Задаём ведомому адрес, последовательный порт, выход управления TX
Modbus slave(ID, SERIAL_PORT_NUMBER, RS485_TX_ENABLED);
boolean led;
int8_t state = 0;
unsigned long tempus;

// массив данных modbus
uint16_t au16data[BUFFER_SIZE];

void setup() {
  // настраиваем входы и выходы
  io_setup();
  // настраиваем последовательный порт ведомого
  slave.begin( SPEED );
  // зажигаем светодиод на 100 мс
  tempus = millis() + 100;
  digitalWrite(stlPin, HIGH );
}

void io_setup() {
  digitalWrite(stlPin, HIGH );
  digitalWrite(ledPin, LOW );
  pinMode(stlPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(btnPin, INPUT);
}

void loop() {
  // обработка сообщений
  state = slave.poll( au16data, BUFFER_SIZE);
  // если получили пакет без ошибок - зажигаем светодиод на 50 мс
  if (state > 4) {
    tempus = millis() + 50;
    digitalWrite(stlPin, HIGH);
  }
  if (millis() > tempus) digitalWrite(stlPin, LOW );
  //обновляем данные в регистрах Modbus и в пользовательской программе
  io_poll();
}

void io_poll() {
  //первый бит первого регистра на ногу ledPin.
  digitalWrite( ledPin, bitRead( au16data[0], 0 ));
}

Если Вы заметили ошибку, нажмите Ctrl+Enter и сообщите нам.
Оценка статьи: 5.0/5 Уже оценило 3
Всего комментариев: 1
Виктор 2016-09-02 05:02
Для разработки и отладки устройств ModBus можно использовать бесплатную программу Alpha Controller. Он позволяет заменить собой аппаратные контроллеры ModBus, есть логика if-then-else, переменные.
[Ссылки только по согласованию с Администрацией]
Добавить комментарий

Вход на сайт

Яндекс.Метрика Рейтинг@Mail.ru Проверка орфографии