Activity › Forums › Questions & Troubleshooting › Modbus communication via Controllino
-
Modbus communication via Controllino
-
-
Hello Lukas,
thank you very much for your response. I would like to ask where you got those numbers from. I’ve connected my Sensor with my Computer and Software and I’ve got the start address 192.
-
I’ve also tried the simple_master Code from GitHub – smarmengol/Modbus-Master-Slave-for-Arduino: Modbus Master-Slave library for Arduino but the response I get is are weird signs and question marks. I’ve changed the address etc. in the Code to the numbers I have (in DEC) but it won’t work and I don’t know what the problem is.
-
You say weird signs and question marks? Then you have something wrong with the RS845 – baudrate, or swapped +/-.
-
I’ve chosen the right Baudrate for my serial monitor and swapped the wires but I still get those blank boxes and question marks. I really don’t know what the problem is
-
-
-
You have stated “0A 04 00 C0 00 01 30 8D where 0A is the slave address, 04 is my function code, 00C0 is my start address, 0001 is my register count and 308D is my checksum.“
C0 = 12.
-
yes but don’t I have to get it from HEX to DEC? Because then I get C0 = 192.
-
-
-
Hello Sir,
I hope you are doing well. I am also having a problem with Modbus sensors and can’t get them to work. Previously, I used ESP32 and Sparkfun RS485 Breakout and it worked fine. From my understanding, the program I use on ESP32 should work on the Controllino because the structure of the program is similar, the only difference is the pin and voltage logic (Sparkfun RS485 uses 3.3v). I also tried the provided example programs but had no luck. Perhaps my understanding is wrong somewhere. For this reason, is possible to get any information or guide to get reading from a Modbus sensor like this one;-
The program I used to read the sensor can be found in the attachment. Thank you very much for your time and support.
#include <SPI.h>
#include <Controllino.h>
float RH;
//———————————————————————————–
#define MAX_MILLIS_TO_WAIT 300
#define FRAMESIZE 9
//———————————————————————————–
#define ADDRESS 0x01 // BYTE 1
#define FUNCTION_CODE 0x04 // BYTE 2
#define BYTE_03 0x00 // BYTE 3
#define BYTE_04 0x02 // BYTE 4
#define BYTE_05 0x00 // BYTE 5
#define BYTE_06 0x01 // BYTE 6
//———————————————————————————–
void setup() {
Serial.begin(115200);
// initialize the modbus communication
Serial3.begin(9600);
Controllino_RS485Init();
Controllino_RS485RxEnable();
/* This will initialize Controllino RS485 pins */
}
void loop() {
if (runEvery(3000)) {
Serial.println(“===================================”);
uint16_t ws;
soil(&ws);
//for debugging purpose
RH = ws/10; Serial.println(” Temp: \t” + String(RH));
}
}
/////////////////////////////function: access modbus data/////////////////////
float soil(uint16_t* ws){
uint16_t temp;
unsigned long resptime;
uint8_t frame[FRAMESIZE] = {ADDRESS, FUNCTION_CODE, BYTE_03, BYTE_04, BYTE_05, BYTE_06, 0, 0, 0};
temp = calculateCRC(frame, FRAMESIZE – 3); // calculate out crc only from first 6 bytes
frame[6] = lowByte(temp);
frame[7] = highByte(temp);
Serial.println(“=========================================================”);
//=====================For debugging purposes======================//
String request = “Request: “;
for(int n=0; n<FRAMESIZE – 1; n++) {
request += frame[n] < 0x10 ? ” 0″ : ” “;
request += String(frame[n], HEX);
request.toUpperCase();
}
Serial.println(request);
//=========================================================//
Controllino_RS485TxEnable();
Serial3.write(frame, FRAMESIZE – 1); // send 8 bytes
Serial3.flush(); // wait until the trasmission is complete
Controllino_RS485RxEnable();
resptime = millis();
while ((Serial3.available() < FRAMESIZE) && ((millis() – resptime) < MAX_MILLIS_TO_WAIT) ) {
delay(50);
}
String Response = “Response: “;
if(Serial3.available()) {
for(int n=0; n<FRAMESIZE – 2; n++) {
frame[n] = Serial3.read();
//debugging//
Response += frame[n] < 0x10 ? ” 0″ : ” “;
Response += String(frame[n], HEX);
Response.toUpperCase();
Serial.println(Response);
//debugging//
}
*ws = ((uint16_t)frame[3] << 8) | frame[4];
}
}
/////////////////////////////function: access modbus data/////////////////////
uint16_t calculateCRC(uint8_t *array, uint8_t num) {
uint16_t temp, flag;
temp = 0xFFFF;
for (uint8_t i = 0; i < num; i++) {
temp = temp ^ array[i];
for (uint8_t j = 8; j; j–) {
flag = temp & 0x0001;
temp >>= 1;
if (flag)
temp ^= 0xA001;
}
}
return temp;
}
//————————————————-//
boolean runEvery(unsigned long interval)
{
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis – previousMillis >= interval)
{
previousMillis = currentMillis;
return true;
}
return false;
}
-
I am not sure whether you only want to use the board, but ,if you are open to use the controllino only, you should use the Modbus RTU example from the controllino page. You should use the modbusRtu.h that is provided by the controllino team(very important: you should see modified by controllino team in the modbusRtu.h ) After that, all you need to do is change the given example according to your need.
-
-
-
Hello,
it’s working now. I had to change the parity. 🙂
Log in to reply.