More work on faster register reading

This commit is contained in:
Warky 2024-09-22 14:09:45 +02:00
parent 1d185ec449
commit 5252c69b5e

View File

@ -35,6 +35,10 @@ File dataFile;
NeoSWSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance NeoSWSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance
ModbusMaster node; ModbusMaster node;
unsigned long lastRefreshTime = 0;
void setup() void setup()
{ {
Serial.begin(SERIAL_BAUDRATE); // For debugging Serial.begin(SERIAL_BAUDRATE); // For debugging
@ -67,7 +71,8 @@ void setup()
// return; // return;
// } // }
// Initialize the SD. // Initialize the SD.
if (!sd.begin(SD_CONFIG)) { if (!sd.begin(SD_CONFIG))
{
sd.initErrorHalt(&Serial); sd.initErrorHalt(&Serial);
return; return;
} }
@ -75,7 +80,6 @@ void setup()
Serial.println(F("Initialize RS485 module / Modbus \n")); Serial.println(F("Initialize RS485 module / Modbus \n"));
pinMode(DE_RE_PIN, OUTPUT); pinMode(DE_RE_PIN, OUTPUT);
digitalWrite(DE_RE_PIN, LOW); // Set to LOW for receiving mode initially digitalWrite(DE_RE_PIN, LOW); // Set to LOW for receiving mode initially
modbusSerial.begin(SERIAL_BAUDRATE); modbusSerial.begin(SERIAL_BAUDRATE);
@ -83,6 +87,8 @@ void setup()
node.begin(SLAVE_ID, modbusSerial); node.begin(SLAVE_ID, modbusSerial);
node.preTransmission(preTransmission); node.preTransmission(preTransmission);
node.postTransmission(postTransmission); node.postTransmission(postTransmission);
} }
void preTransmission() void preTransmission()
@ -95,7 +101,6 @@ void postTransmission()
digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit
} }
void writeFile(char *str) void writeFile(char *str)
{ {
if (!dataFile) if (!dataFile)
@ -134,12 +139,11 @@ String getFilename()
return mb; return mb;
} }
unsigned long lastRefreshTime = 0;
String writebuffer;
void loop() void loop()
{ {
delay(100); delay(100);
String writebuffer;
if (millis() - lastRefreshTime >= 1000) if (millis() - lastRefreshTime >= 1000)
{ {
@ -150,8 +154,57 @@ void loop()
// Serial.print("\nHeep:"); // Serial.print("\nHeep:");
// Serial.print(ESP.getFreeHeap()); // Serial.print(ESP.getFreeHeap());
Serial.print("\n"); Serial.print("\n");
writebuffer = "a";
// Modbus Data Loop
for (int i = 0; i < 20; i++)
{
const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
const uint8_t regtype = pgm_read_word(&registers[i].regtype);
// Open file for writing Serial.print(F("Reg Read: "));
Serial.println(regtype);
Serial.println(regaddr);
if (regaddr > 0)
{
uint8_t result = node.readHoldingRegisters(regaddr-1, 2);
if (result == node.ku8MBSuccess)
{
if (regtype == 2)
{
writebuffer += String(getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1)),4) + ",";
}
else if (regtype == 1)
{
writebuffer += String(node.getResponseBuffer(0),10) + ",";
}
// else if (regtype == 3)
// {
// writebuffer += getRegisterInt64(node.getResponseBuffer(0), node.getResponseBuffer(1), node.getResponseBuffer(2), node.getResponseBuffer(3)) + ",";
// }
else if (regtype == 0)
{
writebuffer += String(getRegisterInt32(node.getResponseBuffer(0), node.getResponseBuffer(1)),10) + ",";
}
else {
writebuffer += "null,";
}
}
else
{
writebuffer += "E" + String(result,10) + "@" +String(regaddr) + ",";
}
}
}
Serial.print(F("\nRead buffer: "));
Serial.println(writebuffer);
delay(10);
//Write to file
String filename = getFilename(); String filename = getFilename();
dataFile.open(filename.c_str(), FILE_WRITE); dataFile.open(filename.c_str(), FILE_WRITE);
Serial.print(F("Open Card ")); Serial.print(F("Open Card "));
@ -170,42 +223,9 @@ void loop()
Serial.print(F("\n\n")); Serial.print(F("\n\n"));
} delay(100);
for (int i = 0; i < 10; i++) {
Serial.print(F("\naddress: "));
Serial.print(registers[i].regaddr);
Serial.print(F("\ntype: "));
Serial.print(registers[i].regtype);
Serial.print(F("\n "));
if (registers[i].regaddr > 0) {
uint8_t result = node.readHoldingRegisters(registers[i].regaddr-1 , 2);
if (result == node.ku8MBSuccess)
{
if (registers[i].regtype == 2) {
writebuffer += getRegisterFloat(node.getResponseBuffer(0),node.getResponseBuffer(1)) + ",";
} else if (registers[i].regtype == 1) {
writebuffer += node.getResponseBuffer(0) + ",";
} else if (registers[i].regtype == 3) {
writebuffer += getRegisterInt64(node.getResponseBuffer(0),node.getResponseBuffer(1),node.getResponseBuffer(2),node.getResponseBuffer(3)) + ",";
}else if (registers[i].regtype == 0) {
writebuffer += getRegisterInt32(node.getResponseBuffer(0),node.getResponseBuffer(1)) + ",";
}
Serial.print(F("Modbus Read successful:"));
} else {
writebuffer += "E" + result + ",";
Serial.print(F("Modbus Read error: "));
Serial.println(result, HEX);
}
}
} }
// // Check if the read was successful // // Check if the read was successful
delay(100);
} }