# Comunicação Arduino com Modbus Serial

**URL:** <https://forum.fazedores.com/t/comunicacao-arduino-com-modbus-serial/8304>\
**Category:** Arduino\
**Created:** [Julho 23, 2021, 1:11pm UTC](https://forum.fazedores.com/t/comunicacao-arduino-com-modbus-serial/8304 "2021-07-23T13:11:24Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Patrick](https://avatars.discourse-cdn.com/v4/letter/p/b2d939/32.png) [@Patrick](https://forum.fazedores.com/u/Patrick)\
**Post date:** [Julho 23, 2021, 1:11pm UTC](https://forum.fazedores.com/t/comunicacao-arduino-com-modbus-serial/8304/1 "2021-07-23T13:11:24Z")

</div>

Bom dia pessoal!

Estou tentando fazer a comunicação de um arduino Uno R3 com um sensor ultrassônico com o ScadaBR através do protocolo Modbus Serial mas não tenho certeza se meu código está certo.

O sensor faz a leitura perfeitamente e exibe no monitor serial mas na hora de colocar para exibir no data point do ScadaBR ele não exibe os dados do sensor e só aparece um “n/a” ao invés de exibir os dados. Não consegui resolver esse erro e preciso de ajuda.

Alguém aqui tem conhecimento nesse assunto para me ajudar?

Agradeço.

O código é esse aqui:

// C++ code  
//

#include \<ModbusSerial.h\>  
#include \<SoftwareSerial.h\>  
#include \<SimpleModbusSlave.h\>

#define sensor

enum  
{  
VALOR\_ALT,  
VALOR\_CAP,  
HOLDING\_REGS\_SIZE  
};

unsigned int holdingRegs[HOLDING\_REGS\_SIZE];

long readUltrasonicDistance(int triggerPin, int echoPin)  
{  
pinMode(triggerPin, OUTPUT); // Clear the trigger  
digitalWrite(triggerPin, LOW);  
delayMicroseconds(2);  
// Sets the trigger pin to HIGH state for 10 microseconds  
digitalWrite(triggerPin, HIGH);  
delayMicroseconds(10);  
digitalWrite(triggerPin, LOW);  
pinMode(echoPin, INPUT);  
// Reads the echo pin, and returns the sound wave travel time in microseconds  
return pulseIn(echoPin, HIGH);  
}

void setup()  
{  
Serial.begin(9600);

/\* configura cominicação modbus \* 9600 bps, 8N1, RS485 network \*/

modbus\_configure(&Serial, 9600, SERIAL\_8N1, 1, 2, HOLDING\_REGS\_SIZE, holdingRegs);

modbus\_update\_comms(9600, SERIAL\_8N1, 1);

}

void loop()

if (0.01723 \* readUltrasonicDistance(A1, A0) \> 0) {  
VALOR\_ALT = 0.01723 \* readUltrasonicDistance(A1, A0);  
}  
if (VALOR\_ALT \<= 50) {  
VALOR\_CAP = 100;  
Serial.println(VALOR\_CAP);  
} else {  
if (VALOR\_ALT \<= 90 && VALOR\_ALT \>= 51) {  
VALOR\_CAP = 80;  
Serial.println(VALOR\_CAP);  
} else {  
if (VALOR\_ALT \<= 130 && VALOR\_ALT \>= 91) {  
VALOR\_CAP = 60;  
Serial.println(VALOR\_CAP);  
} else {  
if (VALOR\_ALT \<= 170 && VALOR\_ALT \>= 131) {  
VALOR\_CAP = 40;  
Serial.println(VALOR\_CAP);  
} else {  
if (VALOR\_ALT \<= 210 && VALOR\_ALT \>= 171) {  
VALOR\_CAP = 20;  
Serial.println(VALOR\_CAP);  
} else {  
if (VALOR\_ALT \<= 300 && VALOR\_ALT \>= 211) {  
Serial.println(“Alerta”);  
}  
}  
}  
}  
}  
}  
{  
modbus\_update();

```
 holdingRegs[VALOR_ALT] = analogRead(A0); 
 
 analogWrite( A1, holdingRegs[VALOR_CAP]);   

```

}

delay(10); // Delay a little bit to improve simulation performance  
}

---

<div class="post-metadata">

**Author:** ![Anilson](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.fazedores.com/anilson/32/3410_2.png) [@Anilson](https://forum.fazedores.com/u/Anilson)\
**Post date:** [Outubro 19, 2021, 2:40pm UTC](https://forum.fazedores.com/t/comunicacao-arduino-com-modbus-serial/8304/2 "2021-10-19T14:40:43Z")

</div>

Inverta os dois fios do Modbus (pode ser isto).  
Já fiz o teste com o ScadaBR e ele acha o Arduino (protocolo Modbus Serial ) com facilidade.
