Changes for the Arduino Mega setups

This commit is contained in:
2024-12-07 10:20:29 +02:00
parent dc2b3429a6
commit 4c77b98388
45 changed files with 1705 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
#include <ModbusMaster.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "register_map_pm8000.h"
#define SIM808_RX 2
#define SIM808_TX 3
#define RS485_DE_RE 4
#define RS485_RX 8
#define RS485_TX 7
#define LED_A 3
#define LED_B 5
SoftwareSerial sim808(SIM808_RX, SIM808_TX);
SoftwareSerial rs485(RS485_RX, RS485_TX);
ModbusMaster modbus;
TinyGPSPlus gps;
const char APN[] = "your_apn_here";
const char SERVER_URL[] = "http://your-server-url.com/upload";
const int SLAVE_ID = 101;
const long INTERVAL = 60000; // 1 minute
unsigned long lastSendTime = 0;
void setup() {
Serial.begin(9600);
sim808.begin(9600);
rs485.begin(9600);
pinMode(RS485_DE_RE, OUTPUT);
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
digitalWrite(RS485_DE_RE, LOW);
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, LOW);
modbus.begin(SLAVE_ID, rs485);
// Initialize SIM808
sim808.println("AT+CGNSPWR=1"); // Turn on GNSS
delay(1000);
sim808.println("AT+CGNSSEQ=\"RMC\""); // Set NMEA sentence to RMC
delay(1000);
sim808.println("AT+CGDCONT=1,\"IP\",\"" + String(APN) + "\"");
delay(1000);
sim808.println("AT+HTTPINIT");
delay(1000);
Serial.println("Setup complete");
}
void loop() {
unsigned long currentTime = millis();
// Read GPS data
while (sim808.available()) {
gps.encode(sim808.read());
}
if (currentTime - lastSendTime >= INTERVAL) {
lastSendTime = currentTime;
String data = createDataString();
sendDataToServer(data);
}
}
String createDataString() {
String data = "";
// Add GPS data
if (gps.location.isValid()) {
data += String(gps.location.lat(), 6) + "," + String(gps.location.lng(), 6) + ",";
} else {
data += "0.000000,0.000000,";
}
// Read Modbus registers
for (int i = 0; i < sizeof(registers) / sizeof(registers[0]); i++) {
uint16_t result = modbus.readHoldingRegisters(registers[i].address - 1, 2);
if (result == modbus.ku8MBSuccess) {
switch (registers[i].type) {
case 2: // Float
data += String(modbus.getResponseBuffer(0)) + ",";
break;
case 1: // Integer
data += String(modbus.getResponseBuffer(0)) + ",";
break;
case 0: // Long
uint32_t longValue = (modbus.getResponseBuffer(0) << 16) | modbus.getResponseBuffer(1);
data += String(longValue) + ",";
break;
}
} else {
data += "ERROR,";
digitalWrite(LED_B, HIGH);
}
}
return data;
}
void sendDataToServer(String data) {
sim808.println("AT+HTTPDATA=" + String(data.length()) + ",10000");
delay(1000);
sim808.println(data);
delay(1000);
sim808.println("AT+HTTPACTION=1"); // POST request
// Wait for response
unsigned long start = millis();
while (millis() - start < 10000) {
if (sim808.available()) {
String response = sim808.readString();
if (response.indexOf("+HTTPACTION: 1,200") != -1) {
digitalWrite(LED_A, HIGH);
delay(200);
digitalWrite(LED_A, LOW);
Serial.println("Data sent successfully");
return;
}
}
}
digitalWrite(LED_B, HIGH);
delay(200);
digitalWrite(LED_B, LOW);
Serial.println("Failed to send data");
}

View File

@@ -0,0 +1,216 @@
# Modbus Reading and GSM/GPS Data Logging for Schneider PowerLogic PM8000 using SIM808 Breakout - GSM & GPS, BAT Input
This is a specification and implementation of an Arduino-based Modbus data logger with GSM data transmission and GPS location tracking for the Schneider PowerLogic PM8000. This software is designed for Vivarox EMS and only Vivarox has the right to use and modify this software.
## Arduino Implementation:
This project uses an Arduino to connect to Modbus devices, read information, transmit it via GSM to a remote server, and provide GPS location data.
### Hardware needed:
1. Arduino Board
Recommended: Arduino MEGA 2560 (for more memory and I/O pins) or Arduino UNO (for simpler projects).
2. RS485 to TTL Module
Allows communication between the Arduino and Modbus devices using the RS485 protocol.
3. SIM808 Breakout - GSM & GPS, BAT Input
Enables the Arduino to send data over cellular networks and provide GPS location data.
4. Power Supply
To power the Arduino and connected peripherals. The SIM808 module requires a dedicated power supply capable of providing up to 2A current.
5. LED Indicators
Two LEDs for status indication.
6. Capacitors
100uF and 10uF capacitors for power supply stabilization.
7. GPS Antenna
For receiving GPS signals.
### Wiring
#### Wiring Diagram
```
Arduino Mega/Uno SIM808 Breakout Description
----------------- --------------- -----------
5V ----> VCC Power supply (via 2A dedicated supply)
GND ----> GND Ground
2 (RX) <---- TX SIM808 TX to Arduino RX
3 (TX) ----> RX Arduino TX to SIM808 RX
7 ----> DI (RS485) RS485 Driver Input
8 <---- RO (RS485) RS485 Receiver Output
4 ----> DE/RE (RS485) RS485 Driver Enable/Receiver Enable
3 ----> LED A Status LED A
5 ----> LED B Status LED B
Power Supply
------------
VCC ----> + (2A) Dedicated 2A power supply positive
GND ----> - (GND) Dedicated 2A power supply ground
Capacitors
----------
VCC ----|(---- GND 100uF capacitor
VCC ---||---- GND 10uF capacitor
GPS Antenna
|
|
[SIM808 Breakout Module]
```
#### Wiring Notes:
1. Ensure the power supply can provide 2A current.
2. Place the 100uF and 10uF capacitors as close to the SIM808 module's power pins as possible.
3. The RS485 connections are optional and depend on your specific requirements.
4. LEDs should be connected with appropriate current-limiting resistors (not shown in diagram).
5. The SIM808 module's GPS antenna should be connected securely.
6. Double-check all connections before powering on the system.
### Software
- Modbus Library: ModbusMaster
- GSM/GPS Library: TinyGSM (recommended for SIM808)
- NeoSWSerial: For better latency on software serial communication with Modbus
### Implementation Details
1. Modbus Configuration:
- Slave ID: 101
- Baud Rate: 9600
- Register map: Defined in separate "register_map_pm8000.h" file
2. Data Logging and Transmission:
- Frequency: Readings taken and transmitted every minute
- Data Format: CSV (Comma-Separated Values) string
- Data Structure: Timestamp, GPS coordinates, followed by register values
- Header Row: Includes register addresses for easy identification
3. Register Types Supported:
- Float (32-bit)
- Integer (32-bit)
- String (up to 20 characters)
4. Error Handling and Status Indication:
- LED A: Indicates successful data transmission
- LED B: Indicates errors (e.g., GSM issues, Modbus communication errors)
- Serial output for debugging (9600 baud)
5. GPS Functionality:
- Provides real-time location data
- Supports various NMEA sentences (GGA, GSA, GSV, RMC)
- Can be used for geofencing applications
6. Special Features:
- Robust error handling for GSM/GPS and Modbus communication
- Header sent once at the beginning of each session
- Configurable APN and server URL
- GPS power saving mode available
### Programming Workflow
1. Initialize hardware (SIM808 module, RS485 module)
2. Set up Modbus communication parameters
3. Configure GSM and GPS settings
4. Enter main loop:
- Read data from Modbus registers
- Obtain GPS location
- Format data into CSV string including GPS coordinates
- Send data via GSM to server
- Handle any errors and provide status indication via LEDs
- Delay for 1 minute before next reading and transmission
## Memory Limitations and Register Customization
### Memory Constraints
The Arduino, particularly models like the UNO and MEGA, has limited memory available for storing program code and variables. This limitation affects the number of Modbus registers that can be defined and read in a single project.
- Arduino UNO: 32 KB Flash (program storage), 2 KB SRAM
- Arduino MEGA: 256 KB Flash, 8 KB SRAM
Due to these constraints, the number of registers that can be defined in the `register_map_pm8000.h` file is not unlimited. The exact number will depend on the complexity of your code and other libraries used.
### Customizing the Register Map
To adapt this project to your specific needs, you can modify the `register_map_pm8000.h` file. This file contains the definitions of Modbus registers to be read by the Arduino.
To customize the register map:
1. Open the `register_map_pm8000.h` file in your Arduino IDE or text editor.
2. Locate the `registers` array in the file. It should look something like this:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
{40003, 1},
// ... other registers ...
};
```
3. To remove a register, simply comment out its line by adding `//` at the beginning:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
// {40003, 1}, // This register is now commented out and won't be read
// ... other registers ...
};
```
4. To add a new register, add a new line to the array with the register address and type:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
{40003, 1},
{40005, 2}, // New register added
// ... other registers ...
};
```
5. Remember to keep the array syntax correct, with commas between entries and a semicolon at the end of the array.
## Best Practices
- Start by commenting out registers you don't need before adding new ones.
- If you're using an Arduino UNO, you may need to be more selective about which registers to include due to memory constraints.
- Test your modifications incrementally to ensure the Arduino can handle the memory load.
- If you need to read a large number of registers, consider using an Arduino MEGA or a more powerful microcontroller.
- Ensure your GSM data plan can handle the amount of data being transmitted.
- Regularly check your server to ensure data is being received correctly.
- Position the GPS antenna with a clear view of the sky for best performance.
## Important AT Commands for SIM808
Here are some important AT commands used in this project:
1. `AT+CGNSPWR=1`: Turn on GNSS power supply.
2. `AT+CGNSSEQ="RMC"`: Set the last NMEA sentence to RMC (Recommended Minimum Specific GNSS Data).
3. `AT+CGNSINF`: Get GNSS navigation information.
4. `AT+CGNSURC=2`: Set URC reporting every 2 GNSS fixes.
5. `AT+CGDCONT=1,"IP","APN_NAME"`: Set the APN for your cellular provider.
6. `AT+HTTPINIT`: Initialize HTTP service.
7. `AT+HTTPSSL=1`: Enable SSL for HTTPS connections (if required).
8. `AT+HTTPPARA="URL","http://your-server-url.com/upload"`: Set the server URL.
9. `AT+HTTPDATA=<size>,10000`: Prepare to send HTTP POST data.
10. `AT+HTTPACTION=1`: Send HTTP POST request.
Remember to replace "APN_NAME" and "http://your-server-url.com/upload" with your specific values.
## Troubleshooting
1. If you encounter communication issues, double-check your wiring and ensure all connections are secure.
2. Verify that your APN settings are correct for your cellular provider.
3. If the module isn't responding, try resetting it and check your power supply.
4. Use AT commands like `AT+CSQ` to check signal strength and `AT+CREG?` to check network registration status.
5. If GPS data isn't being received, ensure the GPS antenna has a clear view of the sky.
6. If data isn't being sent, verify your TCP connection settings and ensure you have an active data plan.
7. Use `AT+CGNSINF` to check GPS fix status and information.
By carefully managing the registers in the `register_map_pm8000.h` file and configuring your SIM808 settings, you can customize this Modbus reader to suit your specific requirements while staying within the memory limitations of your Arduino board and optimizing data transmission and GPS functionality.

View File

