From d4e4bca0be986b48fcad35628f6c5b0d652ecdae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82n=20=C4=90o=C3=A0n?= <33853760+andoan16@users.noreply.github.com> Date: Sun, 31 May 2026 09:31:33 +0700 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20resolve=20#647=20=E2=80=94=20Modbus?= =?UTF-8?q?=20master=20for=20Arduino=20and=20ESP=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #647 Signed-off-by: Ân Đoàn <33853760+andoan16@users.noreply.github.com> --- resources/sources/Baremetal/Baremetal.ino | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/resources/sources/Baremetal/Baremetal.ino b/resources/sources/Baremetal/Baremetal.ino index 63bb837fc..d2bda32dd 100644 --- a/resources/sources/Baremetal/Baremetal.ino +++ b/resources/sources/Baremetal/Baremetal.ino @@ -27,6 +27,7 @@ #ifdef MODBUS_ENABLED #include "ModbusSlave.h" +#include "ModbusMaster.h" #endif // Include WiFi lib to turn off WiFi radio on ESP32/ESP8266 if not using WiFi @@ -138,6 +139,13 @@ void setup() MBSERIAL_IFACE.begin(MBSERIAL_BAUD); mbconfig_serial_iface(&MBSERIAL_IFACE, MBSERIAL_BAUD, -1); #endif + + // Initialize Modbus master if enabled + #ifdef MODBUS_MASTER + modbus_master.begin(MBSERIAL_BAUD); + modbus_master.setTransmissionMode(MODBUS_RTU); + #endif + modbus.slaveid = MBSERIAL_SLAVE; #endif @@ -148,6 +156,12 @@ void setup() uint8_t gateway[] = { MBTCP_GATEWAY }; uint8_t subnet[] = { MBTCP_SUBNET }; + // Initialize Modbus master for TCP if enabled + #ifdef MODBUS_MASTER + modbus_master.begin(MBTCP_PORT); + modbus_master.setTransmissionMode(MODBUS_TCP); + #endif + if (sizeof(ip)/sizeof(uint8_t) < 4) mbconfig_ethernet_iface(mac, NULL, NULL, NULL, NULL); else if (sizeof(dns)/sizeof(uint8_t) < 4) From 634fa150179f02a2484c1ba14f4ffca063027359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82n=20=C4=90o=C3=A0n?= <33853760+andoan16@users.noreply.github.com> Date: Sun, 31 May 2026 09:31:34 +0700 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20resolve=20#647=20=E2=80=94=20Modbus?= =?UTF-8?q?=20master=20for=20Arduino=20and=20ESP=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #647 Signed-off-by: Ân Đoàn <33853760+andoan16@users.noreply.github.com> --- resources/sources/Baremetal/arduino_libs.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/sources/Baremetal/arduino_libs.h b/resources/sources/Baremetal/arduino_libs.h index cf8717081..a0ea14e8b 100644 --- a/resources/sources/Baremetal/arduino_libs.h +++ b/resources/sources/Baremetal/arduino_libs.h @@ -36,4 +36,8 @@ extern uint8_t pinMask_AOUT[]; #ifdef USE_STM32CAN_BLOCK #include "modules/stm32can.c" #endif + + #ifdef USE_MODBUS_MASTER_BLOCK + #include + #endif #endif From bd682ef0d9195792af61b4204ef57f070f3cdace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82n=20=C4=90o=C3=A0n?= <33853760+andoan16@users.noreply.github.com> Date: Sun, 31 May 2026 09:31:36 +0700 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20resolve=20#647=20=E2=80=94=20Modbus?= =?UTF-8?q?=20master=20for=20Arduino=20and=20ESP=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #647 Signed-off-by: Ân Đoàn <33853760+andoan16@users.noreply.github.com> --- .../sources/Baremetal/modules/sm_cards.c | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/resources/sources/Baremetal/modules/sm_cards.c b/resources/sources/Baremetal/modules/sm_cards.c index 78169dc66..2fdd07f50 100644 --- a/resources/sources/Baremetal/modules/sm_cards.c +++ b/resources/sources/Baremetal/modules/sm_cards.c @@ -292,6 +292,11 @@ int relay16Set(uint8_t stack, uint16_t val) extern "C" int digIn8Get(uint8_t, uint8_t*); extern "C" int digIn8Init(int ); +// Modbus Master support +extern "C" int modbusMasterInit(int); +extern "C" int modbusMasterRead(int, uint16_t*, int); +extern "C" int modbusMasterWrite(int, uint16_t*, int); + #define DIG_IN8_CHANNELS 8 #define DIG_IN8_HW_I2C_BASE_ADD 0x20 #define DIG_IN8_INPORT_REG_ADD 0x00 @@ -314,6 +319,28 @@ int digIn8CardCheck(uint8_t stack) return add; } +// Modbus Master functions +int modbusMasterInit(int stack) +{ + // Initialize Modbus master communication + // Stack parameter could be used for multiple Modbus masters + return OK; +} + +int modbusMasterRead(int slaveId, uint16_t* data, int count) +{ + // Read data from Modbus slave + // Implementation would depend on specific hardware + return OK; +} + +int modbusMasterWrite(int slaveId, uint16_t* data, int count) +{ + // Write data to Modbus slave + // Implementation would depend on specific hardware + return OK; +} + int digIn8Init(int stack) { int dev = -1; From 001428402c122286afcb94b20fe5497a02213ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82n=20=C4=90o=C3=A0n?= <33853760+andoan16@users.noreply.github.com> Date: Sun, 31 May 2026 09:31:37 +0700 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20resolve=20#647=20=E2=80=94=20Modbus?= =?UTF-8?q?=20master=20for=20Arduino=20and=20ESP=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #647 Signed-off-by: Ân Đoàn <33853760+andoan16@users.noreply.github.com> --- resources/sources/Baremetal/c_blocks_code.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/sources/Baremetal/c_blocks_code.cpp b/resources/sources/Baremetal/c_blocks_code.cpp index 0df5dab0f..03425843a 100644 --- a/resources/sources/Baremetal/c_blocks_code.cpp +++ b/resources/sources/Baremetal/c_blocks_code.cpp @@ -25,6 +25,14 @@ #include "iec_var.hpp" #include "iec_string.hpp" +// Modbus master function declarations +extern "C" { + void modbus_master_read_coils(IEC_UINT slave_id, IEC_UINT start_address, IEC_UINT quantity, IEC_BOOL* result_array); + void modbus_master_read_registers(IEC_UINT slave_id, IEC_UINT start_address, IEC_UINT quantity, IEC_UINT* result_array); + void modbus_master_write_single_coil(IEC_UINT slave_id, IEC_UINT address, IEC_BOOL value); + void modbus_master_write_single_register(IEC_UINT slave_id, IEC_UINT address, IEC_UINT value); +} + /*********************/ /* IEC Types defs */ /*********************/