Коммуникация Arduino и Modbus

Привет всем, столкнулся с проблемой коммуникации между Arduino (Master) и Modbus RTU(Slave). Задача поставлена так : Считывать дата с электромагнитного расходометра Promag P 300 и выписывать значения в консоль. Не могу найти проблему и как её решить, либо она в коде либо в настройке регистров.

Расходомер подключен через модуль Rs 485 к ардуино.
Для определения регистра использовал DataSheet:

Модуль выглядит так:



Код:

#include <ModbusMaster.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(19, 18); // RX, TX
ModbusMaster node;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  node.begin(1, mySerial);
}

void loop() {
  uint8_t result;
  uint16_t data;

  result = node.readHoldingRegisters(0x5053, 1);
  if (result == node.ku8MBSuccess) {
    data = node.getResponseBuffer(4);
    Serial.print("Register value: ");
    Serial.println(data);
  } else {
    Serial.println("Error reading from register");
  }
delay(1000);
}

После записи кода в консоль выписывает следущее:
image

Прошу помочь с решением задачи, заранее благодарен.

Вот такую хреновину в пэка втыкаете, девайс свой коннектите и модполом тыркаете - отдаёт он чего нужно с регистра или нет. Потом уже в ардуину лезете.

@SSaienko
так какой адрес регистра правильный - 5053 или 0х5053 ? - это как бы очень большая разница

И еще, секция даташита 7.5.1 указывает, как менять адрес девайса. Если адрес не менять, по умолчанию все девайсы имеют Модбас адрес 247. Что-то я не вижу в коде, чтобы вы обращались к девайсу по такому адресу.
Вы точно знаете, что ваш сенсор имеет адрес 1 ?

Уверен на сто процентов так как этот адрес настраивается непосредственно на расходометре мануально,247 адресов быть не может, ниже прикреплю фото из datasheet:
image
На счет адреса регистра ссылаясь снова на даташит:


так как адрес 1 то регистр должен быть 5053, но прочитав описание библиотеки Modbus Master
и посмотрев несколько видео по этому поводу одни пишут 0x5053 другие 5053

посмотрев тот же пример из библиотеки
`#include <ModbusMaster.h>

// instantiate ModbusMaster object
ModbusMaster node;

void setup()
{
// use Serial (port 0); initialize Modbus communication baud rate
Serial.begin(19200);

// communicate with Modbus slave ID 2 over Serial (port 0)
node.begin(2, Serial);
}

void loop()
{
static uint32_t i;
uint8_t j, result;
uint16_t data[6];

i++;

// set word 0 of TX buffer to least-significant word of counter (bits 15…0)
node.setTransmitBuffer(0, lowWord(i));

// set word 1 of TX buffer to most-significant word of counter (bits 31…16)
node.setTransmitBuffer(1, highWord(i));

// slave: write TX buffer to (2) 16-bit registers starting at register 0
result = node.writeMultipleRegisters(0, 2);

// slave: read (6) 16-bit registers starting at register 2 to RX buffer
result = node.readHoldingRegisters(2, 6);

// do something with data if read is successful
if (result == node.ku8MBSuccess)
{
for (j = 0; j < 6; j++)
{
data[j] = node.getResponseBuffer(j);
}
}
}`
не вижу здесь дефиниции пинов на которые нужно подключить модуль к ардуино

Я тоже делаю ставку на 5053, ибо:

The device offers a special memory area, the Modbus data map (for a maximum of 16 device parameters)

Carried out using the operating menu of the measuring device:
Expert → Communication → Modbus data map → Scan list register 0 to 15

И, раз уж регистры в таблице приведены в десятичной форме, то и адреса тоже должны быть в таковой.

1 лайк

Спасибо, но на это уже недостаточно времени.

Набирайте 112, коли пожар или кто-то сроки прос… пал.

Проблема в том что это дипломная работа и я в основном работал на ПЛК но из-за длительного ожидания на доставку ПЛК мне сказали сделать его на ардуино с которым так каковом особо не работал.

Так это вы им объясняйте - с чем работали, сколько ждали и что Ардуина - не ваше.
Отчего мы-то должны в положение входить, а не ваши кураторы?

Самый простой способ проверить работу устройства я вам посоветовал.

Это само собой было на что ответ получил такой “Вы же хотите закончить университет?”. Поэтому и обращаюсь к небезразличным людям которые могут помочь в решении данного вопроса и написания кода.

Вот и не теряйте время даром.
Запускайте Avito, Yandex Market, ищите такой свисток. Он не только на Али встречается.

Сдается мне вы не понимаете о чем пишете.
Вы путаете три разных числа - число регистров, адрес регистра и адрес девайса.
Еще раз - прочитайте раздел 7.5.1 даташита. Адрес вашего расходомера по умолчанию 247:

The device address must always be configured for a Modbus slave. The valid device
addresses are in the range from 1 to 247. Each address may only be assigned once in a
Modbus RS485 network. If an address is not configured correctly, the measuring device is
not recognized by the Modbus master. All measuring devices are delivered from the
factory with the device address 247

1 лайк

Да, вы правы прошу извинить, но у меня включен переключатель 8 что означает адрес 1

ТС же с ПЛК работал. По любому должен уже понимать в модбасе хоть что-то, чтобы закончить университет…

Смотрите еще второй пункт в этом же разделе даташита - софт и хард адреса. У вас какие выбраны?

Когда практически два года учеба были дистанционно из-за ковида трудно назвать это учебой.

И нах…й нужен такой “специалист” ?
Дети в школе роботов программируют в хвост и в гриву !!!
Постыдился бы плакаться …
Нет ума - готовь бабло в теме Ищу исполнителя !

выбран Hardware то есть 4 включена

Вы пришли сюда помочь с проблемой или вычитывать меня ?