EPEVER Solar Controller RS485 MODBUS test

From Public Wiki
Revision as of 23:55, 8 December 2020 by Falgsc-al (talk | contribs) (First Upload)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Synopsis

Notes

This was developed to test communication to the EPEVER AN Solar controller from the Arduino


Code

  1 //Power is not currently working for battery or panel
  2 
  3 #include <ModbusMaster.h>
  4 
  5 
  6 #define MAX485_DE   49
  7 #define MAX485_RE   48
  8 
  9 #define PANEL_VOLTS     0x00
 10 #define PANEL_AMPS      0x01
 11 #define PANEL_POWER_L   0x02
 12 #define PANEL_POWER_H   0x03
 13 #define BATT_VOLTS      0x04
 14 #define BATT_AMPS       0x05
 15 #define BATT_POWER_L    0x06
 16 #define BATT_POWER_H    0x07
 17 #define OVERVOLT_DISC   0x00
 18 #define CHARGING_LIMIT  0x01
 19 #define OVERVOLT_RECON  0x02
 20 #define EQUILIBRIUM_CV  0x03
 21 #define BOOST_CV        0x04
 22 #define FLOAT_CV        0x05
 23 #define BOOST_RECON     0x06
 24 
 25 
 26 // instantiate ModbusMaster object
 27 ModbusMaster node;
 28 
 29 //#include <SoftwareSerial.h>
 30 
 31 //SoftwareSerial mySerial(10, 11); // RX, TX
 32 
 33 void setup()
 34 {
 35   Serial.begin(115200);
 36   while (!Serial) {
 37     ;
 38   }
 39   Serial.println("Moooooo!");
 40 
 41   pinMode(MAX485_RE, OUTPUT);
 42   pinMode(MAX485_DE, OUTPUT);
 43   // Init in receive mode
 44   digitalWrite(MAX485_RE, 0);
 45   digitalWrite(MAX485_DE, 0);
 46 
 47   // Modbus at 115200 baud
 48   Serial1.begin(115200);
 49 
 50   // EPEver Device ID 1
 51   node.begin(1, Serial1);
 52 
 53   // Callbacks
 54   node.preTransmission(preTransmission);
 55   node.postTransmission(postTransmission);
 56 }
 57 
 58 void loop()
 59 {
 60   uint8_t result;
 61 
 62   // Read 8 registers starting at 0x3100)
 63   node.clearResponseBuffer();
 64   result = node.readInputRegisters(0x3100, 8);
 65 
 66   if (result == node.ku8MBSuccess)
 67   {
 68     Serial.print("VPanel: ");
 69     Serial.println(node.getResponseBuffer(PANEL_VOLTS)/100.0f);
 70     Serial.print("IPanel: ");
 71     Serial.println(node.getResponseBuffer(PANEL_AMPS)/100.0f);
 72     Serial.print("PPanel: ");
 73     Serial.println((node.getResponseBuffer(PANEL_POWER_L) +
 74                     node.getResponseBuffer(PANEL_POWER_H) << 16)/100.0f);
 75    
 76     Serial.print("VBatt: ");
 77     Serial.println(node.getResponseBuffer(BATT_VOLTS)/100.0f);
 78     Serial.print("Ibatt: ");
 79     Serial.println(node.getResponseBuffer(BATT_AMPS)/100.0f);
 80     Serial.print("PBatt: ");
 81     Serial.println((node.getResponseBuffer(BATT_POWER_L) +
 82                     node.getResponseBuffer(BATT_POWER_H) << 16)/100.0f);                   
 83     Serial.println();
 84     Serial.println();
 85   } else {
 86     Serial.print("Miss read, ret val:");
 87     Serial.println(result);
 88   }
 89   //delay(1000);
 90 
 91   // Read 6 registers starting at 0x9003)
 92   node.clearResponseBuffer();
 93   result = node.readHoldingRegisters(0x9003, 7);
 94 
 95   if (result == node.ku8MBSuccess)
 96   {
 97     Serial.print("Overvolt Disconnect Voltage: ");
 98     Serial.println(node.getResponseBuffer(OVERVOLT_DISC)/100.0f);
 99     Serial.print("Charging Limit Voltage: ");
100     Serial.println(node.getResponseBuffer(CHARGING_LIMIT)/100.0f);
101     Serial.print("Overvolt Disconnect Voltage: ");
102     Serial.println(node.getResponseBuffer(OVERVOLT_DISC)/100.0f);
103     Serial.print("Overvolt Reconnect Voltage: ");
104     Serial.println(node.getResponseBuffer(OVERVOLT_RECON)/100.0f);
105     Serial.print("Equilibrium Charge Voltage: ");
106     Serial.println(node.getResponseBuffer(EQUILIBRIUM_CV)/100.0f);
107     Serial.print("Boost Charging Voltage:  ");
108     Serial.println(node.getResponseBuffer(BOOST_CV)/100.0f);
109     Serial.print("Float Charging Voltage: ");
110     Serial.println(node.getResponseBuffer(FLOAT_CV)/100.0f);
111     Serial.print("Boost Reconnect Voltage: ");
112     Serial.println(node.getResponseBuffer(BOOST_RECON)/100.0f);
113                   
114     Serial.println();
115     Serial.println();
116   } else {
117     Serial.print("Miss read, ret val:");
118     Serial.println(result);
119   }
120 
121   delay(2000);
122 }
123 
124 void preTransmission()
125 {
126   digitalWrite(MAX485_RE, 1);
127   digitalWrite(MAX485_DE, 1);
128 }
129 
130 void postTransmission()
131 {
132   digitalWrite(MAX485_RE, 0);
133   digitalWrite(MAX485_DE, 0);
134 }