Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Мастерство Modbus на Arduino: пошаговое руководство

Компоненты и расходные материалы

Программное обеспечение и онлайн-сервисы

О проекте

Modbus — это стандарт последовательной связи, ставший де-факто промышленным протоколом для подключения электронных устройств. В Modbus RTU и Modbus ASCII физическим уровнем служит RS485. Arduino может выступать в роли ведомого устройства (slave), а с некоторыми ограничениями — и ведущего (master), но для этого требуется интерфейс RS485. Наш RS422/RS485 Shield — это полностью гальванически изолированный модуль последовательной связи, предназначенный для Arduino UNO и совместимых плат (Arduino 101, STM Nucleo и др.). Он идеально подходит для таких приложений.

Цель данного руководства — показать, как на базе Arduino UNO создать простое ведомое Modbus-устройство. В качестве ведущего (master) будет использоваться ПК.

Инструменты и материалы

Опционально (для демонстрации):

Программное обеспечение

Подключение RS485

Схема подключения очень проста: нужно соединить только выводы A и B шилда с соответствующими линиями A и B шины Modbus. Выводы Y и Z в данном приложении не используются. Для длинных линий рекомендуется использовать скрученные пары для A и B.

Подключение Arduino (опционально)

Рекомендуется добавить светодиод и кнопку к Arduino для наглядной демонстрации работы Modbus-коммуникации. Это не обязательно, но полезно для визуализации процессов.

Настройка DIP-переключателей

На шилде RS422/RS485 установлены три группы DIP-переключателей. Их нужно настроить для работы с Modbus следующим образом:

* Включение терминирующего резистора (позиция ON) требуется только если шилд находится на конце шины Modbus. Во всех остальных случаях резистор должен быть выключен (OFF).

Настройка джамперов

На шилде есть три группы джамперов. Критически важный — JP1 для выбора напряжения питания. Arduino UNO работает от 5 В, поэтому установите этот джампер в позицию 5V (для плат 3.3 В, например Arduino 101 — в позицию 3.3V).

Также установите джамперы коммуникационных портов в левом верхнем углу согласно схеме — это соединит внутренний UART (порты 0 и 1) с RS485-интерфейсом шилда.

Джампер управления RX/TX не используется, так как настроено автоматическое переключение направления передачи.

Установка ПО ModbusTester на ПК

В качестве Modbus-мастера используется ПК. Скачайте ModbusTester, распакуйте архив в отдельную папку. Запустите программу и настройте параметры как на скриншоте. Важно: подключите USB-RS485-адаптер до запуска программы и выберите правильный COM-порт в ModbusTester.

Прошивка Arduino

Загрузите скетч в Arduino IDE, скомпилируйте и прошейте плату.

Тестирование

Нажмите кнопку Read в ModbusTester — будет прочитано 8 байт памяти ведомого устройства. В адресе 400008 находится состояние кнопки, а адреса 400001–400006 содержат значения АЦП (аналоговых входов).

Кнопкой Write можно записывать значения в регистры ведомого. Запишите в адрес 400007 значение 0 или 1, чтобы выключить или включить светодиод.

Код (скетч для Arduino UNO)

/* 
 * Тестовая программа для Arduino RS422/RS485 Shield
 * Version 1.0
 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de
 * (основано на исходниках https://github.com/angeloc/simplemodbusng)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 */
#include <SimpleModbusSlave.h>

#define ledPin 12      // встроенный светодиод
#define buttonPin 7    // кнопка

// Регистры ведомого устройства
enum {
  ADC0, ADC1, ADC2, ADC3, ADC4, ADC5,  // 6 аналоговых входов
  LED_STATE,       // состояние светодиода (управляется через функцию 16)
  BUTTON_STATE,    // состояние кнопки
  TOTAL_ERRORS,    // счётчик ошибок связи
  TOTAL_REGS_SIZE  // общее количество регистров
};

unsigned int holdingRegs[TOTAL_REGS_SIZE];  // массив регистров для функций 3 и 16

void setup() {
  // modbus_configure(baudrate, ID, transmit enable pin, holding registers size, low latency)
  // transmit enable pin = 6 (для полудуплекса с MAX485), значения 0 и 1 зарезервированы для Rx/Tx
  modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0);
  
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // modbus_update() обновляет массив holdingRegs и проверяет связь
  // Возвращает общее количество ошибок с момента запуска
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);

  // Читаем 6 аналоговых входов
  for (byte i = 0; i < 6; i++) {
    holdingRegs[i] = analogRead(i);
    delayMicroseconds(50);
  }

  // Читаем состояние кнопки
  byte buttonState = digitalRead(buttonPin);
  holdingRegs[BUTTON_STATE] = buttonState;

  // Управляем светодиодом по значению регистра LED_STATE (функция 16)
  byte ledState = holdingRegs[LED_STATE];
  if (ledState) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
    holdingRegs[LED_STATE] = 0;
  }
}

Схемы подключения

Схема подключения тестовых компонентов (кнопка, светодиод) к Arduino приведена на рисунке.

Производственный процесс

  1. Очереди в C#: Enqueue, Dequeue и операции First-In-First-Out
  2. Управление яркостью LED с ШИМ через кнопку на Arduino Mega
  3. Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
  4. Unopad: Бесшовный Arduino MIDI-контроллер для Ableton Live
  5. Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
  6. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  7. Своё рулевое управление (джойстик) для игр на Arduino
  8. Использование термистора: пошаговое руководство для Arduino
  9. Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино
  10. Подключение Arduino к NMEA-0183: пошаговое руководство