I'm trying to communicate with a temperature controller using Modbus RTU. I used this Arduino library.
I was able to read PV(current temperature value) using below code. It uses Function code 4.
I want to set SV value(Set Value) using Function code 6
I replaced telegram.u8fct = 0x04;
to telegram.u8fct = 0x06;
and telegram.u16RegAdd = 0x03E8;
to relevant address for SV. But, I couldn't get success.
How can I implement Function Code 6 in this library ?
Code for read PV as below. Its working properly.
#include <ModbusRtu.h>
// data array for modbus network sharing
uint16_t au16data[16];
uint8_t u8state;
/**
Modbus object declaration
u8id : node id = 0 for master, = 1..247 for slave
u8serno : serial port (use 0 for Serial)
u8txenpin : 0 for RS-232 and USB-FTDI
or any pin number > 1 for RS-485
*/
//TRANSMISSION CONTROL PIN - 8
//HADWARE SERIAL NUMBER - 2
Modbus master(0, 2, 8); // this is master and RS-232 or USB-FTDI
/*
This is an structe which contains a query to an slave device
*/
modbus_t telegram;
unsigned long u32wait;
void setup() {
Serial.begin(9600);
master.begin(9600); // baud-rate at 9600
master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
u32wait = millis() + 1000;
u8state = 0;
}
void loop() {
switch ( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // wait state
break;
case 1:
telegram.u8id = 0x01; // slave address
telegram.u8fct = 0x04; // function code (this one is registers read)
telegram.u16RegAdd = 0x03E8; // start address in slave [CHANNEL 1 PV]
telegram.u16CoilsNo = 0x01; // number of elements (coils or registers) to read
telegram.au16reg = au16data; // pointer to a memory array in the Arduino
master.query( telegram ); // send query (only once)
u8state++;
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 100;
Serial.println(au16data[0]);//PRINT TEMPARATURE VALUE
}
break;
}
}