modbus библотека

whyNot_
Offline
Зарегистрирован: 20.10.2021

Добрый день. Подскажите  хорошую библиотеку для связи modbus RTU. попробывал первые 5 из репозитория platformio, но они как то странно работают. Свою писать что то не очень охото. За ранее спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

Для разных МК разные.

whyNot_
Offline
Зарегистрирован: 20.10.2021

Мне для nodemcu v3 нужно. А можно узнать в чем там разница?  Там же надо собрать пакет из байт и отправить его в сериал, если не ошибаюсь 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Модбасы разные бывают.
RTU, ASCI, TCP, RTU over TCP...
Ещё устройства бывают : master(client)/slave(server)
Тебе какую и на какое устройство ?

И "странно работают" это как ?
Может кто то пытается их странно использовать ?

nik182
Offline
Зарегистрирован: 04.05.2015

Для nodemcu только одна. Ссылку ищите на офф сайте. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

whyNot_ пишет:

Свою писать что то не очень охото.

whyNot_?

whyNot_
Offline
Зарегистрирован: 20.10.2021

Пол месяца назад писал  на С# свою, в качестве практики. Тут не очень охото все таки Мадбас широко используется  и думаю что есть уже готовые хорошие  решения 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Вот вариант ModbusTCP сервер, отдает только значения запрашиваемых регистров:

#include <ESP8266WiFi.h>

#define maxHoldingRegister 20
 
byte arr[260];
unsigned int MBHoldingRegister[maxHoldingRegister];
 
//////////////////////////////////////////////////////////////////////////
 
WiFiServer MBServer(ModbusTCP_port);
 
void setup() {
 
  Serial.begin(9600);
  delay(100);
  WiFi.begin(ssid, password);
  delay(100);
  Serial.println(".");
 
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
 
  MBServer.begin();
  Serial.println("Connected ");
  Serial.print("ESP8266 Slave Modbus TCP/IP ");
  Serial.print(WiFi.localIP()); Serial.print(":"); Serial.println(String(ModbusTCP_port));
  Serial.println("Modbus TCP/IP Online");
}
 
 
void loop() {
  // Check if a client has connected // Modbus TCP/IP
  WiFiClient client = MBServer.available();
  if (!client) { return; }
 
  boolean flagClientConnected = 0;
  byte byteFN=0;
  int Start;
  int WordDataLength;
  int ByteDataLength;
  int MessageLength;
 
  // Modbus TCP/IP
  while (client.connected()) {
    if(client.available()) {
      flagClientConnected = 1;
      int i = 0;
      while(client.available()) {
        arr[i] = client.read();
        i++;
      }
      client.flush();
  
      //// routine Modbus TCP
      byteFN = arr[7];
      Start = word(arr[8],arr[9]);
      WordDataLength = word(arr[10],arr[11]);
    }
 
    // Handle request
    switch(byteFN) {
 
      case 0:
        break;
 
      case 3:
        ByteDataLength = WordDataLength * 2;
        arr[5] = ByteDataLength + 3; //Number of bytes after this one.
        arr[8] = ByteDataLength; //Number of bytes after this one (or number of bytes of data).
        for(int i = 0; i < WordDataLength; i++) {
          arr[ 9 + i * 2] = highByte(MBHoldingRegister[Start + i]);
          arr[10 + i * 2] = lowByte(MBHoldingRegister[Start + i]);
        }
        MessageLength = ByteDataLength + 9;
        client.write((const uint8_t *)arr,MessageLength);
        byteFN=0;
        break;
  
      case 6:
      byteFN=0;
        break;
 
      case 16: 
      byteFN=0;
        break;
    }
  }
}

 

whyNot_
Offline
Зарегистрирован: 20.10.2021

Kakmyc пишет:
Модбасы разные бывают. RTU, ASCI, TCP, RTU over TCP... Ещё устройства бывают : master(client)/slave(server) Тебе какую и на какое устройство ? И "странно работают" это как ? Может кто то пытается их странно использовать ?
.
У меня написано rtu 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

И тем не менее: "пример странной работы в студию"