summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/h803x/h803x.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/h803x/h803x.hpp')
-rw-r--r--peripheral/libupm/src/h803x/h803x.hpp547
1 files changed, 0 insertions, 547 deletions
diff --git a/peripheral/libupm/src/h803x/h803x.hpp b/peripheral/libupm/src/h803x/h803x.hpp
deleted file mode 100644
index 472f5e1..0000000
--- a/peripheral/libupm/src/h803x/h803x.hpp
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Author: Jon Trulson <jtrulson@ics.com>
- * Copyright (c) 2016 Intel Corporation.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#pragma once
-
-#include <string>
-
-#include <modbus/modbus.h>
-
-namespace upm {
-
- /**
- * @brief H803X Energy Meter
- * @defgroup h803x libupm-h803x
- * @ingroup uart electric
- */
-
- /**
- * @library h803x
- * @sensor h803x
- * @comname UPM API for the Veris H803X Energy Meter
- * @type electic
- * @man veris
- * @con uart
- * @web http://www.veris.com/Item/H8035-0100-2.aspx
- *
- * @brief UPM API for the Veris H803X Energy Meter
- *
- * This module implements support for the Veris H8035 and H8036
- * Energy Meters.
- *
- * The H8036 is similar to the H8035, but provides much more data.
- *
- * The Enercept H8035/H8036 is an innovative three-phase networked
- * (Modbus RTU) power transducer that combines electronics and high
- * accuracy industrial grade CTs in a single package. The need for
- * external electrical enclosures is eliminated, greatly reducing
- * installation time and cost. Color-coordination between voltage
- * leads and CTs makes phase matching easy. Additionally, these
- * transducers automatically detect and compensate for phase
- * reversal, eliminating the concern of CT load orientation. Up to
- * 63 Transducers can be daisy-chained on a single RS-485 network.
- *
- * This module was developed using libmodbus 3.1.2, and the H8035.
- * The H8036 has not been tested. libmodbus 3.1.2 must be present
- * for this module to build.
- *
- * It was developed using an RS232->RS485 interface. You cannot use
- * the built in MCU TTL UART pins for accessing this device -- you
- * must use a full Serial RS232->RS485 or USB-RS485 interface
- * connected via USB.
- *
- * @snippet h803x.cxx Interesting
- */
-
- class H803X {
- public:
-
- // MODBUS holding registers. These offsets are for the MSW only.
- // The LSW always follows, though they are not enumerated here.
- // These are all 2 register (32-bit total (16b HSW + 16b LSW))
- // quantities, in IEEE 754 floating point format.
- typedef enum {
- // these two registers are used only for presetConsumption()
- HOLDING_CONSUMPTION_KWH_INT_L = 0, // preset use only
- HOLDING_CONSUMPTION_KWH_INT_H = 1, // preset use only
-
- // H8035/H8036
- HOLDING_CONSUMPTION_KWH = 258, // floating point data
-
- HOLDING_REAL_POWER_KW = 260,
-
- // H8036 only
- HOLDING_REACTIVE_POWER_KVAR = 262,
- HOLDING_APPARENT_POWER_KVA = 264,
- HOLDING_POWER_FACTOR = 266,
- HOLDING_VOLTS_LINE_TO_LINE = 268,
- HOLDING_VOLTS_LINE_TO_NEUTRAL = 270,
- HOLDING_CURRENT = 272,
- HOLDING_REAL_POWER_PHASE_A_KWH = 274,
- HOLDING_REAL_POWER_PHASE_B_KWH = 276,
- HOLDING_REAL_POWER_PHASE_C_KWH = 278,
- HOLDING_POWER_FACTOR_PHASE_A = 280,
- HOLDING_POWER_FACTOR_PHASE_B = 282,
- HOLDING_POWER_FACTOR_PHASE_C = 284,
- HOLDING_VOLTS_PHASE_AB = 286,
- HOLDING_VOLTS_PHASE_BC = 288,
- HOLDING_VOLTS_PHASE_AC = 290,
- HOLDING_VOLTS_PHASE_AN = 292,
- HOLDING_VOLTS_PHASE_BN = 294,
- HOLDING_VOLTS_PHASE_CN = 296,
- HOLDING_CURRENT_PHASE_A = 298,
- HOLDING_CURRENT_PHASE_B = 300,
- HOLDING_CURRENT_PHASE_C = 302,
- HOLDING_AVG_REAL_POWER_KW = 304,
- HOLDING_MIN_REAL_POWER_KW = 306,
- HOLDING_MAX_REAL_POWER_KW = 308
- } HOLDING_REGS_T;
-
- // these enums are used by presetConsumption() to scale the value
- // properly depending on the devices' current capacity.
- typedef enum {
- MULT_100A = 128, // 100A devices
- MULT_300A_400A = 32,
- MULT_800A = 16,
- MULT_1600A = 8,
- MULT_2400A = 4
- } MULTIPLIERS_T;
-
- /**
- * H803X constructor
- *
- * @param device Path to the serial device
- * @param address The MODBUS slave address
- * @param baud The baudrate of the device. Default: 9600
- * @param bits The number of bits per byte. Default: 8
- * @param parity The parity of the connection, 'N' for None, 'E'
- * for Even, 'O' for Odd. Default: 'N'
- * @param stopBits The number of stop bits. Default: 2
- */
- H803X(std::string device, int address, int baud=9600, int bits=8,
- char parity='N', int stopBits=2);
-
- /**
- * H803X Destructor
- */
- ~H803X();
-
- /**
- * Read current values from the sensor and update internal stored
- * values. This method must be called prior to querying any
- * values.
- */
- void update();
-
- /**
- * Return a string corresponding the the device's MODBUS slave ID.
- *
- * @return string represnting the MODBUS slave ID
- */
- std::string getSlaveID();
-
- /**
- * Set a new MODBUS slave address. This is useful if you have
- * multiple H803X devices on a single bus. When this method is
- * called, the current stored data is cleared, and a new attempt
- * is made to determine whether the target device is an H8035 or
- * H8036.
- *
- * @param addr The new slave address to set
- */
- void setSlaveAddress(int addr);
-
- /**
- * Preset the kWh accumulated Consumption registers to a
- * predefined value. This is generally not advised, but is
- * provided for those installations that might require it. The
- * multiplier depends on the current range of your device. Be
- * sure to select the right multiplier for your devices'
- * supported current capacity.
- *
- * @param value The desired value for the consumption accumulator
- * registers in kWh.
- * @param multiplier The correct MULTIPLIERS_T value for your device.
- */
- void presetConsumption(float value, MULTIPLIERS_T multiplier);
-
- /**
- * Return the accumulated consumption value, in kWh. update() must
- * have been called prior to calling this method.
- *
- * @return The accumulated consumption.
- */
- float getConsumption()
- {
- return m_consumptionkWh;
- };
-
- /**
- * Return the real power value in kW. update() must have been
- * called prior to calling this method.
- *
- * @return The real power value in kW.
- */
- float getRealPower()
- {
- return m_realPowerkW;
- };
-
- /**
- * Return the reactive power value in kVAR (kilo-volt Amperes
- * Reactive). update() must have been called prior to calling this
- * method.
- *
- * @return The reactive power value in kVAR.
- */
- float getReactivePower()
- {
- return m_reactivePowerkVAR;
- };
-
- /**
- * Return the apparent power value in kVA. update() must have been
- * called prior to calling this method.
- *
- * @return The apparent power value in kVA.
- */
- float getApparentPower()
- {
- return m_apparentPowerkVA;
- };
-
- /**
- * Return the power factor value. update() must have been called
- * prior to calling this method.
- *
- * @return The power factor.
- */
- float getPowerFactor()
- {
- return m_powerFactor;
- };
-
- /**
- * Return the voltage line to line value. update() must have been
- * called prior to calling this method.
- *
- * @return The voltage, line to line.
- */
- float getVoltsLineToLine()
- {
- return m_voltsLineToLine;
- };
-
- /**
- * Return the voltage line to neutral. update() must have been
- * called prior to calling this method.
- *
- * @return The voltage, line to neutral.
- */
- float getVoltsLineToNeutral()
- {
- return m_voltsLineToNeutral;
- };
-
- /**
- * Return the current value in amps. update() must have been
- * called prior to calling this method.
- *
- * @return The current value in amps.
- */
- float getCurrent()
- {
- return m_current;
- };
-
- /**
- * Return the real power for phase A. update() must have been
- * called prior to calling this method.
- *
- * @return The real power for phase A.
- */
- float getRealPowerPhaseA()
- {
- return m_realPowerPhaseAkW;
- };
-
- /**
- * Return the real power for phase B. update() must have been
- * called prior to calling this method.
- *
- * @return The real power for phase B.
- */
- float getRealPowerPhaseB()
- {
- return m_realPowerPhaseBkW;
- };
-
- /**
- * Return the real power for phase C. update() must have been
- * called prior to calling this method.
- *
- * @return The real power for phase C.
- */
- float getRealPowerPhaseC()
- {
- return m_realPowerPhaseCkW;
- };
-
- /**
- * Return the power factor for phase A. update() must have been
- * called prior to calling this method.
- *
- * @return The power factor for phase A.
- */
- float getPowerFactorPhaseA()
- {
- return m_powerFactorPhaseA;
- };
-
- /**
- * Return the power factor for phase B. update() must have been
- * called prior to calling this method.
- *
- * @return The power factor for phase B.
- */
- float getPowerFactorPhaseB()
- {
- return m_powerFactorPhaseB;
- };
-
- /**
- * Return the power factor for phase C. update() must have been
- * called prior to calling this method.
- *
- * @return The power factor for phase C.
- */
- float getPowerFactorPhaseC()
- {
- return m_powerFactorPhaseC;
- };
-
- /**
- * Return the voltage for phase A to B. update() must have been
- * called prior to calling this method.
- *
- * @return The voltage for phase A to B.
- */
- float getVoltsPhaseAToB()
- {
- return m_voltsPhaseAB;
- };
-
- /**
- * Return the voltage for phase B to C. update() must have been
- * called prior to calling this method.
- *
- * @return The voltage for phase B to C.
- */
- float getVoltsPhaseBToC()
- {
- return m_voltsPhaseBC;
- };
-
- /**
- * Return the voltage for phase A to B. update() must have been
- * called prior to calling this method.
- *
- * @return The voltage for phase A to B.
- */
- float getVoltsPhaseAToC()
- {
- return m_voltsPhaseAC;
- };
-
- /**
- * Return the voltage for phase A to neutral. update() must have
- * been called prior to calling this method.
- *
- * @return The voltage for phase A to neutral.
- */
- float getVoltsPhaseAToNeutral()
- {
- return m_voltsPhaseAN;
- };
-
- /**
- * Return the voltage for phase B to neutral. update() must have
- * been called prior to calling this method.
- *
- * @return The voltage for phase B to neutral.
- */
- float getVoltsPhaseBToNeutral()
- {
- return m_voltsPhaseBN;
- };
-
- /**
- * Return the voltage for phase C to neutral. update() must have
- * been called prior to calling this method.
- *
- * @return The voltage for phase C to neutral.
- */
- float getVoltsPhaseCToNeutral()
- {
- return m_voltsPhaseCN;
- };
-
- /**
- * Return the current for phase A. update() must have been called
- * prior to calling this method.
- *
- * @return The current for phase A.
- */
- float getCurrentPhaseA()
- {
- return m_currentPhaseA;
- };
-
- /**
- * Return the current for phase B. update() must have been called
- * prior to calling this method.
- *
- * @return The current for phase B.
- */
- float getCurrentPhaseB()
- {
- return m_currentPhaseB;
- };
-
- /**
- * Return the current for phase C. update() must have been called
- * prior to calling this method.
- *
- * @return The current for phase C.
- */
- float getCurrentPhaseC()
- {
- return m_currentPhaseC;
- };
-
- /**
- * Return the average real power. update() must have been called
- * prior to calling this method.
- *
- * @return The average real power.
- */
- float getAvgRealPower()
- {
- return m_avgRealPowerkW;
- };
-
- /**
- * Return the minimum real power. update() must have been called
- * prior to calling this method.
- *
- * @return The minimum real power.
- */
- float getMinRealPower()
- {
- return m_minRealPowerkW;
- };
-
- /**
- * Return the maximum real power. update() must have been called
- * prior to calling this method.
- *
- * @return The maximum real power.
- */
- float getMaxRealPower()
- {
- return m_maxRealPowerkW;
- };
-
- /**
- * Enable or disable debugging output. This primarily enables and
- * disables libmodbus debugging output.
- *
- * @param enable true to enable debugging, false otherwise
- */
- void setDebug(bool enable);
-
- /**
- * Indicate whether the connected device is an H8035 or an H8036.
- * The H8036 provides many more data registers.
- *
- * @return true if we are using an H8036, false otherwise.
- */
- bool isH8036()
- {
- return m_isH8036;
- };
-
- protected:
- // holding registers
- int readHoldingRegs(HOLDING_REGS_T reg, int len, uint16_t *buf);
- void writeHoldingReg(HOLDING_REGS_T reg, int value);
-
- // clear out all stored data
- void clearData();
-
- // MODBUS context
- modbus_t *m_mbContext;
-
- // test to see if the connected device is an H8036, and set
- // m_isH8036 appropriately
- void testH8036();
-
- // Is this an H8036 (has extended registers)
- bool m_isH8036;
-
- private:
- bool m_debugging;
-
- // data
-
- // H8035 / H8036
- float m_consumptionkWh;
- float m_realPowerkW;
-
- // H8036 only
- float m_reactivePowerkVAR;
- float m_apparentPowerkVA;
- float m_powerFactor;
- float m_voltsLineToLine;
- float m_voltsLineToNeutral;
- float m_current; // in amps
- float m_realPowerPhaseAkW;
- float m_realPowerPhaseBkW;
- float m_realPowerPhaseCkW;
- float m_powerFactorPhaseA;
- float m_powerFactorPhaseB;
- float m_powerFactorPhaseC;
- float m_voltsPhaseAB;
- float m_voltsPhaseBC;
- float m_voltsPhaseAC;
- float m_voltsPhaseAN;
- float m_voltsPhaseBN;
- float m_voltsPhaseCN;
- float m_currentPhaseA;
- float m_currentPhaseB;
- float m_currentPhaseC;
- float m_avgRealPowerkW;
- float m_minRealPowerkW;
- float m_maxRealPowerkW;
- };
-}