Sub Process_Globals
Public Serial1 As Serial
Private Result As Int
End Sub
Private Sub AppStart
Serial1.Initialize(115200)
Log("AppStart")
RunNative("readModbusRegisters", Null)
Log("Resultado: ", Result)
End Sub
#if C
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
SoftwareSerial S(4, 5); // RX = GPIO4 (D2), TX = GPIO5 (D1)
ModbusMaster node;
#define DE_PIN 4 // Pin para controlar DE/RE del módulo RS485
void preTransmission() {
digitalWrite(DE_PIN, HIGH); // Habilitar la transmisión
}
void postTransmission() {
digitalWrite(DE_PIN, LOW); // Habilitar la recepción
}
void setup() {
pinMode(DE_PIN, OUTPUT);
digitalWrite(DE_PIN, LOW); // Empieza en modo recepción
S.begin(9600); // Asegúrate de que la velocidad coincide con el dispositivo Modbus
node.begin(1, S); // Dirección del dispositivo Modbus
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
Serial.begin(115200); // Velocidad para depuración
Serial.println("Iniciando comunicación Modbus RTU...");
}
void readModbusRegisters(B4R::Object* o) {
uint8_t result;
uint16_t data[2];
result = node.readHoldingRegisters(0x0300, 2);
if (result == node.ku8MBSuccess) {
data[0] = node.getResponseBuffer(0);
data[1] = node.getResponseBuffer(1);
uint32_t serialNumber = (data[0] << 16) | data[1];
Serial.printf("Número de serie: %08X\n", serialNumber);
b4r_main::_result = serialNumber; // Asigna el resultado a la variable global de B4R
} else {
Serial.printf("Error en la comunicación Modbus: %d\n", result);
b4r_main::_result = -1; // Indica un error
}
}
#End if