diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index b344943..fe29687 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -39,24 +39,21 @@ jobs: matrix: board: - - fqbn: arduino:avr:nano - ethernet: true - nina: false - - fqbn: arduino:avr:leonardo - ethernet: true - nina: false - fqbn: arduino:megaavr:uno2018:mode=off ethernet: true nina: true - fqbn: arduino:samd:mkrwifi1010 ethernet: true nina: true - - fqbn: arduino:mbed:nano33ble + - fqbn: arduino:mbed_nano:nano33ble ethernet: false nina: false - - fqbn: arduino:mbed:envie_m7 + - 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 02761ad..4a076b3 100644 --- a/library.properties +++ b/library.properties @@ -1,11 +1,11 @@ name=ArduinoModbus -version=1.0.7 +version=1.0.8 author=Arduino maintainer=Arduino 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=* +architectures=megaavr,samd,mbed_nano,mbed_portenta,mbed_opta includes=ArduinoModbus.h depends=ArduinoRS485