Основная связь Arduino ModBus RTU с проблемой измерителя мощности

У меня есть Arduino UNO с модулем RS485.

Я выполнил следующее подключение:Подключение модуля 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.

Спасибо за помощь.

, 👍2

Обсуждение

Не могли бы вы мне помочь, у меня такая же проблема. Я пытаюсь прочитать значение с автономного счетчика импульсов и отобразить его на последовательном мониторе 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


2 ответа


Лучший ответ:

3

Я сделал это. Теперь это работает. Я проверяю только 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


1

Я использую пульсометр 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