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) 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 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 */ /*********************/ 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;