Основная связь Arduino ModBus RTU с проблемой измерителя мощности
У меня есть Arduino UNO с модулем RS485.
Я выполнил следующее подключение:
И у меня проблема со связью этого модуля с измерителем мощности «ИнеПро ПРО-1Мод» (техническое описание) по протоколу ModBus. Я хочу, например, прочитать значение напряжения L1, о котором я знаю из руководства (страницы 24 и 25), что это значение хранится в «регистре хранения чтения» с адресом 5002. Я должен общаться с этими параметрами:
- Скорость передачи 9600
- 8 бит данных
- четное соотношение
- 1 стоповый бит
Есть также упоминание о резисторе 120 Ом, установленном рядом с измерителем мощности (но это кабель длиной 15 см, и даже с резистором нет никаких изменений)
Я пробовал использовать множество библиотек ModBus, и на данный момент ни одна из них не работает. Я пробовал "Modbus-Master-Slave-for-Arduino", "ModbusMaster и теперь, наконец, я использую этот "простой-modbus".
Я думаю, что с этой простой библиотекой Modbus я зашел так далеко, как только мог, но она по-прежнему не работает, но я вижу на дисплее измерителя мощности попытку связи (я вижу черную точку, которая показывает связь Modbus) но я не получаю никаких полезных данных.
Я использую этот код:
#include <SimpleModbusMaster.h>
#include <AltSoftSerial.h>
#define TxEnablePin 2 // Контакт управления направлением RS485 Modbus:
#define baud 9600 // скорость порта Modbus:
#define timeout 1000 // время ожидания Modbus в мсек:
#define polling 500 // скорость сканирования Modbus в мс:
#define retry_count 15
#define TOTAL_NO_OF_REGISTERS 1// количество регистров для опроса:
AltSoftSerial altSerial;
enum
{
PACKET1,
TOTAL_NO_OF_PACKETS // оставить эту последнюю запись
};
Packet packets[TOTAL_NO_OF_PACKETS]; // массив пакетов для настройки
// struct packagePointer package1 = &packets[PACKET1];
unsigned int regs[TOTAL_NO_OF_REGISTERS]; // основной массив регистров
long previousMillis = 0;
long interval = 1200;
unsigned long currentMillis;
void setup() {
Serial.begin(9600);
altSerial.begin(9600);
altSerial.println("Hello World");
modbus_construct(&packets[PACKET1], 5, READ_HOLDING_REGISTERS, 5000, 2, 0); // инициализируем пакет
modbus_configure(&Serial, baud, SERIAL_8E1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
}
void loop() {
modbus_update();
float Power;
unsigned long temp = (unsigned long)regs[1] << 16 | regs[0];
Power = *(float*)&temp;
currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
altSerial.print("Exception errors: ");
altSerial.println(packets[PACKET1].exception_errors);
altSerial.print("Failed requests: ");
altSerial.println(packets[PACKET1].failed_requests);
altSerial.print("Successful requests: ");
altSerial.println(packets[PACKET1].successful_requests);
altSerial.print("Low byte: ");
altSerial.println(regs[0]);
altSerial.print("High byte: ");
altSerial.println(regs[1]);
altSerial.print("Power ");
altSerial.println(Power);
altSerial.println("----------");
previousMillis = currentMillis;
}
}
А у меня на компе только такой вывод (конечно повторяется):
----------
Exception errors: 0
Failed requests: 5
Successful requests: 0
Low byte: 0
High byte: 260
Power 0.00
----------
Библиотека Altserial, которую я использую вместе с преобразователем USB2TTL на контактах 8 и amp; 9, чтобы увидеть результат.
Я должен упомянуть, что на измерителе мощности есть только винтовые клеммы A и B, поэтому у меня нет возможности сделать общее заземление. Я также использую кабель UTP с витой парой длиной 15 см.
Может ли кто-нибудь помочь мне заставить его работать? Я пытался изменить адрес регистра хранения на 0x5000 или 5002, пытался изменить количество регистров.
Я попытался подключить модуль rs485 с USB2TTL к ПК и запустить программу под названием "qModMaster", и это работает, но с arduino это не работает.
Идентификатор ведомого устройства (измеритель мощности) равен 5.
Спасибо за помощь.
@Vasekdvor, 👍2
Обсуждение2 ответа
Лучший ответ:
Я сделал это. Теперь это работает. Я проверяю только A & B кабели (попробовал новый) и изменить адрес регистра с 5000 на 0x5000 и теперь это работает. Я думал, что эта библиотека уже дает 0x перед адресом, потому что я нигде раньше не видел 0x.
Совет для людей с такими же проблемами: Большинство устройств, которые используют протокол RS485 и ModBus (и имеют какой-либо дисплей), отображают связь (более 485 и Modbus) на дисплее с помощью какой-либо метки, например, в моем случае это была «точка». который мигает, когда есть связь. Когда отображается этот значок, это означает, что настройки связи правильные, поэтому данные, бит четности, стоповый бит и т.д. скорость передачи в норме (данные успешно достигли целевого устройства).
После этого эти устройства отправляют вам сообщение об ошибке обратно по своей линии. Поэтому, если у вас есть проблемы с получением данных, вы должны отправить свое сообщение (спросить) с arduino на это устройство через контакт передачи от arduino (конечно, через преобразователь, например max485), а контакт приема (боковой) подключить к комп через опять же какой-то преобразователь с UART на USB. (Внимание: у вас должен быть одинаковый потенциал земли, поэтому соедините все земли вместе)
Установите программное обеспечение для связи по ModBus на ПК (я использую это программное обеспечение: https://www.simplymodbus.ca/ | вы можете использовать демонстрацию) После этого пусть arduino отправит сообщение и получит его на ПК. (в simplemodbus посмотрите "ответ") прочитайте этот код и загляните в руководство к используемому вами устройству, где должно быть описание кодов ошибок, если нет посмотрите этот документ: http://www.simplymodbus.ca/exceptions.htm или THIS). После этого вы сможете лучше понять, что происходит и где возникла проблема.
Используя решение, которое я написал выше, я понял, что возникла проблема с «Недопустимым адресом данных», получил код ответа исключения «02»., @Vasekdvor
Я использую пульсометр mp5w, настройки:
- Скорость передачи: 9600
- Адрес : 02
- Равность: нет
- Стоповый бит: 1
Таблица карты памяти Modbus для значения измерения /(PV):
- Модубус: 31002
- Адрес : 03E9
- Размер : 5
Когда я смотрю в руководство, нет никаких признаков того, что эти счетчики импульсов используют протокол ModBus, только RS485. В этом руководстве [ссылка](http://www.farnell.com/datasheets/1514125.pdf) на странице M-26 (M-27 — последняя страница), поэтому первая перед последней страницей. Вот такой текст: «Управление связью серии MP5 является частным протоколом (несовместимым с другой системой)», а затем следует описание этого частного протокола., @Vasekdvor
Тогда вы не сможете использовать эту библиотеку, она не будет работать ни при каких настройках., @Vasekdvor
Моя ссылка - это видио [ссылка](https://www.youtube.com/watch?v=htFQPsrXh4A). в этом видео показано, что пульсометр Mp5Y может обмениваться данными с другой системой (mkrocontroller/arduino), а результат измерения/PV может отображаться на 7 сегментах., @Yaay
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Связь Arduino master/slave с использованием RS485
- Связь Arduino Uno и ESP32 с использованием RS485
- Управление VFD с помощью ModBus RTU через RS485 и Arduino
- Использование Modbus-RTU с Arduino и контроллером температуры
- считывание данных с контроллера через RS485 Modbus rtu Arduino
- Подключить датчик постоянного тока 12 В к Arduino UNO с помощью TTL RS485
- Проблема последовательной связи RS-485 с arduino
Не могли бы вы мне помочь, у меня такая же проблема. Я пытаюсь прочитать значение с автономного счетчика импульсов и отобразить его на последовательном мониторе Arduino. моя настройка пульсометра: скорость передачи 9600 адрес 02 с вашим кодом выше, могу ли я решить свою проблему? или любой код должен измениться... Спасибо..., @Yaay
Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав [Задать вопрос](https://arduinoprosto.ru/q/ask). Вы также можете [добавить награду](https://arduino.stackexchange.com/help/привилегии/set-bounties), чтобы привлечь больше внимания к этому вопросу, как только у вас будет достаточно [репутации](https://arduino.stackexchange. com/help/whats-reputation). - [Из обзора](/review/low-quality-posts/40138), @Michel Keijzers
Я не знаю, какой тип «автоматики пульсометра» вы используете, но я нашел руководство для этих типов: MP5S_MP5Y_MP5W_MP5M, и в руководстве они сказали, что они НЕ используют БИТ четности. Поэтому вы должны изменить «SERIAL_8E1» на «SERIAL_8N1»., @Vasekdvor
Я отредактировал свой ответ, чтобы получить дополнительную помощь, посмотрите на него., @Vasekdvor
Моя ссылка - это видио [ссылка](https://www.youtube.com/watch?v=htFQPsrXh4A). в этом видео показано, что пульсометр Mp5Y может связываться с другой системой (mkrocontroller/arduino) и результат измерения/PV может отображаться на 7 сегментах, @Yaay