Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,19 @@ It work's for me, but there's room for improvement. If you have an idea please o
![Home](doc/img/esp32-xy017.png)


## Fork Information

This fork has the following changes:

* Added support for Ethernet boards(In my case WT32-ETH01)
* Replaced debug function with functions from eModbus
* Cosmetic fixes for the WebUI
* Added support for different Serials objects
* Added support for less than 247 Modbus addresses
* Added support for a custom RTU timeout
* Better debug messages


## Screenshots

### Home
Expand Down
Binary file modified doc/img/config.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified doc/img/debug.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified doc/img/status.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions include/ModbusBridgeEthernet.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// =================================================================================================
// Modified version of ModbusBridgeWiFi.h to user native Ethernet support
// =================================================================================================
#ifndef _MODBUS_BRIDGE_ETHERNET_H
#define _MODBUS_BRIDGE_ETHERNET_H
#include "options.h"
#include <ETH.h>

#undef SERVER_END
#define SERVER_END server.end();

#include "ModbusServerTCPtemp.h"
#include "ModbusBridgeTemp.h"

// Same name as ModBusBridgeWiFi
using ModbusBridgeWiFi = ModbusBridge<ModbusServerTCP<WiFiServer, WiFiClient>>;

#endif
22 changes: 12 additions & 10 deletions include/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@
#define CONFIG_H
#include <Arduino.h>
#include <Preferences.h>
#define debugSerial Serial
#define modbusSerial Serial2
#define DEBUG
#if !defined(DEBUG_SERIAL)
#define DEBUG_SERIAL Serial
#endif
#if !defined(MODBUS_SERIAL)
#define MODBUS_SERIAL Serial2
#endif
#if !defined(MODBUS_MAX_ADDRESS)
#define MODBUS_MAX_ADDRESS 247
#endif

class Config{
private:
Expand All @@ -14,6 +20,7 @@
unsigned long _modbusBaudRate;
uint32_t _modbusConfig;
int8_t _modbusRtsPin;
uint32_t _rtuTimeout;
unsigned long _serialBaudRate;
uint32_t _serialConfig;
public:
Expand All @@ -34,6 +41,8 @@
void setModbusStopBits(uint8_t value);
int8_t getModbusRtsPin();
void setModbusRtsPin(int8_t value);
uint32_t getRtuTimeout();
void setRtuTimeout(uint32_t value);
uint32_t getSerialConfig();
unsigned long getSerialBaudRate();
void setSerialBaudRate(unsigned long value);
Expand All @@ -44,11 +53,4 @@
uint8_t getSerialStopBits();
void setSerialStopBits(uint8_t value);
};
#ifdef DEBUG
#define dbg(x...) debugSerial.print(x);
#define dbgln(x...) debugSerial.println(x);
#else /* DEBUG */
#define dbg(x...) ;
#define dbgln(x...) ;
#endif /* DEBUG */
#endif /* CONFIG_H */
13 changes: 11 additions & 2 deletions include/pages.h
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
#ifndef PAGES_H
#define PAGES_H

#include <WiFiManager.h>
#if defined(ETHERNET)
#include <ETH.h>
#include "ModbusBridgeEthernet.h"
#else
#include <WiFiManager.h>
#include <ModbusBridgeWiFi.h>
#endif
#include <ESPAsyncWebServer.h>
#include <ModbusBridgeWiFi.h>
#include <ModbusClientRTU.h>
#include <Update.h>
#include "config.h"
#include "debug.h"

#if defined(ETHERNET)
void setupPages(AsyncWebServer* server, ModbusClientRTU *rtu, ModbusBridgeWiFi *bridge, Config *config);
#else
void setupPages(AsyncWebServer* server, ModbusClientRTU *rtu, ModbusBridgeWiFi *bridge, Config *config, WiFiManager *wm);
#endif
void sendResponseHeader(AsyncResponseStream *response, const char *title, bool inlineStyle = false);
void sendResponseTrailer(AsyncResponseStream *response);
void sendButton(AsyncResponseStream *response, const char *title, const char *action, const char *css = "");
Expand Down
20 changes: 15 additions & 5 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
; https://docs.platformio.org/page/projectconf.html

