Есть ли хорошая рабочая библиотека MODBUS TCP master для Arduino?

Я хотел бы подключиться к солнечному инвертору Fronius через MODBUS TCP с Arduino только для чтения и ЗАПИСИ значений регистров. Я хочу установить Arduino в качестве ведущего, а инвертор-в качестве ведомого. Я хочу использовать только две функции "Чтение регистров хранения" и "Запись одного регистра хранения" с кодом функции " 3 "и кодом функции "6" соответственно. Есть ли для этого какая-нибудь хорошая и работающая библиотека? А также пример.

, 👍3


1 ответ


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

4

Проверьте библиотеку Modbus-TCP на Github. Он имеет возможность использовать все функциональные коды в соответствии с запросом. Он имеет возможность подключения Ethernet-микросхем Wiznet W5100 и ENC28J60. Все протестировано с помощью Arduino Mega. См.Хорошо документированный пример кода модуля Wiznet в библиотеке.

Для получения более подробной информации о библиотеке прочтите index.html внутри папки doc библиотеки.

Вот пример кода, объясняющего несколько кодов функций для Arduino Mega и модуля W5100.

/*
  Это тестовый код Modbus для демонстрации всех функций Modbus
с Ethernet IC WIZNET W5100 

  ModbusTCP-это свободное программное обеспечение: вы можете распространять его и/или изменять
в соответствии с условиями GNU General Public License, опубликованной Фондом
свободного программного обеспечения, либо версией 3 Лицензии, либо
(по вашему выбору) любой более поздней версией.

  ModbusTCP распространяется в надежде, что он будет полезен,
но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
  ТОВАРНАЯ ПРИГОДНОСТЬ или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.  См.
  GNU General Public License для получения более подробной информации.

  Вы должны были получить копию GNU General Public License
вместе с ModbusTCP.  Если нет, то смотрите <http://www.gnu.org/licenses/>.

  Принят от ModbusMaster для RTU по RS-485 Доком Уокером
  Модифицировано Нарендрой Дехури для TCP.
  авторское право @ phoenixrobotix.com

*/
#define WIZNET_W5100 1

unsigned int param_value_int[7];
#include <Ethernet.h>

IPAddress ModbusDeviceIP(10, 10, 108, 211);  // Введите IP-адрес ПЛК здесь
IPAddress moduleIPAddress(10, 10, 108, 23);  // Назначьте что-либо, кроме IP-адреса ПЛК

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };


#include <ModbusTCP.h>

ModbusTCP node(1);                            // Идентификатор блока.

void setup()
{

  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);                      // Для отключения slave select для SD-карты; устарело.

  Serial.begin(9600);
  delay(1000);
  Ethernet.begin(mac, moduleIPAddress);
  node.setServerIPAddress(ModbusDeviceIP);
  delay(6000);                                // Обеспечить достаточное время для инициализации.

}


void loop()
{
  uint8_t result;

  node.setTransactionID(random(100));           // Not necessary; but good to distinguish each frame individually.
  result = node.readHoldingRegisters(1, 12);    // Чтение регистров хранения

  Serial.println(result, HEX);
  if(result != 0)
  {
    Serial.println("TimeOut");

    delay(6000);
  }

  int len = node.getResponseBufferLength();           
  Serial.println("Response Length: " + String(len));// См. Длину принятого пакета данных.
  for (byte j = 0; j < len; j++)
  {
    Serial.print(node.getResponseBuffer(j));       // Проверьте данные.
    Serial.print(" ");
  }
  Serial.println();
  node.clearResponseBuffer();
  delay(100);




  node.writeSingleRegister(5, 3);                  // Write single register
  Serial.println(result, HEX);
  delay(500);



  for (byte i = 0; i < 5; i++)
  {
    node.setTransmitBuffer(i, (i+100));
  }
  node.writeMultipleRegisters(2, 5);               // Запись нескольких регистров
  Serial.println(result, HEX);
  delay(500);



  node.writeSingleCoil(20, 1);                     // Write Single coil
  delay(500);



  node.setTransmitBuffer(0, 0b1010101001010101);

  node.writeMultipleCoils(20, 16);                 // Запись нескольких катушек
  delay(500);
  result = node.readCoils(20, 18);
  len = node.getResponseBufferLength();
  Serial.println("Response Length: " + String(len));
  Serial.println(node.getResponseBuffer(0), BIN);


  node.clearResponseBuffer();
  delay(5000);
}
,

Не могли бы вы объяснить, почему *вы* считаете это полезным, а также дать краткое изложение ссылки? В его нынешнем виде, если это ссылка, только ответ. Если ссылка умрет в какой-то момент в будущем, ваш ответ будет не очень полезен., @Greenonline

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответы только по ссылкам могут стать недействительными, если связанная страница изменится. - [Из обзора](/обзор/низкого качества-сообщения/26453), @Greenonline

Я обновил этот пост. Пожалуйста, поделитесь своим беспокойством по поводу даунвотов. Я постараюсь вам помочь., @goddland_16

Несколько дней назад я столкнулся с такой же ситуацией, я не мог найти подходящую библиотеку для Modbus TCP, где Arduino будет выступать в качестве клиента. Поэтому я решил сделать один из них. И эта ссылка - ссылка на библиотеку. Вы должны поощрять такую деятельность, а не просить об удалении., @goddland_16

Ваш ответ был помещен в очередь рецензентов из-за его краткости, и я просто просматривал рецензии... вы находитесь на SE уже более года, и поэтому вы должны знать, как работает SE, и что ответы только на ссылки не одобряются, и дополнительное объяснение *обычно* требуется. Кстати, я не голосовал против этого. Ваш расширенный ответ намного лучше, спасибо (хотя я не уверен насчет *now suit yourself*, так как это *может* быть воспринято неправильно) :-), @Greenonline

Я прошу прощения за все это шоу. Спасибо вам за гида. :), @goddland_16

привет goddland_16 этот код дает некоторую ошибку, когда я компилирую его на Arduino IDE, @Prayuktibid

@Prayuktibid примите его, если он работает., @goddland_16