@@ -0,0 +1,602 @@
#include <stdint.h>
struct RegisterMap
{
uint16_t regaddr;
uint8_t regtype;
};
const PROGMEM RegisterMap registers[] = {
//{ 30, 5} , // Name: Meter Name (DeviceName) - [30,20] as UTF8
//{ 50, 5} , // Name: Meter Model (DeviceType) - [50,20] as UTF8
{ 1837, 1} , // Name: Year (Year) - [1837,1] as INT16U
{ 1838, 1} , // Name: Month (Month) - [1838,1] as INT16U
{ 1839, 1} , // Name: Day (Day) - [1839,1] as INT16U
{ 1840, 1} , // Name: Hour (Hour) - [1840,1] as INT16U
{ 1841, 1} , // Name: Minute (Minute) - [1841,1] as INT16U
{ 2700, 2} , // Name: Active Energy Delivered (Into Load) (kWh del) - [2700,2] as FLOAT32
{ 2702, 2} , // Name: Active Energy Received (Out of Load) (kWh rec) - [2702,2] as FLOAT32
{ 2704, 2} , // Name: Active Energy Delivered + Received (kWh del+rec) - [2704,2] as FLOAT32
{ 2706, 2} , // Name: Active Energy Delivered- Received (kWh del-rec) - [2706,2] as FLOAT32
{ 2708, 2} , // Name: Reactive Energy Delivered (kVARh del) - [2708,2] as FLOAT32
{ 2710, 2} , // Name: Reactive Energy Received (kVARh rec) - [2710,2] as FLOAT32
{ 2712, 2} , // Name: Reactive Energy Delivered + Received (kVARh del+rec) - [2712,2] as FLOAT32
{ 2714, 2} , // Name: Reactive Energy Delivered - Received (kVARh del-rec) - [2714,2] as FLOAT32
{ 2716, 2} , // Name: Apparent Energy Delivered (kVAh del) - [2716,2] as FLOAT32
{ 2718, 2} , // Name: Apparent Energy Received (kVAh rec) - [2718,2] as FLOAT32
{ 2720, 2} , // Name: Apparent Energy Delivered + Received (kVAh del+rec) - [2720,2] as FLOAT32
{ 2722, 2} , // Name: Apparent Energy Delivered - Received (kVAh del-rec) - [2722,2] as FLOAT32
{ 2724, 2} , // Name: Active Energy in Quadrant I (kWh Q1) - [2724,2] as FLOAT32
{ 2726, 2} , // Name: Active Energy in Quadrant II (kWh Q2) - [2726,2] as FLOAT32
{ 2728, 2} , // Name: Active Energy in Quadrant III (kWh Q3) - [2728,2] as FLOAT32
{ 2730, 2} , // Name: Active Energy in Quadrant IV (kWh Q4) - [2730,2] as FLOAT32
{ 2732, 2} , // Name: Reactive Energy in Quadrant I (kVARh Q1) - [2732,2] as FLOAT32
{ 2734, 2} , // Name: Reactive Energy in Quadrant II (kVARh Q2) - [2734,2] as FLOAT32
{ 2736, 2} , // Name: Reactive Energy in Quadrant III (kVARh Q3) - [2736,2] as FLOAT32
{ 2738, 2} , // Name: Reactive Energy in Quadrant IV (kVARh Q4) - [2738,2] as FLOAT32
{ 2740, 2} , // Name: Apparent Energy in Quadrant I (kVAh Q1) - [2740,2] as FLOAT32
{ 2742, 2} , // Name: Apparent Energy in Quadrant II (kVAh Q2) - [2742,2] as FLOAT32
{ 2744, 2} , // Name: Apparent Energy in Quadrant III (kVAh Q3) - [2744,2] as FLOAT32
{ 2746, 2} , // Name: Apparent Energy in Quadrant IV (kVAh Q4) - [2746,2] as FLOAT32
{ 2748, 2} , // Name: Conditional Active Energy Delivered (Into Load) (Cnd kWh del) - [2748,2] as FLOAT32
{ 2750, 2} , // Name: Conditional Active Energy Received (Out of Load) (Cnd kWh rec) - [2750,2] as FLOAT32
{ 2754, 2} , // Name: Active Energy Delivered - Received, Conditional (Cnd kWh d-r) - [2754,2] as FLOAT32
{ 2756, 2} , // Name: Conditional Reactive Energy In (Delivered) (Cnd kVARh del) - [2756,2] as FLOAT32
{ 2758, 2} , // Name: Conditional Reactive Energy Out (Received) (Cnd kVARh rec) - [2758,2] as FLOAT32
{ 2762, 2} , // Name: Reactive Energy Delivered - Received, Conditional (Cnd kVARh d-r) - [2762,2] as FLOAT32
{ 2768, 2} , // Name: Apparent Energy Delivered + Received, Conditional (Cnd kVAh d+r) - [2768,2] as FLOAT32
{ 2772, 2} , // Name: Active Energy Delivered , Last Complete Interval (Inc kWh del C) - [2772,2] as FLOAT32
{ 2774, 2} , // Name: Active Energy Received , Last Complete Interval (Inc kWh rec C) - [2774,2] as FLOAT32
{ 2776, 2} , // Name: Active Energy Delivered - Received , Last Complete Interval (Inc kWh d-r C) - [2776,2] as FLOAT32
{ 2778, 2} , // Name: Reactive Energy Delivered , Last Complete Interval (Inc kVARh del C) - [2778,2] as FLOAT32
{ 2780, 2} , // Name: Reactive Energy Received , Last Complete Interval (Inc kVARh rec C) - [2780,2] as FLOAT32
{ 2782, 2} , // Name: Reactive Energy Delivered - Received , Last Complete Interval (Inc kVARh d-r C) - [2782,2] as FLOAT32
{ 2784, 2} , // Name: Apparent Energy Delivered + Received , Last Complete Interval (Inc kVAh d+r C) - [2784,2] as FLOAT32
{ 2786, 2} , // Name: Active Energy Delivered , Present Interval (Inc kWh del) - [2786,2] as FLOAT32
{ 2788, 2} , // Name: Active Energy Received , Present Interval (Inc kWh rec) - [2788,2] as FLOAT32
{ 2790, 2} , // Name: Active Energy Delivered - Received , Present Interval (Inc kWh d-r) - [2790,2] as FLOAT32
{ 2792, 2} , // Name: Reactive Energy Delivered , Present Interval (Inc kVARh del) - [2792,2] as FLOAT32
{ 2794, 2} , // Name: Reactive Energy Received , Present Interval (Inc kVARh rec) - [2794,2] as FLOAT32
{ 2796, 2} , // Name: Reactive Energy Delivered - Received , Present Interval (Inc kVARh d-r) - [2796,2] as FLOAT32
{ 2798, 2} , // Name: Apparent Energy Delivered + Received , Present Interval (Inc kVAh d+r) - [2798,2] as FLOAT32
{ 2800, 2} , // Name: Active Energy Delivered Interval (kWh del int) - [2800,2] as FLOAT32
{ 2802, 2} , // Name: Active Energy Received Interval (kWh rec int) - [2802,2] as FLOAT32
{ 2804, 2} , // Name: Reactive Energy Delivered Interval (kVARh del int) - [2804,2] as FLOAT32
{ 2806, 2} , // Name: Reactive Energy Received Interval (kVARh rec int) - [2806,2] as FLOAT32
{ 2808, 2} , // Name: Apparent Energy Delivered Interval (kVAh del int) - [2808,2] as FLOAT32
{ 2810, 2} , // Name: Apparent Energy Received Interval (kVAh rec int) - [2810,2] as FLOAT32
{ 3000, 2} , // Name: Current A (I a) - [3000,2] as FLOAT32
{ 3002, 2} , // Name: Current B (I b) - [3002,2] as FLOAT32
{ 3004, 2} , // Name: Current C (I c) - [3004,2] as FLOAT32
{ 3006, 2} , // Name: Current N (I 4) - [3006,2] as FLOAT32
{ 3008, 2} , // Name: Current G (I 5) - [3008,2] as FLOAT32
//{ 3010, 2} , // Name: Current Avg (I avg) - [3010,2] as FLOAT32
{ 3020, 2} , // Name: Voltage A-B (Vll ab) - [3020,2] as FLOAT32
{ 3022, 2} , // Name: Voltage B-C (Vll bc) - [3022,2] as FLOAT32
{ 3024, 2} , // Name: Voltage C-A (Vll ca) - [3024,2] as FLOAT32
//{ 3026, 2} , // Name: Voltage L-L Avg (Vll avg) - [3026,2] as FLOAT32
{ 3028, 2} , // Name: Voltage A-N (Vln a) - [3028,2] as FLOAT32
{ 3030, 2} , // Name: Voltage B-N (Vln b) - [3030,2] as FLOAT32
{ 3032, 2} , // Name: Voltage C-N (Vln c) - [3032,2] as FLOAT32
// { 3036, 2} , // Name: Voltage L-N Avg (Vln avg) - [3036,2] as FLOAT32
{ 3054, 2} , // Name: Active Power A (kW a) - [3054,2] as FLOAT32
{ 3056, 2} , // Name: Active Power B (kW b) - [3056,2] as FLOAT32
{ 3058, 2} , // Name: Active Power C (kW c) - [3058,2] as FLOAT32
{ 3060, 2} , // Name: Active Power Total (kW tot) - [3060,2] as FLOAT32
{ 3062, 2} , // Name: Reactive Power A (kVAR a) - [3062,2] as FLOAT32
{ 3064, 2} , // Name: Reactive Power B (kVAR b) - [3064,2] as FLOAT32
{ 3066, 2} , // Name: Reactive Power C (kVAR c) - [3066,2] as FLOAT32
{ 3068, 2} , // Name: Reactive Power Total (kVAR tot) - [3068,2] as FLOAT32
{ 3070, 2} , // Name: Apparent Power A (kVA a) - [3070,2] as FLOAT32
{ 3072, 2} , // Name: Apparent Power B (kVA b) - [3072,2] as FLOAT32
{ 3074, 2} , // Name: Apparent Power C (kVA c) - [3074,2] as FLOAT32
{ 3076, 2} , // Name: Apparent Power Total (kVA tot) - [3076,2] as FLOAT32
{ 3110, 2} , // Name: Frequency (Freq) - [3110,2] as FLOAT32
// { 3204, 3} , // Name: Active Energy Delivered (Into Load) (kWh del) - [3204,4] as INT64
// { 3208, 3} , // Name: Active Energy Received (Out of Load) (kWh rec) - [3208,4] as INT64
// { 3212, 3} , // Name: Active Energy Delivered + Received (kWh del+rec) - [3212,4] as INT64
// { 3216, 3} , // Name: Active Energy Delivered- Received (kWh del-rec) - [3216,4] as INT64
// { 3220, 3} , // Name: Reactive Energy Delivered (kVARh del) - [3220,4] as INT64
// { 3224, 3} , // Name: Reactive Energy Received (kVARh rec) - [3224,4] as INT64
// { 3228, 3} , // Name: Reactive Energy Delivered + Received (kVARh del+rec) - [3228,4] as INT64
// { 3232, 3} , // Name: Reactive Energy Delivered - Received (kVARh del-rec) - [3232,4] as INT64
// { 3236, 3} , // Name: Apparent Energy Delivered (kVAh del) - [3236,4] as INT64
// { 3240, 3} , // Name: Apparent Energy Received (kVAh rec) - [3240,4] as INT64
// { 3244, 3} , // Name: Apparent Energy Delivered + Received (kVAh del+rec) - [3244,4] as INT64
// { 3248, 3} , // Name: Apparent Energy Delivered - Received (kVAh del-rec) - [3248,4] as INT64
// { 3256, 3} , // Name: Active Energy in Quadrant I (kWh Q1) - [3256,4] as INT64
// { 3260, 3} , // Name: Active Energy in Quadrant II (kWh Q2) - [3260,4] as INT64
// { 3264, 3} , // Name: Active Energy in Quadrant III (kWh Q3) - [3264,4] as INT64
// { 3268, 3} , // Name: Active Energy in Quadrant IV (kWh Q4) - [3268,4] as INT64
// { 3272, 3} , // Name: Reactive Energy in Quadrant I (kVARh Q1) - [3272,4] as INT64
// { 3276, 3} , // Name: Reactive Energy in Quadrant II (kVARh Q2) - [3276,4] as INT64
// { 3280, 3} , // Name: Reactive Energy in Quadrant III (kVARh Q3) - [3280,4] as INT64
// { 3284, 3} , // Name: Reactive Energy in Quadrant IV (kVARh Q4) - [3284,4] as INT64
// { 3288, 3} , // Name: Apparent Energy in Quadrant I (kVAh Q1) - [3288,4] as INT64
// { 3292, 3} , // Name: Apparent Energy in Quadrant II (kVAh Q2) - [3292,4] as INT64
// { 3296, 3} , // Name: Apparent Energy in Quadrant III (kVAh Q3) - [3296,4] as INT64
// { 3300, 3} , // Name: Apparent Energy in Quadrant IV (kVAh Q4) - [3300,4] as INT64
// { 3358, 3} , // Name: Conditional Active Energy Delivered (Into Load) (Cnd kWh del) - [3358,4] as INT64
// { 3362, 3} , // Name: Conditional Active Energy Received (Out of Load) (Cnd kWh rec) - [3362,4] as INT64
// { 3370, 3} , // Name: Active Energy Delivered - Received, Conditional (Cnd kWh d-r) - [3370,4] as INT64
// { 3374, 3} , // Name: Conditional Reactive Energy In (Delivered) (Cnd kVARh del) - [3374,4] as INT64
// { 3378, 3} , // Name: Conditional Reactive Energy Out (Received) (Cnd kVARh rec) - [3378,4] as INT64
// { 3386, 3} , // Name: Reactive Energy Delivered - Received, Conditional (Cnd kVARh d-r) - [3386,4] as INT64
// { 3398, 3} , // Name: Apparent Energy Delivered + Received, Conditional (Cnd kVAh d+r) - [3398,4] as INT64
// { 3414, 3} , // Name: Active Energy Delivered , Last Complete Interval (Inc kWh del C) - [3414,4] as INT64
// { 3418, 3} , // Name: Active Energy Received , Last Complete Interval (Inc kWh rec C) - [3418,4] as INT64
// { 3422, 3} , // Name: Active Energy Delivered - Received , Last Complete Interval (Inc kWh d-r C) - [3422,4] as INT64
// { 3426, 3} , // Name: Reactive Energy Delivered , Last Complete Interval (Inc kVARh del C) - [3426,4] as INT64
// { 3430, 3} , // Name: Reactive Energy Received , Last Complete Interval (Inc kVARh rec C) - [3430,4] as INT64
// { 3434, 3} , // Name: Reactive Energy Delivered - Received , Last Complete Interval (Inc kVARh d-r C) - [3434,4] as INT64
// { 3438, 3} , // Name: Apparent Energy Delivered + Received , Last Complete Interval (Inc kVAh d+r C) - [3438,4] as INT64
// { 3442, 3} , // Name: Active Energy Delivered , Present Interval (Inc kWh del) - [3442,4] as INT64
// { 3446, 3} , // Name: Active Energy Received , Present Interval (Inc kWh rec) - [3446,4] as INT64
// { 3450, 3} , // Name: Active Energy Delivered - Received , Present Interval (Inc kWh d-r) - [3450,4] as INT64
// { 3454, 3} , // Name: Reactive Energy Delivered , Present Interval (Inc kVARh del) - [3454,4] as INT64
// { 3458, 3} , // Name: Reactive Energy Received , Present Interval (Inc kVARh rec) - [3458,4] as INT64
// { 3462, 3} , // Name: Reactive Energy Delivered - Received , Present Interval (Inc kVARh d-r) - [3462,4] as INT64
// { 3466, 3} , // Name: Apparent Energy Delivered + Received , Present Interval (Inc kVAh d+r) - [3466,4] as INT64
// { 3470, 3} , // Name: Active Energy Delivered Interval (kWh del int) - [3470,4] as INT64
// { 3474, 3} , // Name: Active Energy Received Interval (kWh rec int) - [3474,4] as INT64
// { 3478, 3} , // Name: Reactive Energy Delivered Interval (kVARh del int) - [3478,4] as INT64
// { 3482, 3} , // Name: Reactive Energy Received Interval (kVARh rec int) - [3482,4] as INT64
// { 3486, 3} , // Name: Apparent Energy Delivered Interval (kVAh del int) - [3486,4] as INT64
// { 3490, 3} , // Name: Apparent Energy Received Interval (kVAh rec int) - [3490,4] as INT64
// { 3650, 2} , // Name: Current A Squared Hours (MU Ia^2h) - [3650,2] as FLOAT32
// { 3652, 2} , // Name: Current B Square Hours (MU Ib^2h) - [3652,2] as FLOAT32
// { 3654, 2} , // Name: Current C Square Hours (MU Ic^2h) - [3654,2] as FLOAT32
// { 3656, 2} , // Name: Voltage A-B Square Hours (MU Vll ab^2h) - [3656,2] as FLOAT32
// { 3658, 2} , // Name: Voltage B-C Square Hours (MU Vll bc^2h) - [3658,2] as FLOAT32
// { 3660, 2} , // Name: Voltage C-A Square Hours (MU Vll ca^2h) - [3660,2] as FLOAT32
// { 3668, 2} , // Name: Current A Squared Hours (MU Ia^2h int) - [3668,2] as FLOAT32
// { 3670, 2} , // Name: Current B Square Hours (MU Ib^2h int) - [3670,2] as FLOAT32
// { 3672, 2} , // Name: Current C Square Hours (MU Ic^2h int) - [3672,2] as FLOAT32
// { 3674, 2} , // Name: Voltage A-B Square Hours (MU Vllab^2h int) - [3674,2] as FLOAT32
// { 3676, 2} , // Name: Voltage B-C Square Hours (MU Vllbc^2h int) - [3676,2] as FLOAT32
// { 3678, 2} , // Name: Voltage C-A Square Hours (MU Vllca^2h int) - [3678,2] as FLOAT32
// { 3680, 2} , // Name: Voltage A-N Square Hours (MU Vlna^2h int) - [3680,2] as FLOAT32
// { 3682, 2} , // Name: Voltage B-N Square Hours (MU Vlnb^2h int) - [3682,2] as FLOAT32
// { 3684, 2} , // Name: Voltage C-N Square Hours (MU Vlnc^2h int) - [3684,2] as FLOAT32
// { 4196, 3} , // Name: Active Energy Delivered Rate 1 (kWh del A) - [4196,4] as INT64
// { 4200, 3} , // Name: Active Energy Delivered Rate 2 (kWh del B) - [4200,4] as INT64
// { 4204, 3} , // Name: Active Energy Delivered Rate 3 (kWh del C) - [4204,4] as INT64
// { 4208, 3} , // Name: Active Energy Delivered Rate 4 (kWh del D) - [4208,4] as INT64
// { 4228, 3} , // Name: Active Energy Received Rate 1 (kWh rec A) - [4228,4] as INT64
// { 4232, 3} , // Name: Active Energy Received Rate 2 (kWh rec B) - [4232,4] as INT64
// { 4236, 3} , // Name: Active Energy Received Rate 3 (kWh rec C) - [4236,4] as INT64
// { 4240, 3} , // Name: Active Energy Received Rate 4 (kWh rec D) - [4240,4] as INT64
// { 4260, 3} , // Name: Reactive Energy Delivered Rate 1 (kVARh del A) - [4260,4] as INT64
// { 4264, 3} , // Name: Reactive Energy Delivered Rate 2 (kVARh del B) - [4264,4] as INT64
// { 4268, 3} , // Name: Reactive Energy Delivered Rate 3 (kVARh del C) - [4268,4] as INT64
// { 4272, 3} , // Name: Reactive Energy Delivered Rate 4 (kVARh del D) - [4272,4] as INT64
// { 4292, 3} , // Name: Reactive Energy Received Rate 1 (kVARh rec A) - [4292,4] as INT64
// { 4296, 3} , // Name: Reactive Energy Received Rate 2 (kVARh rec B) - [4296,4] as INT64
// { 4300, 3} , // Name: Reactive Energy Received Rate 3 (kVARh rec C) - [4300,4] as INT64
// { 4304, 3} , // Name: Reactive Energy Received Rate 4 (kVARh rec D) - [4304,4] as INT64
// { 4324, 3} , // Name: Apparent Energy Delivered Rate 1 (kVAh del A) - [4324,4] as INT64
// { 4328, 3} , // Name: Apparent Energy Delivered Rate 2 (kVAh del B) - [4328,4] as INT64
// { 4332, 3} , // Name: Apparent Energy Delivered Rate 3 (kVAh del C) - [4332,4] as INT64
// { 4336, 3} , // Name: Apparent Energy Delivered Rate 4 (kVAh del D) - [4336,4] as INT64
// { 4356, 3} , // Name: Apparent Energy Received Rate 1 (kVAh rec A) - [4356,4] as INT64
// { 4360, 3} , // Name: Apparent Energy Received Rate 2 (kVAh rec B) - [4360,4] as INT64
// { 4364, 3} , // Name: Apparent Energy Received Rate 3 (kVAh rec C) - [4364,4] as INT64
// { 4368, 3} , // Name: Apparent Energy Received Rate 4 (kVAh rec D) - [4368,4] as INT64
// { 4800, 2} , // Name: Active Energy Delivered Rate 1 (kWh del A) - [4800,2] as FLOAT32
// { 4802, 2} , // Name: Active Energy Delivered Rate 2 (kWh del B) - [4802,2] as FLOAT32
// { 4804, 2} , // Name: Active Energy Delivered Rate 3 (kWh del C) - [4804,2] as FLOAT32
// { 4806, 2} , // Name: Active Energy Delivered Rate 4 (kWh del D) - [4806,2] as FLOAT32
// { 4816, 2} , // Name: Active Energy Received Rate 1 (kWh rec A) - [4816,2] as FLOAT32
// { 4818, 2} , // Name: Active Energy Received Rate 2 (kWh rec B) - [4818,2] as FLOAT32
// { 4820, 2} , // Name: Active Energy Received Rate 3 (kWh rec C) - [4820,2] as FLOAT32
// { 4822, 2} , // Name: Active Energy Received Rate 4 (kWh rec D) - [4822,2] as FLOAT32
// { 4832, 2} , // Name: Reactive Energy Delivered Rate 1 (kVARh del A) - [4832,2] as FLOAT32
// { 4834, 2} , // Name: Reactive Energy Delivered Rate 2 (kVARh del B) - [4834,2] as FLOAT32
// { 4836, 2} , // Name: Reactive Energy Delivered Rate 3 (kVARh del C) - [4836,2] as FLOAT32
// { 4838, 2} , // Name: Reactive Energy Delivered Rate 4 (kVARh del D) - [4838,2] as FLOAT32
// { 4848, 2} , // Name: Reactive Energy Received Rate 1 (kVARh rec A) - [4848,2] as FLOAT32
// { 4850, 2} , // Name: Reactive Energy Received Rate 2 (kVARh rec B) - [4850,2] as FLOAT32
// { 4852, 2} , // Name: Reactive Energy Received Rate 3 (kVARh rec C) - [4852,2] as FLOAT32
// { 4854, 2} , // Name: Reactive Energy Received Rate 4 (kVARh rec D) - [4854,2] as FLOAT32
// { 4864, 2} , // Name: Apparent Energy Delivered Rate 1 (kVAh del A) - [4864,2] as FLOAT32
// { 4866, 2} , // Name: Apparent Energy Delivered Rate 2 (kVAh del B) - [4866,2] as FLOAT32
// { 4868, 2} , // Name: Apparent Energy Delivered Rate 3 (kVAh del C) - [4868,2] as FLOAT32
// { 4870, 2} , // Name: Apparent Energy Delivered Rate 4 (kVAh del D) - [4870,2] as FLOAT32
// { 4880, 2} , // Name: Apparent Energy Received Rate 1 (kVAh rec A) - [4880,2] as FLOAT32
// { 4882, 2} , // Name: Apparent Energy Received Rate 2 (kVAh rec B) - [4882,2] as FLOAT32
// { 4884, 2} , // Name: Apparent Energy Received Rate 3 (kVAh rec C) - [4884,2] as FLOAT32
// { 4886, 2} , // Name: Apparent Energy Received Rate 4 (kVAh rec D) - [4886,2] as FLOAT32
// { 14045, 2} , // Name: Pickup Setpoint (Over I 4 High Limit) - [14045,2] as FLOAT32
// { 14049, 2} , // Name: Dropout Setpoint (Over I 4 Low Limit) - [14049,2] as FLOAT32
// { 14325, 2} , // Name: Pickup Setpoint (Over kW sd High Limit) - [14325,2] as FLOAT32
// { 14329, 2} , // Name: Dropout Setpoint (Over kW sd Low Limit) - [14329,2] as FLOAT32
// { 14585, 2} , // Name: Pickup Setpoint (Over I a High Limit) - [14585,2] as FLOAT32
// { 14589, 2} , // Name: Dropout Setpoint (Over I a Low Limit) - [14589,2] as FLOAT32
// { 14605, 2} , // Name: Pickup Setpoint (Over I b High Limit) - [14605,2] as FLOAT32
// { 14609, 2} , // Name: Dropout Setpoint (Over I b Low Limit) - [14609,2] as FLOAT32
// { 14625, 2} , // Name: Pickup Setpoint (Over I c High Limit) - [14625,2] as FLOAT32
// { 14629, 2} , // Name: Dropout Setpoint (Over I c Low Limit) - [14629,2] as FLOAT32
// { 21000, 2} , // Name: HS Current A (HS I a) - [21000,2] as FLOAT32
// { 21002, 2} , // Name: HS Current B (HS I b) - [21002,2] as FLOAT32
// { 21004, 2} , // Name: HS Current C (HS I c) - [21004,2] as FLOAT32
// { 21006, 2} , // Name: HS Current N (HS I 4) - [21006,2] as FLOAT32
// { 21008, 2} , // Name: HS Current G (HS I 5) - [21008,2] as FLOAT32
// { 21010, 2} , // Name: HS Current Avg (HS I avg) - [21010,2] as FLOAT32
// { 21016, 2} , // Name: HS Frequency (HS Freq) - [21016,2] as FLOAT32
// { 21018, 2} , // Name: HS Voltage, A-B (HS Vll ab) - [21018,2] as FLOAT32
// { 21020, 2} , // Name: HS Voltage, B-C (HS Vll bc) - [21020,2] as FLOAT32
// { 21022, 2} , // Name: HS Voltage, C-A (HS Vll ca) - [21022,2] as FLOAT32
// { 21024, 2} , // Name: HS Voltage, L-L Average (HS Vll avg) - [21024,2] as FLOAT32
// { 21026, 2} , // Name: HS Voltage, A-N (HS Vln a) - [21026,2] as FLOAT32
// { 21028, 2} , // Name: HS Voltage, B-N (HS Vln b) - [21028,2] as FLOAT32
// { 21030, 2} , // Name: HS Voltage, C-N (HS Vln c) - [21030,2] as FLOAT32
// { 21034, 2} , // Name: HS Voltage, L-N Average (HS Vln avg) - [21034,2] as FLOAT32
// { 21040, 2} , // Name: HS Active Power A (HS kW a) - [21040,2] as FLOAT32
// { 21042, 2} , // Name: HS Active Power B (HS kW b) - [21042,2] as FLOAT32
// { 21044, 2} , // Name: HS Active Power C (HS kW c) - [21044,2] as FLOAT32
// { 21046, 2} , // Name: HS Active Power Total (HS kW tot) - [21046,2] as FLOAT32
// { 21048, 2} , // Name: HS Reactive Power A (HS kVAR a) - [21048,2] as FLOAT32
// { 21050, 2} , // Name: HS Reactive Power B (HS kVAR b) - [21050,2] as FLOAT32
// { 21052, 2} , // Name: HS Reactive Power C (HS kVAR c) - [21052,2] as FLOAT32
// { 21054, 2} , // Name: HS Reactive Power Total (HS kVAR tot) - [21054,2] as FLOAT32
// { 21056, 2} , // Name: HS Apparent Power A (HS kVA a) - [21056,2] as FLOAT32
// { 21058, 2} , // Name: HS Apparent Power B (HS kVA b) - [21058,2] as FLOAT32
// { 21060, 2} , // Name: HS Apparent Power C (HS kVA c) - [21060,2] as FLOAT32
// { 21062, 2} , // Name: HS Apparent Power Total (HS kVA tot) - [21062,2] as FLOAT32
// { 21358, 2} , // Name: K-Factor A (I1 K Factor) - [21358,2] as FLOAT32
// { 21360, 2} , // Name: K-Factor B (I2 K Factor) - [21360,2] as FLOAT32
// { 21362, 2} , // Name: K-Factor C (I3 K Factor) - [21362,2] as FLOAT32
// { 27218, 2} , // Name: Min Current A (I a mn) - [27218,2] as FLOAT32
// { 27220, 2} , // Name: Min Current B (I b mn) - [27220,2] as FLOAT32
// { 27222, 2} , // Name: Min Current C (I c mn) - [27222,2] as FLOAT32
// { 27224, 2} , // Name: Min Current N (I4 mn) - [27224,2] as FLOAT32
// { 27226, 2} , // Name: Min Current G (I5 mn) - [27226,2] as FLOAT32
// { 27228, 2} , // Name: Min Current Avg (I avg mn) - [27228,2] as FLOAT32
// { 27238, 2} , // Name: Min Voltage A-B (Vll ab mn) - [27238,2] as FLOAT32
// { 27240, 2} , // Name: Min Voltage B-C (Vll bc mn) - [27240,2] as FLOAT32
// { 27242, 2} , // Name: Min Voltage C-A (Vll ca mn) - [27242,2] as FLOAT32
// { 27244, 2} , // Name: Min Voltage L-L Avg (Vll avg mn) - [27244,2] as FLOAT32
// { 27246, 2} , // Name: Min Voltage A-N (Vln a mn) - [27246,2] as FLOAT32
// { 27248, 2} , // Name: Min Voltage B-N (Vln b mn) - [27248,2] as FLOAT32
// { 27250, 2} , // Name: Min Voltage C-N (Vln c mn) - [27250,2] as FLOAT32
// { 27254, 2} , // Name: Min Voltage L-N Avg (Vln avg mn) - [27254,2] as FLOAT32
// { 27278, 2} , // Name: Min Active Power Total (kW tot mn) - [27278,2] as FLOAT32
// { 27286, 2} , // Name: Min Reactive Power Total (kVAR tot mn) - [27286,2] as FLOAT32
// { 27294, 2} , // Name: Min Apparent Power Total (kVA tot mn) - [27294,2] as FLOAT32
// { 27616, 2} , // Name: Min Frequency (Freq mn) - [27616,2] as FLOAT32
// { 27644, 2} , // Name: Current A Low (I a low) - [27644,2] as FLOAT32
// { 27646, 2} , // Name: Current B Low (I b low) - [27646,2] as FLOAT32
// { 27648, 2} , // Name: Current C Low (I c low) - [27648,2] as FLOAT32
// { 27650, 2} , // Name: Current N Low (I4 low) - [27650,2] as FLOAT32
// { 27652, 2} , // Name: Current Avg Low (I avg low) - [27652,2] as FLOAT32
// { 27654, 2} , // Name: Voltage A-B Low (Vll ab low) - [27654,2] as FLOAT32
// { 27656, 2} , // Name: Voltage B-C Low (Vll bc low) - [27656,2] as FLOAT32
// { 27658, 2} , // Name: Voltage C-A Low (Vll ca low) - [27658,2] as FLOAT32
// { 27660, 2} , // Name: Voltage L-L Avg Low (Vll avg low) - [27660,2] as FLOAT32
// { 27672, 2} , // Name: Active Power Low (kW tot low) - [27672,2] as FLOAT32
// { 27674, 2} , // Name: Reactive Power Low (kVAR tot low) - [27674,2] as FLOAT32
// { 27676, 2} , // Name: Apparent Power Low (kVA tot low) - [27676,2] as FLOAT32
// { 27682, 2} , // Name: Frequency Low (Freq low) - [27682,2] as FLOAT32
// { 27694, 2} , // Name: Max Current A (I a mx) - [27694,2] as FLOAT32
// { 27696, 2} , // Name: Max Current B (I b mx) - [27696,2] as FLOAT32
// { 27698, 2} , // Name: Max Current C (I c mx) - [27698,2] as FLOAT32
// { 27700, 2} , // Name: Max Current N (I4 mx) - [27700,2] as FLOAT32
// { 27702, 2} , // Name: Max Current G (I5 mx) - [27702,2] as FLOAT32
// { 27704, 2} , // Name: Max Current Avg (I avg mx) - [27704,2] as FLOAT32
// { 27714, 2} , // Name: Max Voltage A-B (Vll ab mx) - [27714,2] as FLOAT32
// { 27716, 2} , // Name: Max Voltage B-C (Vll bc mx) - [27716,2] as FLOAT32
// { 27718, 2} , // Name: Max Voltage C-A (Vll ca mx) - [27718,2] as FLOAT32
// { 27720, 2} , // Name: Max Voltage L-L Avg (Vll avg mx) - [27720,2] as FLOAT32
// { 27722, 2} , // Name: Max Voltage A-N (Vln a mx) - [27722,2] as FLOAT32
// { 27724, 2} , // Name: Max Voltage B-N (Vln b mx) - [27724,2] as FLOAT32
// { 27726, 2} , // Name: Max Voltage C-N (Vln c mx) - [27726,2] as FLOAT32
// { 27730, 2} , // Name: Max Voltage L-N Avg (Vln avg mx) - [27730,2] as FLOAT32
// { 27754, 2} , // Name: Max Active Power Total (kW tot mx) - [27754,2] as FLOAT32
// { 27762, 2} , // Name: Max Reactive Power Total (kVAR tot mx) - [27762,2] as FLOAT32
// { 27770, 2} , // Name: Max Apparent Power Total (kVA tot mx) - [27770,2] as FLOAT32
// { 28092, 2} , // Name: Max Frequency (Freq mx) - [28092,2] as FLOAT32
// { 28120, 2} , // Name: Current A High (I a high) - [28120,2] as FLOAT32
// { 28122, 2} , // Name: Current B High (I b high) - [28122,2] as FLOAT32
// { 28124, 2} , // Name: Current C High (I c high) - [28124,2] as FLOAT32
// { 28126, 2} , // Name: Current N High (I 4 high) - [28126,2] as FLOAT32
// { 28128, 2} , // Name: Current Avg High (I avg high) - [28128,2] as FLOAT32
// { 28130, 2} , // Name: Voltage A-B High (Vll ab high) - [28130,2] as FLOAT32
// { 28132, 2} , // Name: Voltage B-C High (Vll bc high) - [28132,2] as FLOAT32
// { 28134, 2} , // Name: Voltage C-A High (Vll ca high) - [28134,2] as FLOAT32
// { 28136, 2} , // Name: Voltage L-L Avg High (Vll avg high) - [28136,2] as FLOAT32
// { 28162, 2} , // Name: Active Power High (kW tot high) - [28162,2] as FLOAT32
// { 28164, 2} , // Name: Reactive Power High (kVAR tot high) - [28164,2] as FLOAT32
// { 28166, 2} , // Name: Apparent Power High (kVA tot high) - [28166,2] as FLOAT32
// { 28172, 2} , // Name: Frequency High (Freq high) - [28172,2] as FLOAT32
// { 28180, 2} , // Name: Current A Mean (I a mean) - [28180,2] as FLOAT32
// { 28182, 2} , // Name: Current B Mean (I b mean) - [28182,2] as FLOAT32
// { 28184, 2} , // Name: Current C Mean (I c mean) - [28184,2] as FLOAT32
// { 28186, 2} , // Name: Current N Mean (I 4 mean) - [28186,2] as FLOAT32
// { 28188, 2} , // Name: Current Avg Mean (I avg mean) - [28188,2] as FLOAT32
// { 28190, 2} , // Name: Voltage A-B Mean (Vll ab mean) - [28190,2] as FLOAT32
// { 28192, 2} , // Name: Voltage B-C Mean (Vll bc mean) - [28192,2] as FLOAT32
// { 28194, 2} , // Name: Voltage C-A Mean (Vll ca mean) - [28194,2] as FLOAT32
// { 28196, 2} , // Name: Voltage L-L Avg Mean (Vll avg mean) - [28196,2] as FLOAT32
// { 28208, 2} , // Name: Active Power Mean (kW tot mean) - [28208,2] as FLOAT32
// { 28210, 2} , // Name: Reactive Power Mean (kVAR tot mean) - [28210,2] as FLOAT32
// { 28212, 2} , // Name: Apparent Power Mean (kVA tot mean) - [28212,2] as FLOAT32
// { 28218, 2} , // Name: Frequency Mean (Freq mean) - [28218,2] as FLOAT32
// { 29884, 2} , // Name: Current A Last Demand (I a sd) - [29884,2] as FLOAT32
// { 29886, 2} , // Name: Current A Predicted Demand (I a sd pred) - [29886,2] as FLOAT32
// { 29888, 0} , // Name: Current A Peak Demand (I a sd mx) - [29888,6] as TIMESTAMPED_FLOAT32
// { 29898, 2} , // Name: Current B Last Demand (I b sd) - [29898,2] as FLOAT32
// { 29900, 2} , // Name: Current B Predicted Demand (I b sd pred) - [29900,2] as FLOAT32
// { 29902, 0} , // Name: Current B Peak Demand (I b sd mx) - [29902,6] as TIMESTAMPED_FLOAT32
// { 29912, 2} , // Name: Current C Last Demand (I c sd) - [29912,2] as FLOAT32
// { 29914, 2} , // Name: Current C Predicted Demand (I c sd pred) - [29914,2] as FLOAT32
// { 29916, 0} , // Name: Current C Peak Demand (I c sd mx) - [29916,6] as TIMESTAMPED_FLOAT32
// { 29926, 2} , // Name: Current 4 Last Demand (I 4 sd) - [29926,2] as FLOAT32
// { 29928, 2} , // Name: Current 4 Predicted Demand (I 4 sd pred) - [29928,2] as FLOAT32
// { 29930, 0} , // Name: Current 4 Peak Demand (I 4 sd mx) - [29930,6] as TIMESTAMPED_FLOAT32
// { 29940, 2} , // Name: Current Avg Last Demand (I avg sd) - [29940,2] as FLOAT32
// { 29942, 2} , // Name: Current Avg Predicted Demand (I avg sd pred) - [29942,2] as FLOAT32
// { 29944, 0} , // Name: Current Avg Peak Demand (I avg sd mx) - [29944,6] as TIMESTAMPED_FLOAT32
// { 29954, 2} , // Name: Active Power Last Demand (kW sd del-rec) - [29954,2] as FLOAT32
// { 29956, 2} , // Name: Active Power Predicted Demand (kW pr del-rec) - [29956,2] as FLOAT32
// { 29958, 0} , // Name: Active Power Peak Demand (kW sd mx d-r) - [29958,6] as TIMESTAMPED_FLOAT32
// { 29968, 2} , // Name: Active Power Del Last Demand (kW sd del) - [29968,2] as FLOAT32
// { 29970, 2} , // Name: Active Power Del Predicted Demand (kW pr del) - [29970,2] as FLOAT32
// { 29972, 0} , // Name: Active Power Del Peak Demand (kW sd mx del) - [29972,6] as TIMESTAMPED_FLOAT32
// { 29982, 2} , // Name: Active Power Rec Last Demand (kW sd rec) - [29982,2] as FLOAT32
// { 29984, 2} , // Name: Active Power Rec Predicted Demand (kW pr rec) - [29984,2] as FLOAT32
// { 29986, 0} , // Name: Active Power Rec Peak Demand (kW sd mx rec) - [29986,6] as TIMESTAMPED_FLOAT32
// { 29996, 2} , // Name: Active Power Total Last Demand (kW sd del+rec) - [29996,2] as FLOAT32
// { 29998, 2} , // Name: Active Power Total Predicted Demand (kW pr del+rec) - [29998,2] as FLOAT32
// { 30000, 0} , // Name: Active Power Total Peak Demand (kW sd mx d+r) - [30000,6] as TIMESTAMPED_FLOAT32
// { 30010, 2} , // Name: Reactive Power Last Demand (kVAR sd del-rec) - [30010,2] as FLOAT32
// { 30012, 2} , // Name: Reactive Power Predicted Demand (kVAR pr del-rec) - [30012,2] as FLOAT32
// { 30014, 0} , // Name: Reactive Power Peak Demand (kVAR sd mx d-r) - [30014,6] as TIMESTAMPED_FLOAT32
// { 30024, 2} , // Name: Reactive Power Del Last Demand (kVAR sd del) - [30024,2] as FLOAT32
// { 30026, 2} , // Name: Reactive Power Del Predicted Demand (kVAR pr del) - [30026,2] as FLOAT32
// { 30028, 0} , // Name: Reactive Power Del Peak Demand (kVAR sd mx del) - [30028,6] as TIMESTAMPED_FLOAT32
// { 30038, 2} , // Name: Reactive Power Rec Last Demand (kVAR sd rec) - [30038,2] as FLOAT32
// { 30040, 2} , // Name: Reactive Power Rec Predicted Demand (kVAR pr rec) - [30040,2] as FLOAT32
// { 30042, 0} , // Name: Reactive Power Rec Peak Demand (kVAR sd mx rec) - [30042,6] as TIMESTAMPED_FLOAT32
// { 30052, 2} , // Name: Reactive Power Total Last Demand (kVAR sd del+rec) - [30052,2] as FLOAT32
// { 30054, 2} , // Name: Reactive Power Total Predicted Demand (kVAR pr del+rec) - [30054,2] as FLOAT32
// { 30056, 0} , // Name: Reactive Power Total Peak Demand (kVAR sd mx d+r) - [30056,6] as TIMESTAMPED_FLOAT32
// { 30066, 2} , // Name: Apparent Power Last Demand (kVA sd del-rec) - [30066,2] as FLOAT32
// { 30068, 2} , // Name: Apparent Power Predicted Demand (kVA pr del-rec) - [30068,2] as FLOAT32
// { 30070, 0} , // Name: Apparent Power Peak Demand (kVA sd mx d-r) - [30070,6] as TIMESTAMPED_FLOAT32
// { 30080, 2} , // Name: Apparent Power Del Last Demand (kVA sd del) - [30080,2] as FLOAT32
// { 30082, 2} , // Name: Apparent Power Del Predicted Demand (kVA pr del) - [30082,2] as FLOAT32
// { 30084, 0} , // Name: Apparent Power Del Peak Demand (kVA sd mx del) - [30084,6] as TIMESTAMPED_FLOAT32
// { 30094, 2} , // Name: Apparent Power Rec Last Demand (kVA sd rec) - [30094,2] as FLOAT32
// { 30096, 2} , // Name: Apparent Power Rec Predicted Demand (kVA pr rec) - [30096,2] as FLOAT32
// { 30098, 0} , // Name: Apparent Power Rec Peak Demand (kVA sd mx rec) - [30098,6] as TIMESTAMPED_FLOAT32
// { 30108, 2} , // Name: Apparent Power Total Last Demand (kVA sd del+rec) - [30108,2] as FLOAT32
// { 30110, 2} , // Name: Apparent Power Total Predicted Demand (kVA pr del+rec) - [30110,2] as FLOAT32
// { 30112, 0} , // Name: Apparent Power Total Peak Demand (kVA sd mx d+r) - [30112,6] as TIMESTAMPED_FLOAT32
// { 30222, 2} , // Name: Active Power Del A Last Demand (kW sd del A) - [30222,2] as FLOAT32
// { 30224, 2} , // Name: Active Power Del A Predicted Demand (kW pr del A) - [30224,2] as FLOAT32
// { 30226, 0} , // Name: Active Power Del A Peak Demand (kW sd mx del A) - [30226,6] as TIMESTAMPED_FLOAT32
// { 30236, 2} , // Name: Active Power Del B Last Demand (kW sd del B) - [30236,2] as FLOAT32
// { 30238, 2} , // Name: Active Power Del B Predicted Demand (kW pr del B) - [30238,2] as FLOAT32
// { 30240, 0} , // Name: Active Power Del B Peak Demand (kW sd mx del B) - [30240,6] as TIMESTAMPED_FLOAT32
// { 30250, 2} , // Name: Active Power Del C Last Demand (kW sd del C) - [30250,2] as FLOAT32
// { 30252, 2} , // Name: Active Power Del C Predicted Demand (kW pr del C) - [30252,2] as FLOAT32
// { 30254, 0} , // Name: Active Power Del C Peak Demand (kW sd mx del C) - [30254,6] as TIMESTAMPED_FLOAT32
// { 30264, 2} , // Name: Active Power Del D Last Demand (kW sd del D) - [30264,2] as FLOAT32
// { 30266, 2} , // Name: Active Power Del D Predicted Demand (kW pr del D) - [30266,2] as FLOAT32
// { 30268, 0} , // Name: Active Power Del D Peak Demand (kW sd mx del D) - [30268,6] as TIMESTAMPED_FLOAT32
// { 30278, 2} , // Name: Active Power Rec A Last Demand (kW sd rec A) - [30278,2] as FLOAT32
// { 30280, 2} , // Name: Active Power Rec A Predicted Demand (kW pr rec A) - [30280,2] as FLOAT32
// { 30282, 0} , // Name: Active Power Rec A Peak Demand (kW sd mx rec A) - [30282,6] as TIMESTAMPED_FLOAT32
// { 30292, 2} , // Name: Active Power Rec B Last Demand (kW sd rec B) - [30292,2] as FLOAT32
// { 30294, 2} , // Name: Active Power Rec B Predicted Demand (kW pr rec B) - [30294,2] as FLOAT32
// { 30296, 0} , // Name: Active Power Rec B Peak Demand (kW sd mx rec B) - [30296,6] as TIMESTAMPED_FLOAT32
// { 30306, 2} , // Name: Active Power Rec C Last Demand (kW sd rec C) - [30306,2] as FLOAT32
// { 30308, 2} , // Name: Active Power Rec C Predicted Demand (kW pr rec C) - [30308,2] as FLOAT32
// { 30310, 0} , // Name: Active Power Rec C Peak Demand (kW sd mx rec C) - [30310,6] as TIMESTAMPED_FLOAT32
// { 30320, 2} , // Name: Active Power Rec D Last Demand (kW sd rec D) - [30320,2] as FLOAT32
// { 30322, 2} , // Name: Active Power Rec D Predicted Demand (kW pr rec D) - [30322,2] as FLOAT32
// { 30324, 0} , // Name: Active Power Rec D Peak Demand (kW sd mx rec D) - [30324,6] as TIMESTAMPED_FLOAT32
// { 30334, 2} , // Name: Reactive Power Del A Last Demand (kVAR sd del A) - [30334,2] as FLOAT32
// { 30336, 2} , // Name: Reactive Power Del A Predicted Demand (kVAR pr del A) - [30336,2] as FLOAT32
// { 30338, 0} , // Name: Reactive Power Del A Peak Demand (kVAR sd mx d A) - [30338,6] as TIMESTAMPED_FLOAT32
// { 30348, 2} , // Name: Reactive Power Del B Last Demand (kVAR sd del B) - [30348,2] as FLOAT32
// { 30350, 2} , // Name: Reactive Power Del B Predicted Demand (kVAR pr del B) - [30350,2] as FLOAT32
// { 30352, 0} , // Name: Reactive Power Del B Peak Demand (kVAR sd mx d B) - [30352,6] as TIMESTAMPED_FLOAT32
// { 30362, 2} , // Name: Reactive Power Del C Last Demand (kVAR sd del C) - [30362,2] as FLOAT32
// { 30364, 2} , // Name: Reactive Power Del C Predicted Demand (kVAR pr del C) - [30364,2] as FLOAT32
// { 30366, 0} , // Name: Reactive Power Del C Peak Demand (kVAR sd mx d C) - [30366,6] as TIMESTAMPED_FLOAT32
// { 30376, 2} , // Name: Reactive Power Del D Last Demand (kVAR sd del D) - [30376,2] as FLOAT32
// { 30378, 2} , // Name: Reactive Power Del D Predicted Demand (kVAR pr del D) - [30378,2] as FLOAT32
// { 30380, 0} , // Name: Reactive Power Del D Peak Demand (kVAR sd mx d D) - [30380,6] as TIMESTAMPED_FLOAT32
// { 30390, 2} , // Name: Reactive Power Rec A Last Demand (kVAR sd rec A) - [30390,2] as FLOAT32
// { 30392, 2} , // Name: Reactive Power Rec A Predicted Demand (kVAR pr rec A) - [30392,2] as FLOAT32
// { 30394, 0} , // Name: Reactive Power Rec A Peak Demand (kVAR sd mx r A) - [30394,6] as TIMESTAMPED_FLOAT32
// { 30404, 2} , // Name: Reactive Power Rec B Last Demand (kVAR sd rec B) - [30404,2] as FLOAT32
// { 30406, 2} , // Name: Reactive Power Rec B Predicted Demand (kVAR pr rec B) - [30406,2] as FLOAT32
// { 30408, 0} , // Name: Reactive Power Rec B Peak Demand (kVAR sd mx r B) - [30408,6] as TIMESTAMPED_FLOAT32
// { 30418, 2} , // Name: Reactive Power Rec C Last Demand (kVAR sd rec C) - [30418,2] as FLOAT32
// { 30420, 2} , // Name: Reactive Power Rec C Predicted Demand (kVAR pr rec C) - [30420,2] as FLOAT32
// { 30422, 0} , // Name: Reactive Power Rec C Peak Demand (kVAR sd mx r C) - [30422,6] as TIMESTAMPED_FLOAT32
// { 30432, 2} , // Name: Reactive Power Rec D Last Demand (kVAR sd rec D) - [30432,2] as FLOAT32
// { 30434, 2} , // Name: Reactive Power Rec D Predicted Demand (kVAR pr rec D) - [30434,2] as FLOAT32
// { 30436, 0} , // Name: Reactive Power Rec D Peak Demand (kVAR sd mx r D) - [30436,6] as TIMESTAMPED_FLOAT32
// { 30446, 2} , // Name: Apparent Power Del A Last Demand (kVA sd del A) - [30446,2] as FLOAT32
// { 30448, 2} , // Name: Apparent Power Del A Predicted Demand (kVA pr del A) - [30448,2] as FLOAT32
// { 30450, 0} , // Name: Apparent Power Del A Peak Demand (kVA sd mx del A) - [30450,6] as TIMESTAMPED_FLOAT32
// { 30460, 2} , // Name: Apparent Power Del B Last Demand (kVA sd del B) - [30460,2] as FLOAT32
// { 30462, 2} , // Name: Apparent Power Del B Predicted Demand (kVA pr del B) - [30462,2] as FLOAT32
// { 30464, 0} , // Name: Apparent Power Del B Peak Demand (kVA sd mx del B) - [30464,6] as TIMESTAMPED_FLOAT32
// { 30474, 2} , // Name: Apparent Power Del C Last Demand (kVA sd del C) - [30474,2] as FLOAT32
// { 30476, 2} , // Name: Apparent Power Del C Predicted Demand (kVA pr del C) - [30476,2] as FLOAT32
// { 30478, 0} , // Name: Apparent Power Del C Peak Demand (kVA sd mx del C) - [30478,6] as TIMESTAMPED_FLOAT32
// { 30488, 2} , // Name: Apparent Power Del D Last Demand (kVA sd del D) - [30488,2] as FLOAT32
// { 30490, 2} , // Name: Apparent Power Del D Predicted Demand (kVA pr del D) - [30490,2] as FLOAT32
// { 30492, 0} , // Name: Apparent Power Del D Peak Demand (kVA sd mx del D) - [30492,6] as TIMESTAMPED_FLOAT32
// { 30502, 2} , // Name: Apparent Power Rec A Last Demand (kVA sd rec A) - [30502,2] as FLOAT32
// { 30504, 2} , // Name: Apparent Power Rec A Predicted Demand (kVA pr rec A) - [30504,2] as FLOAT32
// { 30506, 0} , // Name: Apparent Power Rec A Peak Demand (kVA sd mx rec A) - [30506,6] as TIMESTAMPED_FLOAT32
// { 30516, 2} , // Name: Apparent Power Rec B Last Demand (kVA sd rec B) - [30516,2] as FLOAT32
// { 30518, 2} , // Name: Apparent Power Rec B Predicted Demand (kVA pr rec B) - [30518,2] as FLOAT32
// { 30520, 0} , // Name: Apparent Power Rec B Peak Demand (kVA sd mx rec B) - [30520,6] as TIMESTAMPED_FLOAT32
// { 30530, 2} , // Name: Apparent Power Rec C Last Demand (kVA sd rec C) - [30530,2] as FLOAT32
// { 30532, 2} , // Name: Apparent Power Rec C Predicted Demand (kVA pr rec C) - [30532,2] as FLOAT32
// { 30534, 0} , // Name: Apparent Power Rec C Peak Demand (kVA sd mx rec C) - [30534,6] as TIMESTAMPED_FLOAT32
// { 30544, 2} , // Name: Apparent Power Rec D Last Demand (kVA sd rec D) - [30544,2] as FLOAT32
// { 30546, 2} , // Name: Apparent Power Rec D Predicted Demand (kVA pr rec D) - [30546,2] as FLOAT32
// { 30548, 0} , // Name: Apparent Power Rec D Peak Demand (kVA sd mx rec D) - [30548,6] as TIMESTAMPED_FLOAT32
// { 30558, 2} , // Name: Active Power Q1 Last Demand (kW sd Q1) - [30558,2] as FLOAT32
// { 30560, 2} , // Name: Active Power Q1 Predicted Demand (kW pr Q1) - [30560,2] as FLOAT32
// { 30562, 0} , // Name: Active Power Q1 Peak Demand (kW sd mx Q1) - [30562,6] as TIMESTAMPED_FLOAT32
// { 30572, 2} , // Name: Active Power Q2 Last Demand (kW sd Q2) - [30572,2] as FLOAT32
// { 30574, 2} , // Name: Active Power Q2 Predicted Demand (kW pr Q2) - [30574,2] as FLOAT32
// { 30576, 0} , // Name: Active Power Q2 Peak Demand (kW sd mx Q2) - [30576,6] as TIMESTAMPED_FLOAT32
// { 30586, 2} , // Name: Active Power Q3 Last Demand (kW sd Q3) - [30586,2] as FLOAT32
// { 30588, 2} , // Name: Active Power Q3 Predicted Demand (kW pr Q3) - [30588,2] as FLOAT32
// { 30590, 0} , // Name: Active Power Q3 Peak Demand (kW sd mx Q3) - [30590,6] as TIMESTAMPED_FLOAT32
// { 30600, 2} , // Name: Active Power Q4 Last Demand (kW sd Q4) - [30600,2] as FLOAT32
// { 30602, 2} , // Name: Active Power Q4 Predicted Demand (kW pr Q4) - [30602,2] as FLOAT32
// { 30604, 0} , // Name: Active Power Q4 Peak Demand (kW sd mx Q4) - [30604,6] as TIMESTAMPED_FLOAT32
// { 30614, 2} , // Name: Reactive Power Q1 Last Demand (kVAR sd Q1) - [30614,2] as FLOAT32
// { 30616, 2} , // Name: Reactive Power Q1 Predicted Demand (kVAR pr Q1) - [30616,2] as FLOAT32
// { 30618, 0} , // Name: Reactive Power Q1 Peak Demand (kVAR sd mx Q1) - [30618,6] as TIMESTAMPED_FLOAT32
// { 30628, 2} , // Name: Reactive Power Q2 Last Demand (kVAR sd Q2) - [30628,2] as FLOAT32
// { 30630, 2} , // Name: Reactive Power Q2 Predicted Demand (kVAR pr Q2) - [30630,2] as FLOAT32
// { 30632, 0} , // Name: Reactive Power Q2 Peak Demand (kVAR sd mx Q2) - [30632,6] as TIMESTAMPED_FLOAT32
// { 30642, 2} , // Name: Reactive Power Q3 Last Demand (kVAR sd Q3) - [30642,2] as FLOAT32
// { 30644, 2} , // Name: Reactive Power Q3 Predicted Demand (kVAR pr Q3) - [30644,2] as FLOAT32
// { 30646, 0} , // Name: Reactive Power Q3 Peak Demand (kVAR sd mx Q3) - [30646,6] as TIMESTAMPED_FLOAT32
// { 30656, 2} , // Name: Reactive Power Q4 Last Demand (kVAR sd Q4) - [30656,2] as FLOAT32
// { 30658, 2} , // Name: Reactive Power Q4 Predicted Demand (kVAR pr Q4) - [30658,2] as FLOAT32
// { 30660, 0} , // Name: Reactive Power Q4 Peak Demand (kVAR sd mx Q4) - [30660,6] as TIMESTAMPED_FLOAT32
// { 30670, 2} , // Name: Apparent Power Q1 Last Demand (kVA sd Q1) - [30670,2] as FLOAT32
// { 30672, 2} , // Name: Apparent Power Q1 Predicted Demand (kVA pr Q1) - [30672,2] as FLOAT32
// { 30674, 0} , // Name: Apparent Power Q1 Peak Demand (kVA sd mx Q1) - [30674,6] as TIMESTAMPED_FLOAT32
// { 30684, 2} , // Name: Apparent Power Q2 Last Demand (kVA sd Q2) - [30684,2] as FLOAT32
// { 30686, 2} , // Name: Apparent Power Q2 Predicted Demand (kVA pr Q2) - [30686,2] as FLOAT32
// { 30688, 0} , // Name: Apparent Power Q2 Peak Demand (kVA sd mx Q2) - [30688,6] as TIMESTAMPED_FLOAT32
// { 30698, 2} , // Name: Apparent Power Q3 Last Demand (kVA sd Q3) - [30698,2] as FLOAT32
// { 30700, 2} , // Name: Apparent Power Q3 Predicted Demand (kVA pr Q3) - [30700,2] as FLOAT32
// { 30702, 0} , // Name: Apparent Power Q3 Peak Demand (kVA sd mx Q3) - [30702,6] as TIMESTAMPED_FLOAT32
// { 30712, 2} , // Name: Apparent Power Q4 Last Demand (kVA sd Q4) - [30712,2] as FLOAT32
// { 30714, 2} , // Name: Apparent Power Q4 Predicted Demand (kVA pr Q4) - [30714,2] as FLOAT32
// { 30716, 0} , // Name: Apparent Power Q4 Peak Demand (kVA sd mx Q4) - [30716,6] as TIMESTAMPED_FLOAT32
// { 30822, 2} , // Name: Block Demand Active Power (kVA co kW d-r) - [30822,2] as FLOAT32
// { 30824, 2} , // Name: Block Demand Active Power Into the Load (kVA co kW del) - [30824,2] as FLOAT32
// { 30826, 2} , // Name: Block Demand Active Power Out of the Load (kVA co kW rec) - [30826,2] as FLOAT32
// { 30828, 2} , // Name: Block Demand Active Power Total (kVA co kW d+r) - [30828,2] as FLOAT32
// { 30830, 2} , // Name: Block Demand Reactive Power (kVA co kVAR d-r) - [30830,2] as FLOAT32
// { 30832, 2} , // Name: Block Demand Reactive Power Into the Load (kVA co kVAR del) - [30832,2] as FLOAT32
// { 30834, 2} , // Name: Block Demand Reactive Power Out of the Load (kVA co kVAR rec) - [30834,2] as FLOAT32
// { 30836, 2} , // Name: Block Demand Reactive Power Total (kVA co kVAR d+r) - [30836,2] as FLOAT32
// { 30838, 2} , // Name: Block Demand Active Power (kVAR co kW d-r) - [30838,2] as FLOAT32
// { 30840, 2} , // Name: Block Demand Active Power Into the Load (kVAR co kW del) - [30840,2] as FLOAT32
// { 30842, 2} , // Name: Block Demand Active Power Out of the Load (kVAR co kW rec) - [30842,2] as FLOAT32
// { 30844, 2} , // Name: Block Demand Active Power Total (kVAR co kW d+r) - [30844,2] as FLOAT32
// { 30846, 2} , // Name: Block Demand Apparent Power (kVAR co kVA d-r) - [30846,2] as FLOAT32
// { 30848, 2} , // Name: Block Demand Apparent Power Into the Load (kVAR co kVA del) - [30848,2] as FLOAT32
// { 30850, 2} , // Name: Block Demand Apparent Power Out of the Load (kVAR co kVA rec) - [30850,2] as FLOAT32
// { 30852, 2} , // Name: Block Demand Apparent Power Total (kVAR co kVA d+r) - [30852,2] as FLOAT32
// { 30854, 2} , // Name: Block Demand Reactive Power (kW co kVAR d-r) - [30854,2] as FLOAT32
// { 30856, 2} , // Name: Block Demand Reactive Power Into the Load (kW co kVAR del) - [30856,2] as FLOAT32
// { 30858, 2} , // Name: Block Demand Reactive Power Out of the Load (kW co kVAR rec) - [30858,2] as FLOAT32
// { 30860, 2} , // Name: Block Demand Reactive Power Total (kW co kVAR d+r) - [30860,2] as FLOAT32
// { 30862, 2} , // Name: Block Demand Apparent Power (kW co kVA d-r) - [30862,2] as FLOAT32
// { 30864, 2} , // Name: Block Demand Apparent Power Into the Load (kW co kVA del) - [30864,2] as FLOAT32
// { 30866, 2} , // Name: Block Demand Apparent Power Out of the Load (kW co kVA rec) - [30866,2] as FLOAT32
// { 30868, 2} , // Name: Block Demand Apparent Power Total (kW co kVA d+r) - [30868,2] as FLOAT32
// { 30870, 3} , // Name: Active Energy Delivered Rate 1 (PB kWh del A) - [30870,4] as INT64
// { 30874, 3} , // Name: Active Energy Delivered Rate 2 (PB kWh del B) - [30874,4] as INT64
// { 30878, 3} , // Name: Active Energy Delivered Rate 3 (PB kWh del C) - [30878,4] as INT64
// { 30882, 3} , // Name: Active Energy Delivered Rate 4 (PB kWh del D) - [30882,4] as INT64
// { 30886, 3} , // Name: Active Energy Delivered (PB kWh del) - [30886,4] as INT64
// { 30890, 3} , // Name: Active Energy Received (PB kWh rec) - [30890,4] as INT64
// { 30894, 3} , // Name: Reactive Energy Delivered (PB kVARh del) - [30894,4] as INT64
// { 30898, 3} , // Name: Reactive Energy Received (PB kVARh rec) - [30898,4] as INT64
// { 30902, 3} , // Name: Apparent Energy Delivered (PB kVAh del) - [30902,4] as INT64
// { 30906, 3} , // Name: Apparent Energy Received (PB kVAh rec) - [30906,4] as INT64
// { 30910, 2} , // Name: Peak Block Demand Active Power Delived Rate 1 (PB kW sd mx d A) - [30910,2] as FLOAT32
// { 30912, 2} , // Name: Peak Block Demand Active Power Delived Rate 2 (PB kW sd mx d B) - [30912,2] as FLOAT32
// { 30914, 2} , // Name: Peak Block Demand Active Power Delived Rate 3 (PB kW sd mx d C) - [30914,2] as FLOAT32
// { 30916, 2} , // Name: Peak Block Demand Active Power Delived Rate 4 (PB kW sd mx d D) - [30916,2] as FLOAT32
// { 30918, 2} , // Name: Peak Block Demand Active Power Received (PB kW sd mx rec) - [30918,2] as FLOAT32
// { 30920, 2} , // Name: Peak Block Demand Reactive Power Delivered (PB kVAR sd mx d) - [30920,2] as FLOAT32
// { 30922, 2} , // Name: Peak Block Demand Reactive Power Received (PB kVAR sd mx r) - [30922,2] as FLOAT32
// { 30924, 2} , // Name: Peak Block Demand Apparent Power Delivered (PB kVA sd mx d) - [30924,2] as FLOAT32
// { 30926, 2} , // Name: Peak Block Demand Apparent Power Received (PB kVA sd mx r) - [30926,2] as FLOAT32
// { 30928, 3} , // Name: Active Energy Delivered Rate 1 (PS kWh del A) - [30928,4] as INT64
// { 30932, 3} , // Name: Active Energy Delivered Rate 2 (PS kWh del B) - [30932,4] as INT64
// { 30936, 3} , // Name: Active Energy Delivered Rate 3 (PS kWh del C) - [30936,4] as INT64
// { 30940, 3} , // Name: Active Energy Delivered Rate 4 (PS kWh del D) - [30940,4] as INT64
// { 30944, 3} , // Name: Active Energy Delivered (PS kWh del) - [30944,4] as INT64
// { 30948, 3} , // Name: Active Energy Received (PS kWh rec) - [30948,4] as INT64
// { 30952, 3} , // Name: Reactive Energy Delivered (PS kVARh del) - [30952,4] as INT64
// { 30956, 3} , // Name: Reactive Energy Received (PS kVARh rec) - [30956,4] as INT64
// { 30960, 3} , // Name: Apparent Energy Delivered (PS kVAh del) - [30960,4] as INT64
// { 30964, 3} , // Name: Apparent Energy Received (PS kVAh rec) - [30964,4] as INT64
// { 30968, 2} , // Name: Peak Block Demand Active Power Delived Rate 1 (PS kW sd mx d A) - [30968,2] as FLOAT32
// { 30970, 2} , // Name: Peak Block Demand Active Power Delived Rate 2 (PS kW sd mx d B) - [30970,2] as FLOAT32
// { 30972, 2} , // Name: Peak Block Demand Active Power Delived Rate 3 (PS kW sd mx d C) - [30972,2] as FLOAT32
// { 30974, 2} , // Name: Peak Block Demand Active Power Delived Rate 4 (PS kW sd mx d D) - [30974,2] as FLOAT32
// { 30976, 2} , // Name: Peak Block Demand Active Power Received (PS kW sd mx rec) - [30976,2] as FLOAT32
// { 30978, 2} , // Name: Peak Block Demand Reactive Power Delivered (PS kVAR sd mx d) - [30978,2] as FLOAT32
// { 30980, 2} , // Name: Peak Block Demand Reactive Power Received (PS kVAR sd mx r) - [30980,2] as FLOAT32
// { 30982, 2} , // Name: Peak Block Demand Apparent Power Delivered (PS kVA sd mx d) - [30982,2] as FLOAT32
// { 30984, 2} , // Name: Peak Block Demand Apparent Power Received (PS kVA sd mx r) - [30984,2] as FLOAT32
// { 30986, 2} , // Name: Active Energy Delivered Rate 1 (PB kWh del A) - [30986,2] as FLOAT32
// { 30988, 2} , // Name: Active Energy Delivered Rate 2 (PB kWh del B) - [30988,2] as FLOAT32
// { 30990, 2} , // Name: Active Energy Delivered Rate 3 (PB kWh del C) - [30990,2] as FLOAT32
// { 30992, 2} , // Name: Active Energy Delivered Rate 4 (PB kWh del D) - [30992,2] as FLOAT32
// { 30994, 2} , // Name: Active Energy Delivered (PB kWh del) - [30994,2] as FLOAT32
// { 30996, 2} , // Name: Active Energy Received (PB kWh rec) - [30996,2] as FLOAT32
// { 30998, 2} , // Name: Reactive Energy Delivered (PB kVARh del) - [30998,2] as FLOAT32
// { 31000, 2} , // Name: Reactive Energy Received (PB kVARh rec) - [31000,2] as FLOAT32
// { 31002, 2} , // Name: Apparent Energy Delivered (PB kVAh del) - [31002,2] as FLOAT32
// { 31004, 2} , // Name: Apparent Energy Received (PB kVAh rec) - [31004,2] as FLOAT32
// { 31006, 2} , // Name: Active Energy Delivered Rate 1 (PS kWh del A) - [31006,2] as FLOAT32
// { 31008, 2} , // Name: Active Energy Delivered Rate 2 (PS kWh del B) - [31008,2] as FLOAT32
// { 31010, 2} , // Name: Active Energy Delivered Rate 3 (PS kWh del C) - [31010,2] as FLOAT32
// { 31012, 2} , // Name: Active Energy Delivered Rate 4 (PS kWh del D) - [31012,2] as FLOAT32
// { 31014, 2} , // Name: Active Energy Delivered (PS kWh del) - [31014,2] as FLOAT32
// { 31016, 2} , // Name: Active Energy Received (PS kWh rec) - [31016,2] as FLOAT32
// { 31018, 2} , // Name: Reactive Energy Delivered (PS kVARh del) - [31018,2] as FLOAT32
// { 31020, 2} , // Name: Reactive Energy Received (PS kVARh rec) - [31020,2] as FLOAT32
// { 31022, 2} , // Name: Apparent Energy Delivered (PS kVAh del) - [31022,2] as FLOAT32
// { 31024, 2} , // Name: Apparent Energy Received (PS kVAh rec) - [31024,2] as FLOAT32
// { 34352, 2} , // Name: Current, Phase A 3 Second (150/180 Cycles) (I1 3s) - [34352,2] as FLOAT32
// { 34354, 2} , // Name: Current, Phase A 10 Minute (I1 10m) - [34354,2] as FLOAT32
// { 34358, 2} , // Name: Current, Phase B 3 Second (150/180 Cycles) (I2 3s) - [34358,2] as FLOAT32
// { 34360, 2} , // Name: Current, Phase B 10 Minute (I2 10m) - [34360,2] as FLOAT32
// { 34364, 2} , // Name: Current, Phase C 3 Second (150/180 Cycles) (I3 3s) - [34364,2] as FLOAT32
// { 34366, 2} , // Name: Current, Phase C 10 Minute (I3 10m) - [34366,2] as FLOAT32
// { 34400, 2} , // Name: Voltage, A-N 3 Second (150/180 Cycles) (V1 3s) - [34400,2] as FLOAT32
// { 34402, 2} , // Name: Voltage, A-N 10 Minute (V1 10m) - [34402,2] as FLOAT32
// { 34404, 2} , // Name: Voltage, A-N 2 Hour (V1 2hr) - [34404,2] as FLOAT32
// { 34406, 2} , // Name: Voltage, B-N 3 Second (150/180 Cycles) (V2 3s) - [34406,2] as FLOAT32
// { 34408, 2} , // Name: Voltage, B-N 10 Minute (V2 10m) - [34408,2] as FLOAT32
// { 34410, 2} , // Name: Voltage, B-N 2 Hour (V2 2hr) - [34410,2] as FLOAT32
// { 34412, 2} , // Name: Voltage, C-N 3 Second (150/180 Cycles) (V3 3s) - [34412,2] as FLOAT32
// { 34414, 2} , // Name: Voltage, C-N 10 Minute (V3 10m) - [34414,2] as FLOAT32
// { 34416, 2} , // Name: Voltage, C-N 2 Hour (V3 2hr) - [34416,2] as FLOAT32
// { 34472, 2} , // Name: Power Frequency 3 Second (150/180 Cycles) (Power Frequency) - [34472,2] as FLOAT32
// { 34474, 2} , // Name: Power Frequency 10 Minute (Power Freq 10m) - [34474,2] as FLOAT32
// { 34476, 2} , // Name: Power Frequency 2 Hour (Power Freq 2hr) - [34476,2] as FLOAT32
// { 40000, 2} , // Name: Frequency 10m Mean (PQ Freq mean) - [40000,2] as FLOAT32
// { 40002, 2} , // Name: Frequency 10m Low (PQ Freq low) - [40002,2] as FLOAT32
// { 40004, 2} , // Name: Frequency 10m High (PQ Freq high) - [40004,2] as FLOAT32
// { 40006, 2} , // Name: Frequency Minimum (PQ Freq mn-op) - [40006,2] as FLOAT32
// { 40008, 2} , // Name: Frequency Maximum (PQ Freq mx-op) - [40008,2] as FLOAT32
// { 40010, 2} , // Name: V1 10m Mean (PQ V1 mean) - [40010,2] as FLOAT32
// { 40012, 2} , // Name: V1 10m Low (PQ V1 low) - [40012,2] as FLOAT32
// { 40014, 2} , // Name: V1 10m High (PQ V1 high) - [40014,2] as FLOAT32
// { 40016, 2} , // Name: V2 10m Mean (PQ V2 mean) - [40016,2] as FLOAT32
// { 40018, 2} , // Name: V2 10m Low (PQ V2 low) - [40018,2] as FLOAT32
// { 40020, 2} , // Name: V2 10m High (PQ V2 high) - [40020,2] as FLOAT32
// { 40022, 2} , // Name: V3 10m Mean (PQ V3 mean) - [40022,2] as FLOAT32
// { 40024, 2} , // Name: V3 10m Low (PQ V3 low) - [40024,2] as FLOAT32
// { 40026, 2} , // Name: V3 10m High (PQ V3 high) - [40026,2] as FLOAT32
// { 54396, 1} , // Name: FAC1 Nominal Frequency (N/A) - [54396,1] as INT16U
// { 56977, 0} , // Name: COM1 RTS Delay (N/A) - [56977,2] as INT32
}
;