[platformio]
default_envs = esp32debug
default_envs = esp32dev

[env]
platform = espressif32
Expand All @@ -22,20 +22,30 @@
build_flags = -Wall -Werror -DLOG_LEVEL=LOG_LEVEL_DEBUG
monitor_speed = 115200

[debug]
build_flags = -D DEBUG -DLOG_LEVEL=LOG_LEVEL_DEBUG ; -DDEBUG_SERIAL=Serial

[release]
build_flags = -DLOG_LEVEL=LOG_LEVEL_WARN

[env:esp32release]
board = esp32dev
build_flags = ${env.build_flags}

[env:esp32debug]
[env:esp32dev]
board = esp32dev
build_flags = ${env.build_flags}
build_flags = ${env.build_flags} ; ${release.build_flags}

[env:olimex-poe]
board = esp32-poe
build_flags = ${env.build_flags} -DRX_PIN=14 -DTX_PIN=5
build_flags = ${env.build_flags} -DRX_PIN=14 -DTX_PIN=5 ; ${debug.build_flags}
upload_port = COM9
monitor_port = COM9

[env:d1mini]
board = wemos_d1_mini32
build_flags = ${env.build_flags}
build_flags = ${env.build_flags} ; ${debug.build_flags}

[env:wt32-eth01]
board = wt32-eth01
build_flags = ${env.build_flags} -DETHERNET=1 -DRX_PIN=5 -DTX_PIN=17 -DMODBUS_MAX_ADDRESS=32 ; ${debug.build_flags}
12 changes: 12 additions & 0 deletions src/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Config::Config()
,_modbusBaudRate(9600)
,_modbusConfig(SERIAL_8N1)
,_modbusRtsPin(-1)
,_rtuTimeout(1000)
,_serialBaudRate(115200)
,_serialConfig(SERIAL_8N1)
{}
Expand All @@ -19,6 +20,7 @@ void Config::begin(Preferences *prefs)
_modbusBaudRate = _prefs->getULong("modbusBaudRate", _modbusBaudRate);
_modbusConfig = _prefs->getULong("modbusConfig", _modbusConfig);
_modbusRtsPin = _prefs->getChar("modbusRtsPin", _modbusRtsPin);
_rtuTimeout = _prefs->getULong("rtuTimeout", _rtuTimeout);
_serialBaudRate = _prefs->getULong("serialBaudRate", _serialBaudRate);
_serialConfig = _prefs->getULong("serialConfig", _serialConfig);
}
Expand Down Expand Up @@ -104,6 +106,16 @@ void Config::setModbusRtsPin(int8_t value){
_prefs->putChar("modbusRtsPin", _modbusRtsPin);
}

uint32_t Config::getRtuTimeout(){
return _rtuTimeout;
}

void Config::setRtuTimeout(uint32_t value){
if (_rtuTimeout == value) return;
_rtuTimeout = value;
_prefs->putULong("rtuTimeout", _rtuTimeout);
}

uint32_t Config::getSerialConfig(){
return _serialConfig;
}
Expand Down
101 changes: 71 additions & 30 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
#if defined(ETHERNET)
#include <ETH.h>
#include "ModbusBridgeEthernet.h"
#else
#include <WiFi.h>
#include <AsyncTCP.h>
#include <WiFiManager.h>
#include <ModbusBridgeWiFi.h>
#endif
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Preferences.h>
#include <Logging.h>
#include <ModbusBridgeWiFi.h>
#include <ModbusClientRTU.h>
#include "config.h"
#include "pages.h"
Expand All @@ -14,53 +19,89 @@ Config config;
Preferences prefs;
ModbusClientRTU *MBclient;
ModbusBridgeWiFi MBbridge;
#if !defined(ETHERNET)
WiFiManager wm;
#endif

