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,12 +6,12 @@
#include "util.h"
#include "register_map_pm8000.h"
//#include <SD.h>
// #include <SD.h>
#include <SPI.h>
#include <SdFat.h>
#define SD_CS_PIN 10 // Chip Select for SD Card
//RS485 pins
// RS485 pins
#define DE_RE_PIN 4
#define RX_PIN 8 // SoftwareSerial RX pin
#define TX_PIN 7 // SoftwareSerial TX pin
@ -30,11 +30,15 @@
RTC_DS3231 rtc; // Create an RTC object
SdFat32 sd;
//SdExFat sd;
// SdExFat sd;
File dataFile;
NeoSWSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance
ModbusMaster node;
unsigned long lastRefreshTime = 0;
void setup()
{
Serial.begin(SERIAL_BAUDRATE); // For debugging
@ -67,7 +71,8 @@ void setup()
// return;
// }
// Initialize the SD.
if (!sd.begin(SD_CONFIG)) {
if (!sd.begin(SD_CONFIG))
{
sd.initErrorHalt(&Serial);
return;
}
@ -75,7 +80,6 @@ void setup()
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);
@ -83,6 +87,8 @@ void setup()
node.begin(SLAVE_ID, modbusSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void preTransmission()
@ -95,7 +101,6 @@ void postTransmission()
digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit
}
void writeFile(char *str)
{
if (!dataFile)
@ -134,14 +139,13 @@ String getFilename()
return mb;
}
unsigned long lastRefreshTime = 0;
String writebuffer;
void loop()
{
delay(100);
String writebuffer;
if(millis() - lastRefreshTime >= 1000)
if (millis() - lastRefreshTime >= 1000)
{
lastRefreshTime += 1000;
@ -150,8 +154,57 @@ void loop()
// Serial.print("\nHeep:");
// Serial.print(ESP.getFreeHeap());
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();
dataFile.open(filename.c_str(), FILE_WRITE);
Serial.print(F("Open Card "));
@ -170,42 +223,9 @@ void loop()
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
delay(100);
}