/// <summary> /// Retrieves the Hardware Version from a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The hardware version as reported by the charge controller</returns> public static string GetHardwareVersion(ModbusMessenger messenger) { ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; ModbusMessage registers = messenger.ReadHoldingRegisters(0xf00a, 0x0001); messenger.TransportEndoing = te; return(registers.DataPoints[0] + "." + registers.DataPoints[1]); }
/// <summary> /// Retrieves the Serial Number from a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The serial number of the charge controller</returns> public static string GetSerialNumber(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; ModbusMessage registers = messenger.ReadHoldingRegisters(0xf000, 0x0004);//was 0x0008 messenger.TransportEndoing = te; return(System.Text.Encoding.ASCII.GetString(registers.DataPoints.ToArray()));//needed substring 0, 8 }
/// <summary> /// Retrieves the amount of days since the last battery service from a Morning Star Change Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The amount of days since the last day the batteries were serviced as reported by the charge controller</returns> public static int GetDaysSinceLastBatteryService(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; ModbusMessage registers = messenger.ReadHoldingRegisters(0xe023, 0x0001); short v = BitConverter.ToInt16(registers.DataPoints.ToArray(), 0); messenger.TransportEndoing = te; return(v); }
/// <summary> /// Retrieves the Faults from a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The Fault Readings reported by the charge controller</returns> public static FaultReading GetFaults(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; ModbusMessage registers = messenger.ReadHoldingRegisters(0x001a, 0x0001); //get registers.DataPoints into a short v short v = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(registers.DataPoints.ToArray(), 0)); messenger.TransportEndoing = te; return(new FaultReading(v)); }
/// <summary> /// Retirves the maximium battery voltage from a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The maximum battery voltage as reported by the charge controller</returns> public static double GetMaximumBatteryVoltage(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; //obtain minBatteryVoltage - scale via stdScalar3 ModbusMessage registers = messenger.ReadHoldingRegisters(0xe02c, 0x0001); //get registers.DataPoints into a short v short v = BitConverter.ToInt16(registers.DataPoints.ToArray(), 0); //return v * stdScalar3 messenger.TransportEndoing = te; return((double)v * stdScalar3); }
/// <summary> /// Retrieves the Load Current from a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The Load Current reported by the charge controller</returns> public static double GetLoadCurrent(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; //obtain loadCurrent - scale via stdScalar4 ModbusMessage registers = messenger.ReadHoldingRegisters(0x000c, 0x001); //get registers.DataPoints into a short v short v = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(registers.DataPoints.ToArray(), 0)); //return v * stdScalar4 messenger.TransportEndoing = te; return((double)v * stdScalar4); }
/// <summary> /// Retrieves the Killowatt Hours Counter From a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The Killowatt Hours Counter reported by the Charge Controller</returns> public static int GetKilowattHours(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; //obtain totalAmpHours - scale via stdScalar6 ModbusMessage registers = messenger.ReadHoldingRegisters(0xe02a, 0x0001); //get registers.DataPoints into a short v short v = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(registers.DataPoints.ToArray(), 0)); //return v * stdScalar6 messenger.TransportEndoing = te; return(v); }
/// <summary> /// Retrieves the Control State from a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The ControlState the Charge controller is operating under</returns> public static ControlState GetControlState(ModbusMessenger messenger, ControlMode controlMode) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; ModbusMessage registers = messenger.ReadHoldingRegisters(0x001a, 0x0001); //get registers.DataPoints into a short v short v = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(registers.DataPoints.ToArray(), 0)); messenger.TransportEndoing = te; if (controlMode == ControlMode.Charge || controlMode == ControlMode.Diversion) { return((ControlState)v); } else { return((ControlState)(8 + v)); } }
/// <summary> /// Retrieves the Resetable Amp Hours Counter From a Morning Star Charge Controller /// </summary> /// <param name="messenger">The ModbusMessenger to perform the transaction on</param> /// <returns>The Resetable Amp Hours Counter reported by the Charge Controller</returns> public static double GetResetableAmpHours(ModbusMessenger messenger) { //remember the old transport encoding ModbusMessenger.TransportEncoding te = messenger.TransportEndoing; //set the new transport encoding messenger.TransportEndoing = ModbusMessenger.TransportEncoding.Binary; //obtain totalAmpHours - scale via stdScalar6 ModbusMessage registers = messenger.ReadHoldingRegisters(0xe026, 0x0002); //get registers.DataPoints into a short v byte[] data = registers.DataPoints.ToArray(); short v = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 0)); if (data.Length > 2) { v += System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 2)); } //return v * stdScalar6 messenger.TransportEndoing = te; return((double)v * stdScalar6); }