diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index e557383..fe29687 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -51,6 +51,9 @@ jobs: - fqbn: arduino:mbed_portenta:envie_m7 ethernet: false nina: false + - fqbn: arduino:mbed_opta:opta + ethernet: true + nina: false # Make board type-specific customizations to the matrix jobs include: diff --git a/examples/RTU/ModbusRTUClientParameters/ModbusRTUClientParameters.ino b/examples/RTU/ModbusRTUClientParameters/ModbusRTUClientParameters.ino new file mode 100644 index 0000000..91b9ec4 --- /dev/null +++ b/examples/RTU/ModbusRTUClientParameters/ModbusRTUClientParameters.ino @@ -0,0 +1,75 @@ +/* + Modbus RTU Client Parameters + + This sketch is the same as ModbusRTUClientToggle and shows how to set + a few RS485 parameters. + + Circuit: + - Arduino Opta + - GND connected to GND of the Modbus RTU server + - A(-) connected to A of the Modbus RTU server + - B(+) connected to B of the Modbus RTU server +*/ + +#include // ArduinoModbus depends on the ArduinoRS485 library +#include + +constexpr auto baudrate { 19200 }; + +// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification +// +// MODBUS over serial line specification and implementation guide V1.02 +// Paragraph 2.5.1.1 MODBUS Message RTU Framing +// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf +constexpr auto bitduration { 1.f / baudrate }; +constexpr auto wordlen { 9.6f }; // try also with 10.0f +constexpr auto preDelayBR { bitduration * wordlen * 3.5f * 1e6 }; +constexpr auto postDelayBR { bitduration * wordlen * 3.5f * 1e6 }; + +void setup() { + Serial.begin(9600); + while (!Serial); + + Serial.println("Modbus RTU Client Toggle w/ Parameters"); + + RS485.setDelays(preDelayBR, postDelayBR); + + // start the Modbus RTU client in 8E1 mode + if (!ModbusRTUClient.begin(baudrate, SERIAL_8E1)) { + Serial.println("Failed to start Modbus RTU Client!"); + while (1); + } +} + +void loop() { + // for (slave) id 1: write the value of 0x01, to the coil at address 0x00 + if (!ModbusRTUClient.coilWrite(1, 0x00, 0x01)) { + Serial.print("Failed to write coil! "); + Serial.println(ModbusRTUClient.lastError()); + } + + // wait for 0.5 second + delay(500); + + // for (slave) id 1: write the value of 0x00, to the coil at address 0x00 + if (!ModbusRTUClient.coilWrite(1, 0x00, 0x00)) { + Serial.print("Failed to write coil! "); + Serial.println(ModbusRTUClient.lastError()); + } + + // wait for 0.5 second + delay(500); + + auto coil = ModbusRTUClient.coilRead(0x02, 0x00); + + if (coil < 0) { + Serial.print("Failed to read coil: "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.print("Coil: "); + Serial.println(coil); + } + + // wait for 0.5 second + delay(500); +} diff --git a/library.properties b/library.properties index 40eebe3..adacb35 100644 --- a/library.properties +++ b/library.properties @@ -6,6 +6,6 @@ sentence=Use Modbus equipment with your Arduino. paragraph=Using TCP or RS485 shields, like the MKR 485 Shield. This library depends on the ArduinoRS485 library. category=Communication url=https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus -architectures=megaavr,samd,mbed_nano,mbed_portenta +architectures=megaavr,samd,mbed_nano,mbed_portenta,mbed_opta includes=ArduinoModbus.h depends=ArduinoRS485