From ed421346a9797fc62c8706fb31bc67cb37ebc96d Mon Sep 17 00:00:00 2001 From: Hein Date: Mon, 23 Sep 2024 18:49:42 +0200 Subject: [PATCH] Stable running reads --- .../modbus-sd-pm8000/modbus-sd-pm8000.ino | 86 +++++++++++-------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/firmware/modbus-sd/modbus-sd-pm8000/modbus-sd-pm8000.ino b/firmware/modbus-sd/modbus-sd-pm8000/modbus-sd-pm8000.ino index 7509645..7261613 100644 --- a/firmware/modbus-sd/modbus-sd-pm8000/modbus-sd-pm8000.ino +++ b/firmware/modbus-sd/modbus-sd-pm8000/modbus-sd-pm8000.ino @@ -36,8 +36,7 @@ NeoSWSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance ModbusMaster node; unsigned long lastRefreshTime = 0; - - +bool headerWritten = false; void setup() { @@ -87,21 +86,22 @@ void setup() node.begin(SLAVE_ID, modbusSerial); node.preTransmission(preTransmission); node.postTransmission(postTransmission); - - } void preTransmission() { + // Serial.println(F("Transmitting Start")); digitalWrite(DE_RE_PIN, HIGH); // Enable RS485 transmit } void postTransmission() { + digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit + // Serial.println(F("Transmitting End")); } -void writeFile(char *str) +void primeFileDate() { if (!dataFile) { @@ -110,6 +110,7 @@ void writeFile(char *str) } DateTime now = rtc.now(); // Log the current date and time + dataFile.print("\n"); dataFile.print(now.year(), DEC); dataFile.print('-'); dataFile.print(now.month(), DEC); @@ -122,9 +123,6 @@ void writeFile(char *str) dataFile.print(':'); dataFile.print(now.second(), DEC); dataFile.print(F(",")); - dataFile.print(str); - - dataFile.println(); } String getFilename() @@ -139,6 +137,7 @@ String getFilename() return mb; } +// const char[20] filename = "20240523.csv"; void loop() { @@ -153,10 +152,34 @@ void loop() Serial.print(rtc.now().timestamp()); // Serial.print("\nHeep:"); // Serial.print(ESP.getFreeHeap()); + const uint16_t totalReg = sizeof(registers) / sizeof(registers[0]); + // Open File + String filename = getFilename(); + Serial.print(F("Open Card ")); + Serial.print(filename.c_str()); Serial.print("\n"); - writebuffer = "a"; + if (!dataFile.open(filename.c_str(), FILE_WRITE)) + { + Serial.println(F("Failed to Open Card ")); + } + if (!headerWritten) + { + dataFile.print("\nDate Time,"); + for (int i = 0; i < totalReg; i++) + { + const uint16_t regaddr = pgm_read_word(®isters[i].regaddr); + dataFile.print("Addr @ "); + dataFile.print(regaddr); + dataFile.print(","); + } + headerWritten = true; + } + primeFileDate(); + Serial.print("\n"); + + Serial.println(totalReg); // Modbus Data Loop - for (int i = 0; i < 20; i++) + for (int i = 0; i < totalReg; i++) { const uint16_t regaddr = pgm_read_word(®isters[i].regaddr); const uint8_t regtype = pgm_read_word(®isters[i].regtype); @@ -164,54 +187,50 @@ void loop() Serial.print(F("Reg Read: ")); Serial.println(regtype); Serial.println(regaddr); - - + if (regaddr > 0) { - uint8_t result = node.readHoldingRegisters(regaddr-1, 2); + delay(50); //Gives the pending communication a little delay + uint8_t result = node.readHoldingRegisters(regaddr - 1, 2); + delay(50); //Delay the read for a little bit so that the buffer can be read if (result == node.ku8MBSuccess) { if (regtype == 2) { - writebuffer += String(getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1)),4) + ","; + dataFile.print(getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1))); } else if (regtype == 1) { - writebuffer += String(node.getResponseBuffer(0),10) + ","; + dataFile.print(node.getResponseBuffer(0)); } // else if (regtype == 3) // { - // writebuffer += getRegisterInt64(node.getResponseBuffer(0), node.getResponseBuffer(1), node.getResponseBuffer(2), node.getResponseBuffer(3)) + ","; + // dataFile.print(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,"; + dataFile.print(getRegisterInt32(node.getResponseBuffer(0), node.getResponseBuffer(1))); + } + else + { + dataFile.print(F("null")); } - } else { - writebuffer += "E" + String(result,10) + "@" +String(regaddr) + ","; + Serial.print(F("Reg Error: ")); + Serial.print(result, HEX); + Serial.print("\n"); + dataFile.print(F("E")); + dataFile.print(result, HEX); } + dataFile.print(","); } } - + Serial.print(F("\nRead buffer: ")); - Serial.println(writebuffer); - delay(10); - //Write to file - String filename = getFilename(); - dataFile.open(filename.c_str(), FILE_WRITE); - Serial.print(F("Open Card ")); - Serial.print(filename.c_str()); - Serial.print("\n"); - - writeFile(writebuffer.c_str()); if (dataFile) { @@ -224,7 +243,6 @@ void loop() Serial.print(F("\n\n")); delay(100); - } // // Check if the read was successful