Необходима библиотека Arduino Modbus Slave
Мы строим схему на основе ATmega328*, которая :
- Считывает 32 датчика тока, мультиплексированных в один аналоговый вход,
- Считывает 12 преобразователей напряжения,мультиплексированных в один аналоговый вход,
- Считывает 6 датчиков температуры, мультиплексированных в один аналоговый вход,
- Манипулирует всеми показаниями с помощью некоторой математики (например, масштабирование,усреднение и т. Д.),
- Вычисляет новые переменные (мощность, коэффициент гребня и т. Д.),
- Отслеживает тренды (max/min/avg) определенных (расчетных) показаний,
- Хранит некоторые события (пики/провалы - значения max/min) и т.д. с отметками времени от РТК,
- Генерирует сигнальные флаги (путем сравнения показаний с заданными программным обеспечением пороговыми значениями),
Схема должна быть подключена как устройство ModBus (Slave) к существующему Сеть Modbus с несколькими другими устройствами по интерфейсу RS485.
Схема должна передавать все эти вычисленные значения и сигналы тревоги , а также некоторую другую информацию, например пиковые/максимальные значения с отметками даты и времени, которые были записаны в момент их возникновения, мастеру Modbus. У нас есть свобода распределения регистрационных номеров , их форматов и так далее. (Карта Modbus) поставщику контроллера (SAUTER). Например, мы говорим им, что регистр 30001-это датчик тока x, 30002-датчик напряжения y и т. Д.
Мы думаем, что отправка временных меток (определенных событий) будет основана на "согласованном" кодировании значений регистра (ММ, ДД, ГГГГ и т.д.) И то же самое для сигналов тревоги (которые будут отправляться в виде шестнадцатеричных кодов).
Мы искали библиотеки и были действительно сбиты с толку множеством библиотек, а также отсутствием документации -:)
Не могли бы вы любезно помочь нам : выберите подходящую библиотеку Arduino Modbus Slave, которая :
- Имеет поддержку MAX485,
- Присваивает регистры Modbus любым произвольным переменным,
- Выдает ответы исключений на запросы Modbus (например, несуществующие регистры или неподдерживаемые коды функций).
- Соответствует стандартам Modbus
- Есть инструкция !!
Мы нашли библиотеку "yaacov" на Github, но она присваивает регистры непосредственно "Пинам". Кроме того, мы рассмотрели его "проблемы", и одна из них была очень серьезной : в каких кадрах , поступающих от Мастера с поврежденным CRC, он реагирует и вызывает столкновение с другими подчиненными. Нам это не нравится ! поскольку это указывает на то, что библиотека не была протестирована в реальной промышленной среде.
Мы также обнаружили, что Библиотека по адресу :
https://electronhacks.com/2014/04/arduino-modbus-plc-rtu/
несколько соответствует нашим требованиям, однако ему не хватает поддержки RS485, и, что более важно, у него нет документации.
Мы очень ценим любую добрую поддержку.
- ATmega328, вероятно, будет заменен более крупным процессором, но мы все еще находимся в стадии разработки.
Спасибо.
@A.H. Shukry, 👍1
Обсуждение2 ответа
Когда мой пост приближается к одному месяцу без единого ответа :смайлик-путаница: ! (по какой бы то ни было причине) Я хотел бы опубликовать для тех, кому может понадобиться эта библиотека :
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, который является профессиональным пакетом, используемым в реальной промышленности.
Это потрясающая ведомая и основная библиотека 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 );
}
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Есть ли хорошая рабочая библиотека MODBUS TCP master для Arduino?
- Ведомая библиотека Modbus RTU
- Modbus IP с Simply Modbus TCP
- Сбой защиты от разрушения стека ESP32 с Modbus RTU
- Связь Arduino Uno и ESP32 с использованием RS485
- Использование сервера Modbus TCP на Arduino
- ATmega328, вероятно, будет заменен более крупным процессором ... затем вы вернетесь к поискам ливрария, @jsotola