I am using ModbusRTUSlave (Bulliner) library to convert arduino Nano to modbus RTU slave which communicates with PC via QModmaster software. (TCP/IP) I am using a Schneider LInk-150 RS485 to Ethernet Gateway module to connect Arduino to PC. {Arduino TTL output is first converted to RS485 signal via a TTL-RS485 onverter). The setup works fine for reading holding registers and coils but write function never works. What can be the issue? Qmodmaster throws an error "Illegal function" when tried to Write to holding register or coil.
Code is given below:
`
#include <ModbusRTUSlave.h>
#define MODBUS_SERIAL Serial
ModbusRTUSlave modbus(MODBUS_SERIAL, 8); //dePin No
bool coils[2];
bool discreteInputs[2];
uint16_t holdingRegisters[3];
uint16_t inputRegisters[2];
uint16_t out;
void setup() {
modbus.configureCoils(coils, 2);
modbus.configureDiscreteInputs(discreteInputs, 2);
modbus.configureHoldingRegisters(holdingRegisters, 3);
modbus.configureInputRegisters(inputRegisters, 2);
MODBUS_SERIAL.begin(9600, SERIAL_8N1);
modbus.begin(1, 9600, SERIAL_8N1);
}
void loop() {
holdingRegisters[0] = rand();
holdingRegisters[1] = rand();
out= holdingRegisters[2];
coils[0]=0;
coils[1]=1;
modbus.poll();
}
Code is given below:
`
#include <ModbusRTUSlave.h>
#define MODBUS_SERIAL Serial
ModbusRTUSlave modbus(MODBUS_SERIAL, 8); //dePin No
bool coils[2];
bool discreteInputs[2];
uint16_t holdingRegisters[3];
uint16_t inputRegisters[2];
uint16_t out;
void setup() {
modbus.configureCoils(coils, 2);
modbus.configureDiscreteInputs(discreteInputs, 2);
modbus.configureHoldingRegisters(holdingRegisters, 3);
modbus.configureInputRegisters(inputRegisters, 2);
MODBUS_SERIAL.begin(9600, SERIAL_8N1);
modbus.begin(1, 9600, SERIAL_8N1);
}
void loop() {
holdingRegisters[0] = rand();
holdingRegisters[1] = rand();
out= holdingRegisters[2];
coils[0]=0;
coils[1]=1;
modbus.poll();
}