Необходима библиотека Arduino Modbus Slave

Мы строим схему на основе ATmega328*, которая :

  1. Считывает 32 датчика тока, мультиплексированных в один аналоговый вход,
  2. Считывает 12 преобразователей напряжения,мультиплексированных в один аналоговый вход,
  3. Считывает 6 датчиков температуры, мультиплексированных в один аналоговый вход,
  4. Манипулирует всеми показаниями с помощью некоторой математики (например, масштабирование,усреднение и т. Д.),
  5. Вычисляет новые переменные (мощность, коэффициент гребня и т. Д.),
  6. Отслеживает тренды (max/min/avg) определенных (расчетных) показаний,
  7. Хранит некоторые события (пики/провалы - значения max/min) и т.д. с отметками времени от РТК,
  8. Генерирует сигнальные флаги (путем сравнения показаний с заданными программным обеспечением пороговыми значениями),

Схема должна быть подключена как устройство ModBus (Slave) к существующему Сеть Modbus с несколькими другими устройствами по интерфейсу RS485.

Схема должна передавать все эти вычисленные значения и сигналы тревоги , а также некоторую другую информацию, например пиковые/максимальные значения с отметками даты и времени, которые были записаны в момент их возникновения, мастеру Modbus. У нас есть свобода распределения регистрационных номеров , их форматов и так далее. (Карта Modbus) поставщику контроллера (SAUTER). Например, мы говорим им, что регистр 30001-это датчик тока x, 30002-датчик напряжения y и т. Д.

Мы думаем, что отправка временных меток (определенных событий) будет основана на "согласованном" кодировании значений регистра (ММ, ДД, ГГГГ и т.д.) И то же самое для сигналов тревоги (которые будут отправляться в виде шестнадцатеричных кодов).

Мы искали библиотеки и были действительно сбиты с толку множеством библиотек, а также отсутствием документации -:)

Не могли бы вы любезно помочь нам : выберите подходящую библиотеку Arduino Modbus Slave, которая :

  1. Имеет поддержку MAX485,
  2. Присваивает регистры Modbus любым произвольным переменным,
  3. Выдает ответы исключений на запросы Modbus (например, несуществующие регистры или неподдерживаемые коды функций).
  4. Соответствует стандартам Modbus
  5. Есть инструкция !!

Мы нашли библиотеку "yaacov" на Github, но она присваивает регистры непосредственно "Пинам". Кроме того, мы рассмотрели его "проблемы", и одна из них была очень серьезной : в каких кадрах , поступающих от Мастера с поврежденным CRC, он реагирует и вызывает столкновение с другими подчиненными. Нам это не нравится ! поскольку это указывает на то, что библиотека не была протестирована в реальной промышленной среде.

Мы также обнаружили, что Библиотека по адресу :

https://electronhacks.com/2014/04/arduino-modbus-plc-rtu/

несколько соответствует нашим требованиям, однако ему не хватает поддержки RS485, и, что более важно, у него нет документации.

Мы очень ценим любую добрую поддержку.

  • ATmega328, вероятно, будет заменен более крупным процессором, но мы все еще находимся в стадии разработки.

Спасибо.

, 👍1

Обсуждение

- ATmega328, вероятно, будет заменен более крупным процессором ... затем вы вернетесь к поискам ливрария, @jsotola


2 ответа


1

Когда мой пост приближается к одному месяцу без единого ответа :смайлик-путаница: ! (по какой бы то ни было причине) Я хотел бы опубликовать для тех, кому может понадобиться эта библиотека :


https://drive.google.com/file/d/0Bx5wWRfN_z7oMDlZMDhWbXM2VFU/view

Библиотека основана на оригинале, написанном Джейсоном Вриландом [CodeRage]. Выпущен 3/7/2010 под лицензией GNU

и был использован (и, возможно, модифицирован) "jhottell" на electronhacks.com :

https://electronhacks.com/2014/04/arduino-modbus-plc-rtu/

Основное различие заключается в использовании RS485.

Я написал код и протестировал его на "UNO", который отлично работал с более чем одним симулятором ModBus Slave под Windows, включая DAQ Factory, который является профессиональным пакетом, используемым в реальной промышленности.

,

0

Это потрясающая ведомая и основная библиотека Modbus

Требуется эта библиотека <ModbusRtu.h>

#include <ModbusRtu.h>
unsigned long TIME = 0;
unsigned long LASTTIME = 0;
unsigned long INTERVAL = 5000; 

int i = 0;
// массив данных для общего доступа к сети Modbus
uint16_t au16data[16] = {
  3, 1415, 9265, 4, 2, 7182, 28182, 8, 0, 0, 0, 0, 0, 0, 1, 11 };

/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  port : serial port
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */
Modbus slave(1,Serial,0); // это slave @1 и RS-232 или USB-FTDI

void setup() {
  Serial.swap();
  Serial.begin( 19200 ); // скорость передачи 19200
  Serial1.begin( 19200 );
  slave.start();
}

void loop() {

  if ((millis() - TIME) > INTERVAL) { 
    i++;

    if(i == 16){
      i = 0;

      for (int ii = 0; ii < 16; ii++)
      {
        au16data[ii] = 0;
      }
    }

    au16data[i] = 1;

    TIME = millis();
  }

  slave.poll( au16data, 16 );
}
,