View File

@@ -0,0 +1,27 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
uint32_t getRegisterUInt32(uint16_t highWord, uint16_t lowWord) {
uint32_t val = (highWord << 16) + lowWord;
return val;
}
int32_t getRegisterInt32(uint16_t highWord, uint16_t lowWord) {
int32_t val = (highWord << 16) + lowWord;
return val;
}
int64_t getRegisterInt64(uint16_t word1, uint16_t word2, uint16_t word3, uint16_t word4) {
uint64_t val = ((uint64_t)word1 << 48) + ((uint64_t)word2 << 32) + (word3 << 16) + word4;
return val;
}
float getRegisterFloat(uint16_t highWord, uint16_t lowWord) {
uint32_t floatRaw = ((uint32_t)highWord << 16) | lowWord;
float floatValue;
memcpy(&floatValue, &floatRaw, sizeof(float));
return floatValue;
}

View File

@@ -0,0 +1,266 @@
#include <Wire.h>
#include <RTClib.h>
#include <NeoSWSerial.h>
#include <ModbusMaster.h>
#include "util.h"
#include "register_map_vsd.h"
#include <SPI.h>
#include <SdFat.h>
#define SD_CS_PIN 10
#define DE_RE_PIN 4
#define RX_PIN 8
#define TX_PIN 7
#define SLAVE_ID 1
#define SERIAL_BAUDRATE 9600
#define MODBUS_SERIAL_BAUDRATE 19200
#define LED_A_PID 3
#define LED_B_PID 5
#define MAX_RETRIES 1
#define ERROR_VALUE -999.99
#define SPI_CLOCK SD_SCK_MHZ(50)
#if HAS_SDIO_CLASS
#define SD_CONFIG SdioConfig(FIFO_SDIO)
#elif ENABLE_DEDICATED_SPI
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK)
#else
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK)
#endif
RTC_DS3231 rtc;
SdFat32 sd;
File dataFile;
NeoSWSerial modbusSerial(RX_PIN, TX_PIN);
ModbusMaster node;
unsigned long lastRefreshTime = 0;
bool headerWritten = false;
bool booted = false;
void flicker(uint8_t pin, uint8_t times, uint16_t speed) {
while(times--) {
delay(speed);
digitalWrite(pin, HIGH);
delay(speed);
digitalWrite(pin, LOW);
}
}
void setup() {
booted = false;
pinMode(LED_A_PID, OUTPUT);
pinMode(LED_B_PID, OUTPUT);
digitalWrite(LED_A_PID, LOW);
digitalWrite(LED_B_PID, HIGH);
Serial.begin(SERIAL_BAUDRATE);
Serial.println(F("Startup \n"));
if (!rtc.begin()) {
Serial.println(F("Couldn't find RTC\n"));
flicker(LED_B_PID, 4, 1000);
digitalWrite(LED_B_PID, HIGH);
digitalWrite(LED_A_PID, HIGH);
return;
}
if (rtc.lostPower()) {
Serial.println(F("RTC lost power, let's set the time!\n"));
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
flicker(LED_B_PID, 4, 500);
}
pinMode(SD_CS_PIN, OUTPUT);
if (!sd.begin(SD_CONFIG)) {
flicker(LED_B_PID, 2, 1000);
digitalWrite(LED_B_PID, HIGH);
sd.initErrorHalt(&Serial);
return;
}
pinMode(DE_RE_PIN, OUTPUT);
digitalWrite(DE_RE_PIN, LOW);
modbusSerial.begin(MODBUS_SERIAL_BAUDRATE);
node.begin(SLAVE_ID, modbusSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
flicker(LED_B_PID, 10, 100);
digitalWrite(LED_B_PID, LOW);
booted = true;
}
void preTransmission() {
digitalWrite(DE_RE_PIN, HIGH);
digitalWrite(LED_A_PID, HIGH);
}
void postTransmission() {
digitalWrite(DE_RE_PIN, LOW);
digitalWrite(LED_A_PID, LOW);
}
void writeDateTime(File &file) {
DateTime now = rtc.now();
file.print('\n');
file.print(now.year(), DEC);
file.print('-');
file.print(now.month(), DEC);
file.print('-');
file.print(now.day(), DEC);
file.print(' ');
file.print(now.hour(), DEC);
file.print(':');
file.print(now.minute(), DEC);
file.print(':');
file.print(now.second(), DEC);
file.print(',');
}
void getFilename(char* buffer) {
DateTime now = rtc.now();
sprintf(buffer, "pm8k_%d%02d%02d.csv", now.year(), now.month(), now.day());
}
float readRegisterWithRetry(uint16_t addr, uint8_t regtype) {
for(uint8_t retry = 0; retry < MAX_RETRIES; retry++) {
delay(5);
uint8_t result = node.readHoldingRegisters(addr - 1, 2);
if(result == node.ku8MBSuccess) {
switch(regtype) {
case 1:
return node.getResponseBuffer(0);
case 2:
return getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1));
case 3:
return getRegisterInt64(node.getResponseBuffer(0), node.getResponseBuffer(1),
node.getResponseBuffer(2), node.getResponseBuffer(3));
}
}
Serial.print(F("Read error at register "));
Serial.print(addr);
Serial.print(F(", attempt "));
Serial.print(retry + 1);
Serial.print(F(" of "));
Serial.print(MAX_RETRIES);
Serial.print(F(", error code: "));
Serial.println(result);
delay(5 * (retry + 1));
flicker(LED_B_PID, 1, 50);
}
return ERROR_VALUE;
}
void writeHeader() {
if (!headerWritten) {
dataFile.print("\nDate Time,");
const uint16_t totalReg = sizeof(registers) / sizeof(registers[0]);
for (uint16_t i = 0; i < totalReg; i++) {
const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
dataFile.print("@");
dataFile.print(regaddr);
dataFile.print(",");
}
headerWritten = true;
flicker(LED_A_PID, 50, 10);
}
}
void loop() {
if (!booted) {
delay(10000);
digitalWrite(LED_A_PID, LOW);
return;
}
if (millis() - lastRefreshTime >= 1000) {
lastRefreshTime += 1000;
char filename[20];
getFilename(filename);
if (!dataFile.open(filename, FILE_WRITE)) {
flicker(LED_B_PID, 6, 500);
return;
}
writeHeader();
writeDateTime(dataFile);
const uint16_t totalReg = sizeof(registers) / sizeof(registers[0]);
float baseValues[4] = {ERROR_VALUE, ERROR_VALUE, ERROR_VALUE, ERROR_VALUE};
uint8_t errorCount = 0;
// Single pass for both reading and processing
for (uint16_t i = 0; i < totalReg; i++) {
const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
const uint8_t regtype = pgm_read_word(&registers[i].regtype);
const float scale = pgm_read_float(&registers[i].scale);
float value = ERROR_VALUE;
if (regtype <= 3 && regaddr > 0) {
value = readRegisterWithRetry(regaddr, regtype);
if (value == ERROR_VALUE) {
errorCount++;
if (errorCount > 5) {
dataFile.close();
flicker(LED_B_PID, 10, 100);
return;
}
}
if (i < 4) baseValues[i] = value;
} else {
bool validBase = true;
for(uint8_t j = 0; j < 4; j++) {
if (baseValues[j] == ERROR_VALUE) {
validBase = false;
break;
}
}
if (validBase) {
switch(regtype) {
case 4:
value = calculateStatusWord(baseValues);
break;
case 5:
value = calculateThermal(baseValues);
break;
case 6:
value = calculatePower(baseValues);
break;
case 7:
value = calculateRPM(baseValues);
break;
}
}
}
if (value != ERROR_VALUE) {
value *= scale;
}
dataFile.print(value);
dataFile.print(',');
}
dataFile.close();
if (errorCount > 0) {
Serial.print(F("Cycle completed with "));
Serial.print(errorCount);
Serial.println(F(" errors"));
flicker(LED_B_PID, errorCount, 200);
} else {
Serial.println(F("Cycle completed successfully"));
flicker(LED_A_PID, 4, 100);
}
if (errorCount > 5) {
Serial.println(F("Too many errors, aborting cycle"));
dataFile.close();
return;
}
}
}

View File