#if defined(ETHERNET)
void setupNetwork()
{
LOG_I("[Ethernet] Setup Network\n");
ETH.begin();
LOG_I("[Ethernet] Done\n");
}
#else
void setupNetwork()
{
LOG_I("[Wifi] Setup Network\n");

void setup() {
debugSerial.begin(115200);
dbgln();
dbgln("[config] load")
prefs.begin("modbusRtuGw");
config.begin(&prefs);
debugSerial.end();
debugSerial.begin(config.getSerialBaudRate(), config.getSerialConfig());
dbgln("[wifi] start");
WiFi.mode(WIFI_STA);
wm.setClass("invert");
auto reboot = false;
wm.setAPCallback([&reboot](WiFiManager *wifiManager){reboot = true;});
wm.setAPCallback([&reboot](WiFiManager *wifiManager){ reboot = true; });
wm.autoConnect();
if (reboot){
if (reboot)
{
ESP.restart();
}
dbgln("[wifi] finished");
dbgln("[modbus] start");

LOG_I("[Wifi] Done\n");
}
#endif

void setup()
{
#if !defined(DEBUG)
MBUlogLvl = LOG_LEVEL_WARNING;
RTUutils::prepareHardwareSerial(modbusSerial);
#endif

LOGDEVICE = &(DEBUG_SERIAL);

DEBUG_SERIAL.begin(115200);

LOG_I("[Config] Loading\n");

// Load preferences
prefs.begin("modbusRtuGw");
config.begin(&prefs);

// Reset Debug Serial based on the configuration
DEBUG_SERIAL.flush();
DEBUG_SERIAL.begin(config.getSerialBaudRate(), config.getSerialConfig());

LOG_I("[Config] Done\n");

setupNetwork();

LOG_I("[Modbus] Setup\n");

RTUutils::prepareHardwareSerial(MODBUS_SERIAL);
#if defined(RX_PIN) && defined(TX_PIN)
// use rx and tx-pins if defined in platformio.ini
modbusSerial.begin(config.getModbusBaudRate(), config.getModbusConfig(), RX_PIN, TX_PIN );
dbgln("Use user defined RX/TX pins");
LOG_I("[Modbus] Using provided RX(%d)/TX(%d) pins\n", RX_PIN, TX_PIN);
MODBUS_SERIAL.begin(config.getModbusBaudRate(), config.getModbusConfig(), RX_PIN, TX_PIN);
#else
// otherwise use default pins for hardware-serial2
modbusSerial.begin(config.getModbusBaudRate(), config.getModbusConfig());
LOG_I("[Modbus] Using default RX/TX pins\n");
MODBUS_SERIAL.begin(config.getModbusBaudRate(), config.getModbusConfig());
#endif

MBclient = new ModbusClientRTU(config.getModbusRtsPin());
MBclient->setTimeout(1000);
MBclient->begin(modbusSerial, 1);
for (uint8_t i = 1; i < 248; i++)
MBclient->setTimeout(config.getRtuTimeout());
MBclient->begin(MODBUS_SERIAL, 1);
for (uint8_t i = 1; i <= MODBUS_MAX_ADDRESS; i++)
{
MBbridge.attachServer(i, i, ANY_FUNCTION_CODE, MBclient);
}
}
MBbridge.start(config.getTcpPort(), 10, config.getTcpTimeout());
dbgln("[modbus] finished");
LOG_I("[Modbus] Done\n");

LOG_I("[WebServer] Setup\n");
#if defined(ETHERNET)
setupPages(&webServer, MBclient, &MBbridge, &config);
#else
setupPages(&webServer, MBclient, &MBbridge, &config, &wm);
#endif
webServer.begin();
dbgln("[setup] finished");
LOG_I("[WebServer] Done\n");
}

void loop() {
// put your main code here, to run repeatedly:
}
void loop() {}
Loading