modbus библотека
- Войдите на сайт для отправки комментариев
Ср, 20/10/2021 - 18:53
Добрый день. Подскажите хорошую библиотеку для связи modbus RTU. попробывал первые 5 из репозитория platformio, но они как то странно работают. Свою писать что то не очень охото. За ранее спасибо.
Для разных МК разные.
Мне для nodemcu v3 нужно. А можно узнать в чем там разница? Там же надо собрать пакет из байт и отправить его в сериал, если не ошибаюсь
Модбасы разные бывают.
RTU, ASCI, TCP, RTU over TCP...
Ещё устройства бывают : master(client)/slave(server)
Тебе какую и на какое устройство ?
И "странно работают" это как ?
Может кто то пытается их странно использовать ?
Для nodemcu только одна. Ссылку ищите на офф сайте.
Свою писать что то не очень охото.
whyNot_?
Пол месяца назад писал на С# свою, в качестве практики. Тут не очень охото все таки Мадбас широко используется и думаю что есть уже готовые хорошие решения
Вот вариант 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; } } }У меня написано rtu
И тем не менее: "пример странной работы в студию"