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

@ -6,15 +6,15 @@
#include "util.h" #include "util.h"
#include "register_map_pm8000.h" #include "register_map_pm8000.h"
//#include <SD.h> // #include <SD.h>
#include <SPI.h> #include <SPI.h>
#include <SdFat.h> #include <SdFat.h>
#define SD_CS_PIN 10 // Chip Select for SD Card #define SD_CS_PIN 10 // Chip Select for SD Card
//RS485 pins // RS485 pins
#define DE_RE_PIN 4 #define DE_RE_PIN 4
#define RX_PIN 8 // SoftwareSerial RX pin #define RX_PIN 8 // SoftwareSerial RX pin
#define TX_PIN 7 // SoftwareSerial TX pin #define TX_PIN 7 // SoftwareSerial TX pin
#define SLAVE_ID 101 #define SLAVE_ID 101
#define SERIAL_BAUDRATE 9600 #define SERIAL_BAUDRATE 9600
@ -24,65 +24,71 @@
#define SD_CONFIG SdioConfig(FIFO_SDIO) #define SD_CONFIG SdioConfig(FIFO_SDIO)
#elif ENABLE_DEDICATED_SPI #elif ENABLE_DEDICATED_SPI
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK)
#else // HAS_SDIO_CLASS #else // HAS_SDIO_CLASS
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK)
#endif // HAS_SDIO_CLASS #endif // HAS_SDIO_CLASS
RTC_DS3231 rtc; // Create an RTC object RTC_DS3231 rtc; // Create an RTC object
SdFat32 sd; SdFat32 sd;
//SdExFat sd; // SdExFat sd;
File dataFile; 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
Serial.println(F("Startup \n")); Serial.println(F("Startup \n"));
// Initialize RTC // Initialize RTC
if (!rtc.begin()) if (!rtc.begin())
{ {
Serial.println(F("Couldn't find RTC\n")); Serial.println(F("Couldn't find RTC\n"));
} }
if (rtc.lostPower()) if (rtc.lostPower())
{ {
Serial.println(F("RTC lost power, let's set the time!\n")); Serial.println(F("RTC lost power, let's set the time!\n"));
// Comment out the following line once the time is set to avoid resetting on every start // Comment out the following line once the time is set to avoid resetting on every start
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
} }
Serial.print(F("Time: ")); Serial.print(F("Time: "));
Serial.print(rtc.now().timestamp()); Serial.print(rtc.now().timestamp());
Serial.println(F("\n")); Serial.println(F("\n"));
// Initialize SD card // Initialize SD card
Serial.println(F("SD card initializing...")); Serial.println(F("SD card initializing..."));
pinMode(SD_CS_PIN, OUTPUT); pinMode(SD_CS_PIN, OUTPUT);
// if (!SD.begin(SPI_HALF_SPEED, SD_CS_PIN )) // if (!SD.begin(SPI_HALF_SPEED, SD_CS_PIN ))
// { // {
// Serial.println(F("SD card initialization failed!\n")); // Serial.println(F("SD card initialization failed!\n"));
// return; // return;
// } // }
// Initialize the SD. // Initialize the SD.
if (!sd.begin(SD_CONFIG)) { if (!sd.begin(SD_CONFIG))
sd.initErrorHalt(&Serial); {
return; sd.initErrorHalt(&Serial);
} return;
Serial.println(F("SD card initialized.\n")); }
Serial.println(F("SD card initialized.\n"));
Serial.println(F("Initialize RS485 module / Modbus \n")); Serial.println(F("Initialize RS485 module / Modbus \n"));
pinMode(DE_RE_PIN, OUTPUT);
digitalWrite(DE_RE_PIN, LOW); // Set to LOW for receiving mode initially
modbusSerial.begin(SERIAL_BAUDRATE);
node.begin(SLAVE_ID, modbusSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
pinMode(DE_RE_PIN, OUTPUT);
digitalWrite(DE_RE_PIN, LOW); // Set to LOW for receiving mode initially
modbusSerial.begin(SERIAL_BAUDRATE);
node.begin(SLAVE_ID, modbusSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
} }
void preTransmission() void preTransmission()
@ -95,117 +101,131 @@ 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)
{ {
Serial.println(F("Error opening file")); Serial.println(F("Error opening file"));
return; return;
} }
DateTime now = rtc.now(); DateTime now = rtc.now();
// Log the current date and time // Log the current date and time
dataFile.print(now.year(), DEC); dataFile.print(now.year(), DEC);
dataFile.print('-'); dataFile.print('-');
dataFile.print(now.month(), DEC); dataFile.print(now.month(), DEC);
dataFile.print('-'); dataFile.print('-');
dataFile.print(now.day(), DEC); dataFile.print(now.day(), DEC);
dataFile.print(" "); dataFile.print(" ");
dataFile.print(now.hour(), DEC); dataFile.print(now.hour(), DEC);
dataFile.print(':'); dataFile.print(':');
dataFile.print(now.minute(), DEC); dataFile.print(now.minute(), DEC);
dataFile.print(':'); dataFile.print(':');
dataFile.print(now.second(), DEC); dataFile.print(now.second(), DEC);
dataFile.print(F(",")); dataFile.print(F(","));
dataFile.print(str); dataFile.print(str);
dataFile.println(); dataFile.println();
} }
String getFilename() String getFilename()
{ {
DateTime now = rtc.now(); DateTime now = rtc.now();
String mb = F(""); String mb = F("");
mb += now.year(); mb += now.year();
mb += now.month(); mb += now.month();
mb += now.day(); mb += now.day();
mb += F(".csv"); mb += F(".csv");
return mb; return mb;
} }
unsigned long lastRefreshTime = 0;
String writebuffer;
void loop() void loop()
{ {
delay(100); delay(100);
String writebuffer;
if (millis() - lastRefreshTime >= 1000)
{
lastRefreshTime += 1000;
if(millis() - lastRefreshTime >= 1000) Serial.print(F("\nTime: "));
Serial.print(rtc.now().timestamp());
// Serial.print("\nHeep:");
// Serial.print(ESP.getFreeHeap());
Serial.print("\n");
writebuffer = "a";
// Modbus Data Loop
for (int i = 0; i < 20; i++)
{ {
lastRefreshTime += 1000; const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
const uint8_t regtype = pgm_read_word(&registers[i].regtype);
Serial.print(F("\nTime: ")); Serial.print(F("Reg Read: "));
Serial.print(rtc.now().timestamp()); Serial.println(regtype);
// Serial.print("\nHeep:"); Serial.println(regaddr);
// Serial.print(ESP.getFreeHeap());
Serial.print("\n");
// Open file for writing
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 (regaddr > 0)
if (dataFile)
{ {
dataFile.close(); // Close the file uint8_t result = node.readHoldingRegisters(regaddr-1, 2);
Serial.print(F("Data written to SD card: "));
Serial.print(filename.c_str());
Serial.print(F("\n"));
}
Serial.print(F("\n\n")); if (result == node.ku8MBSuccess)
{
} if (regtype == 2)
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 += String(getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1)),4) + ",";
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);
} }
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) + ",";
}
}
} }
// // Check if the read was successful 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)
{
dataFile.close(); // Close the file
Serial.print(F("Data written to SD card: "));
Serial.print(filename.c_str());
Serial.print(F("\n"));
}
Serial.print(F("\n\n"));
delay(100); delay(100);
}
// // Check if the read was successful
} }