@@ -0,0 +1,120 @@
# Modbus Reading for Generic VSD Device
This is a specification and implementation of the Arduino-based Modbus data logger for a Generic VSD Device.
This software is designed for Vivarox EMS and only Vivarox has right to use and modify this software.
## Arduino Implementation:
This project uses an Arduino to connect to Modbus devices, read information, and log it onto an SD card with timestamps.
### Hardware needed:
1. Arduino Board
Recommended: Arduino MEGA 2560 (for more memory and I/O pins) or Arduino UNO (for simpler projects).
- [Arduino MEGA @ R377.20](https://www.robotics.org.za/MEGA-16U2?search=Arduino%20MEGA%202560)
- [UNO R3 with 16U2 USB Interface @ R151.00](https://www.robotics.org.za/UNOR3-16U2?search=%20Arduino%20UNO)
2. RS485 to TTL Module
Allows communication between the Arduino and Modbus devices using the RS485 protocol.
- [RS485 Module (TTL -> RS485) @ R25.30](https://www.robotics.org.za/RS485-MOD)
- [MAX485 Bus Transceiver (4 Pack) @ R16.00](https://www.robotics.org.za/MAX485-DIP?search=MAX485)
3. SD Card Module
Allows the Arduino to read from and write data to an SD card.
- [Micro SD Card Module @ R25.00](https://www.diyelectronics.co.za/store/memory/512-micro-sd-card-module.html?srsltid=AfmBOoptww8c6kx53xbZWiP2_C_qOE3r9xinyoCO-AZHrZkNQiyxU17c)
4. RTC Module
To keep track of the current date and time, even when the Arduino is powered off.
- [DS3231 Real Time Clock Module @ R55.20](https://www.robotics.org.za/DS3231-MOD?search=DS3231)
5. Power Supply
To power the Arduino and connected peripherals.
- [AC Adapter 9V with barrel jack @ R60](https://www.robotics.org.za/AC-9V-2A-2155?search=%20Power%20Supply)
6. LED Indicators
Two LEDs for status indication (not included in original cost estimate).
### Wiring
#### RS485 Module to Arduino:
1. RO (Receiver Output) to Arduino RX (pin 8)
2. DI (Driver Input) to Arduino TX (pin 7)
3. DE (Driver Enable) & RE (Receiver Enable) to Arduino digital pin 4
4. VCC to 5V on Arduino
5. GND to GND on Arduino
6. A & B (RS485 differential pair) to Modbus device
#### SD Card Module to Arduino:
1. VCC to 5V on Arduino
2. GND to GND on Arduino
3. MOSI to MOSI (pin 51 on MEGA, pin 11 on UNO)
4. MISO to MISO (pin 50 on MEGA, pin 12 on UNO)
5. SCK to SCK (pin 52 on MEGA, pin 13 on UNO)
6. CS (Chip Select) to digital pin 10
#### RTC Module to Arduino:
1. VCC to 5V on the Arduino
2. GND to GND on the Arduino
3. SDA to SDA (pin 20 on MEGA, pin A4 on UNO)
4. SCL to SCL (pin 21 on MEGA, pin A5 on UNO)
#### LED Indicators:
1. LED A to digital pin 3
2. LED B to digital pin 5
### Software
- Modbus Library: ModbusMaster
- SD Library: SdFat (more advanced than the standard SD library)
- RTC Library: RTClib by Adafruit
- NeoSWSerial: For better latency on software serial communication
### Implementation Details
1. Modbus Configuration:
- Slave ID: 101
- Baud Rate: 9600
- Register map: Defined in separate "register_map_pm8000.h" file
2. Data Logging:
- Frequency: Readings taken every second
- File Format: CSV (Comma-Separated Values)
- Filename: "pm8k_YYYYMMDD.csv" (generated daily based on current date)
- Data Structure: Timestamp, followed by register values
- Header Row: Includes register addresses for easy identification
3. Register Types Supported:
- Float (32-bit)
- Integer (32-bit)
- Long (64-bit)
- String (up to 20 characters)
4. Error Handling and Status Indication:
- LED A: Indicates successful data writing and transmission
- LED B: Indicates errors (e.g., SD card issues, RTC problems, Modbus communication errors)
- Serial output for debugging (9600 baud)
5. Special Features:
- Automatic creation of new log file on date change
- Header row written only once per file
- Robust error handling for SD card, RTC, and Modbus communication
### Programming Workflow
1. Initialize hardware (RTC, SD card, RS485 module)
2. Set up Modbus communication parameters
3. Enter main loop:
- Read current time from RTC
- Read data from Modbus registers
- Write timestamped data to SD card
- Handle any errors and provide status indication via LEDs
- Delay for 1 second before next reading
## Best Practices
- Start by commenting out registers you don't need before adding new ones.
- If you're using an Arduino UNO, you may need to be more selective about which registers to include due to memory constraints.
- Test your modifications incrementally to ensure the Arduino can handle the memory load.
- If you need to read a large number of registers, consider using an Arduino MEGA or a more powerful microcontroller.
By carefully managing the registers in the `register_map_vsd.h` file, you can customize this Modbus reader to suit your specific requirements while staying within the memory limitations of your Arduino board.

View File

@@ -0,0 +1,63 @@
#include <stdint.h>
#ifndef REGISTER_MAP_VSD_H
#define REGISTER_MAP_VSD_H
struct RegisterMap {
uint16_t regaddr;
uint8_t regtype; // 1=UINT16, 2=FLOAT32, 3=INT64, 4=Status, 5=Thermal, 6=Power, 7=RPM
float scale;
};
const PROGMEM RegisterMap registers[] = {
{2910, 4, 1.0}, // Status Word
{2911, 6, 1.0}, // Min Active Value
{2912, 5, 1.0}, // Thermal Sense
{2913, 2, 10.0}, // Frequency
{2914, 1, 1.0}, // Running Hours
{2916, 1, 1.0}, // Operating Hours
{2918, 2, 1.0}, // kWh Counter
{2920, 2, 100.0}, // Input Power kW
{2922, 6, 134.102}, // Input Power HP
{2924, 2, 100.0}, // Motor Current
{2926, 2, 100.0}, // Phase I1
{2928, 2, 100.0}, // Phase I2
{2930, 2, 100.0}, // Phase I3
{2932, 7, 60.0}, // Motor RPM
{2934, 2, 10.0}, // Motor Voltage
{2935, 6, 1.0}, // Torque Nm
{2936, 5, 1.0}, // Motor Thermal
{2937, 5, 1.0}, // Heatsink Temp
{2938, 5, 1.0}, // Card Temp
{2939, 5, 1.0}, // Inverter Thermal
{2940, 2, 1.0}, // DC Link Voltage
{2941, 6, 1.0}, // Motor Torque %
{2942, 2, 100.0}, // Inverter Nominal Current
{2944, 2, 100.0}, // Inverter Max Current
{2946, 4, 1.0}, // Alarm Word 1
{2948, 4, 1.0}, // Alarm Word 2
{2950, 4, 1.0}, // Warning Word 1
{2952, 4, 1.0}, // Warning Word 2
{2954, 4, 1.0}, // Power Ups
{3000, 5, 1.0} // Over Temp Counter
};
float calculateStatusWord(float* values) {
uint16_t status = 0;
if(values[0] > 0) status |= 0x0001; // Running
if(values[1] > 100) status |= 0x0002; // Overload
return status;
}
float calculateThermal(float* values) {
return (values[0] / 100.0) * 100.0;
}
float calculatePower(float* values) {
return values[0] * 0.746; // kW to HP conversion
}
float calculateRPM(float* values) {
return values[0] * 60.0;
}
#endif

View File

@@ -0,0 +1,27 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
uint32_t getRegisterUInt32(uint16_t highWord, uint16_t lowWord) {
uint32_t val = (highWord << 16) + lowWord;
return val;
}
int32_t getRegisterInt32(uint16_t highWord, uint16_t lowWord) {
int32_t val = (highWord << 16) + lowWord;
return val;
}
int64_t getRegisterInt64(uint16_t word1, uint16_t word2, uint16_t word3, uint16_t word4) {
uint64_t val = ((uint64_t)word1 << 48) + ((uint64_t)word2 << 32) + (word3 << 16) + word4;
return val;
}
float getRegisterFloat(uint16_t highWord, uint16_t lowWord) {
uint32_t floatRaw = ((uint32_t)highWord << 16) | lowWord;
float floatValue;
memcpy(&floatValue, &floatRaw, sizeof(float));
return floatValue;
}

View File

@@ -0,0 +1,39 @@
Date Time,@1837,@1838,@1839,@1840,@1841,@2700,@2702,@2704,@2706,@2708,@2710,@2712,@2714,@2716,@2718,@2720,@2722,@2724,@2726,@2728,@2730,@2732,@2734,@2736,@2738,@2740,@2742,@2744,@2746,@2748,@2750,@2754,@2756,@2758,@2762,@2768,@2772,@2774,@2776,@2778,@2780,@2782,@2784,@2786,@2788,@2790,@2792,@2794,@2796,@2798,@2800,@2802,@2804,@2806,@2808,@2810,@3000,@3002,@3004,@3006,@3008,@3020,@3022,@3024,@3028,@3030,@3032,@3054,@3056,@3058,@3060,@3062,@3064,@3066,@3068,@3070,@3072,@3074,@3076,@3110,
2024-9-23 21:16:57,2024,9,23,21,22,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:17:5,2024,9,23,21,22,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:17:12,2024,9,23,21,22,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:17:20,2024,9,23,21,22,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:17:27,2024,9,23,21,22,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:17:35,2024,9,23,21,22,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
Date Time,@1837,@1838,@1839,@1840,@1841,@2700,@2702,@2704,@2706,@2708,@2710,@2712,@2714,@2716,@2718,@2720,@2722,@2724,@2726,@2728,@2730,@2732,@2734,@2736,@2738,@2740,@2742,@2744,@2746,@2748,@2750,@2754,@2756,@2758,@2762,@2768,@2772,@2774,@2776,@2778,@2780,@2782,@2784,@2786,@2788,@2790,@2792,@2794,@2796,@2798,@2800,@2802,@2804,@2806,@2808,@2810,@3000,@3002,@3004,@3006,@3008,@3020,@3022,@3024,@3028,@3030,@3032,@3054,@3056,@3058,@3060,@3062,@3064,@3066,@3068,@3070,@3072,@3074,@3076,@3110,
2024-9-23 21:48:7,2024,10,15,20,23,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:48:15,2024,10,15,20,23,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:48:22,2024,10,15,20,23,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:48:30,2024,10,15,20,23,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:48:37,2024,10,15,20,23,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:48:45,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:48:53,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:0,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:8,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:15,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:23,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:30,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:38,2024,10,15,20,24,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:46,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:49:53,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:1,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:8,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:16,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:24,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:31,2024,10,15,20,25,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:39,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:46,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:50:54,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:1,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:9,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:17,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:24,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:32,2024,10,15,20,26,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:39,2024,10,15,20,27,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
2024-9-23 21:51:47,2024,10,15,20,27,275879.18,0.00,275879.18,275879.18,353.28,454.06,807.33,-100.78,275891.18,0.00,0.48,0.00,0.00,247401.81,0.00,0.00,353.28,0.00,0.00,454.06,30106.41,0.00,0.00,245756.50,0.00,0.00,4485.08,0.00,0.00,4437.08,0.00,nan,nan,nan,nan,nan,nan,nan,0.00,0.00,28477.23,0.00,0.00,246294.14,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,nan,
1 Date Time @1837 @1838 @1839 @1840 @1841 @2700 @2702 @2704 @2706 @2708 @2710 @2712 @2714 @2716 @2718 @2720 @2722 @2724 @2726 @2728 @2730 @2732 @2734 @2736 @2738 @2740 @2742 @2744 @2746 @2748 @2750 @2754 @2756 @2758 @2762 @2768 @2772 @2774 @2776 @2778 @2780 @2782 @2784 @2786 @2788 @2790 @2792 @2794 @2796 @2798 @2800 @2802 @2804 @2806 @2808 @2810 @3000 @3002 @3004 @3006 @3008 @3020 @3022 @3024 @3028 @3030 @3032 @3054 @3056 @3058 @3060 @3062 @3064 @3066 @3068 @3070 @3072 @3074 @3076 @3110
2 2024-9-23 21:16:57 2024 9 23 21 22 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
3 2024-9-23 21:17:5 2024 9 23 21 22 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
4 2024-9-23 21:17:12 2024 9 23 21 22 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
5 2024-9-23 21:17:20 2024 9 23 21 22 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
6 2024-9-23 21:17:27 2024 9 23 21 22 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
7 2024-9-23 21:17:35 2024 9 23 21 22 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
8 Date Time @1837 @1838 @1839 @1840 @1841 @2700 @2702 @2704 @2706 @2708 @2710 @2712 @2714 @2716 @2718 @2720 @2722 @2724 @2726 @2728 @2730 @2732 @2734 @2736 @2738 @2740 @2742 @2744 @2746 @2748 @2750 @2754 @2756 @2758 @2762 @2768 @2772 @2774 @2776 @2778 @2780 @2782 @2784 @2786 @2788 @2790 @2792 @2794 @2796 @2798 @2800 @2802 @2804 @2806 @2808 @2810 @3000 @3002 @3004 @3006 @3008 @3020 @3022 @3024 @3028 @3030 @3032 @3054 @3056 @3058 @3060 @3062 @3064 @3066 @3068 @3070 @3072 @3074 @3076 @3110
9 2024-9-23 21:48:7 2024 10 15 20 23 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
10 2024-9-23 21:48:15 2024 10 15 20 23 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
11 2024-9-23 21:48:22 2024 10 15 20 23 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
12 2024-9-23 21:48:30 2024 10 15 20 23 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
13 2024-9-23 21:48:37 2024 10 15 20 23 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
14 2024-9-23 21:48:45 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
15 2024-9-23 21:48:53 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
16 2024-9-23 21:49:0 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
17 2024-9-23 21:49:8 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
18 2024-9-23 21:49:15 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
19 2024-9-23 21:49:23 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
20 2024-9-23 21:49:30 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
21 2024-9-23 21:49:38 2024 10 15 20 24 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
22 2024-9-23 21:49:46 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
23 2024-9-23 21:49:53 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
24 2024-9-23 21:50:1 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
25 2024-9-23 21:50:8 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
26 2024-9-23 21:50:16 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
27 2024-9-23 21:50:24 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
28 2024-9-23 21:50:31 2024 10 15 20 25 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
29 2024-9-23 21:50:39 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
30 2024-9-23 21:50:46 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
31 2024-9-23 21:50:54 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
32 2024-9-23 21:51:1 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
33 2024-9-23 21:51:9 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
34 2024-9-23 21:51:17 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
35 2024-9-23 21:51:24 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
36 2024-9-23 21:51:32 2024 10 15 20 26 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
37 2024-9-23 21:51:39 2024 10 15 20 27 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan
38 2024-9-23 21:51:47 2024 10 15 20 27 275879.18 0.00 275879.18 275879.18 353.28 454.06 807.33 -100.78 275891.18 0.00 0.48 0.00 0.00 247401.81 0.00 0.00 353.28 0.00 0.00 454.06 30106.41 0.00 0.00 245756.50 0.00 0.00 4485.08 0.00 0.00 4437.08 0.00 nan nan nan nan nan nan nan 0.00 0.00 28477.23 0.00 0.00 246294.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 nan

View File

@@ -0,0 +1,185 @@
# User and Installation Guide: Arduino Modbus Data Logger for PM8000
An electronic version of this manual can be found at: [https://git.warky.dev/vivarox](https://git.warky.dev/vivarox/arduino/src/branch/main/firmware/modbus-sd-pm8000/manual.md)
## 1. Introduction
This guide will walk you through the setup and usage of the Arduino-based Modbus data logger for the Schneider PowerLogic PM8000. This project allows you to read data from the PM8000 using Modbus protocol and log it to an SD card with timestamps.
## 2. Hardware Requirements
- Arduino Board (MEGA 2560 recommended, UNO for simpler projects)
- RS485 to TTL Module
- SD Card Module
- SD Card (formatted as FAT32)
- RTC (Real Time Clock) Module (DS3231)
- Power Supply (9V AC Adapter with barrel jack)
- Two LEDs for status indication
- Jumper wires
- Breadboard (optional, for prototyping)
## 3. Hardware Setup
### 3.1 Wiring Instructions
1. **RS485 Module to Arduino:**
- RO (Receiver Output) → Arduino RX (pin 8)
- DI (Driver Input) → Arduino TX (pin 7)
- DE (Driver Enable) & RE (Receiver Enable) → Arduino digital pin 4
- VCC → 5V on Arduino
- GND → GND on Arduino
- A & B (RS485 differential pair) → Modbus device (PM8000)
2. **SD Card Module to Arduino:**
- VCC → 5V on Arduino
- GND → GND on Arduino
- MOSI → MOSI (pin 51 on MEGA, pin 11 on UNO)
- MISO → MISO (pin 50 on MEGA, pin 12 on UNO)
- SCK → SCK (pin 52 on MEGA, pin 13 on UNO)
- CS (Chip Select) → digital pin 10
3. **RTC Module to Arduino:**
- VCC → 5V on Arduino
- GND → GND on Arduino
- SDA → SDA (pin 20 on MEGA, pin A4 on UNO)
- SCL → SCL (pin 21 on MEGA, pin A5 on UNO)
4. **LED Indicators:**
- LED A → digital pin 3
- LED B → digital pin 5
### 3.2 RS485 Connection to Modbus Device
1. Locate the RS485 connection points on your Modbus device (PM8000):
- There should be terminals labeled '+' (positive) and '-' (negative).
- These correspond to the 'A' and 'B' lines of the RS485 communication.
2. Connect the RS485 module to the Modbus device:
- Connect the 'A' wire from the RS485 module to the '+' terminal on the Modbus device.
- Connect the 'B' wire from the RS485 module to the '-' terminal on the Modbus device.
3. Optional ground connection:
- If you experience communication issues, you may need to connect a ground wire.
- Connect the GND from the RS485 module to the GND or shield terminal on the Modbus device.
4. Troubleshooting RS485 connection:
- If you're experiencing communication issues, try reversing the 'A' and 'B' wires.
- Some devices may label their terminals differently, so reversing the connections might be necessary.
Note: Always refer to the specific documentation of your Modbus device (PM8000) for the correct terminal labels and any device-specific connection requirements.
### 3.3 Power Connection
Connect the 9V AC Adapter to the Arduino's power jack.
### 3.4 SD Card Preparation
1. Insert the SD card into your computer.
2. Format the SD card as FAT32:
- On Windows: Right-click the SD card in File Explorer, select "Format", and choose "FAT32" as the file system.
- On Mac: Use Disk Utility, select the SD card, click "Erase", and choose "MS-DOS (FAT)" as the format.
- On Linux: Use the `mkfs.vfat` command in terminal.
3. After formatting, safely eject the SD card from your computer.
4. Insert the formatted SD card into the SD Card Module connected to your Arduino.
### 3.5 Assembled Device Images
Below are images of the fully assembled Arduino Modbus Data Logger, with annotations highlighting key connections:
1. **Overall Assembly**
- Full assembly of the Arduino Modbus Data Logger
- SD Card Module wired to Arduino
- RS485 module connected to Arduino and Modbus device
- RTC module wired to Arduino
[<img src="../../docs/video/modbus-sd-pm8000/TopView.jpeg" height="400" alt="Full assembly of the Arduino Modbus Data Logger" >](../../docs/video/modbus-sd-pm8000/TopView.jpeg)
1. **Front View**
[<img src="../../docs/video/modbus-sd-pm8000/FrontView.jpeg" height="400" alt="Front View" >](../../docs/video/modbus-sd-pm8000/FrontView.jpeg)
2. **SideView**
[<img src="../../docs/video/modbus-sd-pm8000/SideView.jpeg" height="400" alt="Front View" >](../../docs/video/modbus-sd-pm8000/SideView.jpeg)
Note: These images serve as a visual guide for the assembly process. Always double-check your connections against the wiring instructions provided earlier in this guide.
To see videos of the device working, goto:
[https://git.warky.dev/vivarox/arduino/src/branch/main/docs/video](https://git.warky.dev/vivarox/arduino/src/branch/main/docs/video)
## 4. Software Setup
### 4.1 Required Libraries
Install the following libraries using the Arduino IDE Library Manager:
- ModbusMaster
- SdFat
- RTClib
- NeoSWSerial
### 4.2 Arduino IDE Setup
1. Download and install the Arduino IDE from [arduino.cc](https://www.arduino.cc/en/software)
2. Open the Arduino IDE
3. Go to Tools → Board and select your Arduino board (MEGA 2560 or UNO)
4. Go to Tools → Port and select the COM port for your Arduino
### 4.3 Uploading the Code
1. Download the project files (main sketch and `register_map_pm8000.h`)
2. Open the main sketch in the Arduino IDE
3. Verify that the `register_map_pm8000.h` file is in the same directory as the main sketch
4. Click the "Upload" button to compile and upload the code to your Arduino
## 5. Usage Instructions
1. Ensure all hardware connections are secure
2. Insert the FAT32-formatted SD card into the SD card module
3. Power on the Arduino using the AC adapter
4. The system will automatically begin logging data:
- LED A will blink to indicate successful data writing and transmission
- LED B will light up if there are any errors (SD card issues, RTC problems, Modbus communication errors)
5. Data will be logged to a file named `pm8k_YYYYMMDD.csv` on the SD card
6. To retrieve data, power off the Arduino and remove the SD card
7. Insert the SD card into a computer to view and analyze the logged data
## 6. Troubleshooting
- If LED B is constantly lit:
- Check SD card insertion and formatting (ensure it's FAT32)
- Verify RTC module connections
- Ensure proper Modbus wiring to the PM8000
- If no data is being logged:
- Check the Modbus device ID and baud rate in the code
- Verify the register map in `register_map_pm8000.h`
- Ensure the SD card is properly formatted as FAT32
- If you're experiencing Modbus communication issues:
- Verify the RS485 connections are correct (A to +, B to -)
- Try reversing the A and B connections
- Add a ground wire between the RS485 module and the Modbus device if not already present
- Check the baud rate settings in the code match the Modbus device settings
- Ensure the correct Modbus device ID is set in the code
- For detailed error messages, connect the Arduino to a computer and open the Serial Monitor in the Arduino IDE (set to 9600 baud)
## 7. Customization
To modify the registers being read:
1. Open `register_map_pm8000.h` in a text editor
2. Add, remove, or modify register entries in the `registers` array
3. Reupload the code to the Arduino
Note: Be mindful of memory limitations, especially when using an Arduino UNO.
## 8. Maintenance
- Regularly check the SD card for available space
- Replace the SD card or transfer data to a computer when it's nearly full
- Keep the hardware clean and dry to ensure longevity
## Further help
For technical support or further customization, please contact Vivarox EMS or Warky Devs.
Via support@warky.dev
Designed by www.warky.dev
<img src="../../wdevs.png" height="200" alt="Logo" >

Binary file not shown.

View File

@@ -0,0 +1,306 @@
#include <Wire.h>
#include <RTClib.h>
#include <NeoSWSerial.h>
#include <ModbusMaster.h>
#include "util.h"
#include "register_map_pm8000.h"
// #include <SD.h>
#include <SPI.h>
#include <SdFat.h>
#define SD_CS_PIN 10 // Chip Select for SD Card
// RS485 pins
#define DE_RE_PIN 4
#define RX_PIN 8 // SoftwareSerial RX pin
#define TX_PIN 7 // SoftwareSerial TX pin
#define SLAVE_ID 101
#define SERIAL_BAUDRATE 9600
#define LED_A_PID 3
#define LED_B_PID 5
// Try to select the best SD card configuration.
#define SPI_CLOCK SD_SCK_MHZ(50)
#if HAS_SDIO_CLASS
#define SD_CONFIG SdioConfig(FIFO_SDIO)
#elif ENABLE_DEDICATED_SPI
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK)
#else // HAS_SDIO_CLASS
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK)
#endif // HAS_SDIO_CLASS
RTC_DS3231 rtc; // Create an RTC object
SdFat32 sd;
// SdExFat sd;
File dataFile;
NeoSWSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance
ModbusMaster node;
unsigned long lastRefreshTime = 0;
bool headerWritten = false;
bool booted = false;
void flicker(uint8_t pin, uint8_t times, uint16_t speed)
{
for (int i = 0; i < times; i++)
{
delay(speed);
digitalWrite(pin, HIGH);
delay(speed);
digitalWrite(pin, LOW);
}
}
void setup()
{
booted = false;
pinMode(LED_A_PID, OUTPUT);
pinMode(LED_B_PID, OUTPUT);
digitalWrite(LED_A_PID, LOW);
digitalWrite(LED_B_PID, HIGH);
Serial.begin(SERIAL_BAUDRATE); // For debugging
Serial.println(F("Startup \n"));
// Initialize RTC
if (!rtc.begin())
{
Serial.println(F("Couldn't find RTC\n"));
flicker(LED_B_PID, 4, 1000); // 4 times on LED b is RTC Error
digitalWrite(LED_B_PID, HIGH);
digitalWrite(LED_A_PID, HIGH);
return;
}
if (rtc.lostPower())
{
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
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
flicker(LED_B_PID, 4, 500); // 6 times fast on LED b is RTC reset
}
Serial.print(F("Time: "));
Serial.print(rtc.now().timestamp());
Serial.println(F("\n"));
// Initialize SD card
Serial.println(F("SD card initializing..."));
pinMode(SD_CS_PIN, OUTPUT);
// if (!SD.begin(SPI_HALF_SPEED, SD_CS_PIN ))
// {
// Serial.println(F("SD card initialization failed!\n"));
// return;
// }
// Initialize the SD.
if (!sd.begin(SD_CONFIG))
{
flicker(LED_B_PID, 2, 1000);
digitalWrite(LED_B_PID, HIGH);
sd.initErrorHalt(&Serial);
// 2 Times slow and stay on, SD Card initilize error
return;
}
Serial.println(F("SD card initialized.\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);
flicker(LED_B_PID, 10, 100);
digitalWrite(LED_B_PID, LOW);
booted = true;
}
void preTransmission()
{
// Serial.println(F("Transmitting Start"));
digitalWrite(DE_RE_PIN, HIGH); // Enable RS485 transmit
digitalWrite(LED_A_PID, HIGH);
}
void postTransmission()
{
digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit
digitalWrite(LED_A_PID, LOW);
// Serial.println(F("Transmitting End"));
}
void primeFileDate()
{
if (!dataFile)
{
Serial.println(F("Error opening file"));
return;
}
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);
dataFile.print('-');
dataFile.print(now.day(), DEC);
dataFile.print(" ");
dataFile.print(now.hour(), DEC);
dataFile.print(':');
dataFile.print(now.minute(), DEC);
dataFile.print(':');
dataFile.print(now.second(), DEC);
dataFile.print(F(","));
}
String getFilename()
{
DateTime now = rtc.now();
String mb = F("pm8k_");
mb += now.year();
mb += now.month();
mb += now.day();
mb += F(".csv");
return mb;
}
// const char[20] filename = "20240523.csv";
void loop()
{
if (!booted)
{
Serial.print(F("\nBoot failed, cycle "));
delay(10000);
digitalWrite(LED_A_PID, LOW);
return;
}
delay(100);
String writebuffer;
if (millis() - lastRefreshTime >= 1000)
{
lastRefreshTime += 1000;
Serial.print(F("\nTime: "));
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");
if (!dataFile.open(filename.c_str(), FILE_WRITE))
{
flicker(LED_B_PID, 6, 500); // Six quick flickers. SD Card error
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(&registers[i].regaddr);
dataFile.print("@");
dataFile.print(regaddr);
dataFile.print(",");
}
headerWritten = true;
flicker(LED_A_PID, 50, 10); // 10 flickers, written header
}
primeFileDate();
Serial.print("\n");
Serial.println(totalReg);
// Modbus Data Loop
for (int i = 0; i < totalReg; i++)
{
const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
const uint8_t regtype = pgm_read_word(&registers[i].regtype);
Serial.print(F("Reg Read: "));
Serial.println(regtype);
Serial.println(regaddr);
if (regaddr > 0)
{
delay(25); // Gives the pending communication a little delay
uint8_t result = node.readHoldingRegisters(regaddr - 1, 2);
delay(25); // Delay the read for a little bit so that the buffer can be read
if (result == node.ku8MBSuccess)
{
if (regtype == 2)
{
dataFile.print(getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1)));
}
else if (regtype == 1)
{
dataFile.print(node.getResponseBuffer(0));
}
// else if (regtype == 3)
// {
// dataFile.print(getRegisterInt64(node.getResponseBuffer(0), node.getResponseBuffer(1), node.getResponseBuffer(2), node.getResponseBuffer(3)));
// }
else if (regtype == 0)
{
dataFile.print(getRegisterInt32(node.getResponseBuffer(0), node.getResponseBuffer(1)));
}
else if (regtype == 5)
{
for (uint8_t j = 0; j < 20; j++)
{
uint8_t v = node.getResponseBuffer(j);
char a = v;
if (v == 0) {
break;
}
dataFile.print(a);
}
}
else
{
dataFile.print(F("null"));
}
}
else
{
Serial.print(F("Reg Error: "));
Serial.print(result, HEX);
Serial.print("\n");
dataFile.print(F("E"));
dataFile.print(result, HEX);
flicker(LED_B_PID, 2, 250);
}
dataFile.print(",");
}
}
Serial.print(F("\nRead buffer: "));
delay(10);
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"));
flicker(LED_A_PID, 4, 100); // Cycle written 4 quick flickers
}
// // Check if the read was successful
}

View File

@@ -0,0 +1,190 @@
# Modbus Reading for Schneider PowerLogic PM8000
This is a specification and implementation of the Arduino-based Modbus data logger for the Schneider PowerLogic PM8000.
This software is designed for Vivarox EMS and only Vivarox has right to use and modify this software.
## Arduino Implementation:
This project uses an Arduino to connect to Modbus devices, read information, and log it onto an SD card with timestamps.
### Hardware needed:
1. Arduino Board
Recommended: Arduino MEGA 2560 (for more memory and I/O pins) or Arduino UNO (for simpler projects).
- [Arduino MEGA @ R377.20](https://www.robotics.org.za/MEGA-16U2?search=Arduino%20MEGA%202560)
- [UNO R3 with 16U2 USB Interface @ R151.00](https://www.robotics.org.za/UNOR3-16U2?search=%20Arduino%20UNO)
2. RS485 to TTL Module
Allows communication between the Arduino and Modbus devices using the RS485 protocol.
- [RS485 Module (TTL -> RS485) @ R25.30](https://www.robotics.org.za/RS485-MOD)
- [MAX485 Bus Transceiver (4 Pack) @ R16.00](https://www.robotics.org.za/MAX485-DIP?search=MAX485)
3. SD Card Module
Allows the Arduino to read from and write data to an SD card.
- [Micro SD Card Module @ R25.00](https://www.diyelectronics.co.za/store/memory/512-micro-sd-card-module.html?srsltid=AfmBOoptww8c6kx53xbZWiP2_C_qOE3r9xinyoCO-AZHrZkNQiyxU17c)
4. RTC Module
To keep track of the current date and time, even when the Arduino is powered off.
- [DS3231 Real Time Clock Module @ R55.20](https://www.robotics.org.za/DS3231-MOD?search=DS3231)
5. Power Supply
To power the Arduino and connected peripherals.
- [AC Adapter 9V with barrel jack @ R60](https://www.robotics.org.za/AC-9V-2A-2155?search=%20Power%20Supply)
6. LED Indicators
Two LEDs for status indication (not included in original cost estimate).
### Wiring
#### RS485 Module to Arduino:
1. RO (Receiver Output) to Arduino RX (pin 8)
2. DI (Driver Input) to Arduino TX (pin 7)
3. DE (Driver Enable) & RE (Receiver Enable) to Arduino digital pin 4
4. VCC to 5V on Arduino
5. GND to GND on Arduino
6. A & B (RS485 differential pair) to Modbus device
#### SD Card Module to Arduino:
1. VCC to 5V on Arduino
2. GND to GND on Arduino
3. MOSI to MOSI (pin 51 on MEGA, pin 11 on UNO)
4. MISO to MISO (pin 50 on MEGA, pin 12 on UNO)
5. SCK to SCK (pin 52 on MEGA, pin 13 on UNO)
6. CS (Chip Select) to digital pin 10
#### RTC Module to Arduino:
1. VCC to 5V on the Arduino
2. GND to GND on the Arduino
3. SDA to SDA (pin 20 on MEGA, pin A4 on UNO)
4. SCL to SCL (pin 21 on MEGA, pin A5 on UNO)
#### LED Indicators:
1. LED A to digital pin 3
2. LED B to digital pin 5
### Software
- Modbus Library: ModbusMaster
- SD Library: SdFat (more advanced than the standard SD library)
- RTC Library: RTClib by Adafruit
- NeoSWSerial: For better latency on software serial communication
### Implementation Details
1. Modbus Configuration:
- Slave ID: 101
- Baud Rate: 9600
- Register map: Defined in separate "register_map_pm8000.h" file
2. Data Logging:
- Frequency: Readings taken every second
- File Format: CSV (Comma-Separated Values)
- Filename: "pm8k_YYYYMMDD.csv" (generated daily based on current date)
- Data Structure: Timestamp, followed by register values
- Header Row: Includes register addresses for easy identification
3. Register Types Supported:
- Float (32-bit)
- Integer (32-bit)
- Long (64-bit)
- String (up to 20 characters)
4. Error Handling and Status Indication:
- LED A: Indicates successful data writing and transmission
- LED B: Indicates errors (e.g., SD card issues, RTC problems, Modbus communication errors)
- Serial output for debugging (9600 baud)
5. Special Features:
- Automatic creation of new log file on date change
- Header row written only once per file
- Robust error handling for SD card, RTC, and Modbus communication
### Programming Workflow
1. Initialize hardware (RTC, SD card, RS485 module)
2. Set up Modbus communication parameters
3. Enter main loop:
- Read current time from RTC
- Read data from Modbus registers
- Write timestamped data to SD card
- Handle any errors and provide status indication via LEDs
- Delay for 1 second before next reading
## Costs
Estimated cost of the hardware from suppliers like Micro Robotics, excluding labor to assemble:
- R617.00 per unit using the Arduino MEGA
- R374.50 per unit using the Arduino UNO
Note: These costs do not include the additional LEDs for status indication.
## Additional Notes
- The system is designed to reset and write logs to newly inserted SD cards automatically.
- Error handling includes visual feedback via LED indicators and detailed serial output for debugging.
- The modular design allows for easy expansion of register types and Modbus devices.
For more detailed implementation, refer to the [Source Code](https://git.warky.dev/vivarox/arduino/src/branch/main/firmware/modbus-sd/modbus-sd-pm8000/modbus-sd-pm8000.ino).
## Memory Limitations and Register Customization
### Memory Constraints
The Arduino, particularly models like the UNO and MEGA, has limited memory available for storing program code and variables. This limitation affects the number of Modbus registers that can be defined and read in a single project.
- Arduino UNO: 32 KB Flash (program storage), 2 KB SRAM
- Arduino MEGA: 256 KB Flash, 8 KB SRAM
Due to these constraints, the number of registers that can be defined in the `register_map_pm8000.h` file is not unlimited. The exact number will depend on the complexity of your code and other libraries used.
### Customizing the Register Map
To adapt this project to your specific needs, you can modify the `register_map_pm8000.h` file. This file contains the definitions of Modbus registers to be read by the Arduino.
To customize the register map:
1. Open the `register_map_pm8000.h` file in your Arduino IDE or text editor.
2. Locate the `registers` array in the file. It should look something like this:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
{40003, 1},
// ... other registers ...
};
```
3. To remove a register, simply comment out its line by adding `//` at the beginning:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
// {40003, 1}, // This register is now commented out and won't be read
// ... other registers ...
};
```
4. To add a new register, add a new line to the array with the register address and type:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
{40003, 1},
{40005, 2}, // New register added
// ... other registers ...
};
```
5. Remember to keep the array syntax correct, with commas between entries and a semicolon at the end of the array.
## Best Practices
- Start by commenting out registers you don't need before adding new ones.
- If you're using an Arduino UNO, you may need to be more selective about which registers to include due to memory constraints.
- Test your modifications incrementally to ensure the Arduino can handle the memory load.
- If you need to read a large number of registers, consider using an Arduino MEGA or a more powerful microcontroller.
By carefully managing the registers in the `register_map_pm8000.h` file, you can customize this Modbus reader to suit your specific requirements while staying within the memory limitations of your Arduino board.

View File

@@ -0,0 +1,602 @@
#include <stdint.h>
struct RegisterMap
{
uint16_t regaddr;
uint8_t regtype;
};
const PROGMEM RegisterMap registers[] = {
//{ 30, 5} , // Name: Meter Name (DeviceName) - [30,20] as UTF8
//{ 50, 5} , // Name: Meter Model (DeviceType) - [50,20] as UTF8
{ 1837, 1} , // Name: Year (Year) - [1837,1] as INT16U
{ 1838, 1} , // Name: Month (Month) - [1838,1] as INT16U
{ 1839, 1} , // Name: Day (Day) - [1839,1] as INT16U
{ 1840, 1} , // Name: Hour (Hour) - [1840,1] as INT16U
{ 1841, 1} , // Name: Minute (Minute) - [1841,1] as INT16U
{ 2700, 2} , // Name: Active Energy Delivered (Into Load) (kWh del) - [2700,2] as FLOAT32
{ 2702, 2} , // Name: Active Energy Received (Out of Load) (kWh rec) - [2702,2] as FLOAT32
{ 2704, 2} , // Name: Active Energy Delivered + Received (kWh del+rec) - [2704,2] as FLOAT32
{ 2706, 2} , // Name: Active Energy Delivered- Received (kWh del-rec) - [2706,2] as FLOAT32
{ 2708, 2} , // Name: Reactive Energy Delivered (kVARh del) - [2708,2] as FLOAT32
{ 2710, 2} , // Name: Reactive Energy Received (kVARh rec) - [2710,2] as FLOAT32
{ 2712, 2} , // Name: Reactive Energy Delivered + Received (kVARh del+rec) - [2712,2] as FLOAT32
{ 2714, 2} , // Name: Reactive Energy Delivered - Received (kVARh del-rec) - [2714,2] as FLOAT32
{ 2716, 2} , // Name: Apparent Energy Delivered (kVAh del) - [2716,2] as FLOAT32
{ 2718, 2} , // Name: Apparent Energy Received (kVAh rec) - [2718,2] as FLOAT32
{ 2720, 2} , // Name: Apparent Energy Delivered + Received (kVAh del+rec) - [2720,2] as FLOAT32
{ 2722, 2} , // Name: Apparent Energy Delivered - Received (kVAh del-rec) - [2722,2] as FLOAT32
{ 2724, 2} , // Name: Active Energy in Quadrant I (kWh Q1) - [2724,2] as FLOAT32
{ 2726, 2} , // Name: Active Energy in Quadrant II (kWh Q2) - [2726,2] as FLOAT32
{ 2728, 2} , // Name: Active Energy in Quadrant III (kWh Q3) - [2728,2] as FLOAT32
{ 2730, 2} , // Name: Active Energy in Quadrant IV (kWh Q4) - [2730,2] as FLOAT32
{ 2732, 2} , // Name: Reactive Energy in Quadrant I (kVARh Q1) - [2732,2] as FLOAT32
{ 2734, 2} , // Name: Reactive Energy in Quadrant II (kVARh Q2) - [2734,2] as FLOAT32
{ 2736, 2} , // Name: Reactive Energy in Quadrant III (kVARh Q3) - [2736,2] as FLOAT32
{ 2738, 2} , // Name: Reactive Energy in Quadrant IV (kVARh Q4) - [2738,2] as FLOAT32
{ 2740, 2} , // Name: Apparent Energy in Quadrant I (kVAh Q1) - [2740,2] as FLOAT32
{ 2742, 2} , // Name: Apparent Energy in Quadrant II (kVAh Q2) - [2742,2] as FLOAT32
{ 2744, 2} , // Name: Apparent Energy in Quadrant III (kVAh Q3) - [2744,2] as FLOAT32
{ 2746, 2} , // Name: Apparent Energy in Quadrant IV (kVAh Q4) - [2746,2] as FLOAT32
{ 2748, 2} , // Name: Conditional Active Energy Delivered (Into Load) (Cnd kWh del) - [2748,2] as FLOAT32
{ 2750, 2} , // Name: Conditional Active Energy Received (Out of Load) (Cnd kWh rec) - [2750,2] as FLOAT32
{ 2754, 2} , // Name: Active Energy Delivered - Received, Conditional (Cnd kWh d-r) - [2754,2] as FLOAT32
{ 2756, 2} , // Name: Conditional Reactive Energy In (Delivered) (Cnd kVARh del) - [2756,2] as FLOAT32
{ 2758, 2} , // Name: Conditional Reactive Energy Out (Received) (Cnd kVARh rec) - [2758,2] as FLOAT32
{ 2762, 2} , // Name: Reactive Energy Delivered - Received, Conditional (Cnd kVARh d-r) - [2762,2] as FLOAT32
{ 2768, 2} , // Name: Apparent Energy Delivered + Received, Conditional (Cnd kVAh d+r) - [2768,2] as FLOAT32
{ 2772, 2} , // Name: Active Energy Delivered , Last Complete Interval (Inc kWh del C) - [2772,2] as FLOAT32
{ 2774, 2} , // Name: Active Energy Received , Last Complete Interval (Inc kWh rec C) - [2774,2] as FLOAT32
{ 2776, 2} , // Name: Active Energy Delivered - Received , Last Complete Interval (Inc kWh d-r C) - [2776,2] as FLOAT32
{ 2778, 2} , // Name: Reactive Energy Delivered , Last Complete Interval (Inc kVARh del C) - [2778,2] as FLOAT32
{ 2780, 2} , // Name: Reactive Energy Received , Last Complete Interval (Inc kVARh rec C) - [2780,2] as FLOAT32
{ 2782, 2} , // Name: Reactive Energy Delivered - Received , Last Complete Interval (Inc kVARh d-r C) - [2782,2] as FLOAT32
{ 2784, 2} , // Name: Apparent Energy Delivered + Received , Last Complete Interval (Inc kVAh d+r C) - [2784,2] as FLOAT32
{ 2786, 2} , // Name: Active Energy Delivered , Present Interval (Inc kWh del) - [2786,2] as FLOAT32
{ 2788, 2} , // Name: Active Energy Received , Present Interval (Inc kWh rec) - [2788,2] as FLOAT32
{ 2790, 2} , // Name: Active Energy Delivered - Received , Present Interval (Inc kWh d-r) - [2790,2] as FLOAT32
{ 2792, 2} , // Name: Reactive Energy Delivered , Present Interval (Inc kVARh del) - [2792,2] as FLOAT32
{ 2794, 2} , // Name: Reactive Energy Received , Present Interval (Inc kVARh rec) - [2794,2] as FLOAT32
{ 2796, 2} , // Name: Reactive Energy Delivered - Received , Present Interval (Inc kVARh d-r) - [2796,2] as FLOAT32
{ 2798, 2} , // Name: Apparent Energy Delivered + Received , Present Interval (Inc kVAh d+r) - [2798,2] as FLOAT32
{ 2800, 2} , // Name: Active Energy Delivered Interval (kWh del int) - [2800,2] as FLOAT32
{ 2802, 2} , // Name: Active Energy Received Interval (kWh rec int) - [2802,2] as FLOAT32
{ 2804, 2} , // Name: Reactive Energy Delivered Interval (kVARh del int) - [2804,2] as FLOAT32
{ 2806, 2} , // Name: Reactive Energy Received Interval (kVARh rec int) - [2806,2] as FLOAT32
{ 2808, 2} , // Name: Apparent Energy Delivered Interval (kVAh del int) - [2808,2] as FLOAT32
{ 2810, 2} , // Name: Apparent Energy Received Interval (kVAh rec int) - [2810,2] as FLOAT32
{ 3000, 2} , // Name: Current A (I a) - [3000,2] as FLOAT32
{ 3002, 2} , // Name: Current B (I b) - [3002,2] as FLOAT32
{ 3004, 2} , // Name: Current C (I c) - [3004,2] as FLOAT32
{ 3006, 2} , // Name: Current N (I 4) - [3006,2] as FLOAT32
{ 3008, 2} , // Name: Current G (I 5) - [3008,2] as FLOAT32
//{ 3010, 2} , // Name: Current Avg (I avg) - [3010,2] as FLOAT32
{ 3020, 2} , // Name: Voltage A-B (Vll ab) - [3020,2] as FLOAT32
{ 3022, 2} , // Name: Voltage B-C (Vll bc) - [3022,2] as FLOAT32
{ 3024, 2} , // Name: Voltage C-A (Vll ca) - [3024,2] as FLOAT32
//{ 3026, 2} , // Name: Voltage L-L Avg (Vll avg) - [3026,2] as FLOAT32
{ 3028, 2} , // Name: Voltage A-N (Vln a) - [3028,2] as FLOAT32
{ 3030, 2} , // Name: Voltage B-N (Vln b) - [3030,2] as FLOAT32
{ 3032, 2} , // Name: Voltage C-N (Vln c) - [3032,2] as FLOAT32
// { 3036, 2} , // Name: Voltage L-N Avg (Vln avg) - [3036,2] as FLOAT32
{ 3054, 2} , // Name: Active Power A (kW a) - [3054,2] as FLOAT32
{ 3056, 2} , // Name: Active Power B (kW b) - [3056,2] as FLOAT32
{ 3058, 2} , // Name: Active Power C (kW c) - [3058,2] as FLOAT32
{ 3060, 2} , // Name: Active Power Total (kW tot) - [3060,2] as FLOAT32
{ 3062, 2} , // Name: Reactive Power A (kVAR a) - [3062,2] as FLOAT32
{ 3064, 2} , // Name: Reactive Power B (kVAR b) - [3064,2] as FLOAT32
{ 3066, 2} , // Name: Reactive Power C (kVAR c) - [3066,2] as FLOAT32
{ 3068, 2} , // Name: Reactive Power Total (kVAR tot) - [3068,2] as FLOAT32
{ 3070, 2} , // Name: Apparent Power A (kVA a) - [3070,2] as FLOAT32
{ 3072, 2} , // Name: Apparent Power B (kVA b) - [3072,2] as FLOAT32
{ 3074, 2} , // Name: Apparent Power C (kVA c) - [3074,2] as FLOAT32
{ 3076, 2} , // Name: Apparent Power Total (kVA tot) - [3076,2] as FLOAT32
{ 3110, 2} , // Name: Frequency (Freq) - [3110,2] as FLOAT32
// { 3204, 3} , // Name: Active Energy Delivered (Into Load) (kWh del) - [3204,4] as INT64
// { 3208, 3} , // Name: Active Energy Received (Out of Load) (kWh rec) - [3208,4] as INT64
// { 3212, 3} , // Name: Active Energy Delivered + Received (kWh del+rec) - [3212,4] as INT64
// { 3216, 3} , // Name: Active Energy Delivered- Received (kWh del-rec) - [3216,4] as INT64
// { 3220, 3} , // Name: Reactive Energy Delivered (kVARh del) - [3220,4] as INT64
// { 3224, 3} , // Name: Reactive Energy Received (kVARh rec) - [3224,4] as INT64
// { 3228, 3} , // Name: Reactive Energy Delivered + Received (kVARh del+rec) - [3228,4] as INT64
// { 3232, 3} , // Name: Reactive Energy Delivered - Received (kVARh del-rec) - [3232,4] as INT64
// { 3236, 3} , // Name: Apparent Energy Delivered (kVAh del) - [3236,4] as INT64
// { 3240, 3} , // Name: Apparent Energy Received (kVAh rec) - [3240,4] as INT64
// { 3244, 3} , // Name: Apparent Energy Delivered + Received (kVAh del+rec) - [3244,4] as INT64
// { 3248, 3} , // Name: Apparent Energy Delivered - Received (kVAh del-rec) - [3248,4] as INT64
// { 3256, 3} , // Name: Active Energy in Quadrant I (kWh Q1) - [3256,4] as INT64
// { 3260, 3} , // Name: Active Energy in Quadrant II (kWh Q2) - [3260,4] as INT64
// { 3264, 3} , // Name: Active Energy in Quadrant III (kWh Q3) - [3264,4] as INT64
// { 3268, 3} , // Name: Active Energy in Quadrant IV (kWh Q4) - [3268,4] as INT64
// { 3272, 3} , // Name: Reactive Energy in Quadrant I (kVARh Q1) - [3272,4] as INT64
// { 3276, 3} , // Name: Reactive Energy in Quadrant II (kVARh Q2) - [3276,4] as INT64
// { 3280, 3} , // Name: Reactive Energy in Quadrant III (kVARh Q3) - [3280,4] as INT64
// { 3284, 3} , // Name: Reactive Energy in Quadrant IV (kVARh Q4) - [3284,4] as INT64
// { 3288, 3} , // Name: Apparent Energy in Quadrant I (kVAh Q1) - [3288,4] as INT64
// { 3292, 3} , // Name: Apparent Energy in Quadrant II (kVAh Q2) - [3292,4] as INT64
// { 3296, 3} , // Name: Apparent Energy in Quadrant III (kVAh Q3) - [3296,4] as INT64
// { 3300, 3} , // Name: Apparent Energy in Quadrant IV (kVAh Q4) - [3300,4] as INT64
// { 3358, 3} , // Name: Conditional Active Energy Delivered (Into Load) (Cnd kWh del) - [3358,4] as INT64
// { 3362, 3} , // Name: Conditional Active Energy Received (Out of Load) (Cnd kWh rec) - [3362,4] as INT64
// { 3370, 3} , // Name: Active Energy Delivered - Received, Conditional (Cnd kWh d-r) - [3370,4] as INT64
// { 3374, 3} , // Name: Conditional Reactive Energy In (Delivered) (Cnd kVARh del) - [3374,4] as INT64
// { 3378, 3} , // Name: Conditional Reactive Energy Out (Received) (Cnd kVARh rec) - [3378,4] as INT64
// { 3386, 3} , // Name: Reactive Energy Delivered - Received, Conditional (Cnd kVARh d-r) - [3386,4] as INT64
// { 3398, 3} , // Name: Apparent Energy Delivered + Received, Conditional (Cnd kVAh d+r) - [3398,4] as INT64
// { 3414, 3} , // Name: Active Energy Delivered , Last Complete Interval (Inc kWh del C) - [3414,4] as INT64
// { 3418, 3} , // Name: Active Energy Received , Last Complete Interval (Inc kWh rec C) - [3418,4] as INT64
// { 3422, 3} , // Name: Active Energy Delivered - Received , Last Complete Interval (Inc kWh d-r C) - [3422,4] as INT64
// { 3426, 3} , // Name: Reactive Energy Delivered , Last Complete Interval (Inc kVARh del C) - [3426,4] as INT64
// { 3430, 3} , // Name: Reactive Energy Received , Last Complete Interval (Inc kVARh rec C) - [3430,4] as INT64
// { 3434, 3} , // Name: Reactive Energy Delivered - Received , Last Complete Interval (Inc kVARh d-r C) - [3434,4] as INT64
// { 3438, 3} , // Name: Apparent Energy Delivered + Received , Last Complete Interval (Inc kVAh d+r C) - [3438,4] as INT64
// { 3442, 3} , // Name: Active Energy Delivered , Present Interval (Inc kWh del) - [3442,4] as INT64
// { 3446, 3} , // Name: Active Energy Received , Present Interval (Inc kWh rec) - [3446,4] as INT64
// { 3450, 3} , // Name: Active Energy Delivered - Received , Present Interval (Inc kWh d-r) - [3450,4] as INT64
// { 3454, 3} , // Name: Reactive Energy Delivered , Present Interval (Inc kVARh del) - [3454,4] as INT64
// { 3458, 3} , // Name: Reactive Energy Received , Present Interval (Inc kVARh rec) - [3458,4] as INT64
// { 3462, 3} , // Name: Reactive Energy Delivered - Received , Present Interval (Inc kVARh d-r) - [3462,4] as INT64
// { 3466, 3} , // Name: Apparent Energy Delivered + Received , Present Interval (Inc kVAh d+r) - [3466,4] as INT64
// { 3470, 3} , // Name: Active Energy Delivered Interval (kWh del int) - [3470,4] as INT64
// { 3474, 3} , // Name: Active Energy Received Interval (kWh rec int) - [3474,4] as INT64
// { 3478, 3} , // Name: Reactive Energy Delivered Interval (kVARh del int) - [3478,4] as INT64
// { 3482, 3} , // Name: Reactive Energy Received Interval (kVARh rec int) - [3482,4] as INT64
// { 3486, 3} , // Name: Apparent Energy Delivered Interval (kVAh del int) - [3486,4] as INT64
// { 3490, 3} , // Name: Apparent Energy Received Interval (kVAh rec int) - [3490,4] as INT64
// { 3650, 2} , // Name: Current A Squared Hours (MU Ia^2h) - [3650,2] as FLOAT32
// { 3652, 2} , // Name: Current B Square Hours (MU Ib^2h) - [3652,2] as FLOAT32
// { 3654, 2} , // Name: Current C Square Hours (MU Ic^2h) - [3654,2] as FLOAT32
// { 3656, 2} , // Name: Voltage A-B Square Hours (MU Vll ab^2h) - [3656,2] as FLOAT32
// { 3658, 2} , // Name: Voltage B-C Square Hours (MU Vll bc^2h) - [3658,2] as FLOAT32
// { 3660, 2} , // Name: Voltage C-A Square Hours (MU Vll ca^2h) - [3660,2] as FLOAT32
// { 3668, 2} , // Name: Current A Squared Hours (MU Ia^2h int) - [3668,2] as FLOAT32
// { 3670, 2} , // Name: Current B Square Hours (MU Ib^2h int) - [3670,2] as FLOAT32
// { 3672, 2} , // Name: Current C Square Hours (MU Ic^2h int) - [3672,2] as FLOAT32
// { 3674, 2} , // Name: Voltage A-B Square Hours (MU Vllab^2h int) - [3674,2] as FLOAT32
// { 3676, 2} , // Name: Voltage B-C Square Hours (MU Vllbc^2h int) - [3676,2] as FLOAT32
// { 3678, 2} , // Name: Voltage C-A Square Hours (MU Vllca^2h int) - [3678,2] as FLOAT32
// { 3680, 2} , // Name: Voltage A-N Square Hours (MU Vlna^2h int) - [3680,2] as FLOAT32
// { 3682, 2} , // Name: Voltage B-N Square Hours (MU Vlnb^2h int) - [3682,2] as FLOAT32
// { 3684, 2} , // Name: Voltage C-N Square Hours (MU Vlnc^2h int) - [3684,2] as FLOAT32
// { 4196, 3} , // Name: Active Energy Delivered Rate 1 (kWh del A) - [4196,4] as INT64
// { 4200, 3} , // Name: Active Energy Delivered Rate 2 (kWh del B) - [4200,4] as INT64
// { 4204, 3} , // Name: Active Energy Delivered Rate 3 (kWh del C) - [4204,4] as INT64
// { 4208, 3} , // Name: Active Energy Delivered Rate 4 (kWh del D) - [4208,4] as INT64
// { 4228, 3} , // Name: Active Energy Received Rate 1 (kWh rec A) - [4228,4] as INT64
// { 4232, 3} , // Name: Active Energy Received Rate 2 (kWh rec B) - [4232,4] as INT64
// { 4236, 3} , // Name: Active Energy Received Rate 3 (kWh rec C) - [4236,4] as INT64
// { 4240, 3} , // Name: Active Energy Received Rate 4 (kWh rec D) - [4240,4] as INT64
// { 4260, 3} , // Name: Reactive Energy Delivered Rate 1 (kVARh del A) - [4260,4] as INT64
// { 4264, 3} , // Name: Reactive Energy Delivered Rate 2 (kVARh del B) - [4264,4] as INT64
// { 4268, 3} , // Name: Reactive Energy Delivered Rate 3 (kVARh del C) - [4268,4] as INT64
// { 4272, 3} , // Name: Reactive Energy Delivered Rate 4 (kVARh del D) - [4272,4] as INT64
// { 4292, 3} , // Name: Reactive Energy Received Rate 1 (kVARh rec A) - [4292,4] as INT64
// { 4296, 3} , // Name: Reactive Energy Received Rate 2 (kVARh rec B) - [4296,4] as INT64
// { 4300, 3} , // Name: Reactive Energy Received Rate 3 (kVARh rec C) - [4300,4] as INT64
// { 4304, 3} , // Name: Reactive Energy Received Rate 4 (kVARh rec D) - [4304,4] as INT64
// { 4324, 3} , // Name: Apparent Energy Delivered Rate 1 (kVAh del A) - [4324,4] as INT64
// { 4328, 3} , // Name: Apparent Energy Delivered Rate 2 (kVAh del B) - [4328,4] as INT64
// { 4332, 3} , // Name: Apparent Energy Delivered Rate 3 (kVAh del C) - [4332,4] as INT64
// { 4336, 3} , // Name: Apparent Energy Delivered Rate 4 (kVAh del D) - [4336,4] as INT64
// { 4356, 3} , // Name: Apparent Energy Received Rate 1 (kVAh rec A) - [4356,4] as INT64
// { 4360, 3} , // Name: Apparent Energy Received Rate 2 (kVAh rec B) - [4360,4] as INT64
// { 4364, 3} , // Name: Apparent Energy Received Rate 3 (kVAh rec C) - [4364,4] as INT64
// { 4368, 3} , // Name: Apparent Energy Received Rate 4 (kVAh rec D) - [4368,4] as INT64
// { 4800, 2} , // Name: Active Energy Delivered Rate 1 (kWh del A) - [4800,2] as FLOAT32
// { 4802, 2} , // Name: Active Energy Delivered Rate 2 (kWh del B) - [4802,2] as FLOAT32
// { 4804, 2} , // Name: Active Energy Delivered Rate 3 (kWh del C) - [4804,2] as FLOAT32
// { 4806, 2} , // Name: Active Energy Delivered Rate 4 (kWh del D) - [4806,2] as FLOAT32
// { 4816, 2} , // Name: Active Energy Received Rate 1 (kWh rec A) - [4816,2] as FLOAT32
// { 4818, 2} , // Name: Active Energy Received Rate 2 (kWh rec B) - [4818,2] as FLOAT32
// { 4820, 2} , // Name: Active Energy Received Rate 3 (kWh rec C) - [4820,2] as FLOAT32
// { 4822, 2} , // Name: Active Energy Received Rate 4 (kWh rec D) - [4822,2] as FLOAT32
// { 4832, 2} , // Name: Reactive Energy Delivered Rate 1 (kVARh del A) - [4832,2] as FLOAT32
// { 4834, 2} , // Name: Reactive Energy Delivered Rate 2 (kVARh del B) - [4834,2] as FLOAT32
// { 4836, 2} , // Name: Reactive Energy Delivered Rate 3 (kVARh del C) - [4836,2] as FLOAT32
// { 4838, 2} , // Name: Reactive Energy Delivered Rate 4 (kVARh del D) - [4838,2] as FLOAT32
// { 4848, 2} , // Name: Reactive Energy Received Rate 1 (kVARh rec A) - [4848,2] as FLOAT32
// { 4850, 2} , // Name: Reactive Energy Received Rate 2 (kVARh rec B) - [4850,2] as FLOAT32
// { 4852, 2} , // Name: Reactive Energy Received Rate 3 (kVARh rec C) - [4852,2] as FLOAT32
// { 4854, 2} , // Name: Reactive Energy Received Rate 4 (kVARh rec D) - [4854,2] as FLOAT32
// { 4864, 2} , // Name: Apparent Energy Delivered Rate 1 (kVAh del A) - [4864,2] as FLOAT32
// { 4866, 2} , // Name: Apparent Energy Delivered Rate 2 (kVAh del B) - [4866,2] as FLOAT32
// { 4868, 2} , // Name: Apparent Energy Delivered Rate 3 (kVAh del C) - [4868,2] as FLOAT32
// { 4870, 2} , // Name: Apparent Energy Delivered Rate 4 (kVAh del D) - [4870,2] as FLOAT32
// { 4880, 2} , // Name: Apparent Energy Received Rate 1 (kVAh rec A) - [4880,2] as FLOAT32
// { 4882, 2} , // Name: Apparent Energy Received Rate 2 (kVAh rec B) - [4882,2] as FLOAT32
// { 4884, 2} , // Name: Apparent Energy Received Rate 3 (kVAh rec C) - [4884,2] as FLOAT32
// { 4886, 2} , // Name: Apparent Energy Received Rate 4 (kVAh rec D) - [4886,2] as FLOAT32
// { 14045, 2} , // Name: Pickup Setpoint (Over I 4 High Limit) - [14045,2] as FLOAT32
// { 14049, 2} , // Name: Dropout Setpoint (Over I 4 Low Limit) - [14049,2] as FLOAT32
// { 14325, 2} , // Name: Pickup Setpoint (Over kW sd High Limit) - [14325,2] as FLOAT32
// { 14329, 2} , // Name: Dropout Setpoint (Over kW sd Low Limit) - [14329,2] as FLOAT32
// { 14585, 2} , // Name: Pickup Setpoint (Over I a High Limit) - [14585,2] as FLOAT32
// { 14589, 2} , // Name: Dropout Setpoint (Over I a Low Limit) - [14589,2] as FLOAT32
// { 14605, 2} , // Name: Pickup Setpoint (Over I b High Limit) - [14605,2] as FLOAT32
// { 14609, 2} , // Name: Dropout Setpoint (Over I b Low Limit) - [14609,2] as FLOAT32
// { 14625, 2} , // Name: Pickup Setpoint (Over I c High Limit) - [14625,2] as FLOAT32
// { 14629, 2} , // Name: Dropout Setpoint (Over I c Low Limit) - [14629,2] as FLOAT32
// { 21000, 2} , // Name: HS Current A (HS I a) - [21000,2] as FLOAT32
// { 21002, 2} , // Name: HS Current B (HS I b) - [21002,2] as FLOAT32
// { 21004, 2} , // Name: HS Current C (HS I c) - [21004,2] as FLOAT32
// { 21006, 2} , // Name: HS Current N (HS I 4) - [21006,2] as FLOAT32
// { 21008, 2} , // Name: HS Current G (HS I 5) - [21008,2] as FLOAT32
// { 21010, 2} , // Name: HS Current Avg (HS I avg) - [21010,2] as FLOAT32
// { 21016, 2} , // Name: HS Frequency (HS Freq) - [21016,2] as FLOAT32
// { 21018, 2} , // Name: HS Voltage, A-B (HS Vll ab) - [21018,2] as FLOAT32
// { 21020, 2} , // Name: HS Voltage, B-C (HS Vll bc) - [21020,2] as FLOAT32
// { 21022, 2} , // Name: HS Voltage, C-A (HS Vll ca) - [21022,2] as FLOAT32
// { 21024, 2} , // Name: HS Voltage, L-L Average (HS Vll avg) - [21024,2] as FLOAT32
// { 21026, 2} , // Name: HS Voltage, A-N (HS Vln a) - [21026,2] as FLOAT32
// { 21028, 2} , // Name: HS Voltage, B-N (HS Vln b) - [21028,2] as FLOAT32
// { 21030, 2} , // Name: HS Voltage, C-N (HS Vln c) - [21030,2] as FLOAT32
// { 21034, 2} , // Name: HS Voltage, L-N Average (HS Vln avg) - [21034,2] as FLOAT32
// { 21040, 2} , // Name: HS Active Power A (HS kW a) - [21040,2] as FLOAT32
// { 21042, 2} , // Name: HS Active Power B (HS kW b) - [21042,2] as FLOAT32
// { 21044, 2} , // Name: HS Active Power C (HS kW c) - [21044,2] as FLOAT32
// { 21046, 2} , // Name: HS Active Power Total (HS kW tot) - [21046,2] as FLOAT32
// { 21048, 2} , // Name: HS Reactive Power A (HS kVAR a) - [21048,2] as FLOAT32
// { 21050, 2} , // Name: HS Reactive Power B (HS kVAR b) - [21050,2] as FLOAT32
// { 21052, 2} , // Name: HS Reactive Power C (HS kVAR c) - [21052,2] as FLOAT32
// { 21054, 2} , // Name: HS Reactive Power Total (HS kVAR tot) - [21054,2] as FLOAT32
// { 21056, 2} , // Name: HS Apparent Power A (HS kVA a) - [21056,2] as FLOAT32
// { 21058, 2} , // Name: HS Apparent Power B (HS kVA b) - [21058,2] as FLOAT32
// { 21060, 2} , // Name: HS Apparent Power C (HS kVA c) - [21060,2] as FLOAT32
// { 21062, 2} , // Name: HS Apparent Power Total (HS kVA tot) - [21062,2] as FLOAT32
// { 21358, 2} , // Name: K-Factor A (I1 K Factor) - [21358,2] as FLOAT32
// { 21360, 2} , // Name: K-Factor B (I2 K Factor) - [21360,2] as FLOAT32
// { 21362, 2} , // Name: K-Factor C (I3 K Factor) - [21362,2] as FLOAT32
// { 27218, 2} , // Name: Min Current A (I a mn) - [27218,2] as FLOAT32
// { 27220, 2} , // Name: Min Current B (I b mn) - [27220,2] as FLOAT32
// { 27222, 2} , // Name: Min Current C (I c mn) - [27222,2] as FLOAT32
// { 27224, 2} , // Name: Min Current N (I4 mn) - [27224,2] as FLOAT32
// { 27226, 2} , // Name: Min Current G (I5 mn) - [27226,2] as FLOAT32
// { 27228, 2} , // Name: Min Current Avg (I avg mn) - [27228,2] as FLOAT32
// { 27238, 2} , // Name: Min Voltage A-B (Vll ab mn) - [27238,2] as FLOAT32
// { 27240, 2} , // Name: Min Voltage B-C (Vll bc mn) - [27240,2] as FLOAT32
// { 27242, 2} , // Name: Min Voltage C-A (Vll ca mn) - [27242,2] as FLOAT32
// { 27244, 2} , // Name: Min Voltage L-L Avg (Vll avg mn) - [27244,2] as FLOAT32
// { 27246, 2} , // Name: Min Voltage A-N (Vln a mn) - [27246,2] as FLOAT32
// { 27248, 2} , // Name: Min Voltage B-N (Vln b mn) - [27248,2] as FLOAT32
// { 27250, 2} , // Name: Min Voltage C-N (Vln c mn) - [27250,2] as FLOAT32
// { 27254, 2} , // Name: Min Voltage L-N Avg (Vln avg mn) - [27254,2] as FLOAT32
// { 27278, 2} , // Name: Min Active Power Total (kW tot mn) - [27278,2] as FLOAT32
// { 27286, 2} , // Name: Min Reactive Power Total (kVAR tot mn) - [27286,2] as FLOAT32
// { 27294, 2} , // Name: Min Apparent Power Total (kVA tot mn) - [27294,2] as FLOAT32
// { 27616, 2} , // Name: Min Frequency (Freq mn) - [27616,2] as FLOAT32
// { 27644, 2} , // Name: Current A Low (I a low) - [27644,2] as FLOAT32
// { 27646, 2} , // Name: Current B Low (I b low) - [27646,2] as FLOAT32
// { 27648, 2} , // Name: Current C Low (I c low) - [27648,2] as FLOAT32
// { 27650, 2} , // Name: Current N Low (I4 low) - [27650,2] as FLOAT32
// { 27652, 2} , // Name: Current Avg Low (I avg low) - [27652,2] as FLOAT32
// { 27654, 2} , // Name: Voltage A-B Low (Vll ab low) - [27654,2] as FLOAT32
// { 27656, 2} , // Name: Voltage B-C Low (Vll bc low) - [27656,2] as FLOAT32
// { 27658, 2} , // Name: Voltage C-A Low (Vll ca low) - [27658,2] as FLOAT32
// { 27660, 2} , // Name: Voltage L-L Avg Low (Vll avg low) - [27660,2] as FLOAT32
// { 27672, 2} , // Name: Active Power Low (kW tot low) - [27672,2] as FLOAT32
// { 27674, 2} , // Name: Reactive Power Low (kVAR tot low) - [27674,2] as FLOAT32
// { 27676, 2} , // Name: Apparent Power Low (kVA tot low) - [27676,2] as FLOAT32
// { 27682, 2} , // Name: Frequency Low (Freq low) - [27682,2] as FLOAT32
// { 27694, 2} , // Name: Max Current A (I a mx) - [27694,2] as FLOAT32
// { 27696, 2} , // Name: Max Current B (I b mx) - [27696,2] as FLOAT32
// { 27698, 2} , // Name: Max Current C (I c mx) - [27698,2] as FLOAT32
// { 27700, 2} , // Name: Max Current N (I4 mx) - [27700,2] as FLOAT32
// { 27702, 2} , // Name: Max Current G (I5 mx) - [27702,2] as FLOAT32
// { 27704, 2} , // Name: Max Current Avg (I avg mx) - [27704,2] as FLOAT32
// { 27714, 2} , // Name: Max Voltage A-B (Vll ab mx) - [27714,2] as FLOAT32
// { 27716, 2} , // Name: Max Voltage B-C (Vll bc mx) - [27716,2] as FLOAT32
// { 27718, 2} , // Name: Max Voltage C-A (Vll ca mx) - [27718,2] as FLOAT32
// { 27720, 2} , // Name: Max Voltage L-L Avg (Vll avg mx) - [27720,2] as FLOAT32
// { 27722, 2} , // Name: Max Voltage A-N (Vln a mx) - [27722,2] as FLOAT32
// { 27724, 2} , // Name: Max Voltage B-N (Vln b mx) - [27724,2] as FLOAT32
// { 27726, 2} , // Name: Max Voltage C-N (Vln c mx) - [27726,2] as FLOAT32
// { 27730, 2} , // Name: Max Voltage L-N Avg (Vln avg mx) - [27730,2] as FLOAT32
// { 27754, 2} , // Name: Max Active Power Total (kW tot mx) - [27754,2] as FLOAT32
// { 27762, 2} , // Name: Max Reactive Power Total (kVAR tot mx) - [27762,2] as FLOAT32
// { 27770, 2} , // Name: Max Apparent Power Total (kVA tot mx) - [27770,2] as FLOAT32
// { 28092, 2} , // Name: Max Frequency (Freq mx) - [28092,2] as FLOAT32
// { 28120, 2} , // Name: Current A High (I a high) - [28120,2] as FLOAT32
// { 28122, 2} , // Name: Current B High (I b high) - [28122,2] as FLOAT32
// { 28124, 2} , // Name: Current C High (I c high) - [28124,2] as FLOAT32
// { 28126, 2} , // Name: Current N High (I 4 high) - [28126,2] as FLOAT32
// { 28128, 2} , // Name: Current Avg High (I avg high) - [28128,2] as FLOAT32
// { 28130, 2} , // Name: Voltage A-B High (Vll ab high) - [28130,2] as FLOAT32
// { 28132, 2} , // Name: Voltage B-C High (Vll bc high) - [28132,2] as FLOAT32
// { 28134, 2} , // Name: Voltage C-A High (Vll ca high) - [28134,2] as FLOAT32
// { 28136, 2} , // Name: Voltage L-L Avg High (Vll avg high) - [28136,2] as FLOAT32
// { 28162, 2} , // Name: Active Power High (kW tot high) - [28162,2] as FLOAT32
// { 28164, 2} , // Name: Reactive Power High (kVAR tot high) - [28164,2] as FLOAT32
// { 28166, 2} , // Name: Apparent Power High (kVA tot high) - [28166,2] as FLOAT32
// { 28172, 2} , // Name: Frequency High (Freq high) - [28172,2] as FLOAT32
// { 28180, 2} , // Name: Current A Mean (I a mean) - [28180,2] as FLOAT32
// { 28182, 2} , // Name: Current B Mean (I b mean) - [28182,2] as FLOAT32
// { 28184, 2} , // Name: Current C Mean (I c mean) - [28184,2] as FLOAT32
// { 28186, 2} , // Name: Current N Mean (I 4 mean) - [28186,2] as FLOAT32
// { 28188, 2} , // Name: Current Avg Mean (I avg mean) - [28188,2] as FLOAT32
// { 28190, 2} , // Name: Voltage A-B Mean (Vll ab mean) - [28190,2] as FLOAT32
// { 28192, 2} , // Name: Voltage B-C Mean (Vll bc mean) - [28192,2] as FLOAT32
// { 28194, 2} , // Name: Voltage C-A Mean (Vll ca mean) - [28194,2] as FLOAT32
// { 28196, 2} , // Name: Voltage L-L Avg Mean (Vll avg mean) - [28196,2] as FLOAT32
// { 28208, 2} , // Name: Active Power Mean (kW tot mean) - [28208,2] as FLOAT32
// { 28210, 2} , // Name: Reactive Power Mean (kVAR tot mean) - [28210,2] as FLOAT32
// { 28212, 2} , // Name: Apparent Power Mean (kVA tot mean) - [28212,2] as FLOAT32
// { 28218, 2} , // Name: Frequency Mean (Freq mean) - [28218,2] as FLOAT32
// { 29884, 2} , // Name: Current A Last Demand (I a sd) - [29884,2] as FLOAT32
// { 29886, 2} , // Name: Current A Predicted Demand (I a sd pred) - [29886,2] as FLOAT32
// { 29888, 0} , // Name: Current A Peak Demand (I a sd mx) - [29888,6] as TIMESTAMPED_FLOAT32
// { 29898, 2} , // Name: Current B Last Demand (I b sd) - [29898,2] as FLOAT32
// { 29900, 2} , // Name: Current B Predicted Demand (I b sd pred) - [29900,2] as FLOAT32
// { 29902, 0} , // Name: Current B Peak Demand (I b sd mx) - [29902,6] as TIMESTAMPED_FLOAT32
// { 29912, 2} , // Name: Current C Last Demand (I c sd) - [29912,2] as FLOAT32
// { 29914, 2} , // Name: Current C Predicted Demand (I c sd pred) - [29914,2] as FLOAT32
// { 29916, 0} , // Name: Current C Peak Demand (I c sd mx) - [29916,6] as TIMESTAMPED_FLOAT32
// { 29926, 2} , // Name: Current 4 Last Demand (I 4 sd) - [29926,2] as FLOAT32
// { 29928, 2} , // Name: Current 4 Predicted Demand (I 4 sd pred) - [29928,2] as FLOAT32
// { 29930, 0} , // Name: Current 4 Peak Demand (I 4 sd mx) - [29930,6] as TIMESTAMPED_FLOAT32
// { 29940, 2} , // Name: Current Avg Last Demand (I avg sd) - [29940,2] as FLOAT32
// { 29942, 2} , // Name: Current Avg Predicted Demand (I avg sd pred) - [29942,2] as FLOAT32
// { 29944, 0} , // Name: Current Avg Peak Demand (I avg sd mx) - [29944,6] as TIMESTAMPED_FLOAT32
// { 29954, 2} , // Name: Active Power Last Demand (kW sd del-rec) - [29954,2] as FLOAT32
// { 29956, 2} , // Name: Active Power Predicted Demand (kW pr del-rec) - [29956,2] as FLOAT32
// { 29958, 0} , // Name: Active Power Peak Demand (kW sd mx d-r) - [29958,6] as TIMESTAMPED_FLOAT32
// { 29968, 2} , // Name: Active Power Del Last Demand (kW sd del) - [29968,2] as FLOAT32
// { 29970, 2} , // Name: Active Power Del Predicted Demand (kW pr del) - [29970,2] as FLOAT32
// { 29972, 0} , // Name: Active Power Del Peak Demand (kW sd mx del) - [29972,6] as TIMESTAMPED_FLOAT32
// { 29982, 2} , // Name: Active Power Rec Last Demand (kW sd rec) - [29982,2] as FLOAT32
// { 29984, 2} , // Name: Active Power Rec Predicted Demand (kW pr rec) - [29984,2] as FLOAT32
// { 29986, 0} , // Name: Active Power Rec Peak Demand (kW sd mx rec) - [29986,6] as TIMESTAMPED_FLOAT32
// { 29996, 2} , // Name: Active Power Total Last Demand (kW sd del+rec) - [29996,2] as FLOAT32
// { 29998, 2} , // Name: Active Power Total Predicted Demand (kW pr del+rec) - [29998,2] as FLOAT32
// { 30000, 0} , // Name: Active Power Total Peak Demand (kW sd mx d+r) - [30000,6] as TIMESTAMPED_FLOAT32
// { 30010, 2} , // Name: Reactive Power Last Demand (kVAR sd del-rec) - [30010,2] as FLOAT32
// { 30012, 2} , // Name: Reactive Power Predicted Demand (kVAR pr del-rec) - [30012,2] as FLOAT32
// { 30014, 0} , // Name: Reactive Power Peak Demand (kVAR sd mx d-r) - [30014,6] as TIMESTAMPED_FLOAT32
// { 30024, 2} , // Name: Reactive Power Del Last Demand (kVAR sd del) - [30024,2] as FLOAT32
// { 30026, 2} , // Name: Reactive Power Del Predicted Demand (kVAR pr del) - [30026,2] as FLOAT32
// { 30028, 0} , // Name: Reactive Power Del Peak Demand (kVAR sd mx del) - [30028,6] as TIMESTAMPED_FLOAT32
// { 30038, 2} , // Name: Reactive Power Rec Last Demand (kVAR sd rec) - [30038,2] as FLOAT32
// { 30040, 2} , // Name: Reactive Power Rec Predicted Demand (kVAR pr rec) - [30040,2] as FLOAT32
// { 30042, 0} , // Name: Reactive Power Rec Peak Demand (kVAR sd mx rec) - [30042,6] as TIMESTAMPED_FLOAT32
// { 30052, 2} , // Name: Reactive Power Total Last Demand (kVAR sd del+rec) - [30052,2] as FLOAT32
// { 30054, 2} , // Name: Reactive Power Total Predicted Demand (kVAR pr del+rec) - [30054,2] as FLOAT32
// { 30056, 0} , // Name: Reactive Power Total Peak Demand (kVAR sd mx d+r) - [30056,6] as TIMESTAMPED_FLOAT32
// { 30066, 2} , // Name: Apparent Power Last Demand (kVA sd del-rec) - [30066,2] as FLOAT32
// { 30068, 2} , // Name: Apparent Power Predicted Demand (kVA pr del-rec) - [30068,2] as FLOAT32
// { 30070, 0} , // Name: Apparent Power Peak Demand (kVA sd mx d-r) - [30070,6] as TIMESTAMPED_FLOAT32
// { 30080, 2} , // Name: Apparent Power Del Last Demand (kVA sd del) - [30080,2] as FLOAT32
// { 30082, 2} , // Name: Apparent Power Del Predicted Demand (kVA pr del) - [30082,2] as FLOAT32
// { 30084, 0} , // Name: Apparent Power Del Peak Demand (kVA sd mx del) - [30084,6] as TIMESTAMPED_FLOAT32
// { 30094, 2} , // Name: Apparent Power Rec Last Demand (kVA sd rec) - [30094,2] as FLOAT32
// { 30096, 2} , // Name: Apparent Power Rec Predicted Demand (kVA pr rec) - [30096,2] as FLOAT32
// { 30098, 0} , // Name: Apparent Power Rec Peak Demand (kVA sd mx rec) - [30098,6] as TIMESTAMPED_FLOAT32
// { 30108, 2} , // Name: Apparent Power Total Last Demand (kVA sd del+rec) - [30108,2] as FLOAT32
// { 30110, 2} , // Name: Apparent Power Total Predicted Demand (kVA pr del+rec) - [30110,2] as FLOAT32
// { 30112, 0} , // Name: Apparent Power Total Peak Demand (kVA sd mx d+r) - [30112,6] as TIMESTAMPED_FLOAT32
// { 30222, 2} , // Name: Active Power Del A Last Demand (kW sd del A) - [30222,2] as FLOAT32
// { 30224, 2} , // Name: Active Power Del A Predicted Demand (kW pr del A) - [30224,2] as FLOAT32
// { 30226, 0} , // Name: Active Power Del A Peak Demand (kW sd mx del A) - [30226,6] as TIMESTAMPED_FLOAT32
// { 30236, 2} , // Name: Active Power Del B Last Demand (kW sd del B) - [30236,2] as FLOAT32
// { 30238, 2} , // Name: Active Power Del B Predicted Demand (kW pr del B) - [30238,2] as FLOAT32
// { 30240, 0} , // Name: Active Power Del B Peak Demand (kW sd mx del B) - [30240,6] as TIMESTAMPED_FLOAT32
// { 30250, 2} , // Name: Active Power Del C Last Demand (kW sd del C) - [30250,2] as FLOAT32
// { 30252, 2} , // Name: Active Power Del C Predicted Demand (kW pr del C) - [30252,2] as FLOAT32
// { 30254, 0} , // Name: Active Power Del C Peak Demand (kW sd mx del C) - [30254,6] as TIMESTAMPED_FLOAT32
// { 30264, 2} , // Name: Active Power Del D Last Demand (kW sd del D) - [30264,2] as FLOAT32
// { 30266, 2} , // Name: Active Power Del D Predicted Demand (kW pr del D) - [30266,2] as FLOAT32
// { 30268, 0} , // Name: Active Power Del D Peak Demand (kW sd mx del D) - [30268,6] as TIMESTAMPED_FLOAT32
// { 30278, 2} , // Name: Active Power Rec A Last Demand (kW sd rec A) - [30278,2] as FLOAT32
// { 30280, 2} , // Name: Active Power Rec A Predicted Demand (kW pr rec A) - [30280,2] as FLOAT32
// { 30282, 0} , // Name: Active Power Rec A Peak Demand (kW sd mx rec A) - [30282,6] as TIMESTAMPED_FLOAT32
// { 30292, 2} , // Name: Active Power Rec B Last Demand (kW sd rec B) - [30292,2] as FLOAT32
// { 30294, 2} , // Name: Active Power Rec B Predicted Demand (kW pr rec B) - [30294,2] as FLOAT32
// { 30296, 0} , // Name: Active Power Rec B Peak Demand (kW sd mx rec B) - [30296,6] as TIMESTAMPED_FLOAT32
// { 30306, 2} , // Name: Active Power Rec C Last Demand (kW sd rec C) - [30306,2] as FLOAT32
// { 30308, 2} , // Name: Active Power Rec C Predicted Demand (kW pr rec C) - [30308,2] as FLOAT32
// { 30310, 0} , // Name: Active Power Rec C Peak Demand (kW sd mx rec C) - [30310,6] as TIMESTAMPED_FLOAT32
// { 30320, 2} , // Name: Active Power Rec D Last Demand (kW sd rec D) - [30320,2] as FLOAT32
// { 30322, 2} , // Name: Active Power Rec D Predicted Demand (kW pr rec D) - [30322,2] as FLOAT32
// { 30324, 0} , // Name: Active Power Rec D Peak Demand (kW sd mx rec D) - [30324,6] as TIMESTAMPED_FLOAT32
// { 30334, 2} , // Name: Reactive Power Del A Last Demand (kVAR sd del A) - [30334,2] as FLOAT32
// { 30336, 2} , // Name: Reactive Power Del A Predicted Demand (kVAR pr del A) - [30336,2] as FLOAT32
// { 30338, 0} , // Name: Reactive Power Del A Peak Demand (kVAR sd mx d A) - [30338,6] as TIMESTAMPED_FLOAT32
// { 30348, 2} , // Name: Reactive Power Del B Last Demand (kVAR sd del B) - [30348,2] as FLOAT32
// { 30350, 2} , // Name: Reactive Power Del B Predicted Demand (kVAR pr del B) - [30350,2] as FLOAT32
// { 30352, 0} , // Name: Reactive Power Del B Peak Demand (kVAR sd mx d B) - [30352,6] as TIMESTAMPED_FLOAT32
// { 30362, 2} , // Name: Reactive Power Del C Last Demand (kVAR sd del C) - [30362,2] as FLOAT32
// { 30364, 2} , // Name: Reactive Power Del C Predicted Demand (kVAR pr del C) - [30364,2] as FLOAT32
// { 30366, 0} , // Name: Reactive Power Del C Peak Demand (kVAR sd mx d C) - [30366,6] as TIMESTAMPED_FLOAT32
// { 30376, 2} , // Name: Reactive Power Del D Last Demand (kVAR sd del D) - [30376,2] as FLOAT32
// { 30378, 2} , // Name: Reactive Power Del D Predicted Demand (kVAR pr del D) - [30378,2] as FLOAT32
// { 30380, 0} , // Name: Reactive Power Del D Peak Demand (kVAR sd mx d D) - [30380,6] as TIMESTAMPED_FLOAT32
// { 30390, 2} , // Name: Reactive Power Rec A Last Demand (kVAR sd rec A) - [30390,2] as FLOAT32
// { 30392, 2} , // Name: Reactive Power Rec A Predicted Demand (kVAR pr rec A) - [30392,2] as FLOAT32
// { 30394, 0} , // Name: Reactive Power Rec A Peak Demand (kVAR sd mx r A) - [30394,6] as TIMESTAMPED_FLOAT32
// { 30404, 2} , // Name: Reactive Power Rec B Last Demand (kVAR sd rec B) - [30404,2] as FLOAT32
// { 30406, 2} , // Name: Reactive Power Rec B Predicted Demand (kVAR pr rec B) - [30406,2] as FLOAT32
// { 30408, 0} , // Name: Reactive Power Rec B Peak Demand (kVAR sd mx r B) - [30408,6] as TIMESTAMPED_FLOAT32
// { 30418, 2} , // Name: Reactive Power Rec C Last Demand (kVAR sd rec C) - [30418,2] as FLOAT32
// { 30420, 2} , // Name: Reactive Power Rec C Predicted Demand (kVAR pr rec C) - [30420,2] as FLOAT32
// { 30422, 0} , // Name: Reactive Power Rec C Peak Demand (kVAR sd mx r C) - [30422,6] as TIMESTAMPED_FLOAT32
// { 30432, 2} , // Name: Reactive Power Rec D Last Demand (kVAR sd rec D) - [30432,2] as FLOAT32
// { 30434, 2} , // Name: Reactive Power Rec D Predicted Demand (kVAR pr rec D) - [30434,2] as FLOAT32
// { 30436, 0} , // Name: Reactive Power Rec D Peak Demand (kVAR sd mx r D) - [30436,6] as TIMESTAMPED_FLOAT32
// { 30446, 2} , // Name: Apparent Power Del A Last Demand (kVA sd del A) - [30446,2] as FLOAT32
// { 30448, 2} , // Name: Apparent Power Del A Predicted Demand (kVA pr del A) - [30448,2] as FLOAT32
// { 30450, 0} , // Name: Apparent Power Del A Peak Demand (kVA sd mx del A) - [30450,6] as TIMESTAMPED_FLOAT32
// { 30460, 2} , // Name: Apparent Power Del B Last Demand (kVA sd del B) - [30460,2] as FLOAT32
// { 30462, 2} , // Name: Apparent Power Del B Predicted Demand (kVA pr del B) - [30462,2] as FLOAT32
// { 30464, 0} , // Name: Apparent Power Del B Peak Demand (kVA sd mx del B) - [30464,6] as TIMESTAMPED_FLOAT32
// { 30474, 2} , // Name: Apparent Power Del C Last Demand (kVA sd del C) - [30474,2] as FLOAT32
// { 30476, 2} , // Name: Apparent Power Del C Predicted Demand (kVA pr del C) - [30476,2] as FLOAT32
// { 30478, 0} , // Name: Apparent Power Del C Peak Demand (kVA sd mx del C) - [30478,6] as TIMESTAMPED_FLOAT32
// { 30488, 2} , // Name: Apparent Power Del D Last Demand (kVA sd del D) - [30488,2] as FLOAT32
// { 30490, 2} , // Name: Apparent Power Del D Predicted Demand (kVA pr del D) - [30490,2] as FLOAT32
// { 30492, 0} , // Name: Apparent Power Del D Peak Demand (kVA sd mx del D) - [30492,6] as TIMESTAMPED_FLOAT32
// { 30502, 2} , // Name: Apparent Power Rec A Last Demand (kVA sd rec A) - [30502,2] as FLOAT32
// { 30504, 2} , // Name: Apparent Power Rec A Predicted Demand (kVA pr rec A) - [30504,2] as FLOAT32
// { 30506, 0} , // Name: Apparent Power Rec A Peak Demand (kVA sd mx rec A) - [30506,6] as TIMESTAMPED_FLOAT32
// { 30516, 2} , // Name: Apparent Power Rec B Last Demand (kVA sd rec B) - [30516,2] as FLOAT32
// { 30518, 2} , // Name: Apparent Power Rec B Predicted Demand (kVA pr rec B) - [30518,2] as FLOAT32
// { 30520, 0} , // Name: Apparent Power Rec B Peak Demand (kVA sd mx rec B) - [30520,6] as TIMESTAMPED_FLOAT32
// { 30530, 2} , // Name: Apparent Power Rec C Last Demand (kVA sd rec C) - [30530,2] as FLOAT32
// { 30532, 2} , // Name: Apparent Power Rec C Predicted Demand (kVA pr rec C) - [30532,2] as FLOAT32
// { 30534, 0} , // Name: Apparent Power Rec C Peak Demand (kVA sd mx rec C) - [30534,6] as TIMESTAMPED_FLOAT32
// { 30544, 2} , // Name: Apparent Power Rec D Last Demand (kVA sd rec D) - [30544,2] as FLOAT32
// { 30546, 2} , // Name: Apparent Power Rec D Predicted Demand (kVA pr rec D) - [30546,2] as FLOAT32
// { 30548, 0} , // Name: Apparent Power Rec D Peak Demand (kVA sd mx rec D) - [30548,6] as TIMESTAMPED_FLOAT32
// { 30558, 2} , // Name: Active Power Q1 Last Demand (kW sd Q1) - [30558,2] as FLOAT32
// { 30560, 2} , // Name: Active Power Q1 Predicted Demand (kW pr Q1) - [30560,2] as FLOAT32
// { 30562, 0} , // Name: Active Power Q1 Peak Demand (kW sd mx Q1) - [30562,6] as TIMESTAMPED_FLOAT32
// { 30572, 2} , // Name: Active Power Q2 Last Demand (kW sd Q2) - [30572,2] as FLOAT32
// { 30574, 2} , // Name: Active Power Q2 Predicted Demand (kW pr Q2) - [30574,2] as FLOAT32
// { 30576, 0} , // Name: Active Power Q2 Peak Demand (kW sd mx Q2) - [30576,6] as TIMESTAMPED_FLOAT32
// { 30586, 2} , // Name: Active Power Q3 Last Demand (kW sd Q3) - [30586,2] as FLOAT32
// { 30588, 2} , // Name: Active Power Q3 Predicted Demand (kW pr Q3) - [30588,2] as FLOAT32
// { 30590, 0} , // Name: Active Power Q3 Peak Demand (kW sd mx Q3) - [30590,6] as TIMESTAMPED_FLOAT32
// { 30600, 2} , // Name: Active Power Q4 Last Demand (kW sd Q4) - [30600,2] as FLOAT32
// { 30602, 2} , // Name: Active Power Q4 Predicted Demand (kW pr Q4) - [30602,2] as FLOAT32
// { 30604, 0} , // Name: Active Power Q4 Peak Demand (kW sd mx Q4) - [30604,6] as TIMESTAMPED_FLOAT32
// { 30614, 2} , // Name: Reactive Power Q1 Last Demand (kVAR sd Q1) - [30614,2] as FLOAT32
// { 30616, 2} , // Name: Reactive Power Q1 Predicted Demand (kVAR pr Q1) - [30616,2] as FLOAT32
// { 30618, 0} , // Name: Reactive Power Q1 Peak Demand (kVAR sd mx Q1) - [30618,6] as TIMESTAMPED_FLOAT32
// { 30628, 2} , // Name: Reactive Power Q2 Last Demand (kVAR sd Q2) - [30628,2] as FLOAT32
// { 30630, 2} , // Name: Reactive Power Q2 Predicted Demand (kVAR pr Q2) - [30630,2] as FLOAT32
// { 30632, 0} , // Name: Reactive Power Q2 Peak Demand (kVAR sd mx Q2) - [30632,6] as TIMESTAMPED_FLOAT32
// { 30642, 2} , // Name: Reactive Power Q3 Last Demand (kVAR sd Q3) - [30642,2] as FLOAT32
// { 30644, 2} , // Name: Reactive Power Q3 Predicted Demand (kVAR pr Q3) - [30644,2] as FLOAT32
// { 30646, 0} , // Name: Reactive Power Q3 Peak Demand (kVAR sd mx Q3) - [30646,6] as TIMESTAMPED_FLOAT32
// { 30656, 2} , // Name: Reactive Power Q4 Last Demand (kVAR sd Q4) - [30656,2] as FLOAT32
// { 30658, 2} , // Name: Reactive Power Q4 Predicted Demand (kVAR pr Q4) - [30658,2] as FLOAT32
// { 30660, 0} , // Name: Reactive Power Q4 Peak Demand (kVAR sd mx Q4) - [30660,6] as TIMESTAMPED_FLOAT32
// { 30670, 2} , // Name: Apparent Power Q1 Last Demand (kVA sd Q1) - [30670,2] as FLOAT32
// { 30672, 2} , // Name: Apparent Power Q1 Predicted Demand (kVA pr Q1) - [30672,2] as FLOAT32
// { 30674, 0} , // Name: Apparent Power Q1 Peak Demand (kVA sd mx Q1) - [30674,6] as TIMESTAMPED_FLOAT32
// { 30684, 2} , // Name: Apparent Power Q2 Last Demand (kVA sd Q2) - [30684,2] as FLOAT32
// { 30686, 2} , // Name: Apparent Power Q2 Predicted Demand (kVA pr Q2) - [30686,2] as FLOAT32
// { 30688, 0} , // Name: Apparent Power Q2 Peak Demand (kVA sd mx Q2) - [30688,6] as TIMESTAMPED_FLOAT32
// { 30698, 2} , // Name: Apparent Power Q3 Last Demand (kVA sd Q3) - [30698,2] as FLOAT32
// { 30700, 2} , // Name: Apparent Power Q3 Predicted Demand (kVA pr Q3) - [30700,2] as FLOAT32
// { 30702, 0} , // Name: Apparent Power Q3 Peak Demand (kVA sd mx Q3) - [30702,6] as TIMESTAMPED_FLOAT32
// { 30712, 2} , // Name: Apparent Power Q4 Last Demand (kVA sd Q4) - [30712,2] as FLOAT32
// { 30714, 2} , // Name: Apparent Power Q4 Predicted Demand (kVA pr Q4) - [30714,2] as FLOAT32
// { 30716, 0} , // Name: Apparent Power Q4 Peak Demand (kVA sd mx Q4) - [30716,6] as TIMESTAMPED_FLOAT32
// { 30822, 2} , // Name: Block Demand Active Power (kVA co kW d-r) - [30822,2] as FLOAT32
// { 30824, 2} , // Name: Block Demand Active Power Into the Load (kVA co kW del) - [30824,2] as FLOAT32
// { 30826, 2} , // Name: Block Demand Active Power Out of the Load (kVA co kW rec) - [30826,2] as FLOAT32
// { 30828, 2} , // Name: Block Demand Active Power Total (kVA co kW d+r) - [30828,2] as FLOAT32
// { 30830, 2} , // Name: Block Demand Reactive Power (kVA co kVAR d-r) - [30830,2] as FLOAT32
// { 30832, 2} , // Name: Block Demand Reactive Power Into the Load (kVA co kVAR del) - [30832,2] as FLOAT32
// { 30834, 2} , // Name: Block Demand Reactive Power Out of the Load (kVA co kVAR rec) - [30834,2] as FLOAT32
// { 30836, 2} , // Name: Block Demand Reactive Power Total (kVA co kVAR d+r) - [30836,2] as FLOAT32
// { 30838, 2} , // Name: Block Demand Active Power (kVAR co kW d-r) - [30838,2] as FLOAT32
// { 30840, 2} , // Name: Block Demand Active Power Into the Load (kVAR co kW del) - [30840,2] as FLOAT32
// { 30842, 2} , // Name: Block Demand Active Power Out of the Load (kVAR co kW rec) - [30842,2] as FLOAT32
// { 30844, 2} , // Name: Block Demand Active Power Total (kVAR co kW d+r) - [30844,2] as FLOAT32
// { 30846, 2} , // Name: Block Demand Apparent Power (kVAR co kVA d-r) - [30846,2] as FLOAT32
// { 30848, 2} , // Name: Block Demand Apparent Power Into the Load (kVAR co kVA del) - [30848,2] as FLOAT32
// { 30850, 2} , // Name: Block Demand Apparent Power Out of the Load (kVAR co kVA rec) - [30850,2] as FLOAT32
// { 30852, 2} , // Name: Block Demand Apparent Power Total (kVAR co kVA d+r) - [30852,2] as FLOAT32
// { 30854, 2} , // Name: Block Demand Reactive Power (kW co kVAR d-r) - [30854,2] as FLOAT32
// { 30856, 2} , // Name: Block Demand Reactive Power Into the Load (kW co kVAR del) - [30856,2] as FLOAT32
// { 30858, 2} , // Name: Block Demand Reactive Power Out of the Load (kW co kVAR rec) - [30858,2] as FLOAT32
// { 30860, 2} , // Name: Block Demand Reactive Power Total (kW co kVAR d+r) - [30860,2] as FLOAT32
// { 30862, 2} , // Name: Block Demand Apparent Power (kW co kVA d-r) - [30862,2] as FLOAT32
// { 30864, 2} , // Name: Block Demand Apparent Power Into the Load (kW co kVA del) - [30864,2] as FLOAT32
// { 30866, 2} , // Name: Block Demand Apparent Power Out of the Load (kW co kVA rec) - [30866,2] as FLOAT32
// { 30868, 2} , // Name: Block Demand Apparent Power Total (kW co kVA d+r) - [30868,2] as FLOAT32
// { 30870, 3} , // Name: Active Energy Delivered Rate 1 (PB kWh del A) - [30870,4] as INT64
// { 30874, 3} , // Name: Active Energy Delivered Rate 2 (PB kWh del B) - [30874,4] as INT64
// { 30878, 3} , // Name: Active Energy Delivered Rate 3 (PB kWh del C) - [30878,4] as INT64
// { 30882, 3} , // Name: Active Energy Delivered Rate 4 (PB kWh del D) - [30882,4] as INT64
// { 30886, 3} , // Name: Active Energy Delivered (PB kWh del) - [30886,4] as INT64
// { 30890, 3} , // Name: Active Energy Received (PB kWh rec) - [30890,4] as INT64
// { 30894, 3} , // Name: Reactive Energy Delivered (PB kVARh del) - [30894,4] as INT64
// { 30898, 3} , // Name: Reactive Energy Received (PB kVARh rec) - [30898,4] as INT64
// { 30902, 3} , // Name: Apparent Energy Delivered (PB kVAh del) - [30902,4] as INT64
// { 30906, 3} , // Name: Apparent Energy Received (PB kVAh rec) - [30906,4] as INT64
// { 30910, 2} , // Name: Peak Block Demand Active Power Delived Rate 1 (PB kW sd mx d A) - [30910,2] as FLOAT32
// { 30912, 2} , // Name: Peak Block Demand Active Power Delived Rate 2 (PB kW sd mx d B) - [30912,2] as FLOAT32
// { 30914, 2} , // Name: Peak Block Demand Active Power Delived Rate 3 (PB kW sd mx d C) - [30914,2] as FLOAT32
// { 30916, 2} , // Name: Peak Block Demand Active Power Delived Rate 4 (PB kW sd mx d D) - [30916,2] as FLOAT32
// { 30918, 2} , // Name: Peak Block Demand Active Power Received (PB kW sd mx rec) - [30918,2] as FLOAT32
// { 30920, 2} , // Name: Peak Block Demand Reactive Power Delivered (PB kVAR sd mx d) - [30920,2] as FLOAT32
// { 30922, 2} , // Name: Peak Block Demand Reactive Power Received (PB kVAR sd mx r) - [30922,2] as FLOAT32
// { 30924, 2} , // Name: Peak Block Demand Apparent Power Delivered (PB kVA sd mx d) - [30924,2] as FLOAT32
// { 30926, 2} , // Name: Peak Block Demand Apparent Power Received (PB kVA sd mx r) - [30926,2] as FLOAT32
// { 30928, 3} , // Name: Active Energy Delivered Rate 1 (PS kWh del A) - [30928,4] as INT64
// { 30932, 3} , // Name: Active Energy Delivered Rate 2 (PS kWh del B) - [30932,4] as INT64
// { 30936, 3} , // Name: Active Energy Delivered Rate 3 (PS kWh del C) - [30936,4] as INT64
// { 30940, 3} , // Name: Active Energy Delivered Rate 4 (PS kWh del D) - [30940,4] as INT64
// { 30944, 3} , // Name: Active Energy Delivered (PS kWh del) - [30944,4] as INT64
// { 30948, 3} , // Name: Active Energy Received (PS kWh rec) - [30948,4] as INT64
// { 30952, 3} , // Name: Reactive Energy Delivered (PS kVARh del) - [30952,4] as INT64
// { 30956, 3} , // Name: Reactive Energy Received (PS kVARh rec) - [30956,4] as INT64
// { 30960, 3} , // Name: Apparent Energy Delivered (PS kVAh del) - [30960,4] as INT64
// { 30964, 3} , // Name: Apparent Energy Received (PS kVAh rec) - [30964,4] as INT64
// { 30968, 2} , // Name: Peak Block Demand Active Power Delived Rate 1 (PS kW sd mx d A) - [30968,2] as FLOAT32
// { 30970, 2} , // Name: Peak Block Demand Active Power Delived Rate 2 (PS kW sd mx d B) - [30970,2] as FLOAT32
// { 30972, 2} , // Name: Peak Block Demand Active Power Delived Rate 3 (PS kW sd mx d C) - [30972,2] as FLOAT32
// { 30974, 2} , // Name: Peak Block Demand Active Power Delived Rate 4 (PS kW sd mx d D) - [30974,2] as FLOAT32
// { 30976, 2} , // Name: Peak Block Demand Active Power Received (PS kW sd mx rec) - [30976,2] as FLOAT32
// { 30978, 2} , // Name: Peak Block Demand Reactive Power Delivered (PS kVAR sd mx d) - [30978,2] as FLOAT32
// { 30980, 2} , // Name: Peak Block Demand Reactive Power Received (PS kVAR sd mx r) - [30980,2] as FLOAT32
// { 30982, 2} , // Name: Peak Block Demand Apparent Power Delivered (PS kVA sd mx d) - [30982,2] as FLOAT32
// { 30984, 2} , // Name: Peak Block Demand Apparent Power Received (PS kVA sd mx r) - [30984,2] as FLOAT32
// { 30986, 2} , // Name: Active Energy Delivered Rate 1 (PB kWh del A) - [30986,2] as FLOAT32
// { 30988, 2} , // Name: Active Energy Delivered Rate 2 (PB kWh del B) - [30988,2] as FLOAT32
// { 30990, 2} , // Name: Active Energy Delivered Rate 3 (PB kWh del C) - [30990,2] as FLOAT32
// { 30992, 2} , // Name: Active Energy Delivered Rate 4 (PB kWh del D) - [30992,2] as FLOAT32
// { 30994, 2} , // Name: Active Energy Delivered (PB kWh del) - [30994,2] as FLOAT32
// { 30996, 2} , // Name: Active Energy Received (PB kWh rec) - [30996,2] as FLOAT32
// { 30998, 2} , // Name: Reactive Energy Delivered (PB kVARh del) - [30998,2] as FLOAT32
// { 31000, 2} , // Name: Reactive Energy Received (PB kVARh rec) - [31000,2] as FLOAT32
// { 31002, 2} , // Name: Apparent Energy Delivered (PB kVAh del) - [31002,2] as FLOAT32
// { 31004, 2} , // Name: Apparent Energy Received (PB kVAh rec) - [31004,2] as FLOAT32
// { 31006, 2} , // Name: Active Energy Delivered Rate 1 (PS kWh del A) - [31006,2] as FLOAT32
// { 31008, 2} , // Name: Active Energy Delivered Rate 2 (PS kWh del B) - [31008,2] as FLOAT32
// { 31010, 2} , // Name: Active Energy Delivered Rate 3 (PS kWh del C) - [31010,2] as FLOAT32
// { 31012, 2} , // Name: Active Energy Delivered Rate 4 (PS kWh del D) - [31012,2] as FLOAT32
// { 31014, 2} , // Name: Active Energy Delivered (PS kWh del) - [31014,2] as FLOAT32
// { 31016, 2} , // Name: Active Energy Received (PS kWh rec) - [31016,2] as FLOAT32
// { 31018, 2} , // Name: Reactive Energy Delivered (PS kVARh del) - [31018,2] as FLOAT32
// { 31020, 2} , // Name: Reactive Energy Received (PS kVARh rec) - [31020,2] as FLOAT32
// { 31022, 2} , // Name: Apparent Energy Delivered (PS kVAh del) - [31022,2] as FLOAT32
// { 31024, 2} , // Name: Apparent Energy Received (PS kVAh rec) - [31024,2] as FLOAT32
// { 34352, 2} , // Name: Current, Phase A 3 Second (150/180 Cycles) (I1 3s) - [34352,2] as FLOAT32
// { 34354, 2} , // Name: Current, Phase A 10 Minute (I1 10m) - [34354,2] as FLOAT32
// { 34358, 2} , // Name: Current, Phase B 3 Second (150/180 Cycles) (I2 3s) - [34358,2] as FLOAT32
// { 34360, 2} , // Name: Current, Phase B 10 Minute (I2 10m) - [34360,2] as FLOAT32
// { 34364, 2} , // Name: Current, Phase C 3 Second (150/180 Cycles) (I3 3s) - [34364,2] as FLOAT32
// { 34366, 2} , // Name: Current, Phase C 10 Minute (I3 10m) - [34366,2] as FLOAT32
// { 34400, 2} , // Name: Voltage, A-N 3 Second (150/180 Cycles) (V1 3s) - [34400,2] as FLOAT32
// { 34402, 2} , // Name: Voltage, A-N 10 Minute (V1 10m) - [34402,2] as FLOAT32
// { 34404, 2} , // Name: Voltage, A-N 2 Hour (V1 2hr) - [34404,2] as FLOAT32
// { 34406, 2} , // Name: Voltage, B-N 3 Second (150/180 Cycles) (V2 3s) - [34406,2] as FLOAT32
// { 34408, 2} , // Name: Voltage, B-N 10 Minute (V2 10m) - [34408,2] as FLOAT32
// { 34410, 2} , // Name: Voltage, B-N 2 Hour (V2 2hr) - [34410,2] as FLOAT32
// { 34412, 2} , // Name: Voltage, C-N 3 Second (150/180 Cycles) (V3 3s) - [34412,2] as FLOAT32
// { 34414, 2} , // Name: Voltage, C-N 10 Minute (V3 10m) - [34414,2] as FLOAT32
// { 34416, 2} , // Name: Voltage, C-N 2 Hour (V3 2hr) - [34416,2] as FLOAT32
// { 34472, 2} , // Name: Power Frequency 3 Second (150/180 Cycles) (Power Frequency) - [34472,2] as FLOAT32
// { 34474, 2} , // Name: Power Frequency 10 Minute (Power Freq 10m) - [34474,2] as FLOAT32
// { 34476, 2} , // Name: Power Frequency 2 Hour (Power Freq 2hr) - [34476,2] as FLOAT32
// { 40000, 2} , // Name: Frequency 10m Mean (PQ Freq mean) - [40000,2] as FLOAT32
// { 40002, 2} , // Name: Frequency 10m Low (PQ Freq low) - [40002,2] as FLOAT32
// { 40004, 2} , // Name: Frequency 10m High (PQ Freq high) - [40004,2] as FLOAT32
// { 40006, 2} , // Name: Frequency Minimum (PQ Freq mn-op) - [40006,2] as FLOAT32
// { 40008, 2} , // Name: Frequency Maximum (PQ Freq mx-op) - [40008,2] as FLOAT32
// { 40010, 2} , // Name: V1 10m Mean (PQ V1 mean) - [40010,2] as FLOAT32
// { 40012, 2} , // Name: V1 10m Low (PQ V1 low) - [40012,2] as FLOAT32
// { 40014, 2} , // Name: V1 10m High (PQ V1 high) - [40014,2] as FLOAT32
// { 40016, 2} , // Name: V2 10m Mean (PQ V2 mean) - [40016,2] as FLOAT32
// { 40018, 2} , // Name: V2 10m Low (PQ V2 low) - [40018,2] as FLOAT32
// { 40020, 2} , // Name: V2 10m High (PQ V2 high) - [40020,2] as FLOAT32
// { 40022, 2} , // Name: V3 10m Mean (PQ V3 mean) - [40022,2] as FLOAT32
// { 40024, 2} , // Name: V3 10m Low (PQ V3 low) - [40024,2] as FLOAT32
// { 40026, 2} , // Name: V3 10m High (PQ V3 high) - [40026,2] as FLOAT32
// { 54396, 1} , // Name: FAC1 Nominal Frequency (N/A) - [54396,1] as INT16U
// { 56977, 0} , // Name: COM1 RTS Delay (N/A) - [56977,2] as INT32
}
;

View File

@@ -0,0 +1,27 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
uint32_t getRegisterUInt32(uint16_t highWord, uint16_t lowWord) {
uint32_t val = (highWord << 16) + lowWord;
return val;
}
int32_t getRegisterInt32(uint16_t highWord, uint16_t lowWord) {
int32_t val = (highWord << 16) + lowWord;
return val;
}
int64_t getRegisterInt64(uint16_t word1, uint16_t word2, uint16_t word3, uint16_t word4) {
uint64_t val = ((uint64_t)word1 << 48) + ((uint64_t)word2 << 32) + (word3 << 16) + word4;
return val;
}
float getRegisterFloat(uint16_t highWord, uint16_t lowWord) {
uint32_t floatRaw = ((uint32_t)highWord << 16) | lowWord;
float floatValue;
memcpy(&floatValue, &floatRaw, sizeof(float));
return floatValue;
}

View File

@@ -0,0 +1,313 @@
#include <NeoSWSerial.h>
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include "util.h"
#include "register_map_pm8000.h"
// RS485 pins
#define DE_RE_PIN 4
#define RX_PIN 8 // SoftwareSerial RX pin for Modbus
#define TX_PIN 7 // SoftwareSerial TX pin for Modbus
#define SLAVE_ID 101
#define SERIAL_BAUDRATE 9600
#define LED_A_PID 3
#define LED_B_PID 5
// GSM module pins
#define GSM_RX 2
#define GSM_TX 3
NeoSWSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance for Modbus
ModbusMaster node;
SoftwareSerial gsmSerial(GSM_RX, GSM_TX); // Create a software serial instance for GSM
unsigned long lastRefreshTime = 0;
bool headerSent = false;
bool booted = false;
void flicker(uint8_t pin, uint8_t times, uint16_t speed)
{
for (int i = 0; i < times; i++)
{
delay(speed);
digitalWrite(pin, HIGH);
delay(speed);
digitalWrite(pin, LOW);
}
}
void setup()
{
booted = false;
pinMode(LED_A_PID, OUTPUT);
pinMode(LED_B_PID, OUTPUT);
digitalWrite(LED_A_PID, LOW);
digitalWrite(LED_B_PID, HIGH);
Serial.begin(SERIAL_BAUDRATE); // For debugging
Serial.println(F("Startup \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);
// Initialize GSM module
gsmSerial.begin(9600);
delay(3000); // Give time for GSM module to initialize
if (initGSM()) {
Serial.println(F("GSM module initialized successfully"));
flicker(LED_A_PID, 5, 200); // 5 quick flashes to indicate successful GSM initialization
} else {
Serial.println(F("Failed to initialize GSM module"));
flicker(LED_B_PID, 2, 1000); // 2 slow flashes to indicate GSM initialization failure
return;
}
flicker(LED_A_PID, 10, 100);
digitalWrite(LED_B_PID, LOW);
booted = true;
}
void preTransmission()
{
digitalWrite(DE_RE_PIN, HIGH); // Enable RS485 transmit
digitalWrite(LED_A_PID, HIGH);
}
void postTransmission()
{
digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit
digitalWrite(LED_A_PID, LOW);
}
bool initGSM() {
gsmSerial.println("AT");
delay(1000);
if (gsmSerial.find("OK")) {
gsmSerial.println("AT+CPIN?");
delay(1000);
if (gsmSerial.find("READY")) {
return true;
}
}
return false;
}
bool waitForResponse(const char* expectedResponse, unsigned long timeout) {
unsigned long start = millis();
String response = "";
while (millis() - start < timeout) {
if (gsmSerial.available()) {
char c = gsmSerial.read();
response += c;
if (response.indexOf(expectedResponse) != -1) {
return true;
}
}
}
Serial.println("Timeout waiting for response: " + response);
return false;
}
int16_t waitForHTTPAction(unsigned long timeout) {
unsigned long start = millis();
String response = "";
while (millis() - start < timeout) {
if (gsmSerial.available()) {
char c = gsmSerial.read();
response += c;
if (response.indexOf("+HTTPACTION:") != -1) {
// Parse the response
int status = response.substring(response.indexOf(',') + 1).toInt();
return status;
}
}
}
Serial.println("Timeout waiting for HTTP action: " + response);
return -1;
}
bool sendGSMData(String data) {
// Configure bearer profile
gsmSerial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
if (!waitForResponse("OK", 1000)) return false;
gsmSerial.println("AT+SAPBR=3,1,\"APN\",\"afrihost\""); // Replace with your APN
if (!waitForResponse("OK", 1000)) return false;
gsmSerial.println("AT+SAPBR=1,1");
if (!waitForResponse("OK", 10000)) return false; // Bearer activation can take longer
// Initialize HTTP service
gsmSerial.println("AT+HTTPINIT");
if (!waitForResponse("OK", 1000)) return false;
gsmSerial.println("AT+HTTPPARA=\"CID\",1");
if (!waitForResponse("OK", 1000)) return false;
// Set the URL (replace with your server URL)
gsmSerial.println("AT+HTTPPARA=\"URL\",\"http://hardwareapi.warky.dev/upload/pm8000\"");
if (!waitForResponse("OK", 1000)) return false;
// Set HTTP data
gsmSerial.println("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
if (!waitForResponse("OK", 1000)) return false;
gsmSerial.println("AT+HTTPDATA=" + String(data.length()) + ",5000");
if (!waitForResponse("DOWNLOAD", 1000)) return false;
gsmSerial.println(data);
if (!waitForResponse("OK", 5000)) return false;
// Send HTTP POST request
gsmSerial.println("AT+HTTPACTION=1");
int16_t httpStatus = waitForHTTPAction(10000);
if (httpStatus != 200) {
Serial.println("HTTP POST failed with status: " + String(httpStatus));
return false;
}
// Read the response
gsmSerial.println("AT+HTTPREAD");
if (!waitForResponse("OK", 1000)) return false;
// Close HTTP service
gsmSerial.println("AT+HTTPTERM");
if (!waitForResponse("OK", 1000)) return false;
// Close bearer
gsmSerial.println("AT+SAPBR=0,1");
if (!waitForResponse("OK", 1000)) return false;
digitalWrite(LED_A_PID, HIGH); // Indicate successful data send
delay(200);
digitalWrite(LED_A_PID, LOW);
return true;
}
void loop()
{
if (!booted)
{
Serial.print(F("\nBoot failed, cycle "));
delay(10000);
digitalWrite(LED_A_PID, LOW);
return;
}
delay(100);
String data;
if (millis() - lastRefreshTime >= 60000) // Changed to 1 minute interval
{
lastRefreshTime = millis();
Serial.print(F("\nTime: "));
Serial.print(millis());
const uint16_t totalReg = sizeof(registers) / sizeof(registers[0]);
if (!headerSent)
{
data = "Date Time,";
for (int i = 0; i < totalReg; i++)
{
const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
data += "@";
data += String(regaddr);
data += ",";
}
headerSent = true;
if (sendGSMData(data)) {
flicker(LED_A_PID, 50, 10); // 50 quick flickers, sent header
} else {
flicker(LED_B_PID, 5, 200); // 5 medium flashes, failed to send header
}
}
data = String(millis()) + ","; // Use millis() as timestamp
Serial.println(totalReg);
// Modbus Data Loop
for (int i = 0; i < totalReg; i++)
{
const uint16_t regaddr = pgm_read_word(&registers[i].regaddr);
const uint8_t regtype = pgm_read_word(&registers[i].regtype);
Serial.print(F("Reg Read: "));
Serial.println(regtype);
Serial.println(regaddr);
if (regaddr > 0)
{
delay(25); // Gives the pending communication a little delay
uint8_t result = node.readHoldingRegisters(regaddr - 1, 2);
delay(25); // Delay the read for a little bit so that the buffer can be read
if (result == node.ku8MBSuccess)
{
if (regtype == 2)
{
data += String(getRegisterFloat(node.getResponseBuffer(0), node.getResponseBuffer(1)));
}
else if (regtype == 1)
{
data += String(node.getResponseBuffer(0));
}
else if (regtype == 0)
{
data += String(getRegisterInt32(node.getResponseBuffer(0), node.getResponseBuffer(1)));
}
else if (regtype == 5)
{
String strData = "";
for (uint8_t j = 0; j < 20; j++)
{
uint8_t v = node.getResponseBuffer(j);
if (v == 0) {
break;
}
strData += char(v);
}
data += strData;
}
else
{
data += "null";
}
}
else
{
Serial.print(F("Reg Error: "));
Serial.print(result, HEX);
Serial.print("\n");
data += "E";
data += String(result, HEX);
flicker(LED_B_PID, 2, 250);
}
data += ",";
}
}
Serial.print(F("\nData to send: "));
Serial.println(data);
if (sendGSMData(data)) {
Serial.println(F("Data sent successfully via GSM"));
flicker(LED_A_PID, 4, 100); // 4 quick flickers on LED_A_PID, data sent
} else {
Serial.println(F("Failed to send data via GSM"));
flicker(LED_B_PID, 4, 250); // 4 medium flashes on LED_B_PID, failed to send data
}
Serial.print(F("\n\n"));
}
}

View File

@@ -0,0 +1,201 @@
# Modbus Reading and GSM Data Logging for Schneider PowerLogic PM8000
This is a specification and implementation of an Arduino-based Modbus data logger with GSM data transmission for the Schneider PowerLogic PM8000.
This software is designed for Vivarox EMS and only Vivarox has the right to use and modify this software.
## Arduino Implementation:
This project uses an Arduino to connect to Modbus devices, read information, and transmit it via GSM to a remote server.
### Hardware needed:
1. Arduino Board
Recommended: Arduino MEGA 2560 (for more memory and I/O pins) or Arduino UNO (for simpler projects).
2. RS485 to TTL Module
Allows communication between the Arduino and Modbus devices using the RS485 protocol.
3. 800C GSM Module 3.3/5V
Enables the Arduino to send data over cellular networks.
4. Power Supply
To power the Arduino and connected peripherals. A dedicated 2A power supply is required for the GSM module.
5. LED Indicators
Two LEDs for status indication.
6. Capacitors
100uF and 10uF capacitors for power supply stabilization.
### Wiring
#### Wiring Diagram
```
Arduino Mega/Uno 800C GSM Module Description
----------------- --------------- -----------
5V ----> VCC Power supply
GND ----> GND Ground
2 (RX) <---- TX GSM TX to Arduino RX
3 (TX) ----> RX Arduino TX to GSM RX
7 ----> DI (RS485) RS485 Driver Input
8 <---- RO (RS485) RS485 Receiver Output
4 ----> DE/RE (RS485) RS485 Driver Enable/Receiver Enable
3 ----> LED A Status LED A
5 ----> LED B Status LED B
Power Supply
------------
VCC ----> + (2A) Dedicated 2A power supply positive
GND ----> - (GND) Dedicated 2A power supply ground
Capacitors
----------
VCC ----|(---- GND 100uF capacitor
VCC ---||---- GND 10uF capacitor
Antenna
|
|
[GSM Module 800C]
```
#### Wiring Notes:
1. Ensure the power supply can provide 2A current.
2. Place the 100uF and 10uF capacitors as close to the GSM module's power pins as possible.
3. The RS485 connections are optional and depend on your specific requirements.
4. LEDs should be connected with appropriate current-limiting resistors (not shown in diagram).
5. The GSM module's antenna should be connected securely.
6. Double-check all connections before powering on the system.
### Software
- Modbus Library: ModbusMaster
- GSM Library: Built-in SoftwareSerial
- NeoSWSerial: For better latency on software serial communication with Modbus
### Implementation Details
1. Modbus Configuration:
- Slave ID: 101
- Baud Rate: 9600
- Register map: Defined in separate "register_map_pm8000.h" file
2. Data Logging and Transmission:
- Frequency: Readings taken and transmitted every minute
- Data Format: CSV (Comma-Separated Values) string
- Data Structure: Timestamp (millis), followed by register values
- Header Row: Includes register addresses for easy identification
3. Register Types Supported:
- Float (32-bit)
- Integer (32-bit)
- String (up to 20 characters)
4. Error Handling and Status Indication:
- LED A: Indicates successful data transmission
- LED B: Indicates errors (e.g., GSM issues, Modbus communication errors)
- Serial output for debugging (9600 baud)
5. Special Features:
- Robust error handling for GSM and Modbus communication
- Header sent once at the beginning of each session
- Configurable APN and server URL
### Programming Workflow
1. Initialize hardware (GSM module, RS485 module)
2. Set up Modbus communication parameters
3. Enter main loop:
- Read data from Modbus registers
- Format data into CSV string
- Send data via GSM to server
- Handle any errors and provide status indication via LEDs
- Delay for 1 minute before next reading and transmission
## Memory Limitations and Register Customization
### Memory Constraints
The Arduino, particularly models like the UNO and MEGA, has limited memory available for storing program code and variables. This limitation affects the number of Modbus registers that can be defined and read in a single project.
- Arduino UNO: 32 KB Flash (program storage), 2 KB SRAM
- Arduino MEGA: 256 KB Flash, 8 KB SRAM
Due to these constraints, the number of registers that can be defined in the `register_map_pm8000.h` file is not unlimited. The exact number will depend on the complexity of your code and other libraries used.
### Customizing the Register Map
To adapt this project to your specific needs, you can modify the `register_map_pm8000.h` file. This file contains the definitions of Modbus registers to be read by the Arduino.
To customize the register map:
1. Open the `register_map_pm8000.h` file in your Arduino IDE or text editor.
2. Locate the `registers` array in the file. It should look something like this:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
{40003, 1},
// ... other registers ...
};
```
3. To remove a register, simply comment out its line by adding `//` at the beginning:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
// {40003, 1}, // This register is now commented out and won't be read
// ... other registers ...
};
```
4. To add a new register, add a new line to the array with the register address and type:
```cpp
const RegisterInfo registers[] PROGMEM = {
{40001, 2}, // Example register
{40003, 1},
{40005, 2}, // New register added
// ... other registers ...
};
```
5. Remember to keep the array syntax correct, with commas between entries and a semicolon at the end of the array.
## Best Practices
- Start by commenting out registers you don't need before adding new ones.
- If you're using an Arduino UNO, you may need to be more selective about which registers to include due to memory constraints.
- Test your modifications incrementally to ensure the Arduino can handle the memory load.
- If you need to read a large number of registers, consider using an Arduino MEGA or a more powerful microcontroller.
- Ensure your GSM data plan can handle the amount of data being transmitted.
- Regularly check your server to ensure data is being received correctly.
## Important AT Commands
Here are some important AT commands used in this project:
1. `AT+XISP=0`: Set to use internal TCP/IP protocol stack.
2. `AT+CGDCONT=1,"IP","APN_NAME"`: Set the APN for your cellular provider.
3. `AT+XGAUTH=1,1,"username","password"`: Set authentication for private networks if needed.
4. `AT+XIIC=1`: Establish PPP link.
5. `AT+TCPSETUP=0,server_ip,port`: Establish TCP connection.
6. `AT+TCPSEND=0,data_length`: Send data over TCP connection.
7. `AT+TCPCLOSE=0`: Close TCP connection.
8. `AT+ENPWRSAVE=1`: Enable power-saving mode (if needed).
Remember to replace "APN_NAME", "username", "password", "server_ip", and "port" with your specific values.
## Troubleshooting
1. If you encounter communication issues, double-check your wiring and ensure all connections are secure.
2. Verify that your APN settings are correct for your cellular provider.
3. If the module isn't responding, try resetting it and check your power supply.
4. Use AT commands like `AT+CSQ` to check signal strength and `AT+CREG?` to check network registration status.
5. If data isn't being sent, verify your TCP connection settings and ensure you have an active data plan.
By carefully managing the registers in the `register_map_pm8000.h` file and configuring your GSM settings, you can customize this Modbus reader to suit your specific requirements while staying within the memory limitations of your Arduino board and optimizing data transmission.

View File

@@ -0,0 +1,602 @@
#include <stdint.h>
struct RegisterMap
{
uint16_t regaddr;
uint8_t regtype;
};
const PROGMEM RegisterMap registers[] = {
//{ 30, 5} , // Name: Meter Name (DeviceName) - [30,20] as UTF8
//{ 50, 5} , // Name: Meter Model (DeviceType) - [50,20] as UTF8
{ 1837, 1} , // Name: Year (Year) - [1837,1] as INT16U
{ 1838, 1} , // Name: Month (Month) - [1838,1] as INT16U
{ 1839, 1} , // Name: Day (Day) - [1839,1] as INT16U
{ 1840, 1} , // Name: Hour (Hour) - [1840,1] as INT16U
{ 1841, 1} , // Name: Minute (Minute) - [1841,1] as INT16U
{ 2700, 2} , // Name: Active Energy Delivered (Into Load) (kWh del) - [2700,2] as FLOAT32
{ 2702, 2} , // Name: Active Energy Received (Out of Load) (kWh rec) - [2702,2] as FLOAT32
{ 2704, 2} , // Name: Active Energy Delivered + Received (kWh del+rec) - [2704,2] as FLOAT32
{ 2706, 2} , // Name: Active Energy Delivered- Received (kWh del-rec) - [2706,2] as FLOAT32
{ 2708, 2} , // Name: Reactive Energy Delivered (kVARh del) - [2708,2] as FLOAT32
{ 2710, 2} , // Name: Reactive Energy Received (kVARh rec) - [2710,2] as FLOAT32
{ 2712, 2} , // Name: Reactive Energy Delivered + Received (kVARh del+rec) - [2712,2] as FLOAT32
{ 2714, 2} , // Name: Reactive Energy Delivered - Received (kVARh del-rec) - [2714,2] as FLOAT32
{ 2716, 2} , // Name: Apparent Energy Delivered (kVAh del) - [2716,2] as FLOAT32
{ 2718, 2} , // Name: Apparent Energy Received (kVAh rec) - [2718,2] as FLOAT32
{ 2720, 2} , // Name: Apparent Energy Delivered + Received (kVAh del+rec) - [2720,2] as FLOAT32
{ 2722, 2} , // Name: Apparent Energy Delivered - Received (kVAh del-rec) - [2722,2] as FLOAT32
{ 2724, 2} , // Name: Active Energy in Quadrant I (kWh Q1) - [2724,2] as FLOAT32
{ 2726, 2} , // Name: Active Energy in Quadrant II (kWh Q2) - [2726,2] as FLOAT32
{ 2728, 2} , // Name: Active Energy in Quadrant III (kWh Q3) - [2728,2] as FLOAT32
{ 2730, 2} , // Name: Active Energy in Quadrant IV (kWh Q4) - [2730,2] as FLOAT32
{ 2732, 2} , // Name: Reactive Energy in Quadrant I (kVARh Q1) - [2732,2] as FLOAT32
{ 2734, 2} , // Name: Reactive Energy in Quadrant II (kVARh Q2) - [2734,2] as FLOAT32
{ 2736, 2} , // Name: Reactive Energy in Quadrant III (kVARh Q3) - [2736,2] as FLOAT32
{ 2738, 2} , // Name: Reactive Energy in Quadrant IV (kVARh Q4) - [2738,2] as FLOAT32
{ 2740, 2} , // Name: Apparent Energy in Quadrant I (kVAh Q1) - [2740,2] as FLOAT32
{ 2742, 2} , // Name: Apparent Energy in Quadrant II (kVAh Q2) - [2742,2] as FLOAT32
{ 2744, 2} , // Name: Apparent Energy in Quadrant III (kVAh Q3) - [2744,2] as FLOAT32
{ 2746, 2} , // Name: Apparent Energy in Quadrant IV (kVAh Q4) - [2746,2] as FLOAT32
{ 2748, 2} , // Name: Conditional Active Energy Delivered (Into Load) (Cnd kWh del) - [2748,2] as FLOAT32
{ 2750, 2} , // Name: Conditional Active Energy Received (Out of Load) (Cnd kWh rec) - [2750,2] as FLOAT32
{ 2754, 2} , // Name: Active Energy Delivered - Received, Conditional (Cnd kWh d-r) - [2754,2] as FLOAT32
{ 2756, 2} , // Name: Conditional Reactive Energy In (Delivered) (Cnd kVARh del) - [2756,2] as FLOAT32
{ 2758, 2} , // Name: Conditional Reactive Energy Out (Received) (Cnd kVARh rec) - [2758,2] as FLOAT32
{ 2762, 2} , // Name: Reactive Energy Delivered - Received, Conditional (Cnd kVARh d-r) - [2762,2] as FLOAT32
{ 2768, 2} , // Name: Apparent Energy Delivered + Received, Conditional (Cnd kVAh d+r) - [2768,2] as FLOAT32
{ 2772, 2} , // Name: Active Energy Delivered , Last Complete Interval (Inc kWh del C) - [2772,2] as FLOAT32
{ 2774, 2} , // Name: Active Energy Received , Last Complete Interval (Inc kWh rec C) - [2774,2] as FLOAT32
{ 2776, 2} , // Name: Active Energy Delivered - Received , Last Complete Interval (Inc kWh d-r C) - [2776,2] as FLOAT32
{ 2778, 2} , // Name: Reactive Energy Delivered , Last Complete Interval (Inc kVARh del C) - [2778,2] as FLOAT32
{ 2780, 2} , // Name: Reactive Energy Received , Last Complete Interval (Inc kVARh rec C) - [2780,2] as FLOAT32
{ 2782, 2} , // Name: Reactive Energy Delivered - Received , Last Complete Interval (Inc kVARh d-r C) - [2782,2] as FLOAT32
{ 2784, 2} , // Name: Apparent Energy Delivered + Received , Last Complete Interval (Inc kVAh d+r C) - [2784,2] as FLOAT32
{ 2786, 2} , // Name: Active Energy Delivered , Present Interval (Inc kWh del) - [2786,2] as FLOAT32
{ 2788, 2} , // Name: Active Energy Received , Present Interval (Inc kWh rec) - [2788,2] as FLOAT32
{ 2790, 2} , // Name: Active Energy Delivered - Received , Present Interval (Inc kWh d-r) - [2790,2] as FLOAT32
{ 2792, 2} , // Name: Reactive Energy Delivered , Present Interval (Inc kVARh del) - [2792,2] as FLOAT32
{ 2794, 2} , // Name: Reactive Energy Received , Present Interval (Inc kVARh rec) - [2794,2] as FLOAT32
{ 2796, 2} , // Name: Reactive Energy Delivered - Received , Present Interval (Inc kVARh d-r) - [2796,2] as FLOAT32
{ 2798, 2} , // Name: Apparent Energy Delivered + Received , Present Interval (Inc kVAh d+r) - [2798,2] as FLOAT32
{ 2800, 2} , // Name: Active Energy Delivered Interval (kWh del int) - [2800,2] as FLOAT32
{ 2802, 2} , // Name: Active Energy Received Interval (kWh rec int) - [2802,2] as FLOAT32
{ 2804, 2} , // Name: Reactive Energy Delivered Interval (kVARh del int) - [2804,2] as FLOAT32
{ 2806, 2} , // Name: Reactive Energy Received Interval (kVARh rec int) - [2806,2] as FLOAT32
{ 2808, 2} , // Name: Apparent Energy Delivered Interval (kVAh del int) - [2808,2] as FLOAT32
{ 2810, 2} , // Name: Apparent Energy Received Interval (kVAh rec int) - [2810,2] as FLOAT32
{ 3000, 2} , // Name: Current A (I a) - [3000,2] as FLOAT32
{ 3002, 2} , // Name: Current B (I b) - [3002,2] as FLOAT32
{ 3004, 2} , // Name: Current C (I c) - [3004,2] as FLOAT32
{ 3006, 2} , // Name: Current N (I 4) - [3006,2] as FLOAT32
{ 3008, 2} , // Name: Current G (I 5) - [3008,2] as FLOAT32
//{ 3010, 2} , // Name: Current Avg (I avg) - [3010,2] as FLOAT32
{ 3020, 2} , // Name: Voltage A-B (Vll ab) - [3020,2] as FLOAT32
{ 3022, 2} , // Name: Voltage B-C (Vll bc) - [3022,2] as FLOAT32
{ 3024, 2} , // Name: Voltage C-A (Vll ca) - [3024,2] as FLOAT32
//{ 3026, 2} , // Name: Voltage L-L Avg (Vll avg) - [3026,2] as FLOAT32
{ 3028, 2} , // Name: Voltage A-N (Vln a) - [3028,2] as FLOAT32
{ 3030, 2} , // Name: Voltage B-N (Vln b) - [3030,2] as FLOAT32
{ 3032, 2} , // Name: Voltage C-N (Vln c) - [3032,2] as FLOAT32
// { 3036, 2} , // Name: Voltage L-N Avg (Vln avg) - [3036,2] as FLOAT32
{ 3054, 2} , // Name: Active Power A (kW a) - [3054,2] as FLOAT32
{ 3056, 2} , // Name: Active Power B (kW b) - [3056,2] as FLOAT32
{ 3058, 2} , // Name: Active Power C (kW c) - [3058,2] as FLOAT32
{ 3060, 2} , // Name: Active Power Total (kW tot) - [3060,2] as FLOAT32
{ 3062, 2} , // Name: Reactive Power A (kVAR a) - [3062,2] as FLOAT32
{ 3064, 2} , // Name: Reactive Power B (kVAR b) - [3064,2] as FLOAT32
{ 3066, 2} , // Name: Reactive Power C (kVAR c) - [3066,2] as FLOAT32
{ 3068, 2} , // Name: Reactive Power Total (kVAR tot) - [3068,2] as FLOAT32
{ 3070, 2} , // Name: Apparent Power A (kVA a) - [3070,2] as FLOAT32
{ 3072, 2} , // Name: Apparent Power B (kVA b) - [3072,2] as FLOAT32
{ 3074, 2} , // Name: Apparent Power C (kVA c) - [3074,2] as FLOAT32
{ 3076, 2} , // Name: Apparent Power Total (kVA tot) - [3076,2] as FLOAT32
{ 3110, 2} , // Name: Frequency (Freq) - [3110,2] as FLOAT32
// { 3204, 3} , // Name: Active Energy Delivered (Into Load) (kWh del) - [3204,4] as INT64
// { 3208, 3} , // Name: Active Energy Received (Out of Load) (kWh rec) - [3208,4] as INT64
// { 3212, 3} , // Name: Active Energy Delivered + Received (kWh del+rec) - [3212,4] as INT64
// { 3216, 3} , // Name: Active Energy Delivered- Received (kWh del-rec) - [3216,4] as INT64
// { 3220, 3} , // Name: Reactive Energy Delivered (kVARh del) - [3220,4] as INT64
// { 3224, 3} , // Name: Reactive Energy Received (kVARh rec) - [3224,4] as INT64
// { 3228, 3} , // Name: Reactive Energy Delivered + Received (kVARh del+rec) - [3228,4] as INT64
// { 3232, 3} , // Name: Reactive Energy Delivered - Received (kVARh del-rec) - [3232,4] as INT64
// { 3236, 3} , // Name: Apparent Energy Delivered (kVAh del) - [3236,4] as INT64
// { 3240, 3} , // Name: Apparent Energy Received (kVAh rec) - [3240,4] as INT64
// { 3244, 3} , // Name: Apparent Energy Delivered + Received (kVAh del+rec) - [3244,4] as INT64
// { 3248, 3} , // Name: Apparent Energy Delivered - Received (kVAh del-rec) - [3248,4] as INT64
// { 3256, 3} , // Name: Active Energy in Quadrant I (kWh Q1) - [3256,4] as INT64
// { 3260, 3} , // Name: Active Energy in Quadrant II (kWh Q2) - [3260,4] as INT64
// { 3264, 3} , // Name: Active Energy in Quadrant III (kWh Q3) - [3264,4] as INT64
// { 3268, 3} , // Name: Active Energy in Quadrant IV (kWh Q4) - [3268,4] as INT64
// { 3272, 3} , // Name: Reactive Energy in Quadrant I (kVARh Q1) - [3272,4] as INT64
// { 3276, 3} , // Name: Reactive Energy in Quadrant II (kVARh Q2) - [3276,4] as INT64
// { 3280, 3} , // Name: Reactive Energy in Quadrant III (kVARh Q3) - [3280,4] as INT64
// { 3284, 3} , // Name: Reactive Energy in Quadrant IV (kVARh Q4) - [3284,4] as INT64
// { 3288, 3} , // Name: Apparent Energy in Quadrant I (kVAh Q1) - [3288,4] as INT64
// { 3292, 3} , // Name: Apparent Energy in Quadrant II (kVAh Q2) - [3292,4] as INT64
// { 3296, 3} , // Name: Apparent Energy in Quadrant III (kVAh Q3) - [3296,4] as INT64
// { 3300, 3} , // Name: Apparent Energy in Quadrant IV (kVAh Q4) - [3300,4] as INT64
// { 3358, 3} , // Name: Conditional Active Energy Delivered (Into Load) (Cnd kWh del) - [3358,4] as INT64
// { 3362, 3} , // Name: Conditional Active Energy Received (Out of Load) (Cnd kWh rec) - [3362,4] as INT64
// { 3370, 3} , // Name: Active Energy Delivered - Received, Conditional (Cnd kWh d-r) - [3370,4] as INT64
// { 3374, 3} , // Name: Conditional Reactive Energy In (Delivered) (Cnd kVARh del) - [3374,4] as INT64
// { 3378, 3} , // Name: Conditional Reactive Energy Out (Received) (Cnd kVARh rec) - [3378,4] as INT64
// { 3386, 3} , // Name: Reactive Energy Delivered - Received, Conditional (Cnd kVARh d-r) - [3386,4] as INT64
// { 3398, 3} , // Name: Apparent Energy Delivered + Received, Conditional (Cnd kVAh d+r) - [3398,4] as INT64
// { 3414, 3} , // Name: Active Energy Delivered , Last Complete Interval (Inc kWh del C) - [3414,4] as INT64
// { 3418, 3} , // Name: Active Energy Received , Last Complete Interval (Inc kWh rec C) - [3418,4] as INT64
// { 3422, 3} , // Name: Active Energy Delivered - Received , Last Complete Interval (Inc kWh d-r C) - [3422,4] as INT64
// { 3426, 3} , // Name: Reactive Energy Delivered , Last Complete Interval (Inc kVARh del C) - [3426,4] as INT64
// { 3430, 3} , // Name: Reactive Energy Received , Last Complete Interval (Inc kVARh rec C) - [3430,4] as INT64
// { 3434, 3} , // Name: Reactive Energy Delivered - Received , Last Complete Interval (Inc kVARh d-r C) - [3434,4] as INT64
// { 3438, 3} , // Name: Apparent Energy Delivered + Received , Last Complete Interval (Inc kVAh d+r C) - [3438,4] as INT64
// { 3442, 3} , // Name: Active Energy Delivered , Present Interval (Inc kWh del) - [3442,4] as INT64
// { 3446, 3} , // Name: Active Energy Received , Present Interval (Inc kWh rec) - [3446,4] as INT64
// { 3450, 3} , // Name: Active Energy Delivered - Received , Present Interval (Inc kWh d-r) - [3450,4] as INT64
// { 3454, 3} , // Name: Reactive Energy Delivered , Present Interval (Inc kVARh del) - [3454,4] as INT64
// { 3458, 3} , // Name: Reactive Energy Received , Present Interval (Inc kVARh rec) - [3458,4] as INT64
// { 3462, 3} , // Name: Reactive Energy Delivered - Received , Present Interval (Inc kVARh d-r) - [3462,4] as INT64
// { 3466, 3} , // Name: Apparent Energy Delivered + Received , Present Interval (Inc kVAh d+r) - [3466,4] as INT64
// { 3470, 3} , // Name: Active Energy Delivered Interval (kWh del int) - [3470,4] as INT64
// { 3474, 3} , // Name: Active Energy Received Interval (kWh rec int) - [3474,4] as INT64
// { 3478, 3} , // Name: Reactive Energy Delivered Interval (kVARh del int) - [3478,4] as INT64
// { 3482, 3} , // Name: Reactive Energy Received Interval (kVARh rec int) - [3482,4] as INT64
// { 3486, 3} , // Name: Apparent Energy Delivered Interval (kVAh del int) - [3486,4] as INT64
// { 3490, 3} , // Name: Apparent Energy Received Interval (kVAh rec int) - [3490,4] as INT64
// { 3650, 2} , // Name: Current A Squared Hours (MU Ia^2h) - [3650,2] as FLOAT32
// { 3652, 2} , // Name: Current B Square Hours (MU Ib^2h) - [3652,2] as FLOAT32
// { 3654, 2} , // Name: Current C Square Hours (MU Ic^2h) - [3654,2] as FLOAT32
// { 3656, 2} , // Name: Voltage A-B Square Hours (MU Vll ab^2h) - [3656,2] as FLOAT32
// { 3658, 2} , // Name: Voltage B-C Square Hours (MU Vll bc^2h) - [3658,2] as FLOAT32
// { 3660, 2} , // Name: Voltage C-A Square Hours (MU Vll ca^2h) - [3660,2] as FLOAT32
// { 3668, 2} , // Name: Current A Squared Hours (MU Ia^2h int) - [3668,2] as FLOAT32
// { 3670, 2} , // Name: Current B Square Hours (MU Ib^2h int) - [3670,2] as FLOAT32
// { 3672, 2} , // Name: Current C Square Hours (MU Ic^2h int) - [3672,2] as FLOAT32
// { 3674, 2} , // Name: Voltage A-B Square Hours (MU Vllab^2h int) - [3674,2] as FLOAT32
// { 3676, 2} , // Name: Voltage B-C Square Hours (MU Vllbc^2h int) - [3676,2] as FLOAT32
// { 3678, 2} , // Name: Voltage C-A Square Hours (MU Vllca^2h int) - [3678,2] as FLOAT32
// { 3680, 2} , // Name: Voltage A-N Square Hours (MU Vlna^2h int) - [3680,2] as FLOAT32
// { 3682, 2} , // Name: Voltage B-N Square Hours (MU Vlnb^2h int) - [3682,2] as FLOAT32
// { 3684, 2} , // Name: Voltage C-N Square Hours (MU Vlnc^2h int) - [3684,2] as FLOAT32
// { 4196, 3} , // Name: Active Energy Delivered Rate 1 (kWh del A) - [4196,4] as INT64
// { 4200, 3} , // Name: Active Energy Delivered Rate 2 (kWh del B) - [4200,4] as INT64
// { 4204, 3} , // Name: Active Energy Delivered Rate 3 (kWh del C) - [4204,4] as INT64
// { 4208, 3} , // Name: Active Energy Delivered Rate 4 (kWh del D) - [4208,4] as INT64
// { 4228, 3} , // Name: Active Energy Received Rate 1 (kWh rec A) - [4228,4] as INT64
// { 4232, 3} , // Name: Active Energy Received Rate 2 (kWh rec B) - [4232,4] as INT64
// { 4236, 3} , // Name: Active Energy Received Rate 3 (kWh rec C) - [4236,4] as INT64
// { 4240, 3} , // Name: Active Energy Received Rate 4 (kWh rec D) - [4240,4] as INT64
// { 4260, 3} , // Name: Reactive Energy Delivered Rate 1 (kVARh del A) - [4260,4] as INT64
// { 4264, 3} , // Name: Reactive Energy Delivered Rate 2 (kVARh del B) - [4264,4] as INT64
// { 4268, 3} , // Name: Reactive Energy Delivered Rate 3 (kVARh del C) - [4268,4] as INT64
// { 4272, 3} , // Name: Reactive Energy Delivered Rate 4 (kVARh del D) - [4272,4] as INT64
// { 4292, 3} , // Name: Reactive Energy Received Rate 1 (kVARh rec A) - [4292,4] as INT64
// { 4296, 3} , // Name: Reactive Energy Received Rate 2 (kVARh rec B) - [4296,4] as INT64
// { 4300, 3} , // Name: Reactive Energy Received Rate 3 (kVARh rec C) - [4300,4] as INT64
// { 4304, 3} , // Name: Reactive Energy Received Rate 4 (kVARh rec D) - [4304,4] as INT64
// { 4324, 3} , // Name: Apparent Energy Delivered Rate 1 (kVAh del A) - [4324,4] as INT64
// { 4328, 3} , // Name: Apparent Energy Delivered Rate 2 (kVAh del B) - [4328,4] as INT64
// { 4332, 3} , // Name: Apparent Energy Delivered Rate 3 (kVAh del C) - [4332,4] as INT64
// { 4336, 3} , // Name: Apparent Energy Delivered Rate 4 (kVAh del D) - [4336,4] as INT64
// { 4356, 3} , // Name: Apparent Energy Received Rate 1 (kVAh rec A) - [4356,4] as INT64
// { 4360, 3} , // Name: Apparent Energy Received Rate 2 (kVAh rec B) - [4360,4] as INT64
// { 4364, 3} , // Name: Apparent Energy Received Rate 3 (kVAh rec C) - [4364,4] as INT64
// { 4368, 3} , // Name: Apparent Energy Received Rate 4 (kVAh rec D) - [4368,4] as INT64
// { 4800, 2} , // Name: Active Energy Delivered Rate 1 (kWh del A) - [4800,2] as FLOAT32
// { 4802, 2} , // Name: Active Energy Delivered Rate 2 (kWh del B) - [4802,2] as FLOAT32
// { 4804, 2} , // Name: Active Energy Delivered Rate 3 (kWh del C) - [4804,2] as FLOAT32
// { 4806, 2} , // Name: Active Energy Delivered Rate 4 (kWh del D) - [4806,2] as FLOAT32
// { 4816, 2} , // Name: Active Energy Received Rate 1 (kWh rec A) - [4816,2] as FLOAT32
// { 4818, 2} , // Name: Active Energy Received Rate 2 (kWh rec B) - [4818,2] as FLOAT32
// { 4820, 2} , // Name: Active Energy Received Rate 3 (kWh rec C) - [4820,2] as FLOAT32
// { 4822, 2} , // Name: Active Energy Received Rate 4 (kWh rec D) - [4822,2] as FLOAT32
// { 4832, 2} , // Name: Reactive Energy Delivered Rate 1 (kVARh del A) - [4832,2] as FLOAT32
// { 4834, 2} , // Name: Reactive Energy Delivered Rate 2 (kVARh del B) - [4834,2] as FLOAT32
// { 4836, 2} , // Name: Reactive Energy Delivered Rate 3 (kVARh del C) - [4836,2] as FLOAT32
// { 4838, 2} , // Name: Reactive Energy Delivered Rate 4 (kVARh del D) - [4838,2] as FLOAT32
// { 4848, 2} , // Name: Reactive Energy Received Rate 1 (kVARh rec A) - [4848,2] as FLOAT32
// { 4850, 2} , // Name: Reactive Energy Received Rate 2 (kVARh rec B) - [4850,2] as FLOAT32
// { 4852, 2} , // Name: Reactive Energy Received Rate 3 (kVARh rec C) - [4852,2] as FLOAT32
// { 4854, 2} , // Name: Reactive Energy Received Rate 4 (kVARh rec D) - [4854,2] as FLOAT32
// { 4864, 2} , // Name: Apparent Energy Delivered Rate 1 (kVAh del A) - [4864,2] as FLOAT32
// { 4866, 2} , // Name: Apparent Energy Delivered Rate 2 (kVAh del B) - [4866,2] as FLOAT32
// { 4868, 2} , // Name: Apparent Energy Delivered Rate 3 (kVAh del C) - [4868,2] as FLOAT32
// { 4870, 2} , // Name: Apparent Energy Delivered Rate 4 (kVAh del D) - [4870,2] as FLOAT32
// { 4880, 2} , // Name: Apparent Energy Received Rate 1 (kVAh rec A) - [4880,2] as FLOAT32
// { 4882, 2} , // Name: Apparent Energy Received Rate 2 (kVAh rec B) - [4882,2] as FLOAT32
// { 4884, 2} , // Name: Apparent Energy Received Rate 3 (kVAh rec C) - [4884,2] as FLOAT32
// { 4886, 2} , // Name: Apparent Energy Received Rate 4 (kVAh rec D) - [4886,2] as FLOAT32
// { 14045, 2} , // Name: Pickup Setpoint (Over I 4 High Limit) - [14045,2] as FLOAT32
// { 14049, 2} , // Name: Dropout Setpoint (Over I 4 Low Limit) - [14049,2] as FLOAT32
// { 14325, 2} , // Name: Pickup Setpoint (Over kW sd High Limit) - [14325,2] as FLOAT32
// { 14329, 2} , // Name: Dropout Setpoint (Over kW sd Low Limit) - [14329,2] as FLOAT32
// { 14585, 2} , // Name: Pickup Setpoint (Over I a High Limit) - [14585,2] as FLOAT32
// { 14589, 2} , // Name: Dropout Setpoint (Over I a Low Limit) - [14589,2] as FLOAT32
// { 14605, 2} , // Name: Pickup Setpoint (Over I b High Limit) - [14605,2] as FLOAT32
// { 14609, 2} , // Name: Dropout Setpoint (Over I b Low Limit) - [14609,2] as FLOAT32
// { 14625, 2} , // Name: Pickup Setpoint (Over I c High Limit) - [14625,2] as FLOAT32
// { 14629, 2} , // Name: Dropout Setpoint (Over I c Low Limit) - [14629,2] as FLOAT32
// { 21000, 2} , // Name: HS Current A (HS I a) - [21000,2] as FLOAT32
// { 21002, 2} , // Name: HS Current B (HS I b) - [21002,2] as FLOAT32
// { 21004, 2} , // Name: HS Current C (HS I c) - [21004,2] as FLOAT32
// { 21006, 2} , // Name: HS Current N (HS I 4) - [21006,2] as FLOAT32
// { 21008, 2} , // Name: HS Current G (HS I 5) - [21008,2] as FLOAT32
// { 21010, 2} , // Name: HS Current Avg (HS I avg) - [21010,2] as FLOAT32
// { 21016, 2} , // Name: HS Frequency (HS Freq) - [21016,2] as FLOAT32
// { 21018, 2} , // Name: HS Voltage, A-B (HS Vll ab) - [21018,2] as FLOAT32
// { 21020, 2} , // Name: HS Voltage, B-C (HS Vll bc) - [21020,2] as FLOAT32
// { 21022, 2} , // Name: HS Voltage, C-A (HS Vll ca) - [21022,2] as FLOAT32
// { 21024, 2} , // Name: HS Voltage, L-L Average (HS Vll avg) - [21024,2] as FLOAT32
// { 21026, 2} , // Name: HS Voltage, A-N (HS Vln a) - [21026,2] as FLOAT32
// { 21028, 2} , // Name: HS Voltage, B-N (HS Vln b) - [21028,2] as FLOAT32
// { 21030, 2} , // Name: HS Voltage, C-N (HS Vln c) - [21030,2] as FLOAT32
// { 21034, 2} , // Name: HS Voltage, L-N Average (HS Vln avg) - [21034,2] as FLOAT32
// { 21040, 2} , // Name: HS Active Power A (HS kW a) - [21040,2] as FLOAT32
// { 21042, 2} , // Name: HS Active Power B (HS kW b) - [21042,2] as FLOAT32
// { 21044, 2} , // Name: HS Active Power C (HS kW c) - [21044,2] as FLOAT32
// { 21046, 2} , // Name: HS Active Power Total (HS kW tot) - [21046,2] as FLOAT32
// { 21048, 2} , // Name: HS Reactive Power A (HS kVAR a) - [21048,2] as FLOAT32
// { 21050, 2} , // Name: HS Reactive Power B (HS kVAR b) - [21050,2] as FLOAT32
// { 21052, 2} , // Name: HS Reactive Power C (HS kVAR c) - [21052,2] as FLOAT32
// { 21054, 2} , // Name: HS Reactive Power Total (HS kVAR tot) - [21054,2] as FLOAT32
// { 21056, 2} , // Name: HS Apparent Power A (HS kVA a) - [21056,2] as FLOAT32
// { 21058, 2} , // Name: HS Apparent Power B (HS kVA b) - [21058,2] as FLOAT32
// { 21060, 2} , // Name: HS Apparent Power C (HS kVA c) - [21060,2] as FLOAT32
// { 21062, 2} , // Name: HS Apparent Power Total (HS kVA tot) - [21062,2] as FLOAT32
// { 21358, 2} , // Name: K-Factor A (I1 K Factor) - [21358,2] as FLOAT32
// { 21360, 2} , // Name: K-Factor B (I2 K Factor) - [21360,2] as FLOAT32
// { 21362, 2} , // Name: K-Factor C (I3 K Factor) - [21362,2] as FLOAT32
// { 27218, 2} , // Name: Min Current A (I a mn) - [27218,2] as FLOAT32
// { 27220, 2} , // Name: Min Current B (I b mn) - [27220,2] as FLOAT32
// { 27222, 2} , // Name: Min Current C (I c mn) - [27222,2] as FLOAT32
// { 27224, 2} , // Name: Min Current N (I4 mn) - [27224,2] as FLOAT32
// { 27226, 2} , // Name: Min Current G (I5 mn) - [27226,2] as FLOAT32
// { 27228, 2} , // Name: Min Current Avg (I avg mn) - [27228,2] as FLOAT32
// { 27238, 2} , // Name: Min Voltage A-B (Vll ab mn) - [27238,2] as FLOAT32
// { 27240, 2} , // Name: Min Voltage B-C (Vll bc mn) - [27240,2] as FLOAT32
// { 27242, 2} , // Name: Min Voltage C-A (Vll ca mn) - [27242,2] as FLOAT32
// { 27244, 2} , // Name: Min Voltage L-L Avg (Vll avg mn) - [27244,2] as FLOAT32
// { 27246, 2} , // Name: Min Voltage A-N (Vln a mn) - [27246,2] as FLOAT32
// { 27248, 2} , // Name: Min Voltage B-N (Vln b mn) - [27248,2] as FLOAT32
// { 27250, 2} , // Name: Min Voltage C-N (Vln c mn) - [27250,2] as FLOAT32
// { 27254, 2} , // Name: Min Voltage L-N Avg (Vln avg mn) - [27254,2] as FLOAT32
// { 27278, 2} , // Name: Min Active Power Total (kW tot mn) - [27278,2] as FLOAT32
// { 27286, 2} , // Name: Min Reactive Power Total (kVAR tot mn) - [27286,2] as FLOAT32
// { 27294, 2} , // Name: Min Apparent Power Total (kVA tot mn) - [27294,2] as FLOAT32
// { 27616, 2} , // Name: Min Frequency (Freq mn) - [27616,2] as FLOAT32
// { 27644, 2} , // Name: Current A Low (I a low) - [27644,2] as FLOAT32
// { 27646, 2} , // Name: Current B Low (I b low) - [27646,2] as FLOAT32
// { 27648, 2} , // Name: Current C Low (I c low) - [27648,2] as FLOAT32
// { 27650, 2} , // Name: Current N Low (I4 low) - [27650,2] as FLOAT32
// { 27652, 2} , // Name: Current Avg Low (I avg low) - [27652,2] as FLOAT32
// { 27654, 2} , // Name: Voltage A-B Low (Vll ab low) - [27654,2] as FLOAT32
// { 27656, 2} , // Name: Voltage B-C Low (Vll bc low) - [27656,2] as FLOAT32
// { 27658, 2} , // Name: Voltage C-A Low (Vll ca low) - [27658,2] as FLOAT32
// { 27660, 2} , // Name: Voltage L-L Avg Low (Vll avg low) - [27660,2] as FLOAT32
// { 27672, 2} , // Name: Active Power Low (kW tot low) - [27672,2] as FLOAT32
// { 27674, 2} , // Name: Reactive Power Low (kVAR tot low) - [27674,2] as FLOAT32
// { 27676, 2} , // Name: Apparent Power Low (kVA tot low) - [27676,2] as FLOAT32
// { 27682, 2} , // Name: Frequency Low (Freq low) - [27682,2] as FLOAT32
// { 27694, 2} , // Name: Max Current A (I a mx) - [27694,2] as FLOAT32
// { 27696, 2} , // Name: Max Current B (I b mx) - [27696,2] as FLOAT32
// { 27698, 2} , // Name: Max Current C (I c mx) - [27698,2] as FLOAT32
// { 27700, 2} , // Name: Max Current N (I4 mx) - [27700,2] as FLOAT32
// { 27702, 2} , // Name: Max Current G (I5 mx) - [27702,2] as FLOAT32
// { 27704, 2} , // Name: Max Current Avg (I avg mx) - [27704,2] as FLOAT32
// { 27714, 2} , // Name: Max Voltage A-B (Vll ab mx) - [27714,2] as FLOAT32
// { 27716, 2} , // Name: Max Voltage B-C (Vll bc mx) - [27716,2] as FLOAT32
// { 27718, 2} , // Name: Max Voltage C-A (Vll ca mx) - [27718,2] as FLOAT32
// { 27720, 2} , // Name: Max Voltage L-L Avg (Vll avg mx) - [27720,2] as FLOAT32
// { 27722, 2} , // Name: Max Voltage A-N (Vln a mx) - [27722,2] as FLOAT32
// { 27724, 2} , // Name: Max Voltage B-N (Vln b mx) - [27724,2] as FLOAT32
// { 27726, 2} , // Name: Max Voltage C-N (Vln c mx) - [27726,2] as FLOAT32
// { 27730, 2} , // Name: Max Voltage L-N Avg (Vln avg mx) - [27730,2] as FLOAT32
// { 27754, 2} , // Name: Max Active Power Total (kW tot mx) - [27754,2] as FLOAT32
// { 27762, 2} , // Name: Max Reactive Power Total (kVAR tot mx) - [27762,2] as FLOAT32
// { 27770, 2} , // Name: Max Apparent Power Total (kVA tot mx) - [27770,2] as FLOAT32
// { 28092, 2} , // Name: Max Frequency (Freq mx) - [28092,2] as FLOAT32
// { 28120, 2} , // Name: Current A High (I a high) - [28120,2] as FLOAT32
// { 28122, 2} , // Name: Current B High (I b high) - [28122,2] as FLOAT32
// { 28124, 2} , // Name: Current C High (I c high) - [28124,2] as FLOAT32
// { 28126, 2} , // Name: Current N High (I 4 high) - [28126,2] as FLOAT32
// { 28128, 2} , // Name: Current Avg High (I avg high) - [28128,2] as FLOAT32
// { 28130, 2} , // Name: Voltage A-B High (Vll ab high) - [28130,2] as FLOAT32
// { 28132, 2} , // Name: Voltage B-C High (Vll bc high) - [28132,2] as FLOAT32
// { 28134, 2} , // Name: Voltage C-A High (Vll ca high) - [28134,2] as FLOAT32
// { 28136, 2} , // Name: Voltage L-L Avg High (Vll avg high) - [28136,2] as FLOAT32
// { 28162, 2} , // Name: Active Power High (kW tot high) - [28162,2] as FLOAT32
// { 28164, 2} , // Name: Reactive Power High (kVAR tot high) - [28164,2] as FLOAT32
// { 28166, 2} , // Name: Apparent Power High (kVA tot high) - [28166,2] as FLOAT32
// { 28172, 2} , // Name: Frequency High (Freq high) - [28172,2] as FLOAT32
// { 28180, 2} , // Name: Current A Mean (I a mean) - [28180,2] as FLOAT32
// { 28182, 2} , // Name: Current B Mean (I b mean) - [28182,2] as FLOAT32
// { 28184, 2} , // Name: Current C Mean (I c mean) - [28184,2] as FLOAT32
// { 28186, 2} , // Name: Current N Mean (I 4 mean) - [28186,2] as FLOAT32
// { 28188, 2} , // Name: Current Avg Mean (I avg mean) - [28188,2] as FLOAT32
// { 28190, 2} , // Name: Voltage A-B Mean (Vll ab mean) - [28190,2] as FLOAT32
// { 28192, 2} , // Name: Voltage B-C Mean (Vll bc mean) - [28192,2] as FLOAT32
// { 28194, 2} , // Name: Voltage C-A Mean (Vll ca mean) - [28194,2] as FLOAT32
// { 28196, 2} , // Name: Voltage L-L Avg Mean (Vll avg mean) - [28196,2] as FLOAT32
// { 28208, 2} , // Name: Active Power Mean (kW tot mean) - [28208,2] as FLOAT32
// { 28210, 2} , // Name: Reactive Power Mean (kVAR tot mean) - [28210,2] as FLOAT32
// { 28212, 2} , // Name: Apparent Power Mean (kVA tot mean) - [28212,2] as FLOAT32
// { 28218, 2} , // Name: Frequency Mean (Freq mean) - [28218,2] as FLOAT32
// { 29884, 2} , // Name: Current A Last Demand (I a sd) - [29884,2] as FLOAT32
// { 29886, 2} , // Name: Current A Predicted Demand (I a sd pred) - [29886,2] as FLOAT32
// { 29888, 0} , // Name: Current A Peak Demand (I a sd mx) - [29888,6] as TIMESTAMPED_FLOAT32
// { 29898, 2} , // Name: Current B Last Demand (I b sd) - [29898,2] as FLOAT32
// { 29900, 2} , // Name: Current B Predicted Demand (I b sd pred) - [29900,2] as FLOAT32
// { 29902, 0} , // Name: Current B Peak Demand (I b sd mx) - [29902,6] as TIMESTAMPED_FLOAT32
// { 29912, 2} , // Name: Current C Last Demand (I c sd) - [29912,2] as FLOAT32
// { 29914, 2} , // Name: Current C Predicted Demand (I c sd pred) - [29914,2] as FLOAT32
// { 29916, 0} , // Name: Current C Peak Demand (I c sd mx) - [29916,6] as TIMESTAMPED_FLOAT32
// { 29926, 2} , // Name: Current 4 Last Demand (I 4 sd) - [29926,2] as FLOAT32
// { 29928, 2} , // Name: Current 4 Predicted Demand (I 4 sd pred) - [29928,2] as FLOAT32
// { 29930, 0} , // Name: Current 4 Peak Demand (I 4 sd mx) - [29930,6] as TIMESTAMPED_FLOAT32
// { 29940, 2} , // Name: Current Avg Last Demand (I avg sd) - [29940,2] as FLOAT32
// { 29942, 2} , // Name: Current Avg Predicted Demand (I avg sd pred) - [29942,2] as FLOAT32
// { 29944, 0} , // Name: Current Avg Peak Demand (I avg sd mx) - [29944,6] as TIMESTAMPED_FLOAT32
// { 29954, 2} , // Name: Active Power Last Demand (kW sd del-rec) - [29954,2] as FLOAT32
// { 29956, 2} , // Name: Active Power Predicted Demand (kW pr del-rec) - [29956,2] as FLOAT32
// { 29958, 0} , // Name: Active Power Peak Demand (kW sd mx d-r) - [29958,6] as TIMESTAMPED_FLOAT32
// { 29968, 2} , // Name: Active Power Del Last Demand (kW sd del) - [29968,2] as FLOAT32
// { 29970, 2} , // Name: Active Power Del Predicted Demand (kW pr del) - [29970,2] as FLOAT32
// { 29972, 0} , // Name: Active Power Del Peak Demand (kW sd mx del) - [29972,6] as TIMESTAMPED_FLOAT32
// { 29982, 2} , // Name: Active Power Rec Last Demand (kW sd rec) - [29982,2] as FLOAT32
// { 29984, 2} , // Name: Active Power Rec Predicted Demand (kW pr rec) - [29984,2] as FLOAT32
// { 29986, 0} , // Name: Active Power Rec Peak Demand (kW sd mx rec) - [29986,6] as TIMESTAMPED_FLOAT32
// { 29996, 2} , // Name: Active Power Total Last Demand (kW sd del+rec) - [29996,2] as FLOAT32
// { 29998, 2} , // Name: Active Power Total Predicted Demand (kW pr del+rec) - [29998,2] as FLOAT32
// { 30000, 0} , // Name: Active Power Total Peak Demand (kW sd mx d+r) - [30000,6] as TIMESTAMPED_FLOAT32
// { 30010, 2} , // Name: Reactive Power Last Demand (kVAR sd del-rec) - [30010,2] as FLOAT32
// { 30012, 2} , // Name: Reactive Power Predicted Demand (kVAR pr del-rec) - [30012,2] as FLOAT32
// { 30014, 0} , // Name: Reactive Power Peak Demand (kVAR sd mx d-r) - [30014,6] as TIMESTAMPED_FLOAT32
// { 30024, 2} , // Name: Reactive Power Del Last Demand (kVAR sd del) - [30024,2] as FLOAT32
// { 30026, 2} , // Name: Reactive Power Del Predicted Demand (kVAR pr del) - [30026,2] as FLOAT32
// { 30028, 0} , // Name: Reactive Power Del Peak Demand (kVAR sd mx del) - [30028,6] as TIMESTAMPED_FLOAT32
// { 30038, 2} , // Name: Reactive Power Rec Last Demand (kVAR sd rec) - [30038,2] as FLOAT32
// { 30040, 2} , // Name: Reactive Power Rec Predicted Demand (kVAR pr rec) - [30040,2] as FLOAT32
// { 30042, 0} , // Name: Reactive Power Rec Peak Demand (kVAR sd mx rec) - [30042,6] as TIMESTAMPED_FLOAT32
// { 30052, 2} , // Name: Reactive Power Total Last Demand (kVAR sd del+rec) - [30052,2] as FLOAT32
// { 30054, 2} , // Name: Reactive Power Total Predicted Demand (kVAR pr del+rec) - [30054,2] as FLOAT32
// { 30056, 0} , // Name: Reactive Power Total Peak Demand (kVAR sd mx d+r) - [30056,6] as TIMESTAMPED_FLOAT32
// { 30066, 2} , // Name: Apparent Power Last Demand (kVA sd del-rec) - [30066,2] as FLOAT32
// { 30068, 2} , // Name: Apparent Power Predicted Demand (kVA pr del-rec) - [30068,2] as FLOAT32
// { 30070, 0} , // Name: Apparent Power Peak Demand (kVA sd mx d-r) - [30070,6] as TIMESTAMPED_FLOAT32
// { 30080, 2} , // Name: Apparent Power Del Last Demand (kVA sd del) - [30080,2] as FLOAT32
// { 30082, 2} , // Name: Apparent Power Del Predicted Demand (kVA pr del) - [30082,2] as FLOAT32
// { 30084, 0} , // Name: Apparent Power Del Peak Demand (kVA sd mx del) - [30084,6] as TIMESTAMPED_FLOAT32
// { 30094, 2} , // Name: Apparent Power Rec Last Demand (kVA sd rec) - [30094,2] as FLOAT32
// { 30096, 2} , // Name: Apparent Power Rec Predicted Demand (kVA pr rec) - [30096,2] as FLOAT32
// { 30098, 0} , // Name: Apparent Power Rec Peak Demand (kVA sd mx rec) - [30098,6] as TIMESTAMPED_FLOAT32
// { 30108, 2} , // Name: Apparent Power Total Last Demand (kVA sd del+rec) - [30108,2] as FLOAT32
// { 30110, 2} , // Name: Apparent Power Total Predicted Demand (kVA pr del+rec) - [30110,2] as FLOAT32
// { 30112, 0} , // Name: Apparent Power Total Peak Demand (kVA sd mx d+r) - [30112,6] as TIMESTAMPED_FLOAT32
// { 30222, 2} , // Name: Active Power Del A Last Demand (kW sd del A) - [30222,2] as FLOAT32
// { 30224, 2} , // Name: Active Power Del A Predicted Demand (kW pr del A) - [30224,2] as FLOAT32
// { 30226, 0} , // Name: Active Power Del A Peak Demand (kW sd mx del A) - [30226,6] as TIMESTAMPED_FLOAT32
// { 30236, 2} , // Name: Active Power Del B Last Demand (kW sd del B) - [30236,2] as FLOAT32
// { 30238, 2} , // Name: Active Power Del B Predicted Demand (kW pr del B) - [30238,2] as FLOAT32
// { 30240, 0} , // Name: Active Power Del B Peak Demand (kW sd mx del B) - [30240,6] as TIMESTAMPED_FLOAT32
// { 30250, 2} , // Name: Active Power Del C Last Demand (kW sd del C) - [30250,2] as FLOAT32
// { 30252, 2} , // Name: Active Power Del C Predicted Demand (kW pr del C) - [30252,2] as FLOAT32
// { 30254, 0} , // Name: Active Power Del C Peak Demand (kW sd mx del C) - [30254,6] as TIMESTAMPED_FLOAT32
// { 30264, 2} , // Name: Active Power Del D Last Demand (kW sd del D) - [30264,2] as FLOAT32
// { 30266, 2} , // Name: Active Power Del D Predicted Demand (kW pr del D) - [30266,2] as FLOAT32
// { 30268, 0} , // Name: Active Power Del D Peak Demand (kW sd mx del D) - [30268,6] as TIMESTAMPED_FLOAT32
// { 30278, 2} , // Name: Active Power Rec A Last Demand (kW sd rec A) - [30278,2] as FLOAT32
// { 30280, 2} , // Name: Active Power Rec A Predicted Demand (kW pr rec A) - [30280,2] as FLOAT32
// { 30282, 0} , // Name: Active Power Rec A Peak Demand (kW sd mx rec A) - [30282,6] as TIMESTAMPED_FLOAT32
// { 30292, 2} , // Name: Active Power Rec B Last Demand (kW sd rec B) - [30292,2] as FLOAT32
// { 30294, 2} , // Name: Active Power Rec B Predicted Demand (kW pr rec B) - [30294,2] as FLOAT32
// { 30296, 0} , // Name: Active Power Rec B Peak Demand (kW sd mx rec B) - [30296,6] as TIMESTAMPED_FLOAT32
// { 30306, 2} , // Name: Active Power Rec C Last Demand (kW sd rec C) - [30306,2] as FLOAT32
// { 30308, 2} , // Name: Active Power Rec C Predicted Demand (kW pr rec C) - [30308,2] as FLOAT32
// { 30310, 0} , // Name: Active Power Rec C Peak Demand (kW sd mx rec C) - [30310,6] as TIMESTAMPED_FLOAT32
// { 30320, 2} , // Name: Active Power Rec D Last Demand (kW sd rec D) - [30320,2] as FLOAT32
// { 30322, 2} , // Name: Active Power Rec D Predicted Demand (kW pr rec D) - [30322,2] as FLOAT32
// { 30324, 0} , // Name: Active Power Rec D Peak Demand (kW sd mx rec D) - [30324,6] as TIMESTAMPED_FLOAT32
// { 30334, 2} , // Name: Reactive Power Del A Last Demand (kVAR sd del A) - [30334,2] as FLOAT32
// { 30336, 2} , // Name: Reactive Power Del A Predicted Demand (kVAR pr del A) - [30336,2] as FLOAT32
// { 30338, 0} , // Name: Reactive Power Del A Peak Demand (kVAR sd mx d A) - [30338,6] as TIMESTAMPED_FLOAT32
// { 30348, 2} , // Name: Reactive Power Del B Last Demand (kVAR sd del B) - [30348,2] as FLOAT32
// { 30350, 2} , // Name: Reactive Power Del B Predicted Demand (kVAR pr del B) - [30350,2] as FLOAT32
// { 30352, 0} , // Name: Reactive Power Del B Peak Demand (kVAR sd mx d B) - [30352,6] as TIMESTAMPED_FLOAT32
// { 30362, 2} , // Name: Reactive Power Del C Last Demand (kVAR sd del C) - [30362,2] as FLOAT32
// { 30364, 2} , // Name: Reactive Power Del C Predicted Demand (kVAR pr del C) - [30364,2] as FLOAT32
// { 30366, 0} , // Name: Reactive Power Del C Peak Demand (kVAR sd mx d C) - [30366,6] as TIMESTAMPED_FLOAT32
// { 30376, 2} , // Name: Reactive Power Del D Last Demand (kVAR sd del D) - [30376,2] as FLOAT32
// { 30378, 2} , // Name: Reactive Power Del D Predicted Demand (kVAR pr del D) - [30378,2] as FLOAT32
// { 30380, 0} , // Name: Reactive Power Del D Peak Demand (kVAR sd mx d D) - [30380,6] as TIMESTAMPED_FLOAT32
// { 30390, 2} , // Name: Reactive Power Rec A Last Demand (kVAR sd rec A) - [30390,2] as FLOAT32
// { 30392, 2} , // Name: Reactive Power Rec A Predicted Demand (kVAR pr rec A) - [30392,2] as FLOAT32
// { 30394, 0} , // Name: Reactive Power Rec A Peak Demand (kVAR sd mx r A) - [30394,6] as TIMESTAMPED_FLOAT32
// { 30404, 2} , // Name: Reactive Power Rec B Last Demand (kVAR sd rec B) - [30404,2] as FLOAT32
// { 30406, 2} , // Name: Reactive Power Rec B Predicted Demand (kVAR pr rec B) - [30406,2] as FLOAT32
// { 30408, 0} , // Name: Reactive Power Rec B Peak Demand (kVAR sd mx r B) - [30408,6] as TIMESTAMPED_FLOAT32
// { 30418, 2} , // Name: Reactive Power Rec C Last Demand (kVAR sd rec C) - [30418,2] as FLOAT32
// { 30420, 2} , // Name: Reactive Power Rec C Predicted Demand (kVAR pr rec C) - [30420,2] as FLOAT32
// { 30422, 0} , // Name: Reactive Power Rec C Peak Demand (kVAR sd mx r C) - [30422,6] as TIMESTAMPED_FLOAT32
// { 30432, 2} , // Name: Reactive Power Rec D Last Demand (kVAR sd rec D) - [30432,2] as FLOAT32
// { 30434, 2} , // Name: Reactive Power Rec D Predicted Demand (kVAR pr rec D) - [30434,2] as FLOAT32
// { 30436, 0} , // Name: Reactive Power Rec D Peak Demand (kVAR sd mx r D) - [30436,6] as TIMESTAMPED_FLOAT32
// { 30446, 2} , // Name: Apparent Power Del A Last Demand (kVA sd del A) - [30446,2] as FLOAT32
// { 30448, 2} , // Name: Apparent Power Del A Predicted Demand (kVA pr del A) - [30448,2] as FLOAT32
// { 30450, 0} , // Name: Apparent Power Del A Peak Demand (kVA sd mx del A) - [30450,6] as TIMESTAMPED_FLOAT32
// { 30460, 2} , // Name: Apparent Power Del B Last Demand (kVA sd del B) - [30460,2] as FLOAT32
// { 30462, 2} , // Name: Apparent Power Del B Predicted Demand (kVA pr del B) - [30462,2] as FLOAT32
// { 30464, 0} , // Name: Apparent Power Del B Peak Demand (kVA sd mx del B) - [30464,6] as TIMESTAMPED_FLOAT32
// { 30474, 2} , // Name: Apparent Power Del C Last Demand (kVA sd del C) - [30474,2] as FLOAT32
// { 30476, 2} , // Name: Apparent Power Del C Predicted Demand (kVA pr del C) - [30476,2] as FLOAT32
// { 30478, 0} , // Name: Apparent Power Del C Peak Demand (kVA sd mx del C) - [30478,6] as TIMESTAMPED_FLOAT32
// { 30488, 2} , // Name: Apparent Power Del D Last Demand (kVA sd del D) - [30488,2] as FLOAT32
// { 30490, 2} , // Name: Apparent Power Del D Predicted Demand (kVA pr del D) - [30490,2] as FLOAT32
// { 30492, 0} , // Name: Apparent Power Del D Peak Demand (kVA sd mx del D) - [30492,6] as TIMESTAMPED_FLOAT32
// { 30502, 2} , // Name: Apparent Power Rec A Last Demand (kVA sd rec A) - [30502,2] as FLOAT32
// { 30504, 2} , // Name: Apparent Power Rec A Predicted Demand (kVA pr rec A) - [30504,2] as FLOAT32
// { 30506, 0} , // Name: Apparent Power Rec A Peak Demand (kVA sd mx rec A) - [30506,6] as TIMESTAMPED_FLOAT32
// { 30516, 2} , // Name: Apparent Power Rec B Last Demand (kVA sd rec B) - [30516,2] as FLOAT32
// { 30518, 2} , // Name: Apparent Power Rec B Predicted Demand (kVA pr rec B) - [30518,2] as FLOAT32
// { 30520, 0} , // Name: Apparent Power Rec B Peak Demand (kVA sd mx rec B) - [30520,6] as TIMESTAMPED_FLOAT32
// { 30530, 2} , // Name: Apparent Power Rec C Last Demand (kVA sd rec C) - [30530,2] as FLOAT32
// { 30532, 2} , // Name: Apparent Power Rec C Predicted Demand (kVA pr rec C) - [30532,2] as FLOAT32
// { 30534, 0} , // Name: Apparent Power Rec C Peak Demand (kVA sd mx rec C) - [30534,6] as TIMESTAMPED_FLOAT32
// { 30544, 2} , // Name: Apparent Power Rec D Last Demand (kVA sd rec D) - [30544,2] as FLOAT32
// { 30546, 2} , // Name: Apparent Power Rec D Predicted Demand (kVA pr rec D) - [30546,2] as FLOAT32
// { 30548, 0} , // Name: Apparent Power Rec D Peak Demand (kVA sd mx rec D) - [30548,6] as TIMESTAMPED_FLOAT32
// { 30558, 2} , // Name: Active Power Q1 Last Demand (kW sd Q1) - [30558,2] as FLOAT32
// { 30560, 2} , // Name: Active Power Q1 Predicted Demand (kW pr Q1) - [30560,2] as FLOAT32
// { 30562, 0} , // Name: Active Power Q1 Peak Demand (kW sd mx Q1) - [30562,6] as TIMESTAMPED_FLOAT32
// { 30572, 2} , // Name: Active Power Q2 Last Demand (kW sd Q2) - [30572,2] as FLOAT32
// { 30574, 2} , // Name: Active Power Q2 Predicted Demand (kW pr Q2) - [30574,2] as FLOAT32
// { 30576, 0} , // Name: Active Power Q2 Peak Demand (kW sd mx Q2) - [30576,6] as TIMESTAMPED_FLOAT32
// { 30586, 2} , // Name: Active Power Q3 Last Demand (kW sd Q3) - [30586,2] as FLOAT32
// { 30588, 2} , // Name: Active Power Q3 Predicted Demand (kW pr Q3) - [30588,2] as FLOAT32
// { 30590, 0} , // Name: Active Power Q3 Peak Demand (kW sd mx Q3) - [30590,6] as TIMESTAMPED_FLOAT32
// { 30600, 2} , // Name: Active Power Q4 Last Demand (kW sd Q4) - [30600,2] as FLOAT32
// { 30602, 2} , // Name: Active Power Q4 Predicted Demand (kW pr Q4) - [30602,2] as FLOAT32
// { 30604, 0} , // Name: Active Power Q4 Peak Demand (kW sd mx Q4) - [30604,6] as TIMESTAMPED_FLOAT32
// { 30614, 2} , // Name: Reactive Power Q1 Last Demand (kVAR sd Q1) - [30614,2] as FLOAT32
// { 30616, 2} , // Name: Reactive Power Q1 Predicted Demand (kVAR pr Q1) - [30616,2] as FLOAT32
// { 30618, 0} , // Name: Reactive Power Q1 Peak Demand (kVAR sd mx Q1) - [30618,6] as TIMESTAMPED_FLOAT32
// { 30628, 2} , // Name: Reactive Power Q2 Last Demand (kVAR sd Q2) - [30628,2] as FLOAT32
// { 30630, 2} , // Name: Reactive Power Q2 Predicted Demand (kVAR pr Q2) - [30630,2] as FLOAT32
// { 30632, 0} , // Name: Reactive Power Q2 Peak Demand (kVAR sd mx Q2) - [30632,6] as TIMESTAMPED_FLOAT32
// { 30642, 2} , // Name: Reactive Power Q3 Last Demand (kVAR sd Q3) - [30642,2] as FLOAT32
// { 30644, 2} , // Name: Reactive Power Q3 Predicted Demand (kVAR pr Q3) - [30644,2] as FLOAT32
// { 30646, 0} , // Name: Reactive Power Q3 Peak Demand (kVAR sd mx Q3) - [30646,6] as TIMESTAMPED_FLOAT32
// { 30656, 2} , // Name: Reactive Power Q4 Last Demand (kVAR sd Q4) - [30656,2] as FLOAT32
// { 30658, 2} , // Name: Reactive Power Q4 Predicted Demand (kVAR pr Q4) - [30658,2] as FLOAT32
// { 30660, 0} , // Name: Reactive Power Q4 Peak Demand (kVAR sd mx Q4) - [30660,6] as TIMESTAMPED_FLOAT32
// { 30670, 2} , // Name: Apparent Power Q1 Last Demand (kVA sd Q1) - [30670,2] as FLOAT32
// { 30672, 2} , // Name: Apparent Power Q1 Predicted Demand (kVA pr Q1) - [30672,2] as FLOAT32
// { 30674, 0} , // Name: Apparent Power Q1 Peak Demand (kVA sd mx Q1) - [30674,6] as TIMESTAMPED_FLOAT32
// { 30684, 2} , // Name: Apparent Power Q2 Last Demand (kVA sd Q2) - [30684,2] as FLOAT32
// { 30686, 2} , // Name: Apparent Power Q2 Predicted Demand (kVA pr Q2) - [30686,2] as FLOAT32
// { 30688, 0} , // Name: Apparent Power Q2 Peak Demand (kVA sd mx Q2) - [30688,6] as TIMESTAMPED_FLOAT32
// { 30698, 2} , // Name: Apparent Power Q3 Last Demand (kVA sd Q3) - [30698,2] as FLOAT32
// { 30700, 2} , // Name: Apparent Power Q3 Predicted Demand (kVA pr Q3) - [30700,2] as FLOAT32
// { 30702, 0} , // Name: Apparent Power Q3 Peak Demand (kVA sd mx Q3) - [30702,6] as TIMESTAMPED_FLOAT32
// { 30712, 2} , // Name: Apparent Power Q4 Last Demand (kVA sd Q4) - [30712,2] as FLOAT32
// { 30714, 2} , // Name: Apparent Power Q4 Predicted Demand (kVA pr Q4) - [30714,2] as FLOAT32
// { 30716, 0} , // Name: Apparent Power Q4 Peak Demand (kVA sd mx Q4) - [30716,6] as TIMESTAMPED_FLOAT32
// { 30822, 2} , // Name: Block Demand Active Power (kVA co kW d-r) - [30822,2] as FLOAT32
// { 30824, 2} , // Name: Block Demand Active Power Into the Load (kVA co kW del) - [30824,2] as FLOAT32
// { 30826, 2} , // Name: Block Demand Active Power Out of the Load (kVA co kW rec) - [30826,2] as FLOAT32
// { 30828, 2} , // Name: Block Demand Active Power Total (kVA co kW d+r) - [30828,2] as FLOAT32
// { 30830, 2} , // Name: Block Demand Reactive Power (kVA co kVAR d-r) - [30830,2] as FLOAT32
// { 30832, 2} , // Name: Block Demand Reactive Power Into the Load (kVA co kVAR del) - [30832,2] as FLOAT32
// { 30834, 2} , // Name: Block Demand Reactive Power Out of the Load (kVA co kVAR rec) - [30834,2] as FLOAT32
// { 30836, 2} , // Name: Block Demand Reactive Power Total (kVA co kVAR d+r) - [30836,2] as FLOAT32
// { 30838, 2} , // Name: Block Demand Active Power (kVAR co kW d-r) - [30838,2] as FLOAT32
// { 30840, 2} , // Name: Block Demand Active Power Into the Load (kVAR co kW del) - [30840,2] as FLOAT32
// { 30842, 2} , // Name: Block Demand Active Power Out of the Load (kVAR co kW rec) - [30842,2] as FLOAT32
// { 30844, 2} , // Name: Block Demand Active Power Total (kVAR co kW d+r) - [30844,2] as FLOAT32
// { 30846, 2} , // Name: Block Demand Apparent Power (kVAR co kVA d-r) - [30846,2] as FLOAT32
// { 30848, 2} , // Name: Block Demand Apparent Power Into the Load (kVAR co kVA del) - [30848,2] as FLOAT32
// { 30850, 2} , // Name: Block Demand Apparent Power Out of the Load (kVAR co kVA rec) - [30850,2] as FLOAT32
// { 30852, 2} , // Name: Block Demand Apparent Power Total (kVAR co kVA d+r) - [30852,2] as FLOAT32
// { 30854, 2} , // Name: Block Demand Reactive Power (kW co kVAR d-r) - [30854,2] as FLOAT32
// { 30856, 2} , // Name: Block Demand Reactive Power Into the Load (kW co kVAR del) - [30856,2] as FLOAT32
// { 30858, 2} , // Name: Block Demand Reactive Power Out of the Load (kW co kVAR rec) - [30858,2] as FLOAT32
// { 30860, 2} , // Name: Block Demand Reactive Power Total (kW co kVAR d+r) - [30860,2] as FLOAT32
// { 30862, 2} , // Name: Block Demand Apparent Power (kW co kVA d-r) - [30862,2] as FLOAT32
// { 30864, 2} , // Name: Block Demand Apparent Power Into the Load (kW co kVA del) - [30864,2] as FLOAT32
// { 30866, 2} , // Name: Block Demand Apparent Power Out of the Load (kW co kVA rec) - [30866,2] as FLOAT32
// { 30868, 2} , // Name: Block Demand Apparent Power Total (kW co kVA d+r) - [30868,2] as FLOAT32
// { 30870, 3} , // Name: Active Energy Delivered Rate 1 (PB kWh del A) - [30870,4] as INT64
// { 30874, 3} , // Name: Active Energy Delivered Rate 2 (PB kWh del B) - [30874,4] as INT64
// { 30878, 3} , // Name: Active Energy Delivered Rate 3 (PB kWh del C) - [30878,4] as INT64
// { 30882, 3} , // Name: Active Energy Delivered Rate 4 (PB kWh del D) - [30882,4] as INT64
// { 30886, 3} , // Name: Active Energy Delivered (PB kWh del) - [30886,4] as INT64
// { 30890, 3} , // Name: Active Energy Received (PB kWh rec) - [30890,4] as INT64
// { 30894, 3} , // Name: Reactive Energy Delivered (PB kVARh del) - [30894,4] as INT64
// { 30898, 3} , // Name: Reactive Energy Received (PB kVARh rec) - [30898,4] as INT64
// { 30902, 3} , // Name: Apparent Energy Delivered (PB kVAh del) - [30902,4] as INT64
// { 30906, 3} , // Name: Apparent Energy Received (PB kVAh rec) - [30906,4] as INT64
// { 30910, 2} , // Name: Peak Block Demand Active Power Delived Rate 1 (PB kW sd mx d A) - [30910,2] as FLOAT32
// { 30912, 2} , // Name: Peak Block Demand Active Power Delived Rate 2 (PB kW sd mx d B) - [30912,2] as FLOAT32
// { 30914, 2} , // Name: Peak Block Demand Active Power Delived Rate 3 (PB kW sd mx d C) - [30914,2] as FLOAT32
// { 30916, 2} , // Name: Peak Block Demand Active Power Delived Rate 4 (PB kW sd mx d D) - [30916,2] as FLOAT32
// { 30918, 2} , // Name: Peak Block Demand Active Power Received (PB kW sd mx rec) - [30918,2] as FLOAT32
// { 30920, 2} , // Name: Peak Block Demand Reactive Power Delivered (PB kVAR sd mx d) - [30920,2] as FLOAT32
// { 30922, 2} , // Name: Peak Block Demand Reactive Power Received (PB kVAR sd mx r) - [30922,2] as FLOAT32
// { 30924, 2} , // Name: Peak Block Demand Apparent Power Delivered (PB kVA sd mx d) - [30924,2] as FLOAT32
// { 30926, 2} , // Name: Peak Block Demand Apparent Power Received (PB kVA sd mx r) - [30926,2] as FLOAT32
// { 30928, 3} , // Name: Active Energy Delivered Rate 1 (PS kWh del A) - [30928,4] as INT64
// { 30932, 3} , // Name: Active Energy Delivered Rate 2 (PS kWh del B) - [30932,4] as INT64
// { 30936, 3} , // Name: Active Energy Delivered Rate 3 (PS kWh del C) - [30936,4] as INT64
// { 30940, 3} , // Name: Active Energy Delivered Rate 4 (PS kWh del D) - [30940,4] as INT64
// { 30944, 3} , // Name: Active Energy Delivered (PS kWh del) - [30944,4] as INT64
// { 30948, 3} , // Name: Active Energy Received (PS kWh rec) - [30948,4] as INT64
// { 30952, 3} , // Name: Reactive Energy Delivered (PS kVARh del) - [30952,4] as INT64
// { 30956, 3} , // Name: Reactive Energy Received (PS kVARh rec) - [30956,4] as INT64
// { 30960, 3} , // Name: Apparent Energy Delivered (PS kVAh del) - [30960,4] as INT64
// { 30964, 3} , // Name: Apparent Energy Received (PS kVAh rec) - [30964,4] as INT64
// { 30968, 2} , // Name: Peak Block Demand Active Power Delived Rate 1 (PS kW sd mx d A) - [30968,2] as FLOAT32
// { 30970, 2} , // Name: Peak Block Demand Active Power Delived Rate 2 (PS kW sd mx d B) - [30970,2] as FLOAT32
// { 30972, 2} , // Name: Peak Block Demand Active Power Delived Rate 3 (PS kW sd mx d C) - [30972,2] as FLOAT32
// { 30974, 2} , // Name: Peak Block Demand Active Power Delived Rate 4 (PS kW sd mx d D) - [30974,2] as FLOAT32
// { 30976, 2} , // Name: Peak Block Demand Active Power Received (PS kW sd mx rec) - [30976,2] as FLOAT32
// { 30978, 2} , // Name: Peak Block Demand Reactive Power Delivered (PS kVAR sd mx d) - [30978,2] as FLOAT32
// { 30980, 2} , // Name: Peak Block Demand Reactive Power Received (PS kVAR sd mx r) - [30980,2] as FLOAT32
// { 30982, 2} , // Name: Peak Block Demand Apparent Power Delivered (PS kVA sd mx d) - [30982,2] as FLOAT32
// { 30984, 2} , // Name: Peak Block Demand Apparent Power Received (PS kVA sd mx r) - [30984,2] as FLOAT32
// { 30986, 2} , // Name: Active Energy Delivered Rate 1 (PB kWh del A) - [30986,2] as FLOAT32
// { 30988, 2} , // Name: Active Energy Delivered Rate 2 (PB kWh del B) - [30988,2] as FLOAT32
// { 30990, 2} , // Name: Active Energy Delivered Rate 3 (PB kWh del C) - [30990,2] as FLOAT32
// { 30992, 2} , // Name: Active Energy Delivered Rate 4 (PB kWh del D) - [30992,2] as FLOAT32
// { 30994, 2} , // Name: Active Energy Delivered (PB kWh del) - [30994,2] as FLOAT32
// { 30996, 2} , // Name: Active Energy Received (PB kWh rec) - [30996,2] as FLOAT32
// { 30998, 2} , // Name: Reactive Energy Delivered (PB kVARh del) - [30998,2] as FLOAT32
// { 31000, 2} , // Name: Reactive Energy Received (PB kVARh rec) - [31000,2] as FLOAT32
// { 31002, 2} , // Name: Apparent Energy Delivered (PB kVAh del) - [31002,2] as FLOAT32
// { 31004, 2} , // Name: Apparent Energy Received (PB kVAh rec) - [31004,2] as FLOAT32
// { 31006, 2} , // Name: Active Energy Delivered Rate 1 (PS kWh del A) - [31006,2] as FLOAT32
// { 31008, 2} , // Name: Active Energy Delivered Rate 2 (PS kWh del B) - [31008,2] as FLOAT32
// { 31010, 2} , // Name: Active Energy Delivered Rate 3 (PS kWh del C) - [31010,2] as FLOAT32
// { 31012, 2} , // Name: Active Energy Delivered Rate 4 (PS kWh del D) - [31012,2] as FLOAT32
// { 31014, 2} , // Name: Active Energy Delivered (PS kWh del) - [31014,2] as FLOAT32
// { 31016, 2} , // Name: Active Energy Received (PS kWh rec) - [31016,2] as FLOAT32
// { 31018, 2} , // Name: Reactive Energy Delivered (PS kVARh del) - [31018,2] as FLOAT32
// { 31020, 2} , // Name: Reactive Energy Received (PS kVARh rec) - [31020,2] as FLOAT32
// { 31022, 2} , // Name: Apparent Energy Delivered (PS kVAh del) - [31022,2] as FLOAT32
// { 31024, 2} , // Name: Apparent Energy Received (PS kVAh rec) - [31024,2] as FLOAT32
// { 34352, 2} , // Name: Current, Phase A 3 Second (150/180 Cycles) (I1 3s) - [34352,2] as FLOAT32
// { 34354, 2} , // Name: Current, Phase A 10 Minute (I1 10m) - [34354,2] as FLOAT32
// { 34358, 2} , // Name: Current, Phase B 3 Second (150/180 Cycles) (I2 3s) - [34358,2] as FLOAT32
// { 34360, 2} , // Name: Current, Phase B 10 Minute (I2 10m) - [34360,2] as FLOAT32
// { 34364, 2} , // Name: Current, Phase C 3 Second (150/180 Cycles) (I3 3s) - [34364,2] as FLOAT32
// { 34366, 2} , // Name: Current, Phase C 10 Minute (I3 10m) - [34366,2] as FLOAT32
// { 34400, 2} , // Name: Voltage, A-N 3 Second (150/180 Cycles) (V1 3s) - [34400,2] as FLOAT32
// { 34402, 2} , // Name: Voltage, A-N 10 Minute (V1 10m) - [34402,2] as FLOAT32
// { 34404, 2} , // Name: Voltage, A-N 2 Hour (V1 2hr) - [34404,2] as FLOAT32
// { 34406, 2} , // Name: Voltage, B-N 3 Second (150/180 Cycles) (V2 3s) - [34406,2] as FLOAT32
// { 34408, 2} , // Name: Voltage, B-N 10 Minute (V2 10m) - [34408,2] as FLOAT32
// { 34410, 2} , // Name: Voltage, B-N 2 Hour (V2 2hr) - [34410,2] as FLOAT32
// { 34412, 2} , // Name: Voltage, C-N 3 Second (150/180 Cycles) (V3 3s) - [34412,2] as FLOAT32
// { 34414, 2} , // Name: Voltage, C-N 10 Minute (V3 10m) - [34414,2] as FLOAT32
// { 34416, 2} , // Name: Voltage, C-N 2 Hour (V3 2hr) - [34416,2] as FLOAT32
// { 34472, 2} , // Name: Power Frequency 3 Second (150/180 Cycles) (Power Frequency) - [34472,2] as FLOAT32
// { 34474, 2} , // Name: Power Frequency 10 Minute (Power Freq 10m) - [34474,2] as FLOAT32
// { 34476, 2} , // Name: Power Frequency 2 Hour (Power Freq 2hr) - [34476,2] as FLOAT32
// { 40000, 2} , // Name: Frequency 10m Mean (PQ Freq mean) - [40000,2] as FLOAT32
// { 40002, 2} , // Name: Frequency 10m Low (PQ Freq low) - [40002,2] as FLOAT32
// { 40004, 2} , // Name: Frequency 10m High (PQ Freq high) - [40004,2] as FLOAT32
// { 40006, 2} , // Name: Frequency Minimum (PQ Freq mn-op) - [40006,2] as FLOAT32
// { 40008, 2} , // Name: Frequency Maximum (PQ Freq mx-op) - [40008,2] as FLOAT32
// { 40010, 2} , // Name: V1 10m Mean (PQ V1 mean) - [40010,2] as FLOAT32
// { 40012, 2} , // Name: V1 10m Low (PQ V1 low) - [40012,2] as FLOAT32
// { 40014, 2} , // Name: V1 10m High (PQ V1 high) - [40014,2] as FLOAT32
// { 40016, 2} , // Name: V2 10m Mean (PQ V2 mean) - [40016,2] as FLOAT32
// { 40018, 2} , // Name: V2 10m Low (PQ V2 low) - [40018,2] as FLOAT32
// { 40020, 2} , // Name: V2 10m High (PQ V2 high) - [40020,2] as FLOAT32
// { 40022, 2} , // Name: V3 10m Mean (PQ V3 mean) - [40022,2] as FLOAT32
// { 40024, 2} , // Name: V3 10m Low (PQ V3 low) - [40024,2] as FLOAT32
// { 40026, 2} , // Name: V3 10m High (PQ V3 high) - [40026,2] as FLOAT32
// { 54396, 1} , // Name: FAC1 Nominal Frequency (N/A) - [54396,1] as INT16U
// { 56977, 0} , // Name: COM1 RTS Delay (N/A) - [56977,2] as INT32
}
;

View File

@@ -0,0 +1,27 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
uint32_t getRegisterUInt32(uint16_t highWord, uint16_t lowWord) {
uint32_t val = (highWord << 16) + lowWord;
return val;
}
int32_t getRegisterInt32(uint16_t highWord, uint16_t lowWord) {
int32_t val = (highWord << 16) + lowWord;
return val;
}
int64_t getRegisterInt64(uint16_t word1, uint16_t word2, uint16_t word3, uint16_t word4) {
uint64_t val = ((uint64_t)word1 << 48) + ((uint64_t)word2 << 32) + (word3 << 16) + word4;
return val;
}
float getRegisterFloat(uint16_t highWord, uint16_t lowWord) {
uint32_t floatRaw = ((uint32_t)highWord << 16) | lowWord;
float floatValue;
memcpy(&floatValue, &floatRaw, sizeof(float));
return floatValue;
}

37
firmware/uno/pinout.md Normal file
View File

@@ -0,0 +1,37 @@
ARDUINO UNO PINOUT
=================
DIGITAL PINS (D0-D13)
--------------------
D0 - RX (Serial)
D1 - TX (Serial)
D2 - Digital
D3 - PWM
D4 - Digital
D5 - PWM
D6 - PWM
D7 - Digital
D8 - Digital
D9 - PWM
D10 - PWM/SS (SPI)
D11 - PWM/MOSI (SPI)
D12 - MISO (SPI)
D13 - SCK (SPI)
ANALOG PINS (A0-A5)
------------------
A0 - Analog Input
A1 - Analog Input
A2 - Analog Input
A3 - Analog Input
A4 - SDA (I2C)
A5 - SCL (I2C)
POWER
-----
VIN - Input Voltage (7-12V)
GND - Ground (multiple pins)
5V - 5V Output
3.3V - 3.3V Output
AREF - Analog Reference
RST - Reset