From a24462e77b155dcc0a6e775e53767b8b1a07cc46 Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Fri, 24 Oct 2025 13:24:59 -0500 Subject: [PATCH 01/11] save --- .../PDU_Maverick_Power_TCP/State_Running.cpp | 10 ++- src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h | 2 +- .../UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp | 65 +++++++++------ .../UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp | 79 ++++++++++--------- .../UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp | 70 ++++++++-------- .../UPS/UPS_Vertiv_APM2_TCP/State_Standby.cpp | 57 ++++++++++++- src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h | 7 +- 7 files changed, 185 insertions(+), 105 deletions(-) diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp index 153ba0f..df33296 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp @@ -161,6 +161,8 @@ State* RunningState::update(Equipment* equipment) if (cb_status == 1.0f){ setBitValue(equipment, "CB_Status", cb_num, true); + setBitValue(equipment, "CB_Tripped", cb_num, false); + strategy = getStrategy("Amps G"); static_cast(strategy)->setSetpoint(65.0f); strategy = getStrategy("Amps N"); @@ -224,7 +226,13 @@ State* RunningState::update(Equipment* equipment) setPointValue(equipment, tag, total_load * 1715.0f * 0.9f); - }else{ + } + else{ + if (cb_status == 2.0f){ + setBitValue(equipment, "CB_Tripped", cb_num, true); + } else { + setBitValue(equipment, "CB_Tripped", cb_num, false); + } setBitValue(equipment, "CB_Status", cb_num, false); strategy = getStrategy("Amps G"); static_cast(strategy)->setSetpoint(0.0f); diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h index db59a4b..3bb5f0c 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 178); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 33, 181); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp index 29c1e91..ce7c1a1 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp @@ -60,11 +60,12 @@ BatteryState::BatteryState() { addStrategy("System Output Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); addStrategy("System Output Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); addStrategy("System Output Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs A", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs B", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs C", new RampStrategy(10.0F, 5.0f, 1000)); addStrategy("Battery Time Remaining", new RampStrategy(0.0F, 0.3f, 1000)); + addStrategy("Percentage Load", new RampStrategy(0.0F, 1.0f, 1000)); } /** @@ -120,7 +121,7 @@ State* BatteryState::update(Equipment* equipment) float Out_PFa = getPointValue(equipment, "System Output Power Factor Phs A"); ramp_strat = getStrategy("System Output Power Phase A"); static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia); - ramp_strat = getStrategy("System Output Apparent Power Phase A"); + ramp_strat = getStrategy("System Output Apparent Power Phs A"); static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * Out_PFa); float Out_Vbn = getPointValue(equipment, "System Output RMS B-N"); @@ -128,7 +129,7 @@ State* BatteryState::update(Equipment* equipment) float Out_PFb = getPointValue(equipment, "System Output Power Factor Phs B"); ramp_strat = getStrategy("System Output Power Phase B"); static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib); - ramp_strat = getStrategy("System Output Apparent Power Phase B"); + ramp_strat = getStrategy("System Output Apparent Power Phs B"); static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * Out_PFb); float Out_Vcn = getPointValue(equipment, "System Output RMS C-N"); @@ -136,7 +137,7 @@ State* BatteryState::update(Equipment* equipment) float Out_PFc = getPointValue(equipment, "System Output Power Factor Phs C"); ramp_strat = getStrategy("System Output Power Phase C"); static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic); - ramp_strat = getStrategy("System Output Apparent Power Phase C"); + ramp_strat = getStrategy("System Output Apparent Power Phs C"); static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * Out_PFc); float Battery_time = getPointValue(equipment, "Battery Time Remaining"); @@ -167,23 +168,43 @@ State* BatteryState::update(Equipment* equipment) */ template<> void BatteryState::enterState(Equipment* equipment) { - // Logic to run when the equipment enters this state - Serial.println("Enter Battery State..."); + // Logic to run when the equipment enters this state + Serial.println("Enter Battery State..."); + setPointValue(equipment, "System Input RMS A-B", 0.0f); + setPointValue(equipment, "System Input RMS B-C", 0.0f); + setPointValue(equipment, "System Input RMS C-A", 0.0f); + setPointValue(equipment, "System Input RMS A-N", 0.0f); + setPointValue(equipment, "System Input RMS B-N", 0.0f); + setPointValue(equipment, "System Input RMS C-N", 0.0f); + setPointValue(equipment, "System Input RMS Current Phase A", 0.0f); + setPointValue(equipment, "System Input RMS Current Phase B", 0.0f); + setPointValue(equipment, "System Input RMS Current Phase C", 0.0f); + setPointValue(equipment, "System Input Frequency", 0.0f); + setPointValue(equipment, "System Input Power Factor Phs A", 0.0f); + setPointValue(equipment, "System Input Power Factor Phs B", 0.0f); + setPointValue(equipment, "System Input Power Factor Phs C", 0.0f); + setPointValue(equipment, "System Input Power Phase A", 0.0f); + setPointValue(equipment, "System Input Power Phase B", 0.0f); + setPointValue(equipment, "System Input Power Phase C", 0.0f); + setPointValue(equipment, "System Input Apparent Power Phs A", 0.0f); + setPointValue(equipment, "System Input Apparent Power Phs B", 0.0f); + setPointValue(equipment, "System Input Apparent Power Phs C", 0.0f); - setPointValue(equipment, "Bypass Input Voltage RMS A-B", 0.0f); - setPointValue(equipment, "Bypass Input Voltage RMS B-C", 0.0f); - setPointValue(equipment, "Bypass Input Voltage RMS C-A", 0.0f); - setPointValue(equipment, "Bypass Input Voltage RMS A-N", 0.0f); - setPointValue(equipment, "Bypass Input Voltage RMS B-N", 0.0f); - setPointValue(equipment, "Bypass Input Voltage RMS C-N", 0.0f); - setPointValue(equipment, "Bypass Input Frequency", 0.0f); - setPointValue(equipment, "Bypass Power Phase A", 0.0f); - setPointValue(equipment, "Bypass Power Phase B", 0.0f); - setPointValue(equipment, "Bypass Power Phase C", 0.0f); - - setPointValue(equipment, "UPS Loading Status", 6.0f); - setPointValue(equipment, "UPS Battery Status2", 2.0f); - // You could also update a Modbus register to show the "standby" state + + setPointValue(equipment, "Bypass Input Voltage RMS A-B", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS B-C", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS C-A", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS A-N", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS B-N", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS C-N", 0.0f); + setPointValue(equipment, "Bypass Input Frequency", 0.0f); + setPointValue(equipment, "Bypass Power Phase A", 0.0f); + setPointValue(equipment, "Bypass Power Phase B", 0.0f); + setPointValue(equipment, "Bypass Power Phase C", 0.0f); + setPointValue(equipment, "UPS Loading Status", 6.0f); + setPointValue(equipment, "UPS Battery Status2", 2.0f); + + // You could also update a Modbus register to show the "standby" state } diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp index 9a1012d..73a2b31 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp @@ -49,9 +49,9 @@ BypassState::BypassState() { addStrategy("System Input RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); addStrategy("System Input RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Input RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Input RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Input RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); addStrategy("System Input Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); @@ -59,12 +59,12 @@ BypassState::BypassState() { addStrategy("System Input Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); addStrategy("System Input Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase A", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase B", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase C", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Apparent Power Phs A", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Apparent Power Phs B", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Apparent Power Phs C", new RampStrategy(0.0F, 5.0f, 1000)); //Bypass System @@ -77,9 +77,9 @@ BypassState::BypassState() { addStrategy("Bypass Input Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); - addStrategy("Bypass Input Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("Bypass Input Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("Bypass Input Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("Bypass Input Power Phase A", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("Bypass Input Power Phase B", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("Bypass Input Power Phase C", new RampStrategy(0.0F, 1.0f, 1000)); //Output System addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); @@ -89,9 +89,9 @@ BypassState::BypassState() { addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Output RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Output RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); addStrategy("System Output Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); @@ -99,12 +99,12 @@ BypassState::BypassState() { addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Power Phase A", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Output Power Phase B", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Output Power Phase C", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs A", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs B", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs C", new RampStrategy(0.0F, 5.0f, 1000)); addStrategy("Battery Time Remaining", new RampStrategy(480.0F, 0.3f, 1000)); addStrategy("DC Bus Voltage", new SingleValueStrategy(518.0F, 5.0f, 1000)); @@ -163,30 +163,30 @@ State* BypassState::update(Equipment* equipment) { float In_PFa = getPointValue(equipment, "System Input Power Factor Phs A"); ramp_strat = getStrategy("System Input Power Phase A"); static_cast(ramp_strat)->setTarget(In_Van * In_Ia); - ramp_strat = getStrategy("Bypass Power Phase A"); + ramp_strat = getStrategy("Bypass Input Power Phase A"); static_cast(ramp_strat)->setTarget(In_Van * In_Ia); - ramp_strat = getStrategy("System Input Apparent Power Phase A"); - static_cast(ramp_strat)->setTarget(In_Van * In_Ia * In_PFa); - + ramp_strat = getStrategy("System Input Apparent Power Phs A"); + static_cast(ramp_strat)->setTarget(In_Van * In_Ia * 0.9f); + float In_Vbn = getPointValue(equipment, "System Input RMS B-N"); float In_Ib = getPointValue(equipment, "System Input RMS Current Phase B"); float In_PFb = getPointValue(equipment, "System Input Power Factor Phs B"); ramp_strat = getStrategy("System Input Power Phase B"); static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib); - ramp_strat = getStrategy("Bypass Power Phase B"); + ramp_strat = getStrategy("Bypass Input Power Phase B"); static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib); - ramp_strat = getStrategy("System Input Apparent Power Phase B"); - static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib * In_PFb); - + ramp_strat = getStrategy("System Input Apparent Power Phs B"); + static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib * 0.9f); + float In_Vcn = getPointValue(equipment, "System Input RMS C-N"); float In_Ic = getPointValue(equipment, "System Input RMS Current Phase C"); float In_PFc = getPointValue(equipment, "System Input Power Factor Phs C"); ramp_strat = getStrategy("System Input Power Phase C"); static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic); - ramp_strat = getStrategy("Bypass Power Phase C"); + ramp_strat = getStrategy("Bypass Input Power Phase C"); static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic); - ramp_strat = getStrategy("System Input Apparent Power Phase C"); - static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic * In_PFc); + ramp_strat = getStrategy("System Input Apparent Power Phs C"); + static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic * 0.9f); //Output strategies float Out_Vab = getPointValue(equipment, "System Output RMS A-B"); @@ -204,24 +204,24 @@ State* BypassState::update(Equipment* equipment) { float Out_PFa = getPointValue(equipment, "System Output Power Factor Phs A"); ramp_strat = getStrategy("System Output Power Phase A"); static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia); - ramp_strat = getStrategy("System Output Apparent Power Phase A"); - static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * Out_PFa); + ramp_strat = getStrategy("System Output Apparent Power Phs A"); + static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * 0.9f); float Out_Vbn = getPointValue(equipment, "System Output RMS B-N"); float Out_Ib = getPointValue(equipment, "System Output RMS Current Phase B"); float Out_PFb = getPointValue(equipment, "System Output Power Factor Phs B"); ramp_strat = getStrategy("System Output Power Phase B"); static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib); - ramp_strat = getStrategy("System Output Apparent Power Phase B"); - static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * Out_PFb); + ramp_strat = getStrategy("System Output Apparent Power Phs B"); + static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * 0.9f); float Out_Vcn = getPointValue(equipment, "System Output RMS C-N"); float Out_Ic = getPointValue(equipment, "System Output RMS Current Phase C"); float Out_PFc = getPointValue(equipment, "System Output Power Factor Phs C"); ramp_strat = getStrategy("System Output Power Phase C"); static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic); - ramp_strat = getStrategy("System Output Apparent Power Phase C"); - static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * Out_PFc); + ramp_strat = getStrategy("System Output Apparent Power Phs C"); + static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * 0.9f); float Battery_time = getPointValue(equipment, "Battery Time Remaining"); float Bat_Percent = Battery_time /4.80f; @@ -252,9 +252,10 @@ State* BypassState::update(Equipment* equipment) { template<> void BypassState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state - Serial.println("Enter Battery State..."); + Serial.println("Enter Bypass State..."); setPointValue(equipment, "UPS Loading Status", 4.0f); setPointValue(equipment, "UPS Battery Status2", 3.0f); + setPointValue(equipment, "Percentage Load", 0.0f); // You could also update a Modbus register to show the "standby" state } diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp index f55d498..94036b7 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp @@ -47,9 +47,9 @@ RunningState::RunningState() { addStrategy("System Input RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); addStrategy("System Input RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Input RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Input RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Input RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); addStrategy("System Input Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); @@ -57,13 +57,12 @@ RunningState::RunningState() { addStrategy("System Input Power Factor Phs B", new SingleValueStrategy(93.0F, 0.5f, 1000)); addStrategy("System Input Power Factor Phs C", new SingleValueStrategy(93.0F, 0.5f, 1000)); - addStrategy("System Input Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - + addStrategy("System Input Power Phase A", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase B", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase C", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Apparent Power Phs A", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Apparent Power Phs B", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Apparent Power Phs C", new RampStrategy(0.0F, 5.0f, 1000)); addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); @@ -71,29 +70,28 @@ RunningState::RunningState() { addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - - addStrategy("System Output RMS Current Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + + addStrategy("System Output RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Output RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Output RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); addStrategy("System Output Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); - + addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0F, 5.0f, 1000)); addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); - + addStrategy("System Output Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); addStrategy("System Output Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); addStrategy("System Output Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - - addStrategy("Battery Time Remaining", new RampStrategy(480.0F, 1.0f, 1000)); - - + addStrategy("System Output Apparent Power Phs A", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs B", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Apparent Power Phs C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("DC Bus Voltage", new SingleValueStrategy(518.0F, 5.0f, 1000)); - + addStrategy("Battery Time Remaining", new RampStrategy(480.0F, 1.0f, 1000)); + addStrategy("Percentage Load", new RampStrategy(100.0F, 1.0f, 1000)); + } /** @@ -149,24 +147,24 @@ State* RunningState::update(Equipment* equipment) float In_PFa = getPointValue(equipment, "System Input Power Factor Phs A"); ramp_strat = getStrategy("System Input Power Phase A"); static_cast(ramp_strat)->setTarget(In_Van * In_Ia); - ramp_strat = getStrategy("System Input Apparent Power Phase A"); - static_cast(ramp_strat)->setTarget(In_Van * In_Ia * (In_PFa/100.0f)); + ramp_strat = getStrategy("System Input Apparent Power Phs A"); + static_cast(ramp_strat)->setTarget(In_Van * In_Ia * 0.9f); float In_Vbn = getPointValue(equipment, "System Input RMS B-N"); float In_Ib = getPointValue(equipment, "System Input RMS Current Phase B"); float In_PFb = getPointValue(equipment, "System Input Power Factor Phs B"); ramp_strat = getStrategy("System Input Power Phase B"); static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib); - ramp_strat = getStrategy("System Input Apparent Power Phase B"); - static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib * (In_PFb/100.0f)); + ramp_strat = getStrategy("System Input Apparent Power Phs B"); + static_cast(ramp_strat)->setTarget(In_Vbn * In_Ib * 0.9f); float In_Vcn = getPointValue(equipment, "System Input RMS C-N"); float In_Ic = getPointValue(equipment, "System Input RMS Current Phase C"); float In_PFc = getPointValue(equipment, "System Input Power Factor Phs C"); ramp_strat = getStrategy("System Input Power Phase C"); static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic); - ramp_strat = getStrategy("System Input Apparent Power Phase C"); - static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic * (In_PFc/100.0f)); + ramp_strat = getStrategy("System Input Apparent Power Phs C"); + static_cast(ramp_strat)->setTarget(In_Vcn * In_Ic * 0.9f); //Output strategies float Out_Vab = getPointValue(equipment, "System Output RMS A-B"); @@ -184,24 +182,24 @@ State* RunningState::update(Equipment* equipment) float Out_PFa = getPointValue(equipment, "System Output Power Factor Phs A"); ramp_strat = getStrategy("System Output Power Phase A"); static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia); - ramp_strat = getStrategy("System Output Apparent Power Phase A"); - static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * (Out_PFa/100.0f)); + ramp_strat = getStrategy("System Output Apparent Power Phs A"); + static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * 0.9f); float Out_Vbn = getPointValue(equipment, "System Output RMS B-N"); float Out_Ib = getPointValue(equipment, "System Output RMS Current Phase B"); float Out_PFb = getPointValue(equipment, "System Output Power Factor Phs B"); ramp_strat = getStrategy("System Output Power Phase B"); static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib); - ramp_strat = getStrategy("System Output Apparent Power Phase B"); - static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * (Out_PFb/100.0f)); + ramp_strat = getStrategy("System Output Apparent Power Phs B"); + static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * 0.9f); float Out_Vcn = getPointValue(equipment, "System Output RMS C-N"); float Out_Ic = getPointValue(equipment, "System Output RMS Current Phase C"); float Out_PFc = getPointValue(equipment, "System Output Power Factor Phs C"); ramp_strat = getStrategy("System Output Power Phase C"); static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic); - ramp_strat = getStrategy("System Output Apparent Power Phase C"); - static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * (Out_PFc/100.0f)); + ramp_strat = getStrategy("System Output Apparent Power Phs C"); + static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * 0.9f); float Battery_time = getPointValue(equipment, "Battery Time Remaining"); float Bat_Percent = Battery_time /4.80f; diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Standby.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Standby.cpp index 3ce2bbd..602846b 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Standby.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Standby.cpp @@ -86,9 +86,60 @@ State* StandbyState::update(Equipment* equipment) */ template<> void StandbyState::enterState(Equipment* equipment) { - // Logic to run when the equipment enters this state - Serial.println("Enter Standby State..."); - setPointValue(equipment, "UPS Loading Status", 2.0f); + // Logic to run when the equipment enters this state + Serial.println("Enter Standby State..."); + setPointValue(equipment, "UPS Loading Status", 2.0f); + + setPointValue(equipment, "System Input RMS A-B", 0.0f); + setPointValue(equipment, "System Input RMS B-C", 0.0f); + setPointValue(equipment, "System Input RMS C-A", 0.0f); + setPointValue(equipment, "System Input RMS A-N", 0.0f); + setPointValue(equipment, "System Input RMS B-N", 0.0f); + setPointValue(equipment, "System Input RMS C-N", 0.0f); + setPointValue(equipment, "System Input RMS Current Phase A", 0.0f); + setPointValue(equipment, "System Input RMS Current Phase B", 0.0f); + setPointValue(equipment, "System Input RMS Current Phase C", 0.0f); + setPointValue(equipment, "System Input Frequency", 0.0f); + setPointValue(equipment, "System Input Power Factor Phs A", 0.0f); + setPointValue(equipment, "System Input Power Factor Phs B", 0.0f); + setPointValue(equipment, "System Input Power Factor Phs C", 0.0f); + setPointValue(equipment, "System Input Power Phase A", 0.0f); + setPointValue(equipment, "System Input Power Phase B", 0.0f); + setPointValue(equipment, "System Input Power Phase C", 0.0f); + setPointValue(equipment, "System Input Apparent Power Phs A", 0.0f); + setPointValue(equipment, "System Input Apparent Power Phs B", 0.0f); + setPointValue(equipment, "System Input Apparent Power Phs C", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS A-B", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS B-C", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS C-A", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS A-N", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS B-N", 0.0f); + setPointValue(equipment, "Bypass Input Voltage RMS C-N", 0.0f); + setPointValue(equipment, "Bypass Input Frequency", 0.0f); + setPointValue(equipment, "Bypass Power Phase A", 0.0f); + setPointValue(equipment, "Bypass Power Phase B", 0.0f); + setPointValue(equipment, "Bypass Power Phase C", 0.0f); + setPointValue(equipment, "System Output RMS A-B", 0.0f); + setPointValue(equipment, "System Output RMS B-C", 0.0f); + setPointValue(equipment, "System Output RMS C-A", 0.0f); + setPointValue(equipment, "System Output RMS A-N", 0.0f); + setPointValue(equipment, "System Output RMS B-N", 0.0f); + setPointValue(equipment, "System Output RMS C-N", 0.0f); + setPointValue(equipment, "System Output RMS Current Phase A", 0.0f); + setPointValue(equipment, "System Output RMS Current Phase B", 0.0f); + setPointValue(equipment, "System Output RMS Current Phase C", 0.0f); + setPointValue(equipment, "System Output Frequency", 0.0f); + setPointValue(equipment, "System Output Power Factor Phs A", 0.0f); + setPointValue(equipment, "System Output Power Factor Phs B", 0.0f); + setPointValue(equipment, "System Output Power Factor Phs C", 0.0f); + setPointValue(equipment, "System Output Power Phase A", 0.0f); + setPointValue(equipment, "System Output Power Phase B", 0.0f); + setPointValue(equipment, "System Output Power Phase C", 0.0f); + setPointValue(equipment, "System Output Apparent Power Phs A", 0.0f); + setPointValue(equipment, "System Output Apparent Power Phs B", 0.0f); + setPointValue(equipment, "System Output Apparent Power Phs C", 0.0f); + setPointValue(equipment, "System Output Power", 0.0f); + setPointValue(equipment, "System Output Apparent Power", 0.0f); } /** diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h index 766b749..9b11fce 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h @@ -23,8 +23,8 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 187); /**< @brief The static IP address for the device. */ - IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ + IPAddress local_IP(172, 17, 3, 187); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 3, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; @@ -125,7 +125,8 @@ modbusMap mb_map[] = {IR, 60, 0, "System Output Power"}, {IR, 61, 0, "System Output Apparent Power"}, {IR, 164, 0, "UPS Loading Status"}, - {IR, 175, 0, "DC Bus Voltage"}, + {IR, 175, 0, "DC Bus Voltage"}, + {IR, 179, 0, "Percentage Load"}, {IR, 180, 0, "Battery Time Remaining"}, {IR, 183, 0, "UPS Battery Status1"}, {IR, 184, 0, "UPS Battery Status2"}, From 39e70ca9ad623cd3644f91dcc64232e4555da76f Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Sat, 25 Oct 2025 10:19:16 -0500 Subject: [PATCH 02/11] s --- platformio.ini | 2 +- .../ATS/ATS_Eaton_ATC900_RPD_TCP/config.h | 8 +-- .../State_Running.cpp | 14 ++--- .../State_Standby.cpp | 3 ++ .../ATS/ATS_Woodward_DTSC200A_TCP/config.h | 2 +- .../PDU_Maverick_Power_TCP/State_Running.cpp | 51 ++++++++++++++++++- src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h | 8 +-- 7 files changed, 70 insertions(+), 18 deletions(-) diff --git a/platformio.ini b/platformio.ini index a11d920..8d5873a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,7 +11,7 @@ [platformio] -default_envs = PDU_Maverick_Power_TCP ; Select here the name of the configuration you want to download +default_envs = ATS_Eaton_ATC900_RPD_TCP ; Select here the name of the configuration you want to download [env] upload_port = COM50 diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h index 867ffca..d5a84a6 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h @@ -21,10 +21,10 @@ * @{ */ #include - const char *ssid = "wifi_ssid"; /**< @brief The SSID of the WiFi network. */ - const char *password = "wifi_password"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(192, 168, 1, 15); /**< @brief The static IP address for the device. */ - IPAddress gateway(192, 168, 1, 1); /**< @brief The gateway IP address. */ + const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ + const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ + IPAddress local_IP(172, 17, 33, 169); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp index 1ea1b5f..1378e38 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp @@ -39,9 +39,9 @@ template<> RunningState::RunningState() { - addStrategy("S2 Volts AB", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("S2 Volts BC", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("S2 Volts CA", new SingleValueStrategy(480.0F, 2.0f, 1000)); + addStrategy("S2 Volts AB", new SingleValueStrategy(4800.0F, 2.0f, 1000)); + addStrategy("S2 Volts BC", new SingleValueStrategy(4800.0F, 2.0f, 1000)); + addStrategy("S2 Volts CA", new SingleValueStrategy(4800.0F, 2.0f, 1000)); addStrategy("PF", new SingleValueStrategy(90.0f, 2.0f, 1000)); @@ -76,9 +76,9 @@ State* RunningState::update(Equipment* equipment) float volts_BC = getPointValue(equipment, "S2 Volts BC"); float volts_AC = getPointValue(equipment, "S2 Volts CA"); - setPointValue(equipment, "S2 Volts AN", volts_AB/1.732); - setPointValue(equipment, "S2 Volts BN", volts_BC/1.732); - setPointValue(equipment, "S2 Volts CN", volts_AC/1.732); + setPointValue(equipment, "S2 Volts AN", volts_AB/17.32); + setPointValue(equipment, "S2 Volts BN", volts_BC/17.32); + setPointValue(equipment, "S2 Volts CN", volts_AC/17.32); int I_load = getPointValue(equipment, "ATS_Load"); int I_rating = getPointValue(equipment, "ATS_Rating"); @@ -129,6 +129,8 @@ void RunningState::enterState(Equipment* equipment) { setPointValue(equipment, "S1 Amps A", 0.0f); setPointValue(equipment, "S1 Amps B", 0.0f); setPointValue(equipment, "S1 Amps C", 0.0f); + setBitValue(equipment, "Source Active", 3, true); + setBitValue(equipment, "Source Active", 4, false); } /** diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp index eadd167..f57063c 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp @@ -121,6 +121,9 @@ void StandbyState::enterState(Equipment* equipment) { setPointValue(equipment, "S2 Amps A", 0.0f); setPointValue(equipment, "S2 Amps B", 0.0f); setPointValue(equipment, "S2 Amps C", 0.0f); + + setBitValue(equipment, "Source Active", 3, false); + setBitValue(equipment, "Source Active", 4, true); } /** diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h index 88f51c0..6a14e99 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 241); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 33, 173); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp index df33296..fe6aa68 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp @@ -224,8 +224,15 @@ State* RunningState::update(Equipment* equipment) tag = ""; tag = cb + "_L3KVar"; setPointValue(equipment, tag, total_load * 1715.0f * 0.9f); - - + tag = ""; + tag = cb + "_L1KVA"; + setPointValue(equipment, tag, total_load * 1715.0f); + tag = ""; + tag = cb + "_L2KVA"; + setPointValue(equipment, tag, total_load * 1715.0f); + tag = ""; + tag = cb + "_L3KVA"; + setPointValue(equipment, tag, total_load * 1715.0f); } else{ if (cb_status == 2.0f){ @@ -295,9 +302,49 @@ State* RunningState::update(Equipment* equipment) tag = ""; tag = cb + "_L3KVar"; setPointValue(equipment, tag, total_load*0.0f); + tag = ""; + tag = cb + "_L1KVA"; + setPointValue(equipment, tag, 0.0f); + tag = ""; + tag = cb + "_L2KVA"; + setPointValue(equipment, tag, 0.0f); + tag = ""; + tag = cb + "_L3KVA"; + setPointValue(equipment, tag, 0.0f); } cb_num++; + + float kw1 = getPointValue(equipment, cb + "_L1KW"); + float kw2 = getPointValue(equipment, cb + "_L2KW"); + float kw3 = getPointValue(equipment, cb + "_L3KW"); + tag = ""; + tag = cb + "_TotalKW"; + setPointValue(equipment, tag, kw1 + kw2 + kw3); + + float kvar1 = getPointValue(equipment, cb + "_L1KVar"); + float kvar2 = getPointValue(equipment, cb + "_L2KVar"); + float kvar3 = getPointValue(equipment, cb + "_L3KVar"); + tag = ""; + tag = cb + "_TotalKVar"; + setPointValue(equipment, tag, kvar1 + kvar2 + kvar3); + + float kva1 = getPointValue(equipment, cb + "_L1KVA"); + float kva2 = getPointValue(equipment, cb + "_L2KVA"); + float kva3 = getPointValue(equipment, cb + "_L3KVA"); + tag = ""; + tag = cb + "_TotalKVA"; + setPointValue(equipment, tag, kvar1 + kva2 + kva3); + + float pf1 = getPointValue(equipment, cb + "_L1PF"); + float pf2 = getPointValue(equipment, cb + "_L2PF"); + float pf3 = getPointValue(equipment, cb + "_L3PF"); + float total_pf = (pf1 + pf2 + pf3) / 3.0f; + tag = ""; + tag = cb + "_TotalPF"; + setPointValue(equipment, tag, total_pf); } + + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h index 3bb5f0c..57a6fce 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 181); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 33, 178); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -113,7 +113,7 @@ modbusMap mb_map[] = { {IR_LONG, 64, 0, "CB0_V31" }, {IR_LONG, 66, 0, "CB0_TotalKW" }, {IR_LONG, 68, 0, "CB0_TotalKVar" }, - {IR_LONG, 70, 0, "CB0_TotalKVA" }, + {IR_LONG, 70, 0, "CB0_TotalKVA" }, // {IR_LONG, 72, 0, "CB0_TotalPF" }, {IR_LONG, 74, 0, "CB0_TotalPFLag" }, {IR_LONG, 76, 0, "CB0_TotalPFLead" }, @@ -563,8 +563,8 @@ modbusMap mb_map[] = { {IR_FLOAT, 1087, 0, "kWh" }, {IR_FLOAT, 1091, 0, "PF" }, - {IR, 1150, 0, "CB_Status" }, - {IR, 1151, 0, "CB_Tripped" }, + {IR, 1550, 0, "CB_Status" }, + {IR, 1551, 0, "CB_Tripped" }, }; //Size of modbus map used in FOR cycles, automatically calculated. From 83a20282386e1f83c42316303ef8c116323c27b5 Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Mon, 27 Oct 2025 08:07:59 -0500 Subject: [PATCH 03/11] 3 --- .../State_Running.cpp | 51 +- .../State_Standby.cpp | 61 +- .../ATS/ATS_Eaton_ATC900_RPD_TCP/config.h | 6 +- .../State_Running.cpp | 54 +- .../State_Standby.cpp | 46 +- .../ATS/ATS_Woodward_DTSC200A_TCP/config.h | 51 +- .../PDU_Maverick_Power_TCP/State_Running.cpp | 18 +- src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h | 649 +++++------------- 8 files changed, 327 insertions(+), 609 deletions(-) diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp index 4fab407..accba63 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp @@ -39,20 +39,19 @@ template<> RunningState::RunningState() { - addStrategy("Source 1 Volts AB", new SingleValueStrategy(0.0F, 0.0f, 1000)); - addStrategy("Source 1 Volts BC", new SingleValueStrategy(0.0F, 0.0f, 1000)); - addStrategy("Source 2 Volts CA", new SingleValueStrategy(0.0F, 0.0f, 1000)); addStrategy("Source 2 Volts AB", new SingleValueStrategy(480.0F, 2.0f, 1000)); addStrategy("Source 2 Volts BC", new SingleValueStrategy(480.0F, 2.0f, 1000)); addStrategy("Source 2 Volts CA", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("Source 1 Frequency", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Source 2 Frequency", new SingleValueStrategy(60.0f, 1.0f, 1000)); - addStrategy("Power Factor", new SingleValueStrategy(90.0f, 2.0f, 1000)); - - addStrategy("Amps A", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("Amps B", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("Amps C", new SingleValueStrategy(1.0f, 5.0f, 1000)); + addStrategy("Volts AB", new SingleValueStrategy(480.0f, 2.0f, 1000)); + addStrategy("Votls BC", new SingleValueStrategy(480.0f, 2.0f, 1000)); + addStrategy("Volts CA", new SingleValueStrategy(480.0f, 2.0f, 1000)); + addStrategy("Amps A", new SingleValueStrategy(1.0f, 3.0f, 1000)); + addStrategy("Amps B", new SingleValueStrategy(1.0f, 3.0f, 1000)); + addStrategy("Amps C", new SingleValueStrategy(1.0f, 3.0f, 1000)); + addStrategy("Total Active Power", new SingleValueStrategy(6.0f, 5.0f, 1000)); + addStrategy("Total Apparent Power", new SingleValueStrategy(6.0f, 5.0f, 1000)); } @@ -78,20 +77,31 @@ State* RunningState::update(Equipment* equipment) return new StandbyState(); } - int I_load = getPointValue(equipment, "ATS_Load"); - int I_rating = getPointValue(equipment, "ATS_Rating"); - float load = static_cast(I_load); - float rating = static_cast(I_rating); - float real_load = rating * (load/100.0f); + float load = getPointValue(equipment, "ATS_Load"); + float rating = getPointValue(equipment, "ATS_Rating"); + float sim_load = rating * (load/100.0f); + Strategy_Behavior* ampsA_svs = getStrategy("Amps A"); Strategy_Behavior* ampsB_svs = getStrategy("Amps B"); Strategy_Behavior* ampsC_svs = getStrategy("Amps C"); - static_cast(ampsA_svs)->setSetpoint(real_load); - static_cast(ampsB_svs)->setSetpoint(real_load); - static_cast(ampsC_svs)->setSetpoint(real_load); - + static_cast(ampsA_svs)->setSetpoint(sim_load); + static_cast(ampsB_svs)->setSetpoint(sim_load); + static_cast(ampsC_svs)->setSetpoint(sim_load); // Apply any strategies defined for the standby state + float v_ab = getPointValue(equipment, "Source 2 Volts AB"); + float v_bc = getPointValue(equipment, "Source 2 Volts BC"); + float v_ca = getPointValue(equipment, "Source 2 Volts CA"); + float i_a = getPointValue(equipment, "Amps A"); + float i_b = getPointValue(equipment, "Amps B"); + float i_c = getPointValue(equipment, "Ampc C"); + float pwr = ((v_ab * i_a) + (v_bc * i_b) + (v_ca * i_c)); + setPointValue(equipment, "Total Active Power", pwr*1000.0f); + float pf = getPointValue(equipment, "Power Factor"); + float a_pwr = pwr * (pf/100.0f); + setPointValue(equipment, "Total Apparent Power", a_pwr*1000.0f); + + _applyStrategies(equipment); return nullptr; } @@ -113,6 +123,11 @@ void RunningState::enterState(Equipment* equipment) { setPointValue(equipment, "Source 1 Preferred", 1); setPointValue(equipment, "Source 2 Preferred", 0); + setPointValue(equipment, "Source 1 Volts AB", 0.0f); + setPointValue(equipment, "Source 1 Volts BC", 0.0f); + setPointValue(equipment, "Source 1 Volts CA", 0.0f); + setPointValue(equipment, "Source 1 Frequency", 0.0f); + int transferQty = getPointValue(equipment, "Number of Transfers"); setPointValue(equipment, "Number of Transfers", transferQty + 1); } diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp index be9fef9..39347b3 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp @@ -37,21 +37,21 @@ */ template<> StandbyState::StandbyState() { - // You can add initialization code here if needed - addStrategy("Source 1 Volts AB", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("Source 1 Volts BC", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("Source 1 Volts CA", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("Source 2 Volts AB", new SingleValueStrategy(0.0F, 0.0f, 1000)); - addStrategy("Source 2 Volts BC", new SingleValueStrategy(0.0F, 0.0f, 1000)); - addStrategy("Source 2 Volts CA", new SingleValueStrategy(0.0F, 0.0f, 1000)); - addStrategy("Source 1 Frequency", new SingleValueStrategy(60.0f, 1.0f, 1000)); - addStrategy("Source 2 Frequency", new SingleValueStrategy(0.0f, 0.0f, 1000)); + // You can add initialization code here if needed + addStrategy("Source 1 Volts AB", new SingleValueStrategy(480.0F, 2.0f, 1000)); + addStrategy("Source 1 Volts BC", new SingleValueStrategy(480.0F, 2.0f, 1000)); + addStrategy("Source 1 Volts CA", new SingleValueStrategy(480.0F, 2.0f, 1000)); + addStrategy("Source 1 Frequency", new SingleValueStrategy(60.0f, 1.0f, 1000)); + addStrategy("Power Factor", new SingleValueStrategy(90.0f, 2.0f, 1000)); + addStrategy("Volts AB", new SingleValueStrategy(480.0f, 2.0f, 1000)); + addStrategy("Votls BC", new SingleValueStrategy(480.0f, 2.0f, 1000)); + addStrategy("Volts CA", new SingleValueStrategy(480.0f, 2.0f, 1000)); + addStrategy("Amps A", new SingleValueStrategy(1.0f, 3.0f, 1000)); + addStrategy("Amps B", new SingleValueStrategy(1.0f, 3.0f, 1000)); + addStrategy("Amps C", new SingleValueStrategy(1.0f, 3.0f, 1000)); + addStrategy("Total Active Power", new SingleValueStrategy(6.0f, 5.0f, 1000)); + addStrategy("Total Apparent Power", new SingleValueStrategy(6.0f, 5.0f, 1000)); - addStrategy("Power Factor", new SingleValueStrategy(90.0f, 2.0f, 1000)); - - addStrategy("Amps A", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("Amps B", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("Amps C", new SingleValueStrategy(1.0f, 5.0f, 1000)); } /** @@ -73,19 +73,31 @@ State* StandbyState::update(Equipment* equipment) return new RunningState(); } - int I_load = getPointValue(equipment, "ATS_Load"); - int I_rating = getPointValue(equipment, "ATS_Rating"); - float load = static_cast(I_load); - float rating = static_cast(I_rating); - float real_load = rating * (load/100.0f); + float load = getPointValue(equipment, "ATS_Load"); + float rating = getPointValue(equipment, "ATS_Rating"); + float sim_load = rating * (load/100.0f); + Strategy_Behavior* ampsA_svs = getStrategy("Amps A"); Strategy_Behavior* ampsB_svs = getStrategy("Amps B"); Strategy_Behavior* ampsC_svs = getStrategy("Amps C"); - static_cast(ampsA_svs)->setSetpoint(real_load); - static_cast(ampsB_svs)->setSetpoint(real_load); - static_cast(ampsC_svs)->setSetpoint(real_load); + static_cast(ampsA_svs)->setSetpoint(sim_load); + static_cast(ampsB_svs)->setSetpoint(sim_load); + static_cast(ampsC_svs)->setSetpoint(sim_load); // Apply any strategies defined for the standby state + float v_ab = getPointValue(equipment, "Source 1 Volts AB"); + float v_bc = getPointValue(equipment, "Source 1 Volts BC"); + float v_ca = getPointValue(equipment, "Source 1 Volts CA"); + float i_a = getPointValue(equipment, "Amps A"); + float i_b = getPointValue(equipment, "Amps B"); + float i_c = getPointValue(equipment, "Ampc C"); + float pwr = ((v_ab * i_a) + (v_bc * i_b) + (v_ca * i_c)); + setPointValue(equipment, "Total Active Power", pwr*1000.0f); + float pf = getPointValue(equipment, "Power Factor"); + float a_pwr = pwr * (pf/100.0f); + setPointValue(equipment, "Total Apparent Power", a_pwr*1000.0f); + + _applyStrategies(equipment); return nullptr; } @@ -107,6 +119,11 @@ void StandbyState::enterState(Equipment* equipment) { setPointValue(equipment, "Source 1 Preferred", 0); setPointValue(equipment, "Source 2 Preferred", 1); + setPointValue(equipment, "Source 2 Volts AB", 0.0f); + setPointValue(equipment, "Source 2 Volts BC", 0.0f); + setPointValue(equipment, "Source 2 Volts CA", 0.0f); + setPointValue(equipment, "Source 2 Frequency", 0.0f); + int transferQty = getPointValue(equipment, "Number of Transfers"); setPointValue(equipment, "Number of Transfers", transferQty + 1); } diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h index d5a84a6..65b58f6 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h @@ -86,9 +86,9 @@ modbusMap mb_map[] = {IR, 6158, 0, "Amps A"}, {IR, 6159, 0, "Amps B"}, {IR, 6160, 0, "Amps C"}, - {IR_LONG, 6165, 0, "Total Active Power"}, - {IR_LONG, 6169, 0, "Total Apparent Power"}, - {IR, 6171, 0, "Power Factor"}, + {IR_LONG, 6165, 0, "Total Active Power"}, //0.001 + {IR_LONG, 6169, 0, "Total Apparent Power"}, //0.001 + {IR, 6171, 0, "Power Factor"}, //0.001 {IR, 6263, 0, "Number of Transfers"}, {IR, 6297, 0, "Alarm Status Bits"}, diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp index 1378e38..9dafbf6 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp @@ -39,15 +39,15 @@ template<> RunningState::RunningState() { - addStrategy("S2 Volts AB", new SingleValueStrategy(4800.0F, 2.0f, 1000)); - addStrategy("S2 Volts BC", new SingleValueStrategy(4800.0F, 2.0f, 1000)); - addStrategy("S2 Volts CA", new SingleValueStrategy(4800.0F, 2.0f, 1000)); + addStrategy("S2 Volts AB", new SingleValueStrategy(4800.0F, 10.0f, 1000)); + addStrategy("S2 Volts BC", new SingleValueStrategy(4800.0F, 10.0f, 1000)); + addStrategy("S2 Volts CA", new SingleValueStrategy(4800.0F, 10.0f, 1000)); - addStrategy("PF", new SingleValueStrategy(90.0f, 2.0f, 1000)); + addStrategy("PF", new SingleValueStrategy(910.0f, 20.0f, 1000)); - addStrategy("S2 Amps A", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("S2 Amps B", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("S2 Amps C", new SingleValueStrategy(1.0f, 5.0f, 1000)); + addStrategy("S2 Amps A", new SingleValueStrategy(200.0f, 100.0f, 1000)); + addStrategy("S2 Amps B", new SingleValueStrategy(200.0f, 100.0f, 1000)); + addStrategy("S2 Amps C", new SingleValueStrategy(200.0f, 100.0f, 1000)); } @@ -74,33 +74,36 @@ State* RunningState::update(Equipment* equipment) } float volts_AB = getPointValue(equipment, "S2 Volts AB"); float volts_BC = getPointValue(equipment, "S2 Volts BC"); - float volts_AC = getPointValue(equipment, "S2 Volts CA"); + float volts_CA = getPointValue(equipment, "S2 Volts CA"); - setPointValue(equipment, "S2 Volts AN", volts_AB/17.32); - setPointValue(equipment, "S2 Volts BN", volts_BC/17.32); - setPointValue(equipment, "S2 Volts CN", volts_AC/17.32); + setPointValue(equipment, "S2 Volts AN", volts_AB/1.732); + setPointValue(equipment, "S2 Volts BN", volts_BC/1.732); + setPointValue(equipment, "S2 Volts CN", volts_CA/1.732); int I_load = getPointValue(equipment, "ATS_Load"); int I_rating = getPointValue(equipment, "ATS_Rating"); float load = static_cast(I_load); float rating = static_cast(I_rating); - float real_load = rating * (load/100.0f); + float sim_load = rating * (load/100.0f); Strategy_Behavior* ampsA_svs = getStrategy("S2 Amps A"); Strategy_Behavior* ampsB_svs = getStrategy("S2 Amps B"); Strategy_Behavior* ampsC_svs = getStrategy("S2 Amps C"); - static_cast(ampsA_svs)->setSetpoint(real_load); - static_cast(ampsB_svs)->setSetpoint(real_load); - static_cast(ampsC_svs)->setSetpoint(real_load); + static_cast(ampsA_svs)->setSetpoint(sim_load*1000.0f); + static_cast(ampsB_svs)->setSetpoint(sim_load*1000.0f); + static_cast(ampsC_svs)->setSetpoint(sim_load*1000.0f); - float pf = getPointValue(equipment, "PF"); + float get_pf = getPointValue(equipment, "PF"); + float pf = get_pf/1000.0f; - - float kw = (1.732f * ((volts_AB + volts_BC + volts_AC)/3.0f) * real_load * pf)/1000; - float kva = (1.732f * ((volts_AB + volts_BC + volts_AC)/3.0f) * real_load)/1000; + float real_v_AB = volts_AB/1000.0f; + float real_v_BC = volts_BC/1000.0f; + float real_v_CA = volts_CA/1000.0f; + float kw = (1.732f * ((real_v_AB + real_v_BC + real_v_CA)/3.0f) * sim_load * pf)*10; + float mwh = kw *600.0f; setPointValue(equipment, "S2 kW", kw); - setPointValue(equipment, "S2 kVA", kva); + setPointValue(equipment, "S2 MWh", mwh); // Apply any strategies defined for the standby state _applyStrategies(equipment); @@ -117,9 +120,6 @@ void RunningState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Running State..."); // You could also update a Modbus register to show the "standby" state - setPointValue(equipment, "Source Active", 32); - setPointValue(equipment, "Source Preferred", 512); - setPointValue(equipment, "S1 Volts AB", 0.0f); setPointValue(equipment, "S1 Volts BC", 0.0f); setPointValue(equipment, "S1 Volts CA", 0.0f); @@ -129,8 +129,14 @@ void RunningState::enterState(Equipment* equipment) { setPointValue(equipment, "S1 Amps A", 0.0f); setPointValue(equipment, "S1 Amps B", 0.0f); setPointValue(equipment, "S1 Amps C", 0.0f); - setBitValue(equipment, "Source Active", 3, true); + setPointValue(equipment, "S1 kW", 0.0f); + setPointValue(equipment, "S1 MWh", 0.0f); + setBitValue(equipment, "Source Active", 4, false); + setBitValue(equipment, "Source Active", 3, true); + + setBitValue(equipment, "Source Preferred", 8, false); + setBitValue(equipment, "Source Preferred", 9, true); } /** diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp index f57063c..10fd829 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp @@ -38,15 +38,15 @@ template<> StandbyState::StandbyState() { // You can add initialization code here if needed - addStrategy("S1 Volts AB", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("S1 Volts BC", new SingleValueStrategy(480.0F, 2.0f, 1000)); - addStrategy("S1 Volts CA", new SingleValueStrategy(480.0F, 2.0f, 1000)); + addStrategy("S1 Volts AB", new SingleValueStrategy(4800.0F, 10.0f, 1000)); + addStrategy("S1 Volts BC", new SingleValueStrategy(4800.0F, 10.0f, 1000)); + addStrategy("S1 Volts CA", new SingleValueStrategy(4800.0F, 10.0f, 1000)); - addStrategy("PF", new SingleValueStrategy(90.0f, 2.0f, 1000)); + addStrategy("PF", new SingleValueStrategy(910.0f, 20.0f, 1000)); - addStrategy("S1 Amps A", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("S1 Amps B", new SingleValueStrategy(1.0f, 5.0f, 1000)); - addStrategy("S1 Amps C", new SingleValueStrategy(1.0f, 5.0f, 1000)); + addStrategy("S1 Amps A", new SingleValueStrategy(200.0f, 100.0f, 1000)); + addStrategy("S1 Amps B", new SingleValueStrategy(200.0f, 100.0f, 1000)); + addStrategy("S1 Amps C", new SingleValueStrategy(200.0f, 100.0f, 1000)); } /** @@ -68,33 +68,36 @@ State* StandbyState::update(Equipment* equipment) } float volts_AB = getPointValue(equipment, "S1 Volts AB"); float volts_BC = getPointValue(equipment, "S1 Volts BC"); - float volts_AC = getPointValue(equipment, "S1 Volts CA"); + float volts_CA = getPointValue(equipment, "S1 Volts CA"); setPointValue(equipment, "S1 Volts AN", volts_AB/1.732); setPointValue(equipment, "S1 Volts BN", volts_BC/1.732); - setPointValue(equipment, "S1 Volts CN", volts_AC/1.732); + setPointValue(equipment, "S1 Volts CN", volts_CA/1.732); int I_load = getPointValue(equipment, "ATS_Load"); int I_rating = getPointValue(equipment, "ATS_Rating"); float load = static_cast(I_load); float rating = static_cast(I_rating); - float real_load = rating * (load/100.0f); + float sim_load = rating * (load/100.0f); Strategy_Behavior* ampsA_svs = getStrategy("S1 Amps A"); Strategy_Behavior* ampsB_svs = getStrategy("S1 Amps B"); Strategy_Behavior* ampsC_svs = getStrategy("S1 Amps C"); - static_cast(ampsA_svs)->setSetpoint(real_load); - static_cast(ampsB_svs)->setSetpoint(real_load); - static_cast(ampsC_svs)->setSetpoint(real_load); + static_cast(ampsA_svs)->setSetpoint(sim_load*1000.0f); + static_cast(ampsB_svs)->setSetpoint(sim_load*1000.0f); + static_cast(ampsC_svs)->setSetpoint(sim_load*1000.0f); - float pf = getPointValue(equipment, "PF"); + float get_pf = getPointValue(equipment, "PF"); + float pf = get_pf/1000.0f; - - float kw = (1.732f * ((volts_AB + volts_BC + volts_AC)/3.0f) * real_load * pf)/1000; - float kva = (1.732f * ((volts_AB + volts_BC + volts_AC)/3.0f) * real_load)/1000; + float real_v_AB = volts_AB/1000.0f; + float real_v_BC = volts_BC/1000.0f; + float real_v_CA = volts_CA/1000.0f; + float kw = (1.732f * ((real_v_AB + real_v_BC + real_v_CA)/3.0f) * sim_load * pf)*10; + float mwh = kw *600.0f; setPointValue(equipment, "S1 kW", kw); - setPointValue(equipment, "S1 kVA", kva); + setPointValue(equipment, "S1 MWh", mwh); _applyStrategies(equipment); return nullptr; } @@ -109,8 +112,6 @@ template<> void StandbyState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Standby State..."); - setPointValue(equipment, "Source Active", 64); - setPointValue(equipment, "Source Preferred", 1024); setPointValue(equipment, "S2 Volts AB", 0.0f); setPointValue(equipment, "S2 Volts BC", 0.0f); @@ -121,9 +122,14 @@ void StandbyState::enterState(Equipment* equipment) { setPointValue(equipment, "S2 Amps A", 0.0f); setPointValue(equipment, "S2 Amps B", 0.0f); setPointValue(equipment, "S2 Amps C", 0.0f); + setPointValue(equipment, "S2 kW", 0.0f); + setPointValue(equipment, "S2 MWh", 0.0f); setBitValue(equipment, "Source Active", 3, false); setBitValue(equipment, "Source Active", 4, true); + + setBitValue(equipment, "Source Preferred", 8, false); + setBitValue(equipment, "Source Preferred", 9, true); } /** diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h index 6a14e99..7b5d59e 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h @@ -64,31 +64,32 @@ modbusMap mb_map[] = {HR, 10, 0, "ATS_Load"}, {HR, 11, 0, "ATS_Rating"}, //Internal Fault code from Modscan - {HR, 50009, 0, "PF"}, - {HR_LONG, 50001, 0, "S2 Volts AB"}, - {HR_LONG, 50004, 0, "S2 Volts AN"}, - {HR_LONG, 50007, 0, "S2 Volts BC"}, - {HR_LONG, 50010, 0, "S2 Volts BN"}, - {HR_LONG, 50013, 0, "S2 Volts CA"}, - {HR_LONG, 50016, 0, "S2 Volts CN"}, - {HR_LONG, 50019, 0, "S1 Volts AB"}, - {HR_LONG, 50022, 0, "S1 Volts AN"}, - {HR_LONG, 50025, 0, "S1 Volts BC"}, - {HR_LONG, 50028, 0, "S1 Volts BN"}, - {HR_LONG, 50031, 0, "S1 Volts CA"}, - {HR_LONG, 50034, 0, "S1 Volts CN"}, - {HR_LONG, 50037, 0, "S2 Amps A"}, - {HR_LONG, 50040, 0, "S2 Amps B"}, - {HR_LONG, 50043, 0, "S2 Amps C"}, - {HR_LONG, 50060, 0, "S2 kW"}, - {HR_LONG, 50064, 0, "S2 MWh"}, - {HR, 50078, 0, "Source Preferred"}, // bit 8 and bit 9 - {HR, 50082, 0, "Source Active"}, //bit2 and bit 3 - {HR_LONG, 50091, 0, "S1 Amps A"}, - {HR, 50093, 0, "S1 kW"}, - {HR_LONG, 50094, 0, "S1 Amps B"}, - {HR_LONG, 50097, 0, "S1 Amps C"}, - {HR_LONG, 50100, 0, "S1 MWh"}, + {HR, 50009, 0, "PF"}, //0.001x + {HR_LONG, 50001, 0, "S2 Volts AB"}, //0.1x + {HR_LONG, 50004, 0, "S2 Volts AN"}, //0.1x + {HR_LONG, 50007, 0, "S2 Volts BC"}, //0.1x + {HR_LONG, 50010, 0, "S2 Volts BN"}, //0.1x + {HR_LONG, 50013, 0, "S2 Volts CA"}, //0.1x + {HR_LONG, 50016, 0, "S2 Volts CN"}, //0.1x + {HR_LONG, 50019, 0, "S1 Volts AB"}, //0.1x + {HR_LONG, 50022, 0, "S1 Volts AN"}, //0.1x + {HR_LONG, 50025, 0, "S1 Volts BC"}, //0.1x + {HR_LONG, 50028, 0, "S1 Volts BN"}, //0.1x + {HR_LONG, 50031, 0, "S1 Volts CA"}, //0.1x + {HR_LONG, 50034, 0, "S1 Volts CN"}, //0.1x + {HR_LONG, 50037, 0, "S2 Amps A"}, //0.001x + {HR_LONG, 50040, 0, "S2 Amps B"}, //0.001x + {HR_LONG, 50043, 0, "S2 Amps C"}, //0.001x + {HR_LONG, 50060, 0, "S2 kW"}, + {HR_LONG, 50064, 0, "S2 MWh"}, //0.01x + {HR, 50078, 0, "Source Preferred"}, //bit9 source1 bit8 source 2 + {HR, 50082, 0, "Source Active"}, //bit4 source1 bit3 source 2 + {HR_LONG, 50091, 0, "S1 Amps A"}, //.001x + {HR, 50093, 0, "S1 kW"}, //.1x + {HR_LONG, 50094, 0, "S1 Amps B"}, //.001x + {HR_LONG, 50097, 0, "S1 Amps C"}, //.001x + {HR_LONG, 50100, 0, "S1 MWh"}, //.01x + }; //Size of modbus map used in FOR cycles, automatically calculated. diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp index fe6aa68..c3e5fca 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp @@ -36,29 +36,21 @@ * state, such as a PID controller for the 'CW Valve Position' and totalizers * for the run-hours of each EC fan. */ -std::string cbs[] = {"CB0", "CB1", "CB2", "CB3", "CB4", "CB5", "CB6", "CB7", "CB8", "CB9"}; +std::string cbs[] = {"CB1", "CB2", "CB3", "CB4", "CB5", "CB6", "CB7", "CB8"}; template<> RunningState::RunningState() { for (const std::string& cb : cbs) { std::string tag = ""; tag = cb + "_V1N"; - addStrategy(tag, new SingleValueStrategy(0.0f, 30.0f, 1000)); + addStrategy(tag, new SingleValueStrategy(40.0f, 30.0f, 1000)); tag = ""; tag = cb + "_V2N"; - addStrategy(tag, new SingleValueStrategy(0.0f, 30.0f, 1000)); + addStrategy(tag, new SingleValueStrategy(40.0f, 30.0f, 1000)); tag = ""; tag = cb + "_V3N"; - addStrategy(tag, new SingleValueStrategy(0.0f, 30.0f, 1000)); - tag = ""; - tag = cb + "_L1PF"; - addStrategy(tag, new SingleValueStrategy(93.0f, 9.0f, 1000)); - tag = ""; - tag = cb + "_L2PF"; - addStrategy(tag, new SingleValueStrategy(93.0f, 9.0f, 1000)); - tag = ""; - tag = cb + "_L3PF"; - addStrategy(tag, new SingleValueStrategy(93.0f, 9.0f, 1000)); + addStrategy(tag, new SingleValueStrategy(40.0f, 30.0f, 1000)); + tag = ""; tag = cb + "_V1THD"; addStrategy(tag, new SingleValueStrategy(20.0f, 7.0f, 1000)); diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h index 57a6fce..f601499 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h @@ -64,9 +64,9 @@ modbusMap mb_map[] = { // Write Registers (as Input Registers - 3X) //*************************************** {HR, 9, 0, "Px Ctrl"}, - {HR, 10, 0, "Px Rating"}, //Watts + {HR, 10, 0, "Px Rating"}, //Amps {HR, 11, 0, "Px Load"}, //%load - {HR, 19, 0, "Px_CB0"}, + {HR, 19, 0, "Px_Input"}, {HR, 20, 0, "Px_CB1"}, {HR, 21, 0, "Px_CB2"}, {HR, 22, 0, "Px_CB3"}, @@ -75,497 +75,178 @@ modbusMap mb_map[] = { {HR, 25, 0, "Px_CB6"}, {HR, 26, 0, "Px_CB7"}, {HR, 27, 0, "Px_CB8"}, - {HR, 28, 0, "Px_CB9"}, + {HR, 28, 0, "Px_Output"}, - // System Status - {IR_LONG, 0, 0, "CB0_V1N" }, - {IR_LONG, 2, 0, "CB0_V2N" }, - {IR_LONG, 4, 0, "CB0_V3N" }, - {IR_LONG, 6, 0, "CB0_I1" }, - {IR_LONG, 8, 0, "CB0_I2" }, - {IR_LONG, 10, 0, "CB0_I3" }, - {IR_LONG, 12, 0, "CB0_L1KW" }, - {IR_LONG, 14, 0, "CB0_L2KW" }, - {IR_LONG, 16, 0, "CB0_L3KW" }, - {IR_LONG, 18, 0, "CB0_L1KVar" }, - {IR_LONG, 20, 0, "CB0_L2KVar" }, - {IR_LONG, 22, 0, "CB0_L3KVar" }, - {IR_LONG, 24, 0, "CB0_L1KVA" }, - {IR_LONG, 26, 0, "CB0_L2KVA" }, - {IR_LONG, 28, 0, "CB0_L3KVA" }, - {IR_LONG, 30, 0, "CB0_L1PF" }, - {IR_LONG, 32, 0, "CB0_L2PF" }, - {IR_LONG, 34, 0, "CB0_L3PF" }, - {IR_LONG, 36, 0, "CB0_V1THD" }, - {IR_LONG, 38, 0, "CB0_V2THD" }, - {IR_LONG, 40, 0, "CB0_V3THD" }, - {IR_LONG, 42, 0, "CB0_I1THD" }, - {IR_LONG, 44, 0, "CB0_I2THD" }, - {IR_LONG, 46, 0, "CB0_I3THD" }, - {IR_LONG, 48, 0, "CB0_I1Kfactor" }, - {IR_LONG, 50, 0, "CB0_I2Kfactor" }, - {IR_LONG, 52, 0, "CB0_I3Kfactor" }, - {IR_LONG, 54, 0, "CB0_I1TDD" }, - {IR_LONG, 56, 0, "CB0_I2TDD" }, - {IR_LONG, 58, 0, "CB0_I3TDD" }, - {IR_LONG, 60, 0, "CB0_V12" }, - {IR_LONG, 62, 0, "CB0_V23" }, - {IR_LONG, 64, 0, "CB0_V31" }, - {IR_LONG, 66, 0, "CB0_TotalKW" }, - {IR_LONG, 68, 0, "CB0_TotalKVar" }, - {IR_LONG, 70, 0, "CB0_TotalKVA" }, // - {IR_LONG, 72, 0, "CB0_TotalPF" }, - {IR_LONG, 74, 0, "CB0_TotalPFLag" }, - {IR_LONG, 76, 0, "CB0_TotalPFLead" }, - {IR_LONG, 78, 0, "CB0_TotalKWImport" }, - {IR_LONG, 80, 0, "CB0_TotalKWExport" }, - {IR_LONG, 82, 0, "CB0_TotalKVarImport" }, - {IR_LONG, 84, 0, "CB0_TotalKVarExport" }, - {IR_LONG, 86, 0, "CB0_LN_Avg" }, - {IR_LONG, 88, 0, "CB0_LL_Avg" }, - {IR_LONG, 92, 0, "CB0_TotalKWh" }, - {IR_LONG, 99, 0, "CB0_Status" }, + // PDU Input + {IR_LONG, 6, 0, "Input_I1" }, //0.01 + {IR_LONG, 8, 0, "Input_I2" }, //0.01 + {IR_LONG, 10, 0, "Input_I3" }, //0.01 + {IR_LONG, 70, 0, "Input_kVA" }, //0.001 + {IR_LONG, 68, 0, "Input_KVAR" }, //0.001 + {IR_LONG, 66, 0, "Input_kW" }, //0.001 + {IR_LONG, 66, 0, "Input_kWh" }, //0.1 + {IR_LONG, 72, 0, "Input_PF" }, //0.001 + {IR_LONG, 60, 0, "Input_V_AB" }, //0.1 + {IR_LONG, 0, 0, "Input_V_AN" }, //0.1 + {IR_LONG, 62, 0, "Input_V_BC" }, //0.1 + {IR_LONG, 2, 0, "Input_V_BN" }, //0.1 + {IR_LONG, 64, 0, "Input_V_CA" }, //0.1 + {IR_LONG, 4, 0, "Input_V_CN" }, //0.1 + {IR_LONG, 88, 0, "Input_LL_Avg" },//0.1 + {IR_LONG, 86, 0, "Input_LN_Avg" },//0.1 + + // Circuit Breaker 1 (CB1) + {IR_LONG, 106, 0, "CB1_I1" }, //0.01x + {IR_LONG, 108, 0, "CB1_I2" }, //0.01x + {IR_LONG, 110, 0, "CB1_I3" }, //0.01x + {IR_LONG, 170, 0, "CB1_kVA" }, //0.001x + {IR_LONG, 124, 0, "CB1_kVA1" }, //0.001x + {IR_LONG, 126, 0, "CB1_kVA2" }, //0.001x + {IR_LONG, 128, 0, "CB1_kVA3" }, //0.001x + {IR_LONG, 168, 0, "CB1_kVAR" }, //0.001x + {IR_LONG, 166, 0, "CB1_kW" }, //0.001x + {IR_LONG, 112, 0, "CB1_kW1" }, //0.001x + {IR_LONG, 114, 0, "CB1_kW2" }, //0.001x + {IR_LONG, 116, 0, "CB1_kW3" }, //0.001x + {IR_LONG, 1113, 0, "CB1_kWh" }, + {IR_LONG, 172, 0, "CB1_PF" }, //0.001x - // Circuit Breaker 1 (OB01) - {IR_LONG, 100, 0, "CB1_V1N" }, - {IR_LONG, 102, 0, "CB1_V2N" }, - {IR_LONG, 104, 0, "CB1_V3N" }, - {IR_LONG, 106, 0, "CB1_I1" }, - {IR_LONG, 108, 0, "CB1_I2" }, - {IR_LONG, 110, 0, "CB1_I3" }, - {IR_LONG, 112, 0, "CB1_L1KW" }, - {IR_LONG, 114, 0, "CB1_L2KW" }, - {IR_LONG, 116, 0, "CB1_L3KW" }, - {IR_LONG, 118, 0, "CB1_L1KVar" }, - {IR_LONG, 120, 0, "CB1_L2KVar" }, - {IR_LONG, 122, 0, "CB1_L3KVar" }, - {IR_LONG, 124, 0, "CB1_L1KVA" }, - {IR_LONG, 126, 0, "CB1_L2KVA" }, - {IR_LONG, 128, 0, "CB1_L3KVA" }, - {IR_LONG, 130, 0, "CB1_L1PF" }, - {IR_LONG, 132, 0, "CB1_L2PF" }, - {IR_LONG, 134, 0, "CB1_L3PF" }, - {IR_LONG, 136, 0, "CB1_V1THD" }, - {IR_LONG, 138, 0, "CB1_V2THD" }, - {IR_LONG, 140, 0, "CB1_V3THD" }, - {IR_LONG, 142, 0, "CB1_I1THD" }, - {IR_LONG, 144, 0, "CB1_I2THD" }, - {IR_LONG, 146, 0, "CB1_I3THD" }, - {IR_LONG, 148, 0, "CB1_I1Kfactor" }, - {IR_LONG, 150, 0, "CB1_I2Kfactor" }, - {IR_LONG, 152, 0, "CB1_I3Kfactor" }, - {IR_LONG, 154, 0, "CB1_I1TDD" }, - {IR_LONG, 156, 0, "CB1_I2TDD" }, - {IR_LONG, 158, 0, "CB1_I3TDD" }, - {IR_LONG, 160, 0, "CB1_V12" }, - {IR_LONG, 162, 0, "CB1_V23" }, - {IR_LONG, 164, 0, "CB1_V31" }, - {IR_LONG, 166, 0, "CB1_TotalKW" }, - {IR_LONG, 168, 0, "CB1_TotalKVar" }, - {IR_LONG, 170, 0, "CB1_TotalKVA" }, - {IR_LONG, 172, 0, "CB1_TotalPF" }, - {IR_LONG, 174, 0, "CB1_TotalPFLag" }, - {IR_LONG, 176, 0, "CB1_TotalPFLead" }, - {IR_LONG, 178, 0, "CB1_TotalKWImport" }, - {IR_LONG, 180, 0, "CB1_TotalKWExport" }, - {IR_LONG, 182, 0, "CB1_TotalKVarImport" }, - {IR_LONG, 184, 0, "CB1_TotalKVarExport" }, - {IR_LONG, 186, 0, "CB1_LN_Avg" }, - {IR_LONG, 188, 0, "CB1_LL_Avg" }, - {IR_LONG, 199, 0, "CB1_Status" }, + // Circuit Breaker 2 (CB1) + {IR_LONG, 206, 0, "CB2_I1" }, //0.01x + {IR_LONG, 208, 0, "CB2_I2" }, //0.01x + {IR_LONG, 210, 0, "CB2_I3" }, //0.01x + {IR_LONG, 270, 0, "CB2_kVA" }, //0.001x + {IR_LONG, 224, 0, "CB2_kVA1" }, //0.001x + {IR_LONG, 226, 0, "CB2_kVA2" }, //0.001x + {IR_LONG, 228, 0, "CB2_kVA3" }, //0.001x + {IR_LONG, 268, 0, "CB2_kVAR" }, //0.001x + {IR_LONG, 266, 0, "CB2_kW" }, //0.001x + {IR_LONG, 212, 0, "CB2_kW1" }, //0.001x + {IR_LONG, 214, 0, "CB2_kW2" }, //0.001x + {IR_LONG, 216, 0, "CB2_kW3" }, //0.001x + {IR_LONG, 1168, 0, "CB2_kWh" }, + {IR_LONG, 272, 0, "CB2_PF" }, //0.001x - // Circuit Breaker 2 (OB02) - {IR_LONG, 200, 0, "CB2_V1N" }, - {IR_LONG, 202, 0, "CB2_V2N" }, - {IR_LONG, 204, 0, "CB2_V3N" }, - {IR_LONG, 206, 0, "CB2_I1" }, - {IR_LONG, 208, 0, "CB2_I2" }, - {IR_LONG, 210, 0, "CB2_I3" }, - {IR_LONG, 212, 0, "CB2_L1KW" }, - {IR_LONG, 214, 0, "CB2_L2KW" }, - {IR_LONG, 216, 0, "CB2_L3KW" }, - {IR_LONG, 218, 0, "CB2_L1KVar" }, - {IR_LONG, 220, 0, "CB2_L2KVar" }, - {IR_LONG, 222, 0, "CB2_L3KVar" }, - {IR_LONG, 224, 0, "CB2_L1KVA" }, - {IR_LONG, 226, 0, "CB2_L2KVA" }, - {IR_LONG, 228, 0, "CB2_L3KVA" }, - {IR_LONG, 230, 0, "CB2_L1PF" }, - {IR_LONG, 232, 0, "CB2_L2PF" }, - {IR_LONG, 234, 0, "CB2_L3PF" }, - {IR_LONG, 236, 0, "CB2_V1THD" }, - {IR_LONG, 238, 0, "CB2_V2THD" }, - {IR_LONG, 240, 0, "CB2_V3THD" }, - {IR_LONG, 242, 0, "CB2_I1THD" }, - {IR_LONG, 244, 0, "CB2_I2THD" }, - {IR_LONG, 246, 0, "CB2_I3THD" }, - {IR_LONG, 248, 0, "CB2_I1Kfactor" }, - {IR_LONG, 250, 0, "CB2_I2Kfactor" }, - {IR_LONG, 252, 0, "CB2_I3Kfactor" }, - {IR_LONG, 254, 0, "CB2_I1TDD" }, - {IR_LONG, 256, 0, "CB2_I2TDD" }, - {IR_LONG, 258, 0, "CB2_I3TDD" }, - {IR_LONG, 260, 0, "CB2_V12" }, - {IR_LONG, 262, 0, "CB2_V23" }, - {IR_LONG, 264, 0, "CB2_V31" }, - {IR_LONG, 266, 0, "CB2_TotalKW" }, - {IR_LONG, 268, 0, "CB2_TotalKVar" }, - {IR_LONG, 270, 0, "CB2_TotalKVA" }, - {IR_LONG, 272, 0, "CB2_TotalPF" }, - {IR_LONG, 274, 0, "CB2_TotalPFLag" }, - {IR_LONG, 276, 0, "CB2_TotalPFLead" }, - {IR_LONG, 278, 0, "CB2_TotalKWImport" }, - {IR_LONG, 280, 0, "CB2_TotalKWExport" }, - {IR_LONG, 282, 0, "CB2_TotalKVarImport" }, - {IR_LONG, 284, 0, "CB2_TotalKVarExport" }, - {IR_LONG, 286, 0, "CB2_LN_Avg" }, - {IR_LONG, 288, 0, "CB2_LL_Avg" }, - {IR_LONG, 299, 0, "CB2_Status" }, + // Circuit Breaker 3 (CB1) + {IR_LONG, 306, 0, "CB3_I1" }, //0.01x + {IR_LONG, 308, 0, "CB3_I2" }, //0.01x + {IR_LONG, 310, 0, "CB3_I3" }, //0.01x + {IR_LONG, 370, 0, "CB3_kVA" }, //0.001x + {IR_LONG, 324, 0, "CB3_kVA1" }, //0.001x + {IR_LONG, 326, 0, "CB3_kVA2" }, //0.001x + {IR_LONG, 328, 0, "CB3_kVA3" }, //0.001x + {IR_LONG, 368, 0, "CB3_kVAR" }, //0.001x + {IR_LONG, 366, 0, "CB3_kW" }, //0.001x + {IR_LONG, 312, 0, "CB3_kW1" }, //0.001x + {IR_LONG, 314, 0, "CB3_kW2" }, //0.001x + {IR_LONG, 316, 0, "CB3_kW3" }, //0.001x + {IR_LONG, 1223, 0, "CB3_kWh" }, + {IR_LONG, 372, 0, "CB3_PF" }, //0.001x - // Circuit Breaker 3 (OB03) - {IR_LONG, 300, 0, "CB3_V1N" }, - {IR_LONG, 302, 0, "CB3_V2N" }, - {IR_LONG, 304, 0, "CB3_V3N" }, - {IR_LONG, 306, 0, "CB3_I1" }, - {IR_LONG, 308, 0, "CB3_I2" }, - {IR_LONG, 310, 0, "CB3_I3" }, - {IR_LONG, 312, 0, "CB3_L1KW" }, - {IR_LONG, 314, 0, "CB3_L2KW" }, - {IR_LONG, 316, 0, "CB3_L3KW" }, - {IR_LONG, 318, 0, "CB3_L1KVar" }, - {IR_LONG, 320, 0, "CB3_L2KVar" }, - {IR_LONG, 322, 0, "CB3_L3KVar" }, - {IR_LONG, 324, 0, "CB3_L1KVA" }, - {IR_LONG, 326, 0, "CB3_L2KVA" }, - {IR_LONG, 328, 0, "CB3_L3KVA" }, - {IR_LONG, 330, 0, "CB3_L1PF" }, - {IR_LONG, 332, 0, "CB3_L2PF" }, - {IR_LONG, 334, 0, "CB3_L3PF" }, - {IR_LONG, 336, 0, "CB3_V1THD" }, - {IR_LONG, 338, 0, "CB3_V2THD" }, - {IR_LONG, 340, 0, "CB3_V3THD" }, - {IR_LONG, 342, 0, "CB3_I1THD" }, - {IR_LONG, 344, 0, "CB3_I2THD" }, - {IR_LONG, 346, 0, "CB3_I3THD" }, - {IR_LONG, 348, 0, "CB3_I1Kfactor" }, - {IR_LONG, 350, 0, "CB3_I2Kfactor" }, - {IR_LONG, 352, 0, "CB3_I3Kfactor" }, - {IR_LONG, 354, 0, "CB3_I1TDD" }, - {IR_LONG, 356, 0, "CB3_I2TDD" }, - {IR_LONG, 358, 0, "CB3_I3TDD" }, - {IR_LONG, 360, 0, "CB3_V12" }, - {IR_LONG, 362, 0, "CB3_V23" }, - {IR_LONG, 364, 0, "CB3_V31" }, - {IR_LONG, 366, 0, "CB3_TotalKW" }, - {IR_LONG, 368, 0, "CB3_TotalKVar" }, - {IR_LONG, 370, 0, "CB3_TotalKVA" }, - {IR_LONG, 372, 0, "CB3_TotalPF" }, - {IR_LONG, 374, 0, "CB3_TotalPFLag" }, - {IR_LONG, 376, 0, "CB3_TotalPFLead" }, - {IR_LONG, 378, 0, "CB3_TotalKWImport" }, - {IR_LONG, 380, 0, "CB3_TotalKWExport" }, - {IR_LONG, 382, 0, "CB3_TotalKVarImport" }, - {IR_LONG, 384, 0, "CB3_TotalKVarExport" }, - {IR_LONG, 386, 0, "CB3_LN_Avg" }, - {IR_LONG, 388, 0, "CB3_LL_Avg" }, - {IR_LONG, 399, 0, "CB3_Status" }, + // Circuit Breaker 4 (CB1) + {IR_LONG, 406, 0, "CB4_I1" }, //0.01x + {IR_LONG, 408, 0, "CB4_I2" }, //0.01x + {IR_LONG, 410, 0, "CB4_I3" }, //0.01x + {IR_LONG, 470, 0, "CB4_kVA" }, //0.001x + {IR_LONG, 424, 0, "CB4_kVA1" }, //0.001x + {IR_LONG, 426, 0, "CB4_kVA2" }, //0.001x + {IR_LONG, 428, 0, "CB4_kVA3" }, //0.001x + {IR_LONG, 468, 0, "CB4_kVAR" }, //0.001x + {IR_LONG, 466, 0, "CB4_kW" }, //0.001x + {IR_LONG, 412, 0, "CB4_kW1" }, //0.001x + {IR_LONG, 414, 0, "CB4_kW2" }, //0.001x + {IR_LONG, 416, 0, "CB4_kW3" }, //0.001x + {IR_LONG, 1278, 0, "CB4_kWh" }, + {IR_LONG, 472, 0, "CB4_PF" }, //0.001x - // Circuit Breaker 4 (OB04) - {IR_LONG, 400, 0, "CB4_V1N" }, - {IR_LONG, 402, 0, "CB4_V2N" }, - {IR_LONG, 404, 0, "CB4_V3N" }, - {IR_LONG, 406, 0, "CB4_I1" }, - {IR_LONG, 408, 0, "CB4_I2" }, - {IR_LONG, 410, 0, "CB4_I3" }, - {IR_LONG, 412, 0, "CB4_L1KW" }, - {IR_LONG, 414, 0, "CB4_L2KW" }, - {IR_LONG, 416, 0, "CB4_L3KW" }, - {IR_LONG, 418, 0, "CB4_L1KVar" }, - {IR_LONG, 420, 0, "CB4_L2KVar" }, - {IR_LONG, 422, 0, "CB4_L3KVar" }, - {IR_LONG, 424, 0, "CB4_L1KVA" }, - {IR_LONG, 426, 0, "CB4_L2KVA" }, - {IR_LONG, 428, 0, "CB4_L3KVA" }, - {IR_LONG, 430, 0, "CB4_L1PF" }, - {IR_LONG, 432, 0, "CB4_L2PF" }, - {IR_LONG, 434, 0, "CB4_L3PF" }, - {IR_LONG, 436, 0, "CB4_V1THD" }, - {IR_LONG, 438, 0, "CB4_V2THD" }, - {IR_LONG, 440, 0, "CB4_V3THD" }, - {IR_LONG, 442, 0, "CB4_I1THD" }, - {IR_LONG, 444, 0, "CB4_I2THD" }, - {IR_LONG, 446, 0, "CB4_I3THD" }, - {IR_LONG, 448, 0, "CB4_I1Kfactor" }, - {IR_LONG, 450, 0, "CB4_I2Kfactor" }, - {IR_LONG, 452, 0, "CB4_I3Kfactor" }, - {IR_LONG, 454, 0, "CB4_I1TDD" }, - {IR_LONG, 456, 0, "CB4_I2TDD" }, - {IR_LONG, 458, 0, "CB4_I3TDD" }, - {IR_LONG, 460, 0, "CB4_V12" }, - {IR_LONG, 462, 0, "CB4_V23" }, - {IR_LONG, 464, 0, "CB4_V31" }, - {IR_LONG, 466, 0, "CB4_TotalKW" }, - {IR_LONG, 468, 0, "CB4_TotalKVar" }, - {IR_LONG, 470, 0, "CB4_TotalKVA" }, - {IR_LONG, 472, 0, "CB4_TotalPF" }, - {IR_LONG, 474, 0, "CB4_TotalPFLag" }, - {IR_LONG, 476, 0, "CB4_TotalPFLead" }, - {IR_LONG, 478, 0, "CB4_TotalKWImport" }, - {IR_LONG, 480, 0, "CB4_TotalKWExport" }, - {IR_LONG, 482, 0, "CB4_TotalKVarImport" }, - {IR_LONG, 484, 0, "CB4_TotalKVarExport" }, - {IR_LONG, 486, 0, "CB4_LN_Avg" }, - {IR_LONG, 488, 0, "CB4_LL_Avg" }, - {IR_LONG, 499, 0, "CB4_Status" }, + // Circuit Breaker 5 (CB1) + {IR_LONG, 506, 0, "CB5_I1" }, //0.01x + {IR_LONG, 508, 0, "CB5_I2" }, //0.01x + {IR_LONG, 510, 0, "CB5_I3" }, //0.01x + {IR_LONG, 570, 0, "CB5_kVA" }, //0.001x + {IR_LONG, 524, 0, "CB5_kVA1" }, //0.001x + {IR_LONG, 526, 0, "CB5_kVA2" }, //0.001x + {IR_LONG, 528, 0, "CB5_kVA3" }, //0.001x + {IR_LONG, 568, 0, "CB5_kVAR" }, //0.001x + {IR_LONG, 566, 0, "CB5_kW" }, //0.001x + {IR_LONG, 512, 0, "CB5_kW1" }, //0.001x + {IR_LONG, 514, 0, "CB5_kW2" }, //0.001x + {IR_LONG, 516, 0, "CB5_kW3" }, //0.001x + {IR_LONG, 1333, 0, "CB5_kWh" }, + {IR_LONG, 572, 0, "CB5_PF" }, //0.001x - // Circuit Breaker 5 (OB05) - {IR_LONG, 500, 0, "CB5_V1N" }, - {IR_LONG, 502, 0, "CB5_V2N" }, - {IR_LONG, 504, 0, "CB5_V3N" }, - {IR_LONG, 506, 0, "CB5_I1" }, - {IR_LONG, 508, 0, "CB5_I2" }, - {IR_LONG, 510, 0, "CB5_I3" }, - {IR_LONG, 512, 0, "CB5_L1KW" }, - {IR_LONG, 514, 0, "CB5_L2KW" }, - {IR_LONG, 516, 0, "CB5_L3KW" }, - {IR_LONG, 518, 0, "CB5_L1KVar" }, - {IR_LONG, 520, 0, "CB5_L2KVar" }, - {IR_LONG, 522, 0, "CB5_L3KVar" }, - {IR_LONG, 524, 0, "CB5_L1KVA" }, - {IR_LONG, 526, 0, "CB5_L2KVA" }, - {IR_LONG, 528, 0, "CB5_L3KVA" }, - {IR_LONG, 530, 0, "CB5_L1PF" }, - {IR_LONG, 532, 0, "CB5_L2PF" }, - {IR_LONG, 534, 0, "CB5_L3PF" }, - {IR_LONG, 536, 0, "CB5_V1THD" }, - {IR_LONG, 538, 0, "CB5_V2THD" }, - {IR_LONG, 540, 0, "CB5_V3THD" }, - {IR_LONG, 542, 0, "CB5_I1THD" }, - {IR_LONG, 544, 0, "CB5_I2THD" }, - {IR_LONG, 546, 0, "CB5_I3THD" }, - {IR_LONG, 548, 0, "CB5_I1Kfactor" }, - {IR_LONG, 550, 0, "CB5_I2Kfactor" }, - {IR_LONG, 552, 0, "CB5_I3Kfactor" }, - {IR_LONG, 554, 0, "CB5_I1TDD" }, - {IR_LONG, 556, 0, "CB5_I2TDD" }, - {IR_LONG, 558, 0, "CB5_I3TDD" }, - {IR_LONG, 560, 0, "CB5_V12" }, - {IR_LONG, 562, 0, "CB5_V23" }, - {IR_LONG, 564, 0, "CB5_V31" }, - {IR_LONG, 566, 0, "CB5_TotalKW" }, - {IR_LONG, 568, 0, "CB5_TotalKVar" }, - {IR_LONG, 570, 0, "CB5_TotalKVA" }, - {IR_LONG, 572, 0, "CB5_TotalPF" }, - {IR_LONG, 574, 0, "CB5_TotalPFLag" }, - {IR_LONG, 576, 0, "CB5_TotalPFLead" }, - {IR_LONG, 578, 0, "CB5_TotalKWImport" }, - {IR_LONG, 580, 0, "CB5_TotalKWExport" }, - {IR_LONG, 582, 0, "CB5_TotalKVarImport" }, - {IR_LONG, 584, 0, "CB5_TotalKVarExport" }, - {IR_LONG, 586, 0, "CB5_LN_Avg" }, - {IR_LONG, 588, 0, "CB5_LL_Avg" }, - {IR_LONG, 599, 0, "CB5_Status" }, - - // Circuit Breaker 6 (OB06) - {IR_LONG, 600, 0, "CB6_V1N" }, - {IR_LONG, 602, 0, "CB6_V2N" }, - {IR_LONG, 604, 0, "CB6_V3N" }, - {IR_LONG, 606, 0, "CB6_I1" }, - {IR_LONG, 608, 0, "CB6_I2" }, - {IR_LONG, 610, 0, "CB6_I3" }, - {IR_LONG, 612, 0, "CB6_L1KW" }, - {IR_LONG, 614, 0, "CB6_L2KW" }, - {IR_LONG, 616, 0, "CB6_L3KW" }, - {IR_LONG, 618, 0, "CB6_L1KVar" }, - {IR_LONG, 620, 0, "CB6_L2KVar" }, - {IR_LONG, 622, 0, "CB6_L3KVar" }, - {IR_LONG, 624, 0, "CB6_L1KVA" }, - {IR_LONG, 626, 0, "CB6_L2KVA" }, - {IR_LONG, 628, 0, "CB6_L3KVA" }, - {IR_LONG, 630, 0, "CB6_L1PF" }, - {IR_LONG, 632, 0, "CB6_L2PF" }, - {IR_LONG, 634, 0, "CB6_L3PF" }, - {IR_LONG, 636, 0, "CB6_V1THD" }, - {IR_LONG, 638, 0, "CB6_V2THD" }, - {IR_LONG, 640, 0, "CB6_V3THD" }, - {IR_LONG, 642, 0, "CB6_I1THD" }, - {IR_LONG, 644, 0, "CB6_I2THD" }, - {IR_LONG, 646, 0, "CB6_I3THD" }, - {IR_LONG, 648, 0, "CB6_I1Kfactor" }, - {IR_LONG, 650, 0, "CB6_I2Kfactor" }, - {IR_LONG, 652, 0, "CB6_I3Kfactor" }, - {IR_LONG, 654, 0, "CB6_I1TDD" }, - {IR_LONG, 656, 0, "CB6_I2TDD" }, - {IR_LONG, 658, 0, "CB6_I3TDD" }, - {IR_LONG, 660, 0, "CB6_V12" }, - {IR_LONG, 662, 0, "CB6_V23" }, - {IR_LONG, 664, 0, "CB6_V31" }, - {IR_LONG, 666, 0, "CB6_TotalKW" }, - {IR_LONG, 668, 0, "CB6_TotalKVar" }, - {IR_LONG, 670, 0, "CB6_TotalKVA" }, - {IR_LONG, 672, 0, "CB6_TotalPF" }, - {IR_LONG, 674, 0, "CB6_TotalPFLag" }, - {IR_LONG, 676, 0, "CB6_TotalPFLead" }, - {IR_LONG, 678, 0, "CB6_TotalKWImport" }, - {IR_LONG, 680, 0, "CB6_TotalKWExport" }, - {IR_LONG, 682, 0, "CB6_TotalKVarImport" }, - {IR_LONG, 684, 0, "CB6_TotalKVarExport" }, - {IR_LONG, 686, 0, "CB6_LN_Avg" }, - {IR_LONG, 688, 0, "CB6_LL_Avg" }, - {IR_LONG, 699, 0, "CB6_Status" }, - - // Circuit Breaker 7 (OB07) - {IR_LONG, 700, 0, "CB7_V1N" }, - {IR_LONG, 702, 0, "CB7_V2N" }, - {IR_LONG, 704, 0, "CB7_V3N" }, - {IR_LONG, 706, 0, "CB7_I1" }, - {IR_LONG, 708, 0, "CB7_I2" }, - {IR_LONG, 710, 0, "CB7_I3" }, - {IR_LONG, 712, 0, "CB7_L1KW" }, - {IR_LONG, 714, 0, "CB7_L2KW" }, - {IR_LONG, 716, 0, "CB7_L3KW" }, - {IR_LONG, 718, 0, "CB7_L1KVar" }, - {IR_LONG, 720, 0, "CB7_L2KVar" }, - {IR_LONG, 722, 0, "CB7_L3KVar" }, - {IR_LONG, 724, 0, "CB7_L1KVA" }, - {IR_LONG, 726, 0, "CB7_L2KVA" }, - {IR_LONG, 728, 0, "CB7_L3KVA" }, - {IR_LONG, 730, 0, "CB7_L1PF" }, - {IR_LONG, 732, 0, "CB7_L2PF" }, - {IR_LONG, 734, 0, "CB7_L3PF" }, - {IR_LONG, 736, 0, "CB7_V1THD" }, - {IR_LONG, 738, 0, "CB7_V2THD" }, - {IR_LONG, 740, 0, "CB7_V3THD" }, - {IR_LONG, 742, 0, "CB7_I1THD" }, - {IR_LONG, 744, 0, "CB7_I2THD" }, - {IR_LONG, 746, 0, "CB7_I3THD" }, - {IR_LONG, 748, 0, "CB7_I1Kfactor" }, - {IR_LONG, 750, 0, "CB7_I2Kfactor" }, - {IR_LONG, 752, 0, "CB7_I3Kfactor" }, - {IR_LONG, 754, 0, "CB7_I1TDD" }, - {IR_LONG, 756, 0, "CB7_I2TDD" }, - {IR_LONG, 758, 0, "CB7_I3TDD" }, - {IR_LONG, 760, 0, "CB7_V12" }, - {IR_LONG, 762, 0, "CB7_V23" }, - {IR_LONG, 764, 0, "CB7_V31" }, - {IR_LONG, 766, 0, "CB7_TotalKW" }, - {IR_LONG, 768, 0, "CB7_TotalKVar" }, - {IR_LONG, 770, 0, "CB7_TotalKVA" }, - {IR_LONG, 772, 0, "CB7_TotalPF" }, - {IR_LONG, 774, 0, "CB7_TotalPFLag" }, - {IR_LONG, 776, 0, "CB7_TotalPFLead" }, - {IR_LONG, 778, 0, "CB7_TotalKWImport" }, - {IR_LONG, 780, 0, "CB7_TotalKWExport" }, - {IR_LONG, 782, 0, "CB7_TotalKVarImport" }, - {IR_LONG, 784, 0, "CB7_TotalKVarExport" }, - {IR_LONG, 786, 0, "CB7_LN_Avg" }, - {IR_LONG, 788, 0, "CB7_LL_Avg" }, - {IR_LONG, 799, 0, "CB7_Status" }, - - // Circuit Breaker 8 (OB08) - {IR_LONG, 800, 0, "CB8_V1N" }, - {IR_LONG, 802, 0, "CB8_V2N" }, - {IR_LONG, 804, 0, "CB8_V3N" }, - {IR_LONG, 806, 0, "CB8_I1" }, - {IR_LONG, 808, 0, "CB8_I2" }, - {IR_LONG, 810, 0, "CB8_I3" }, - {IR_LONG, 812, 0, "CB8_L1KW" }, - {IR_LONG, 814, 0, "CB8_L2KW" }, - {IR_LONG, 816, 0, "CB8_L3KW" }, - {IR_LONG, 818, 0, "CB8_L1KVar" }, - {IR_LONG, 820, 0, "CB8_L2KVar" }, - {IR_LONG, 822, 0, "CB8_L3KVar" }, - {IR_LONG, 824, 0, "CB8_L1KVA" }, - {IR_LONG, 826, 0, "CB8_L2KVA" }, - {IR_LONG, 828, 0, "CB8_L3KVA" }, - {IR_LONG, 830, 0, "CB8_L1PF" }, - {IR_LONG, 832, 0, "CB8_L2PF" }, - {IR_LONG, 834, 0, "CB8_L3PF" }, - {IR_LONG, 836, 0, "CB8_V1THD" }, - {IR_LONG, 838, 0, "CB8_V2THD" }, - {IR_LONG, 840, 0, "CB8_V3THD" }, - {IR_LONG, 842, 0, "CB8_I1THD" }, - {IR_LONG, 844, 0, "CB8_I2THD" }, - {IR_LONG, 846, 0, "CB8_I3THD" }, - {IR_LONG, 848, 0, "CB8_I1Kfactor" }, - {IR_LONG, 850, 0, "CB8_I2Kfactor" }, - {IR_LONG, 852, 0, "CB8_I3Kfactor" }, - {IR_LONG, 854, 0, "CB8_I1TDD" }, - {IR_LONG, 856, 0, "CB8_I2TDD" }, - {IR_LONG, 858, 0, "CB8_I3TDD" }, - {IR_LONG, 860, 0, "CB8_V12" }, - {IR_LONG, 862, 0, "CB8_V23" }, - {IR_LONG, 864, 0, "CB8_V31" }, - {IR_LONG, 866, 0, "CB8_TotalKW" }, - {IR_LONG, 868, 0, "CB8_TotalKVar" }, - {IR_LONG, 870, 0, "CB8_TotalKVA" }, - {IR_LONG, 872, 0, "CB8_TotalPF" }, - {IR_LONG, 874, 0, "CB8_TotalPFLag" }, - {IR_LONG, 876, 0, "CB8_TotalPFLead" }, - {IR_LONG, 878, 0, "CB8_TotalKWImport" }, - {IR_LONG, 880, 0, "CB8_TotalKWExport" }, - {IR_LONG, 882, 0, "CB8_TotalKVarImport" }, - {IR_LONG, 884, 0, "CB8_TotalKVarExport" }, - {IR_LONG, 886, 0, "CB8_LN_Avg" }, - {IR_LONG, 888, 0, "CB8_LL_Avg" }, - {IR_LONG, 899, 0, "CB8_Status" }, - - // Circuit Breaker 8 (OB08) - {IR_LONG, 900, 0, "CB9_V1N" }, - {IR_LONG, 902, 0, "CB9_V2N" }, - {IR_LONG, 904, 0, "CB9_V3N" }, - {IR_LONG, 906, 0, "CB9_I1" }, - {IR_LONG, 908, 0, "CB9_I2" }, - {IR_LONG, 910, 0, "CB9_I3" }, - {IR_LONG, 912, 0, "CB9_L1KW" }, - {IR_LONG, 914, 0, "CB9_L2KW" }, - {IR_LONG, 916, 0, "CB9_L3KW" }, - {IR_LONG, 918, 0, "CB9_L1KVar" }, - {IR_LONG, 920, 0, "CB9_L2KVar" }, - {IR_LONG, 922, 0, "CB9_L3KVar" }, - {IR_LONG, 924, 0, "CB9_L1KVA" }, - {IR_LONG, 926, 0, "CB9_L2KVA" }, - {IR_LONG, 928, 0, "CB9_L3KVA" }, - {IR_LONG, 930, 0, "CB9_L1PF" }, - {IR_LONG, 932, 0, "CB9_L2PF" }, - {IR_LONG, 934, 0, "CB9_L3PF" }, - {IR_LONG, 936, 0, "CB9_V1THD" }, - {IR_LONG, 938, 0, "CB9_V2THD" }, - {IR_LONG, 940, 0, "CB9_V3THD" }, - {IR_LONG, 942, 0, "CB9_I1THD" }, - {IR_LONG, 944, 0, "CB9_I2THD" }, - {IR_LONG, 946, 0, "CB9_I3THD" }, - {IR_LONG, 948, 0, "CB9_I1Kfactor" }, - {IR_LONG, 950, 0, "CB9_I2Kfactor" }, - {IR_LONG, 952, 0, "CB9_I3Kfactor" }, - {IR_LONG, 954, 0, "CB9_I1TDD" }, - {IR_LONG, 956, 0, "CB9_I2TDD" }, - {IR_LONG, 958, 0, "CB9_I3TDD" }, - {IR_LONG, 960, 0, "CB9_V12" }, - {IR_LONG, 962, 0, "CB9_V23" }, - {IR_LONG, 964, 0, "CB9_V31" }, - {IR_LONG, 966, 0, "CB9_TotalKW" }, - {IR_LONG, 968, 0, "CB9_TotalKVar" }, - {IR_LONG, 970, 0, "CB9_TotalKVA" }, - {IR_LONG, 972, 0, "CB9_TotalPF" }, - {IR_LONG, 974, 0, "CB9_TotalPFLag" }, - {IR_LONG, 976, 0, "CB9_TotalPFLead" }, - {IR_LONG, 978, 0, "CB9_TotalKWImport" }, - {IR_LONG, 980, 0, "CB9_TotalKWExport" }, - {IR_LONG, 982, 0, "CB9_TotalKVarImport" }, - {IR_LONG, 984, 0, "CB9_TotalKVarExport" }, - {IR_LONG, 986, 0, "CB9_LN_Avg" }, - {IR_LONG, 988, 0, "CB9_LL_Avg" }, - {IR_LONG, 999, 0, "CB9_Status" }, - - {IR_FLOAT, 1068, 0, "Amps G" }, - {IR_FLOAT, 1066, 0, "Amps N" }, - {IR_FLOAT, 1087, 0, "kWh" }, - {IR_FLOAT, 1091, 0, "PF" }, + // Circuit Breaker 6 (CB1) + {IR_LONG, 606, 0, "CB6_I1" }, //0.01x + {IR_LONG, 608, 0, "CB6_I2" }, //0.01x + {IR_LONG, 610, 0, "CB6_I3" }, //0.01x + {IR_LONG, 670, 0, "CB6_kVA" }, //0.001x + {IR_LONG, 624, 0, "CB6_kVA1" }, //0.001x + {IR_LONG, 626, 0, "CB6_kVA2" }, //0.001x + {IR_LONG, 628, 0, "CB6_kVA3" }, //0.001x + {IR_LONG, 668, 0, "CB6_kVAR" }, //0.001x + {IR_LONG, 666, 0, "CB6_kW" }, //0.001x + {IR_LONG, 612, 0, "CB6_kW1" }, //0.001x + {IR_LONG, 614, 0, "CB6_kW2" }, //0.001x + {IR_LONG, 616, 0, "CB6_kW3" }, //0.001x + {IR_LONG, 1388, 0, "CB6_kWh" }, + {IR_LONG, 672, 0, "CB6_PF" }, //0.001x + // Circuit Breaker 7 (CB1) + {IR_LONG, 706, 0, "CB7_I1" }, //0.01x + {IR_LONG, 708, 0, "CB7_I2" }, //0.01x + {IR_LONG, 710, 0, "CB7_I3" }, //0.01x + {IR_LONG, 770, 0, "CB7_kVA" }, //0.001x + {IR_LONG, 724, 0, "CB7_kVA1" }, //0.001x + {IR_LONG, 726, 0, "CB7_kVA2" }, //0.001x + {IR_LONG, 728, 0, "CB7_kVA3" }, //0.001x + {IR_LONG, 768, 0, "CB7_kVAR" }, //0.001x + {IR_LONG, 766, 0, "CB7_kW" }, //0.001x + {IR_LONG, 712, 0, "CB7_kW1" }, //0.001x + {IR_LONG, 714, 0, "CB7_kW2" }, //0.001x + {IR_LONG, 716, 0, "CB7_kW3" }, //0.001x + {IR_LONG, 1443, 0, "CB7_kWh" }, + {IR_LONG, 772, 0, "CB7_PF" }, //0.001x + + // Circuit Breaker 8 (CB1) + {IR_LONG, 806, 0, "CB8_I1" }, //0.01x + {IR_LONG, 808, 0, "CB8_I2" }, //0.01x + {IR_LONG, 810, 0, "CB8_I3" }, //0.01x + {IR_LONG, 870, 0, "CB8_kVA" }, //0.001x + {IR_LONG, 824, 0, "CB8_kVA1" }, //0.001x + {IR_LONG, 826, 0, "CB8_kVA2" }, //0.001x + {IR_LONG, 828, 0, "CB8_kVA3" }, //0.001x + {IR_LONG, 868, 0, "CB8_kVAR" }, //0.001x + {IR_LONG, 866, 0, "CB8_kW" }, //0.001x + {IR_LONG, 812, 0, "CB8_kW1" }, //0.001x + {IR_LONG, 814, 0, "CB8_kW2" }, //0.001x + {IR_LONG, 816, 0, "CB8_kW3" }, //0.001x + {IR_LONG, 1498, 0, "CB8_kWh" }, + {IR_LONG, 872, 0, "CB8_PF" }, //0.001x + + // PDU Output + {IR_LONG, 906, 0, "Output_I1" }, //0.01x + {IR_LONG, 908, 0, "Output_I2" }, + {IR_LONG, 910, 0, "Output_I3" }, + {IR_LONG, 1068, 0, "Output_IG" }, + {IR_LONG, 1066, 0, "Output_IN" }, + {IR_LONG, 924, 0, "Output_kVA1" }, //0.001 + {IR_LONG, 926, 0, "Output_kVA2" }, + {IR_LONG, 928, 0, "Output_kVA3" }, + {IR_LONG, 968, 0, "Output_kVAR" }, //0.001 + {IR_LONG, 912, 0, "Output_kW1" }, //0.001x + {IR_LONG, 914, 0, "Output_kW2" }, + {IR_LONG, 916, 0, "Output_kW3" }, + {IR_LONG, 1086, 0, "Output_kWh" }, + {IR_LONG, 1091, 0, "Output_PF" }, //0.001 + {IR_LONG, 960, 0, "Output_V_AB" }, + {IR_LONG, 900, 0, "Output_V_AN" }, //0.01x + {IR_LONG, 962, 0, "Output_V_BC" }, + {IR_LONG, 902, 0, "Output_V_BN" }, + {IR_LONG, 964, 0, "Output_V_CA" }, + {IR_LONG, 904, 0, "Output_V_CN" }, + {IR, 1550, 0, "CB_Status" }, {IR, 1551, 0, "CB_Tripped" }, - }; //Size of modbus map used in FOR cycles, automatically calculated. From 900f38fb5c0832db1579b221a3ce1704af708a10 Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Mon, 27 Oct 2025 17:46:42 -0500 Subject: [PATCH 04/11] save --- platformio.ini | 3 +- .../ATS/ATS_Eaton_ATC900_RPD_TCP/config.h | 2 +- .../Breaker/BKR_ABB_XT_TCP/State_Running.cpp | 34 +- .../Breaker/BKR_ABB_XT_TCP/State_Standby.cpp | 14 +- src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h | 6 +- .../BKR_Eaton_PXR20_25/State_Running.cpp | 6 +- .../BKR_Eaton_PXR20_25/State_Standby.cpp | 9 +- src/EPMS/Breaker/BKR_Eaton_PXR20_25/config.h | 8 +- .../PDU_Maverick_Power_TCP/State_Running.cpp | 443 ++++++++++-------- .../PDU_Maverick_Power_TCP/State_Standby.cpp | 10 + src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h | 6 +- src/EPMS/PQM/PQM_PM9000_TCP/State_Running.cpp | 2 +- src/EPMS/PQM/PQM_PM9000_TCP/State_Standby.cpp | 1 + src/EPMS/PQM/PQM_PM9000_TCP/config.h | 4 +- .../UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp | 184 ++++---- .../UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp | 117 ++--- .../UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp | 103 ++-- src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h | 6 +- 18 files changed, 527 insertions(+), 431 deletions(-) diff --git a/platformio.ini b/platformio.ini index 8d5873a..06422a6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,4 @@ ; PlatformIO Project Configuration File -; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library storages @@ -11,7 +10,7 @@ [platformio] -default_envs = ATS_Eaton_ATC900_RPD_TCP ; Select here the name of the configuration you want to download +default_envs = BKR_ABB_XT_TCP ; Select here the name of the configuration you want to download [env] upload_port = COM50 diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h index 65b58f6..b781b9e 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 169); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 33, 172); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ diff --git a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp index 4aaabcd..54fbf46 100644 --- a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp +++ b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp @@ -38,11 +38,11 @@ */ template<> RunningState::RunningState() { - addStrategy("Volts AB", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("Volts BC", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("Volts CA", new SingleValueStrategy(480.0F, 5.0f, 1000)); + addStrategy("Volts AB", new SingleValueStrategy(4800.0F, 5.0f, 1000)); + addStrategy("Volts BC", new SingleValueStrategy(4800.0F, 5.0f, 1000)); + addStrategy("Volts CA", new SingleValueStrategy(4800.0F, 5.0f, 1000)); - addStrategy("PF", new SingleValueStrategy(90.0f, 1.0f, 1000)); + addStrategy("PF", new SingleValueStrategy(900.0f, 1.0f, 1000)); addStrategy("Amps A", new SingleValueStrategy(1.0f, 10.0f, 1000)); addStrategy("Amps B", new SingleValueStrategy(1.0f, 10.0f, 1000)); @@ -68,7 +68,10 @@ State* RunningState::update(Equipment* equipment) Serial.println("Running update function"); Serial.println("Running update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 1){ + if (State_Ctrl == 0){ + return new StandbyState(); + } + if (State_Ctrl == 2){ return new StandbyState(); } // Apply any strategies defined for the standby state @@ -76,9 +79,9 @@ State* RunningState::update(Equipment* equipment) float volts_BC = getPointValue(equipment, "Volts BC"); float volts_AC = getPointValue(equipment, "Volts CA"); - setPointValue(equipment, "Volts AN", volts_AB/1.732); - setPointValue(equipment, "Volts BN", volts_BC/1.732); - setPointValue(equipment, "Volts CN", volts_AC/1.732); + setPointValue(equipment, "Volts AN", volts_AB/1.732f); + setPointValue(equipment, "Volts BN", volts_BC/1.732f); + setPointValue(equipment, "Volts CN", volts_AC/1.732f); int I_load = getPointValue(equipment, "Load"); @@ -86,18 +89,21 @@ State* RunningState::update(Equipment* equipment) float load = static_cast(I_load); float rating = static_cast(I_rating); float real_load = rating * (load/100.0f); - setPointValue(equipment, "Amps A", real_load); - setPointValue(equipment, "Amps B", real_load); - setPointValue(equipment, "Amps C", real_load); + setPointValue(equipment, "Amps A", real_load * 10.0f); + setPointValue(equipment, "Amps B", real_load * 10.0f); + setPointValue(equipment, "Amps C", real_load * 10.0f); + setPointValue(equipment, "Amps G", volts_AB * 0.037f); + setPointValue(equipment, "Amps N", volts_BC * 0.034f); float pf = getPointValue(equipment, "PF"); - float kw = (1.732f * ((volts_AB + volts_BC + volts_AC)/3.0f) * real_load * (pf/100))/100; - float kva = (1.732f * ((volts_AB + volts_BC + volts_AC)/3.0f) * real_load)/100; + float kva = (1.732f * ((volts_AB + volts_BC + volts_AC)/4.0f) * real_load * (pf/100.0f))/100.0f; + float kw = (1.732f * ((volts_AB + volts_BC + volts_AC)/4.0f) * real_load )/100.0f; setPointValue(equipment, "kW", kw); setPointValue(equipment, "kVA", kva); + setPointValue(equipment, "kWh", 1724.0f); // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; @@ -113,7 +119,7 @@ void RunningState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Running State..."); // You could also update a Modbus register to show the "standby" state - setPointValue(equipment, "CB Position", 1); + setBitValue(equipment, "CB Position", 1, true); } /** diff --git a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp index c51a4c2..ab732df 100644 --- a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp +++ b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp @@ -57,9 +57,16 @@ State* StandbyState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Standby update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 2){ + if (State_Ctrl == 1){ return new RunningState(); } + + if (State_Ctrl == 0){ + setBitValue(equipment, "CB Position", 12, false); + } + if (State_Ctrl == 2){ + setBitValue(equipment, "CB Position", 12, true); + } // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; @@ -75,7 +82,7 @@ template<> void StandbyState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Standby State..."); - setPointValue(equipment, "CB Position", 0); + setBitValue(equipment, "CB Position", 0, false); setPointValue(equipment, "Volts AB", 0.0f); setPointValue(equipment, "Volts BC", 0.0f); setPointValue(equipment, "Volts CA", 0.0f); @@ -86,8 +93,11 @@ void StandbyState::enterState(Equipment* equipment) { setPointValue(equipment, "Amps A", 0.0f); setPointValue(equipment, "Amps B", 0.0f); setPointValue(equipment, "Amps C", 0.0f); + setPointValue(equipment, "Amps G", 0.0f); + setPointValue(equipment, "Amps N", 0.0f); setPointValue(equipment, "kW", 0.0f); setPointValue(equipment, "kVA", 0.0f); + setPointValue(equipment, "kWh", 0.0f); } /** diff --git a/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h b/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h index f3742ab..018a5ed 100644 --- a/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h +++ b/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h @@ -23,8 +23,8 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 30, 241); /**< @brief The static IP address for the device. */ - IPAddress gateway(172, 17, 30, 1); /**< @brief The gateway IP address. */ + IPAddress local_IP(172, 17, 33, 150); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; @@ -63,7 +63,7 @@ modbusMap mb_map[] = {HR, 9, 0, "State Control"}, //Open-Close Cmd {HR, 10, 0, "Load"}, //Adjustble Load {HR, 11, 0, "Rating"}, //Max amp to calculate kw, kVA, etc - {IR_LONG, 41, 0, "CB Position"}, + {IR_LONG, 41, 0, "CB Position"}, //b0 close open b12 tripped {IR_LONG, 101, 0, "Amps A"}, {IR_LONG, 103, 0, "Amps B"}, {IR_LONG, 105, 0, "Amps C"}, diff --git a/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Running.cpp b/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Running.cpp index 16d2903..431ab66 100644 --- a/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Running.cpp +++ b/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Running.cpp @@ -68,7 +68,10 @@ State* RunningState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Running update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 1){ + if (State_Ctrl == 0){ + return new StandbyState(); + } + if (State_Ctrl == 2){ return new StandbyState(); } // Apply any strategies defined for the standby state @@ -118,6 +121,7 @@ void RunningState::enterState(Equipment* equipment) { Serial.println("Enter Running State..."); // You could also update a Modbus register to show the "standby" state setPointValue(equipment, "CB Position", 2048); + setPointValue(equipment, "CB Trip", 0.0f); } diff --git a/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Standby.cpp b/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Standby.cpp index 5dd2e42..f2195c2 100644 --- a/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Standby.cpp +++ b/src/EPMS/Breaker/BKR_Eaton_PXR20_25/State_Standby.cpp @@ -57,9 +57,16 @@ State* StandbyState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Standby update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 2){ + if (State_Ctrl == 1){ return new RunningState(); } + + if (State_Ctrl == 0){ + setPointValue(equipment, "CB Trip", 0.0f); + } + if (State_Ctrl == 2){ + setPointValue(equipment, "CB Trip", 1.0f); + } // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/EPMS/Breaker/BKR_Eaton_PXR20_25/config.h b/src/EPMS/Breaker/BKR_Eaton_PXR20_25/config.h index 79be276..6a3bd12 100644 --- a/src/EPMS/Breaker/BKR_Eaton_PXR20_25/config.h +++ b/src/EPMS/Breaker/BKR_Eaton_PXR20_25/config.h @@ -21,10 +21,10 @@ * @{ */ #include - const char *ssid = "wifi_name"; /**< @brief The SSID of the WiFi network. */ - const char *password = "wifi_password"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(192, 168, 1, 234); /**< @brief The static IP address for the device. */ - IPAddress gateway(192, 168, 1, 1); /**< @brief The gateway IP address. */ + const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ + const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ + IPAddress local_IP(172, 17, 33, 167); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp index c3e5fca..765a521 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Running.cpp @@ -40,68 +40,86 @@ std::string cbs[] = {"CB1", "CB2", "CB3", "CB4", "CB5", "CB6", "CB7", "CB8"}; template<> RunningState::RunningState() { + addStrategy("Input_I1", new SingleValueStrategy(40.0f, 30.0f, 1000)); + addStrategy("Input_I2", new SingleValueStrategy(40.0f, 30.0f, 1000)); + addStrategy("Input_I3", new SingleValueStrategy(40.0f, 30.0f, 1000)); + addStrategy("Input_kVA", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Input_kVAR", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Input_kW", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Input_kWh", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_PF", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Input_V_AB", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_V_AN", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_V_BC", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_V_BN", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_V_CA", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_V_CN", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_LL_Avg", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Input_LN_Avg", new SingleValueStrategy(3.0f, 2.0f, 1000)); + for (const std::string& cb : cbs) { std::string tag = ""; - tag = cb + "_V1N"; + tag = ""; + tag = cb + "_I1"; addStrategy(tag, new SingleValueStrategy(40.0f, 30.0f, 1000)); tag = ""; - tag = cb + "_V2N"; + tag = cb + "_I2"; addStrategy(tag, new SingleValueStrategy(40.0f, 30.0f, 1000)); tag = ""; - tag = cb + "_V3N"; + tag = cb + "_I3"; addStrategy(tag, new SingleValueStrategy(40.0f, 30.0f, 1000)); - tag = ""; - tag = cb + "_V1THD"; - addStrategy(tag, new SingleValueStrategy(20.0f, 7.0f, 1000)); + tag = cb + "_kVA"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_V2THD"; - addStrategy(tag, new SingleValueStrategy(20.0f, 7.0f, 1000)); + tag = cb + "_kVA1"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_V3THD"; - addStrategy(tag, new SingleValueStrategy(20.0f, 7.0f, 1000)); - tag = ""; - tag = cb + "_I1THD"; - addStrategy(tag, new SingleValueStrategy(100.0f, 12.0f, 1000)); + tag = cb + "_kVA2"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I2THD"; - addStrategy(tag, new SingleValueStrategy(100.0f, 12.0f, 1000)); + tag = cb + "_kVA3"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I3THD"; - addStrategy(tag, new SingleValueStrategy(100.0f, 12.0f, 1000)); + tag = cb + "_kVAR"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I1Kfactor"; - addStrategy(tag, new SingleValueStrategy(30.0f, 6.0f, 1000)); + tag = cb + "_kW"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I2Kfactor"; - addStrategy(tag, new SingleValueStrategy(30.0f, 6.0f, 1000)); + tag = cb + "_kW1"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I3Kfactor"; - addStrategy(tag, new SingleValueStrategy(30.0f, 6.0f, 1000)); + tag = cb + "_kW2"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I1TDD"; - addStrategy(tag, new SingleValueStrategy(50.0f, 9.0f, 1000)); + tag = cb + "_kW3"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); tag = ""; - tag = cb + "_I2TDD"; - addStrategy(tag, new SingleValueStrategy(50.0f, 9.0f, 1000)); + tag = cb + "_kWh"; + addStrategy(tag, new SingleValueStrategy(0.1f, 100.0f, 1000)); tag = ""; - tag = cb + "_I3TDD"; - addStrategy(tag, new SingleValueStrategy(50.0f, 9.0f, 1000)); - tag = ""; - tag = cb + "_V12"; - addStrategy(tag, new SingleValueStrategy(0.0f, 30.0f, 1000)); - tag = ""; - tag = cb + "_V23"; - addStrategy(tag, new SingleValueStrategy(0.0f, 30.0f, 1000)); - tag = ""; - tag = cb + "_V31"; - addStrategy(tag, new SingleValueStrategy(0.0f, 30.0f, 1000)); + tag = cb + "_PF"; + addStrategy(tag, new SingleValueStrategy(150.0f, 100.0f, 1000)); } - addStrategy("Amps G", new SingleValueStrategy(0.0f, 2.0f, 1000)); - addStrategy("Amps N", new SingleValueStrategy(0.0f, 3.0f, 1000)); - addStrategy("kWh", new RampStrategy(5000000.0f, 1.0f, 1000)); - addStrategy("PF", new SingleValueStrategy(0.0f, 1.0f, 1000)); + + addStrategy("Output_I1", new SingleValueStrategy(30.0f, 20.0f, 1000)); + addStrategy("Output_I2", new SingleValueStrategy(30.0f, 30.0f, 1000)); + addStrategy("Output_I3", new SingleValueStrategy(30.0f, 20.0f, 1000)); + addStrategy("Output_IG", new SingleValueStrategy(30.0f, 30.0f, 1000)); + addStrategy("Output_IN", new SingleValueStrategy(30.0f, 20.0f, 1000)); + addStrategy("Output_kVA1", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Output_kVA2", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Output_kVA3", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Output_kWh", new SingleValueStrategy(3.0f, 2.0f, 1000)); + addStrategy("Output_PF", new SingleValueStrategy(150.0f, 100.0f, 1000)); + addStrategy("Output_V_AB", new SingleValueStrategy(30.0f, 20.0f, 1000)); + addStrategy("Output_V_AN", new SingleValueStrategy(30.0f, 30.0f, 1000)); + addStrategy("Output_V_BC", new SingleValueStrategy(30.0f, 20.0f, 1000)); + addStrategy("Output_V_BN", new SingleValueStrategy(30.0f, 30.0f, 1000)); + addStrategy("Output_V_CA", new SingleValueStrategy(30.0f, 20.0f, 1000)); + addStrategy("Output_V_CN", new SingleValueStrategy(30.0f, 30.0f, 1000)); } /** @@ -132,14 +150,14 @@ State* RunningState::update(Equipment* equipment) float cb_count = 0.0f; for (const std::string& cb :cbs){ std::string tag = ""; - tag = "Px " + cb; - if (cb == "CB0") continue; + tag = "Px_" + cb; float cb_status = getPointValue(equipment, tag); if (cb_status == 1.0f){ cb_count += 1.0f; } } - int cb_num = 0; + Serial.printf("CB_ CLosed = %f \n", cb_count); + int cb_num = 1; for (const std::string& cb : cbs) { std::string tag = ""; Strategy_Behavior* strategy = nullptr; @@ -148,83 +166,75 @@ State* RunningState::update(Equipment* equipment) float cb_status = getPointValue(equipment, tag); float percent_load = getPointValue(equipment, "Px Load"); float Rating = getPointValue(equipment, "Px Rating"); - float total_load = Rating * (percent_load /100.0f); - float cb_load = total_load / cb_count; - + float cb_load = 400.0f * (percent_load /1000.0f); + if (cb_status == 1.0f){ setBitValue(equipment, "CB_Status", cb_num, true); setBitValue(equipment, "CB_Tripped", cb_num, false); - strategy = getStrategy("Amps G"); - static_cast(strategy)->setSetpoint(65.0f); - strategy = getStrategy("Amps N"); - static_cast(strategy)->setSetpoint(50.0f); - strategy = getStrategy("PF"); - static_cast(strategy)->setSetpoint(90.0f); - tag = ""; - tag = cb + "_V1N"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(2700.0f); - tag = ""; - tag = cb + "_V2N"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(2700.0f); - tag = ""; - tag = cb + "_V3N"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(2700.0f); - - tag = ""; - tag = cb + "_V12"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(4800.0f); - tag = ""; - tag = cb + "_V23"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(4800.0f); - tag = ""; - tag = cb + "_V31"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(4800.0f); - tag = ""; tag = cb + "_I1"; - setPointValue(equipment, tag, total_load * 100.0f); + setPointValue(equipment, tag, cb_load * 1000.0f); tag = ""; tag = cb + "_I2"; - setPointValue(equipment, tag, total_load * 100.0f); + setPointValue(equipment, tag, cb_load * 1000.0f); tag = ""; tag = cb + "_I3"; - setPointValue(equipment, tag, total_load * 100.0f); + setPointValue(equipment, tag, cb_load * 1000.0f); + tag = ""; + tag = cb + "_PF"; + setPointValue(equipment, tag, 910.0f); + tag = ""; + tag = cb + "_PF"; + float pf = getPointValue(equipment, tag); + tag = ""; - tag = cb + "_L1KW"; - setPointValue(equipment, tag, total_load * 1715.0f); + tag = cb + "_kW1"; + setPointValue(equipment, tag, cb_load * 48000.0f * pf); + float kW1 = getPointValue(equipment, tag); tag = ""; - tag = cb + "_L2KW"; - setPointValue(equipment, tag, total_load * 1715.0f); + tag = cb + "_kW2"; + setPointValue(equipment, tag, cb_load * 48000.0f * pf); + float kW2 = getPointValue(equipment, tag); tag = ""; - tag = cb + "_L3KW"; - setPointValue(equipment, tag, total_load * 1715.0f); + tag = cb + "_kW3"; + setPointValue(equipment, tag, cb_load * 48000.0f * pf); + float kW3 = getPointValue(equipment, tag); + tag = ""; + tag = cb + "_kW"; + setPointValue(equipment, tag, ((kW1 + kW2 + kW3) / 3.0f)*1000.0f); + tag = ""; + tag = cb + "_kWh"; + setPointValue(equipment, tag, 1325.0f); + tag = ""; + tag = cb + "_kVA"; + setPointValue(equipment, tag, cb_load * 480.0f * 10000.0f); + tag = ""; + tag = cb + "_kVA"; + setPointValue(equipment, tag, cb_load * 480.0f * 10000.0f); + tag = ""; + tag = cb + "_kVA"; + setPointValue(equipment, tag, cb_load * 480.0f * 10000.0f); tag = ""; - tag = cb + "_L1KVar"; - setPointValue(equipment, tag, total_load * 1715.0f * 0.9f); + tag = cb + "_kVA1"; + float kVA1 = getPointValue(equipment, tag); tag = ""; - tag = cb + "_L2KVar"; - setPointValue(equipment, tag, total_load * 1715.0f * 0.9f); + tag = cb + "_kVA2"; + float kVA2 = getPointValue(equipment, tag); tag = ""; - tag = cb + "_L3KVar"; - setPointValue(equipment, tag, total_load * 1715.0f * 0.9f); + tag = cb + "_kVA3"; + float kVA3 = getPointValue(equipment, tag); + float kVA = (kVA1 + kVA2 + kVA3) * 1732.0f; tag = ""; - tag = cb + "_L1KVA"; - setPointValue(equipment, tag, total_load * 1715.0f); + tag = cb + "_kVA"; + setPointValue(equipment, tag, kVA); tag = ""; - tag = cb + "_L2KVA"; - setPointValue(equipment, tag, total_load * 1715.0f); - tag = ""; - tag = cb + "_L3KVA"; - setPointValue(equipment, tag, total_load * 1715.0f); + tag = cb + "_kVAR"; + setPointValue(equipment, tag, kVA / pf); + + } else{ if (cb_status == 2.0f){ @@ -233,110 +243,147 @@ State* RunningState::update(Equipment* equipment) setBitValue(equipment, "CB_Tripped", cb_num, false); } setBitValue(equipment, "CB_Status", cb_num, false); - strategy = getStrategy("Amps G"); - static_cast(strategy)->setSetpoint(0.0f); - strategy = getStrategy("Amps N"); - static_cast(strategy)->setSetpoint(0.0f); - strategy = getStrategy("PF"); - static_cast(strategy)->setSetpoint(0.0f); - tag = ""; - tag = cb + "_V1N"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(0.0f); - tag = ""; - tag = cb + "_V2N"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(0.0f); - tag = ""; - tag = cb + "_V3N"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(0.0f); - - tag = ""; - tag = cb + "_V12"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(0.0f); - tag = ""; - tag = cb + "_V23"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(0.0f); - tag = ""; - tag = cb + "_V31"; - strategy = getStrategy(tag); - static_cast(strategy)->setSetpoint(0.0f); - - tag = ""; - tag = cb + "_I1"; - setPointValue(equipment, tag, total_load); - tag = ""; - tag = cb + "_I2"; - setPointValue(equipment, tag, total_load); - tag = ""; - tag = cb + "_I3"; - setPointValue(equipment, tag, total_load); - - tag = ""; - tag = cb + "_L1KW"; - setPointValue(equipment, tag, total_load*0.0f); - tag = ""; - tag = cb + "_L2KW"; - setPointValue(equipment, tag, total_load*0.0f); - tag = ""; - tag = cb + "_L3KW"; - setPointValue(equipment, tag, total_load*0.0f); - - tag = ""; - tag = cb + "_L1KVar"; - setPointValue(equipment, tag, total_load*0.0f); - tag = ""; - tag = cb + "_L2KVar"; - setPointValue(equipment, tag, total_load*0.0f); - tag = ""; - tag = cb + "_L3KVar"; - setPointValue(equipment, tag, total_load*0.0f); - tag = ""; - tag = cb + "_L1KVA"; - setPointValue(equipment, tag, 0.0f); - tag = ""; - tag = cb + "_L2KVA"; - setPointValue(equipment, tag, 0.0f); - tag = ""; - tag = cb + "_L3KVA"; - setPointValue(equipment, tag, 0.0f); + tag = ""; + tag = cb + "_I1"; + setPointValue(equipment, tag, 40.0f); + tag = ""; + tag = cb + "_I2"; + setPointValue(equipment, tag, 0.0f); + tag = ""; + tag = cb + "_I3"; + setPointValue(equipment, tag, 40.0f); + tag = ""; + tag = cb + "_kVA"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kVA1"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kVA2"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kVA3"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kVAR"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kW"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kW1"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kW2"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kW3"; + setPointValue(equipment, tag, 150.0f); + tag = ""; + tag = cb + "_kWh"; + setPointValue(equipment, tag, 0.5f); + tag = ""; + tag = cb + "_PF"; + setPointValue(equipment, tag, 150.0f); } cb_num++; - float kw1 = getPointValue(equipment, cb + "_L1KW"); - float kw2 = getPointValue(equipment, cb + "_L2KW"); - float kw3 = getPointValue(equipment, cb + "_L3KW"); - tag = ""; - tag = cb + "_TotalKW"; - setPointValue(equipment, tag, kw1 + kw2 + kw3); + + } + Serial.printf("CB_ CLosed = %f \n", cb_count); + if (cb_count > 0.0f){ + Serial.println("At least one breaker closed..."); + float percent_load = getPointValue(equipment, "Px Load"); + float cb_load = 400.0f * (percent_load /1000.0f); + setPointValue(equipment, "Input_I1", cb_count * cb_load *100.0f); + setPointValue(equipment, "Input_I2", cb_count * cb_load *100.0f); + setPointValue(equipment, "Input_I3", cb_count * cb_load *100.0f); + setPointValue(equipment, "Output_I1", cb_count * cb_load *100.0f); + setPointValue(equipment, "Output_I2", cb_count * cb_load*100.0f); + setPointValue(equipment, "Output_I3", cb_count * cb_load*100.0f); + setPointValue(equipment, "Output_IG", cb_count * 750.0f); + setPointValue(equipment, "Output_IN", cb_count * 482.0f); + + float pf = 0.92f; + setPointValue(equipment, "Input_PF", pf * 930.0f); + setPointValue(equipment, "Output_PF", pf); + float i1 = getPointValue(equipment, "Input_I1"); + float i2 = getPointValue(equipment, "Input_I2"); + float i3 = getPointValue(equipment, "Input_I3"); + + setPointValue(equipment, "Input_kW", 480.0f * ((i1 + i2 + i3) / 3.0f)); + float kW = getPointValue(equipment, "Input_kW"); + setPointValue(equipment, "Input_kVA", kW * 1.732f); + setPointValue(equipment, "Output_kVA1", (kW * 1.732f)/3.0f); + setPointValue(equipment, "Output_kVA2", (kW * 1.732f)/3.0f); + setPointValue(equipment, "Output_kVA3", (kW * 1.732f)/3.0f); + setPointValue(equipment, "Input_kVAR", kW * 1.732f* pf); + setPointValue(equipment, "Output_kVAR", kW * 1.732f* pf); - float kvar1 = getPointValue(equipment, cb + "_L1KVar"); - float kvar2 = getPointValue(equipment, cb + "_L2KVar"); - float kvar3 = getPointValue(equipment, cb + "_L3KVar"); - tag = ""; - tag = cb + "_TotalKVar"; - setPointValue(equipment, tag, kvar1 + kvar2 + kvar3); + setPointValue(equipment, "Output_kW1", kW /3.0f); + setPointValue(equipment, "Output_kW2", kW /3.0f); + setPointValue(equipment, "Output_kW3", kW /3.0f); + + setPointValue(equipment, "Output_kWh", 1423.0f); + + + setPointValue(equipment, "Input_V_AB", 4800.0f); + setPointValue(equipment, "Input_V_AN", 2700.0f); + setPointValue(equipment, "Input_V_BC", 4800.0f); + setPointValue(equipment, "Input_V_BN", 2700.0f); + setPointValue(equipment, "Input_V_CA", 4800.0f); + setPointValue(equipment, "Input_V_CN", 2700.0f); + setPointValue(equipment, "Input_LL_Avg", 4800.0f); + setPointValue(equipment, "Input_LN_Avg", 2700.0f); + setPointValue(equipment, "Output_V_AB", 4800.0f); + setPointValue(equipment, "Output_V_AN", 2700.0f); + setPointValue(equipment, "Output_V_BC", 4800.0f); + setPointValue(equipment, "Output_V_BN", 2700.0f); + setPointValue(equipment, "Output_V_CA", 4800.0f); + setPointValue(equipment, "Output_V_CN", 2700.0f); + } else { + Serial.println("No breaker closed..."); + setPointValue(equipment, "Input_I1", 50.0f); + setPointValue(equipment, "Input_I2", 50.0f); + setPointValue(equipment, "Input_I3", 50.0f); + setPointValue(equipment, "Output_I1", 50.0f); + setPointValue(equipment, "Output_I2", 50.0f); + setPointValue(equipment, "Output_I3", 50.0f); + setPointValue(equipment, "Output_IG", 50.0f); + setPointValue(equipment, "Output_IN", 50.0f); + setPointValue(equipment, "Input_PF", 0.0f); + setPointValue(equipment, "Output_PF", 0.0f); + setPointValue(equipment, "Input_kW", 0.0f); + setPointValue(equipment, "Input_kVA", 0.0f); + setPointValue(equipment, "Output_kVA1", 0.0f); + setPointValue(equipment, "Output_kVA2", 0.0f); + setPointValue(equipment, "Output_kVA3", 0.0f); + setPointValue(equipment, "Input_kVAR", 0.0f); + setPointValue(equipment, "Output_kVAR", 0.0f); + setPointValue(equipment, "Output_kW1", 0.0f); + setPointValue(equipment, "Output_kW2", 0.0f); + setPointValue(equipment, "Output_kW3", 0.0f); + setPointValue(equipment, "Output_kWh", 1.0f); + setPointValue(equipment, "Input_V_AB", 4800.0f); + setPointValue(equipment, "Input_V_AN", 2700.0f); + setPointValue(equipment, "Input_V_BC", 4800.0f); + setPointValue(equipment, "Input_V_BN", 2700.0f); + setPointValue(equipment, "Input_V_CA", 4800.0f); + setPointValue(equipment, "Input_V_CN", 2700.0f); + setPointValue(equipment, "Input_LL_Avg", 4800.0f); + setPointValue(equipment, "Input_LN_Avg", 2700.0f); + setPointValue(equipment, "Output_V_AB", 10.0f); + setPointValue(equipment, "Output_V_AN", 10.0f); + setPointValue(equipment, "Output_V_BC", 10.0f); + setPointValue(equipment, "Output_V_BN", 10.0f); + setPointValue(equipment, "Output_V_CA", 10.0f); + setPointValue(equipment, "Output_V_CN", 10.0f); - float kva1 = getPointValue(equipment, cb + "_L1KVA"); - float kva2 = getPointValue(equipment, cb + "_L2KVA"); - float kva3 = getPointValue(equipment, cb + "_L3KVA"); - tag = ""; - tag = cb + "_TotalKVA"; - setPointValue(equipment, tag, kvar1 + kva2 + kva3); - - float pf1 = getPointValue(equipment, cb + "_L1PF"); - float pf2 = getPointValue(equipment, cb + "_L2PF"); - float pf3 = getPointValue(equipment, cb + "_L3PF"); - float total_pf = (pf1 + pf2 + pf3) / 3.0f; - tag = ""; - tag = cb + "_TotalPF"; - setPointValue(equipment, tag, total_pf); } + + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Standby.cpp b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Standby.cpp index 369b295..b35142e 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Standby.cpp +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/State_Standby.cpp @@ -79,6 +79,16 @@ template<> void StandbyState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Standby State..."); + setPointValue(equipment, "Input_V_AB", 0.0f); + setPointValue(equipment, "Input_V_AN", 0.0f); + setPointValue(equipment, "Input_V_BC", 0.0f); + setPointValue(equipment, "Input_V_BN", 0.0f); + setPointValue(equipment, "Input_V_CA", 0.0f); + setPointValue(equipment, "Input_V_CN", 0.0f); + setPointValue(equipment, "Input_LL_Avg", 0.0f); + setPointValue(equipment, "Input_LN_Avg", 0.0f); + setPointValue(equipment, "Output_PF", 0.0f); + } /** diff --git a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h index f601499..cd8b96f 100644 --- a/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h +++ b/src/EPMS/PDU/PDU_Maverick_Power_TCP/config.h @@ -22,8 +22,8 @@ */ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ - const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 178); /**< @brief The static IP address for the device. */ + const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ + IPAddress local_IP(172, 17, 33, 181); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -46,8 +46,6 @@ ModbusRTU mb; #endif - - /** * @defgroup ModbusMapConfig Modbus Map Configuration * @brief Defines the Modbus register map and related parameters for the emulator. diff --git a/src/EPMS/PQM/PQM_PM9000_TCP/State_Running.cpp b/src/EPMS/PQM/PQM_PM9000_TCP/State_Running.cpp index e60e869..8e3480f 100644 --- a/src/EPMS/PQM/PQM_PM9000_TCP/State_Running.cpp +++ b/src/EPMS/PQM/PQM_PM9000_TCP/State_Running.cpp @@ -43,7 +43,7 @@ RunningState::RunningState() { addStrategy("Volts CA", new SingleValueStrategy(480.0F, 5.0f, 1000)); addStrategy("PF", new SingleValueStrategy(0.9f, 0.05f, 1000)); - + addStrategy("Frequency", new SingleValueStrategy(60.0f, 0.7f, 1000)); addStrategy("Amps A", new SingleValueStrategy(1.0f, 10.0f, 1000)); addStrategy("Amps B", new SingleValueStrategy(1.0f, 10.0f, 1000)); addStrategy("Amps C", new SingleValueStrategy(1.0f, 10.0f, 1000)); diff --git a/src/EPMS/PQM/PQM_PM9000_TCP/State_Standby.cpp b/src/EPMS/PQM/PQM_PM9000_TCP/State_Standby.cpp index 0600853..65ab9ca 100644 --- a/src/EPMS/PQM/PQM_PM9000_TCP/State_Standby.cpp +++ b/src/EPMS/PQM/PQM_PM9000_TCP/State_Standby.cpp @@ -87,6 +87,7 @@ void StandbyState::enterState(Equipment* equipment) { setPointValue(equipment, "Amps C", 0.0f); setPointValue(equipment, "kW", 0.0f); setPointValue(equipment, "kVA", 0.0f); + setPointValue(equipment, "Frequency", 0.0f); } /** diff --git a/src/EPMS/PQM/PQM_PM9000_TCP/config.h b/src/EPMS/PQM/PQM_PM9000_TCP/config.h index f323a0c..8886755 100644 --- a/src/EPMS/PQM/PQM_PM9000_TCP/config.h +++ b/src/EPMS/PQM/PQM_PM9000_TCP/config.h @@ -23,8 +23,8 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 30, 241); /**< @brief The static IP address for the device. */ - IPAddress gateway(172, 17, 30, 1); /**< @brief The gateway IP address. */ + IPAddress local_IP(172, 17, 33, 174); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp index ce7c1a1..b3c7894 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Battery.cpp @@ -40,32 +40,32 @@ */ template<> BatteryState::BatteryState() { - addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS C-A", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); + addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS C-A", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output RMS Current Phase A", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output RMS Current Phase B", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output RMS Current Phase C", new RampStrategy(10.0f, 50.0f, 1000)); addStrategy("System Output Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); - addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0f, 5.0f, 1000)); - addStrategy("System Output Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Power Phase A", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Power Phase B", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Power Phase C", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs A", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs B", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs C", new RampStrategy(10.0f, 50.0f, 1000)); - addStrategy("Battery Time Remaining", new RampStrategy(0.0F, 0.3f, 1000)); - addStrategy("Percentage Load", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("Battery Time Remaining", new RampStrategy(0.0f, 3.0f, 1000)); + addStrategy("Percentage Load", new RampStrategy(0.0f, 5.0f, 1000)); } /** @@ -96,80 +96,88 @@ State* BatteryState::update(Equipment* equipment) case 4: return new BypassState(); break; - default: + default: break; - } - - float rating = getPointValue(equipment, "Px Rating"); - float load = getPointValue(equipment, "Px Load"); - float real_load = rating * (load/100.f); - - Strategy_Behavior* ramp_strat = nullptr; + } + + float Battery_time = getPointValue(equipment, "Battery Time Remaining"); + float Bat_Percent = Battery_time /4.80f; + float select = 1.0f; + if (Bat_Percent > 98.0f){ + setPointValue(equipment, "UPS Battery Status2", 0.0f); + select = 1.0f; + } + if (Bat_Percent > 20.0f) { + setPointValue(equipment, "UPS Battery Status1", 2.0f); + setPointValue(equipment, "Battery Low", 0.0f); + select = 1.0f; + } + if (Bat_Percent <= 20.0f && Bat_Percent >= 5.0f){ + setPointValue(equipment, "UPS Battery Status1", 3.0f); + setPointValue(equipment, "Battery Low", 1.0f); + select = 0.8f; + } + if (Bat_Percent < 5.0f){ + setPointValue(equipment, "UPS Battery Status1", 4.0f); + select = 0.05f; + } + float rating = getPointValue(equipment, "Px Rating"); + float load = getPointValue(equipment, "Px Load"); + float real_load = (rating) * (load/100.0f); + + Strategy_Behavior* ramp_strat = nullptr; //Output strategies - float Out_Vab = getPointValue(equipment, "System Output RMS A-B"); - ramp_strat = getStrategy("System Output RMS Current Phase A"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vab); - float Out_Vbc = getPointValue(equipment, "System Output RMS B-C"); - ramp_strat = getStrategy("System Output RMS Current Phase B"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vbc); - float Out_Vca = getPointValue(equipment, "System Output RMS C-A"); - ramp_strat = getStrategy("System Output RMS Current Phase C"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vca); + float Out_Vab = getPointValue(equipment, "System Output RMS A-B"); + ramp_strat = getStrategy("System Output RMS Current Phase A"); + static_cast(ramp_strat)->setTarget(real_load*select); + float Out_Vbc = getPointValue(equipment, "System Output RMS B-C"); + ramp_strat = getStrategy("System Output RMS Current Phase B"); + static_cast(ramp_strat)->setTarget(real_load*select); + float Out_Vca = getPointValue(equipment, "System Output RMS C-A"); + ramp_strat = getStrategy("System Output RMS Current Phase C"); + static_cast(ramp_strat)->setTarget(real_load*select); + + float Out_Van = getPointValue(equipment, "System Output RMS A-N"); + float Out_Ia = getPointValue(equipment, "System Output RMS Current Phase A"); + float Out_PFa = getPointValue(equipment, "System Output Power Factor Phs A"); + ramp_strat = getStrategy("System Output Power Phase A"); + static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia); + ramp_strat = getStrategy("System Output Apparent Power Phs A"); + static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * Out_PFa); + + float Out_Vbn = getPointValue(equipment, "System Output RMS B-N"); + float Out_Ib = getPointValue(equipment, "System Output RMS Current Phase B"); + float Out_PFb = getPointValue(equipment, "System Output Power Factor Phs B"); + ramp_strat = getStrategy("System Output Power Phase B"); + static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib); + ramp_strat = getStrategy("System Output Apparent Power Phs B"); + static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * Out_PFb); + + float Out_Vcn = getPointValue(equipment, "System Output RMS C-N"); + float Out_Ic = getPointValue(equipment, "System Output RMS Current Phase C"); + float Out_PFc = getPointValue(equipment, "System Output Power Factor Phs C"); + ramp_strat = getStrategy("System Output Power Phase C"); + static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic); + ramp_strat = getStrategy("System Output Apparent Power Phs C"); + static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * Out_PFc); - float Out_Van = getPointValue(equipment, "System Output RMS A-N"); - float Out_Ia = getPointValue(equipment, "System Output RMS Current Phase A"); - float Out_PFa = getPointValue(equipment, "System Output Power Factor Phs A"); - ramp_strat = getStrategy("System Output Power Phase A"); - static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia); - ramp_strat = getStrategy("System Output Apparent Power Phs A"); - static_cast(ramp_strat)->setTarget(Out_Van * Out_Ia * Out_PFa); - - float Out_Vbn = getPointValue(equipment, "System Output RMS B-N"); - float Out_Ib = getPointValue(equipment, "System Output RMS Current Phase B"); - float Out_PFb = getPointValue(equipment, "System Output Power Factor Phs B"); - ramp_strat = getStrategy("System Output Power Phase B"); - static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib); - ramp_strat = getStrategy("System Output Apparent Power Phs B"); - static_cast(ramp_strat)->setTarget(Out_Vbn * Out_Ib * Out_PFb); - - float Out_Vcn = getPointValue(equipment, "System Output RMS C-N"); - float Out_Ic = getPointValue(equipment, "System Output RMS Current Phase C"); - float Out_PFc = getPointValue(equipment, "System Output Power Factor Phs C"); - ramp_strat = getStrategy("System Output Power Phase C"); - static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic); - ramp_strat = getStrategy("System Output Apparent Power Phs C"); - static_cast(ramp_strat)->setTarget(Out_Vcn * Out_Ic * Out_PFc); - - float Battery_time = getPointValue(equipment, "Battery Time Remaining"); - float Bat_Percent = Battery_time /4.80f; - if (Bat_Percent > 98.0f){ - setPointValue(equipment, "UPS Battery Status2", 0.0f); - } - if (Bat_Percent > 20.0f) { - setPointValue(equipment, "UPS Battery Status1", 2.0f); - setPointValue(equipment, "Battery Low", 0.0f); - } - if (Bat_Percent <= 20.0f && Bat_Percent >= 5.0f){ - setPointValue(equipment, "UPS Battery Status1", 3.0f); - setPointValue(equipment, "Battery Low", 1.0f); - } - if (Bat_Percent < 5.0f){ - setPointValue(equipment, "UPS Battery Status1", 4.0f); - } + setPointValue(equipment, "System Output Power", (real_load * Out_Vab)/1000.0f); + setPointValue(equipment, "System Output Apparent Power", (real_load* Out_Vab * 0.9f)/1000.0f); + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; -} - -/** - * @brief Logic to execute once when entering the Battery state. - * Sets the "Run Status" for all EC fans to 1 to indicate they are active. - * @param equipment Pointer to the Equipment instance. - */ -template<> -void BatteryState::enterState(Equipment* equipment) { - // Logic to run when the equipment enters this state - Serial.println("Enter Battery State..."); + } + + /** + * @brief Logic to execute once when entering the Battery state. + * Sets the "Run Status" for all EC fans to 1 to indicate they are active. + * @param equipment Pointer to the Equipment instance. + */ + template<> + void BatteryState::enterState(Equipment* equipment) { + // Logic to run when the equipment enters this state + Serial.println("Enter Battery State..."); setPointValue(equipment, "System Input RMS A-B", 0.0f); setPointValue(equipment, "System Input RMS B-C", 0.0f); setPointValue(equipment, "System Input RMS C-A", 0.0f); diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp index 73a2b31..0c92458 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Bypass.cpp @@ -42,72 +42,72 @@ template<> BypassState::BypassState() { //Input System - addStrategy("System Input RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Input RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Input RMS C-A", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Input RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Input RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Input RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); + addStrategy("System Input RMS A-B", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Input RMS B-C", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Input RMS C-A", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Input RMS A-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Input RMS B-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Input RMS C-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Input RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Input RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Input RMS Current Phase A", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Input RMS Current Phase B", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Input RMS Current Phase C", new RampStrategy(0.0f, 25.0f, 1000)); - addStrategy("System Input Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); + addStrategy("System Input Frequency", new SingleValueStrategy(60.0f, 2.0f, 1000)); - addStrategy("System Input Power Factor Phs A", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Input Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Input Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); + addStrategy("System Input Power Factor Phs A", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Input Power Factor Phs B", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Input Power Factor Phs C", new SingleValueStrategy(93.0f, 5.0f, 1000)); - addStrategy("System Input Power Phase A", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase B", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase C", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phs A", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phs B", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phs C", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase A", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Power Phase B", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Power Phase C", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Apparent Power Phs A", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Apparent Power Phs B", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Apparent Power Phs C", new RampStrategy(0.0f, 50.0f, 1000)); //Bypass System - addStrategy("Bypass Input Voltage RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("Bypass Input Voltage RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("Bypass Input Voltage RMS C-A", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("Bypass Input Voltage RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("Bypass Input Voltage RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("Bypass Input Voltage RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); + addStrategy("Bypass Input Voltage RMS A-B", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("Bypass Input Voltage RMS B-C", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("Bypass Input Voltage RMS C-A", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("Bypass Input Voltage RMS A-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("Bypass Input Voltage RMS B-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("Bypass Input Voltage RMS C-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); - addStrategy("Bypass Input Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); + addStrategy("Bypass Input Frequency", new SingleValueStrategy(60.0f, 2.0f, 1000)); - addStrategy("Bypass Input Power Phase A", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("Bypass Input Power Phase B", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("Bypass Input Power Phase C", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("Bypass Input Power Phase A", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("Bypass Input Power Phase B", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("Bypass Input Power Phase C", new RampStrategy(0.0f, 25.0f, 1000)); //Output System - addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS C-A", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); + addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS C-A", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Output RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Output RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Output RMS Current Phase A", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Output RMS Current Phase B", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Output RMS Current Phase C", new RampStrategy(0.0f, 25.0f, 1000)); - addStrategy("System Output Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); + addStrategy("System Output Frequency", new SingleValueStrategy(60.0f, 2.0f, 1000)); - addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0f, 5.0f, 1000)); - addStrategy("System Output Power Phase A", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase B", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase C", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs A", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs B", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs C", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Output Power Phase A", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Output Power Phase B", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Output Power Phase C", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs A", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs B", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs C", new RampStrategy(0.0f, 50.0f, 1000)); - addStrategy("Battery Time Remaining", new RampStrategy(480.0F, 0.3f, 1000)); - addStrategy("DC Bus Voltage", new SingleValueStrategy(518.0F, 5.0f, 1000)); + addStrategy("Battery Time Remaining", new RampStrategy(480.0f, 0.3f, 1000)); + addStrategy("DC Bus Voltage", new SingleValueStrategy(518.0f, 5.0f, 1000)); } /** @@ -143,20 +143,20 @@ State* BypassState::update(Equipment* equipment) { } float rating = getPointValue(equipment, "Px Rating"); float load = getPointValue(equipment, "Px Load"); - float real_load = rating * (load/100.f); + float real_load = (rating) * (load/100.0f); Strategy_Behavior* ramp_strat = nullptr; //Input strategies float In_Vab = getPointValue(equipment, "System Input RMS A-B"); ramp_strat = getStrategy("System Input RMS Current Phase A"); - static_cast(ramp_strat)->setTarget(real_load/In_Vab); + static_cast(ramp_strat)->setTarget(real_load); float In_Vbc = getPointValue(equipment, "System Input RMS B-C"); ramp_strat = getStrategy("System Input RMS Current Phase B"); - static_cast(ramp_strat)->setTarget(real_load/In_Vbc); + static_cast(ramp_strat)->setTarget(real_load); float In_Vca = getPointValue(equipment, "System Input RMS C-A"); ramp_strat = getStrategy("System Input RMS Current Phase C"); - static_cast(ramp_strat)->setTarget(real_load/In_Vca); + static_cast(ramp_strat)->setTarget(real_load); float In_Van = getPointValue(equipment, "System Input RMS A-N"); float In_Ia = getPointValue(equipment, "System Input RMS Current Phase A"); @@ -191,13 +191,13 @@ State* BypassState::update(Equipment* equipment) { //Output strategies float Out_Vab = getPointValue(equipment, "System Output RMS A-B"); ramp_strat = getStrategy("System Output RMS Current Phase A"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vab); + static_cast(ramp_strat)->setTarget(real_load); float Out_Vbc = getPointValue(equipment, "System Output RMS B-C"); ramp_strat = getStrategy("System Output RMS Current Phase B"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vbc); + static_cast(ramp_strat)->setTarget(real_load); float Out_Vca = getPointValue(equipment, "System Output RMS C-A"); ramp_strat = getStrategy("System Output RMS Current Phase C"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vca); + static_cast(ramp_strat)->setTarget(real_load); float Out_Van = getPointValue(equipment, "System Output RMS A-N"); float Out_Ia = getPointValue(equipment, "System Output RMS Current Phase A"); @@ -239,11 +239,12 @@ State* BypassState::update(Equipment* equipment) { if (Bat_Percent < 5.0f){ setPointValue(equipment, "UPS Battery Status1", 4.0f); } + setPointValue(equipment, "System Output Power", (real_load * In_Vab)/1000.0f); + setPointValue(equipment, "System Output Apparent Power", (real_load* In_Vab * 0.9f)/1000.0f); // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; } - /** * @brief Logic to execute once when entering the Bypass state. * Sets the "Run Status" for all EC fans to 1 to indicate they are active. diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp index 94036b7..0bdbcb6 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/State_Running.cpp @@ -40,58 +40,60 @@ */ template<> RunningState::RunningState() { - addStrategy("System Input RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Input RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Input RMS C-A", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Input RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Input RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Input RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); + addStrategy("System Input RMS A-B", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Input RMS B-C", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Input RMS C-A", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Input RMS A-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Input RMS B-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Input RMS C-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); - addStrategy("System Input RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Input RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Input RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Input RMS Current Phase A", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Input RMS Current Phase B", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Input RMS Current Phase C", new RampStrategy(0.0f, 25.0f, 1000)); - addStrategy("System Input Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); + addStrategy("System Input Frequency", new SingleValueStrategy(60.0f, 2.0f, 1000)); - addStrategy("System Input Power Factor Phs A", new SingleValueStrategy(93.0F, 0.5f, 1000)); - addStrategy("System Input Power Factor Phs B", new SingleValueStrategy(93.0F, 0.5f, 1000)); - addStrategy("System Input Power Factor Phs C", new SingleValueStrategy(93.0F, 0.5f, 1000)); + addStrategy("System Input Power Factor Phs A", new SingleValueStrategy(93.0f, 0.5f, 1000)); + addStrategy("System Input Power Factor Phs B", new SingleValueStrategy(93.0f, 0.5f, 1000)); + addStrategy("System Input Power Factor Phs C", new SingleValueStrategy(93.0f, 0.5f, 1000)); - addStrategy("System Input Power Phase A", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase B", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Power Phase C", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phs A", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phs B", new RampStrategy(0.0F, 5.0f, 1000)); - addStrategy("System Input Apparent Power Phs C", new RampStrategy(0.0F, 5.0f, 1000)); + addStrategy("System Input Power Phase A", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Power Phase B", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Power Phase C", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Apparent Power Phs A", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Apparent Power Phs B", new RampStrategy(0.0f, 50.0f, 1000)); + addStrategy("System Input Apparent Power Phs C", new RampStrategy(0.0f, 50.0f, 1000)); - addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS C-A", new SingleValueStrategy(480.0F, 5.0f, 1000)); - addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); - addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0F, 5.0f, 1000)); + addStrategy("System Output RMS A-B", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS B-C", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS C-A", new SingleValueStrategy(480.0f, 5.0f, 1000)); + addStrategy("System Output RMS A-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Output RMS B-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); + addStrategy("System Output RMS C-N", new SingleValueStrategy(270.0f, 5.0f, 1000)); - addStrategy("System Output RMS Current Phase A", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Output RMS Current Phase B", new RampStrategy(0.0F, 1.0f, 1000)); - addStrategy("System Output RMS Current Phase C", new RampStrategy(0.0F, 1.0f, 1000)); + addStrategy("System Output RMS Current Phase A", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Output RMS Current Phase B", new RampStrategy(0.0f, 25.0f, 1000)); + addStrategy("System Output RMS Current Phase C", new RampStrategy(0.0f, 25.0f, 1000)); - addStrategy("System Output Frequency", new SingleValueStrategy(60.0F, 2.0f, 1000)); + addStrategy("System Output Frequency", new SingleValueStrategy(60.0f, 2.0f, 1000)); - addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0F, 5.0f, 1000)); - addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0F, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs A", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs B", new SingleValueStrategy(93.0f, 5.0f, 1000)); + addStrategy("System Output Power Factor Phs C", new SingleValueStrategy(93.0f, 5.0f, 1000)); - addStrategy("System Output Power Phase A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Power Phase C", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs A", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs B", new RampStrategy(10.0F, 5.0f, 1000)); - addStrategy("System Output Apparent Power Phs C", new RampStrategy(10.0F, 5.0f, 1000)); + addStrategy("System Output Power Phase A", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Power Phase B", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Power Phase C", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs A", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs B", new RampStrategy(10.0f, 50.0f, 1000)); + addStrategy("System Output Apparent Power Phs C", new RampStrategy(10.0f, 50.0f, 1000)); - addStrategy("DC Bus Voltage", new SingleValueStrategy(518.0F, 5.0f, 1000)); - addStrategy("Battery Time Remaining", new RampStrategy(480.0F, 1.0f, 1000)); - addStrategy("Percentage Load", new RampStrategy(100.0F, 1.0f, 1000)); - + addStrategy("DC Bus Voltage", new SingleValueStrategy(518.0f, 5.0f, 1000)); + addStrategy("Battery Time Remaining", new RampStrategy(480.0f, 1.0f, 1000)); + addStrategy("Percentage Load", new RampStrategy(100.0f, 5.0f, 1000)); + + addStrategy("System Output Power", new SingleValueStrategy(0.0f, 5.0f, 1000)); + addStrategy("System Output Apparent Power", new SingleValueStrategy(0.0f, 5.0f, 1000)); } /** @@ -128,19 +130,22 @@ State* RunningState::update(Equipment* equipment) float rating = getPointValue(equipment, "Px Rating"); float load = getPointValue(equipment, "Px Load"); - float real_load = (rating*1000.0f) * (load/100.f); + float real_load = (rating) * (load/100.0f); Strategy_Behavior* ramp_strat = nullptr; //Input strategies float In_Vab = getPointValue(equipment, "System Input RMS A-B"); ramp_strat = getStrategy("System Input RMS Current Phase A"); - static_cast(ramp_strat)->setTarget(real_load/In_Vab); + static_cast(ramp_strat)->setTarget(real_load); float In_Vbc = getPointValue(equipment, "System Input RMS B-C"); ramp_strat = getStrategy("System Input RMS Current Phase B"); - static_cast(ramp_strat)->setTarget(real_load/In_Vbc); + static_cast(ramp_strat)->setTarget(real_load); float In_Vca = getPointValue(equipment, "System Input RMS C-A"); ramp_strat = getStrategy("System Input RMS Current Phase C"); - static_cast(ramp_strat)->setTarget(real_load/In_Vca); + static_cast(ramp_strat)->setTarget(real_load); + + setPointValue(equipment, "System Output Power", (real_load * In_Vab)/1000.0f); + setPointValue(equipment, "System Output Apparent Power", (real_load* In_Vab * 0.9f)/1000.0f); float In_Van = getPointValue(equipment, "System Input RMS A-N"); float In_Ia = getPointValue(equipment, "System Input RMS Current Phase A"); @@ -169,13 +174,13 @@ State* RunningState::update(Equipment* equipment) //Output strategies float Out_Vab = getPointValue(equipment, "System Output RMS A-B"); ramp_strat = getStrategy("System Output RMS Current Phase A"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vab); + static_cast(ramp_strat)->setTarget(real_load); float Out_Vbc = getPointValue(equipment, "System Output RMS B-C"); ramp_strat = getStrategy("System Output RMS Current Phase B"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vbc); + static_cast(ramp_strat)->setTarget(real_load); float Out_Vca = getPointValue(equipment, "System Output RMS C-A"); ramp_strat = getStrategy("System Output RMS Current Phase C"); - static_cast(ramp_strat)->setTarget(real_load/Out_Vca); + static_cast(ramp_strat)->setTarget(real_load); float Out_Van = getPointValue(equipment, "System Output RMS A-N"); float Out_Ia = getPointValue(equipment, "System Output RMS Current Phase A"); diff --git a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h index 9b11fce..dc93df8 100644 --- a/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h +++ b/src/EPMS/UPS/UPS_Vertiv_APM2_TCP/config.h @@ -23,8 +23,8 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 3, 187); /**< @brief The static IP address for the device. */ - IPAddress gateway(172, 17, 3, 1); /**< @brief The gateway IP address. */ + IPAddress local_IP(172, 17, 33, 187); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; @@ -84,7 +84,7 @@ modbusMap mb_map[] = {IR, 8, 0, "System Input RMS Current Phase B"}, {IR, 9, 0, "System Input RMS Current Phase C"}, {IR_10x, 10, 0, "System Input Frequency"}, - {IR, 11, 0, "System Input Power Factor Phs A"}, + {IR, 11, 0, "System Input Power Factor Phs A"}, //0.01 {IR, 12, 0, "System Input Power Factor Phs B"}, {IR, 13, 0, "System Input Power Factor Phs C"}, {IR_10x, 14, 0, "System Input Power Phase A"}, From 0eaa0232e959a6e003136957bfda5ddcf852ec7c Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Mon, 27 Oct 2025 18:26:08 -0500 Subject: [PATCH 05/11] s --- src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp | 12 ++++++------ src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp | 6 +++--- src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h | 4 ++-- src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h | 3 ++- src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp index 54fbf46..e044cb4 100644 --- a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp +++ b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Running.cpp @@ -66,12 +66,11 @@ template<> State* RunningState::update(Equipment* equipment) { // STATE control, add conditions if change to a different state is needed Serial.println("Running update function"); - Serial.println("Running update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 0){ + if (State_Ctrl == 0.0f){ return new StandbyState(); } - if (State_Ctrl == 2){ + if (State_Ctrl == 2.0f){ return new StandbyState(); } // Apply any strategies defined for the standby state @@ -98,8 +97,8 @@ State* RunningState::update(Equipment* equipment) float pf = getPointValue(equipment, "PF"); - float kva = (1.732f * ((volts_AB + volts_BC + volts_AC)/4.0f) * real_load * (pf/100.0f))/100.0f; - float kw = (1.732f * ((volts_AB + volts_BC + volts_AC)/4.0f) * real_load )/100.0f; + float kva = (1.732f * ((volts_AB + volts_BC + volts_AC)/4.0f) * real_load * (pf/100.0f))/100000.0f; + float kw = (1.732f * ((volts_AB + volts_BC + volts_AC)/4.0f) * real_load )/10000.0f; setPointValue(equipment, "kW", kw); setPointValue(equipment, "kVA", kva); @@ -119,7 +118,8 @@ void RunningState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Running State..."); // You could also update a Modbus register to show the "standby" state - setBitValue(equipment, "CB Position", 1, true); + setBitValue(equipment, "CB Position", 0, true); + setBitValue(equipment, "CB Position", 12, false); } /** diff --git a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp index ab732df..7d19437 100644 --- a/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp +++ b/src/EPMS/Breaker/BKR_ABB_XT_TCP/State_Standby.cpp @@ -57,14 +57,14 @@ State* StandbyState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Standby update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 1){ + if (State_Ctrl == 1.0f){ return new RunningState(); } - if (State_Ctrl == 0){ + if (State_Ctrl == 0.0f){ setBitValue(equipment, "CB Position", 12, false); } - if (State_Ctrl == 2){ + if (State_Ctrl == 2.0f){ setBitValue(equipment, "CB Position", 12, true); } // Apply any strategies defined for the standby state diff --git a/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h b/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h index 018a5ed..b77bc05 100644 --- a/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h +++ b/src/EPMS/Breaker/BKR_ABB_XT_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 150); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 33, 154); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -63,7 +63,7 @@ modbusMap mb_map[] = {HR, 9, 0, "State Control"}, //Open-Close Cmd {HR, 10, 0, "Load"}, //Adjustble Load {HR, 11, 0, "Rating"}, //Max amp to calculate kw, kVA, etc - {IR_LONG, 41, 0, "CB Position"}, //b0 close open b12 tripped + {IR, 41, 0, "CB Position"}, //b0 close open b12 tripped {IR_LONG, 101, 0, "Amps A"}, {IR_LONG, 103, 0, "Amps B"}, {IR_LONG, 105, 0, "Amps C"}, diff --git a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h index 2ee81ea..89915d8 100644 --- a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h +++ b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h @@ -64,11 +64,12 @@ modbusMap mb_map[] = {HR, 10, 0, "Load"}, {HR, 11, 0, "Rating"}, - {IR, 2, 0, "Status"}, + {IR, 2, 0, "Status"}, //bit 2 open-close, {IR, 3, 0, "Amps A"}, {IR, 5, 0, "Amps B"}, {IR, 7, 0, "Amps C"}, {IR, 9, 0, "Amps N"}, + {IR, 13, 0, "Tripped"}, //bit 0 tripped }; //Size of modbus map used in FOR cycles, automatically calculated. diff --git a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h index 07b7b0b..5d19823 100644 --- a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h +++ b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h @@ -64,7 +64,7 @@ modbusMap mb_map[] = {HR, 10, 0, "Load"}, {HR, 11, 0, "Rating"}, - {IR, 207, 0, "CB Position"}, + {IR, 207, 0, "CB Position"}, //bit 9 tripp bit 12 open closed {IR_FLOAT, 215, 0, "Amps A"}, {IR_FLOAT, 217, 0, "Amps B"}, {IR_FLOAT, 219, 0, "Amps C"}, From 1e4cf1394b3c94d2fae79ce7746fb4fcc7cc295c Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Wed, 29 Oct 2025 12:57:05 -0500 Subject: [PATCH 06/11] save --- platformio.ini | 2 +- .../Breaker/BKR_Susol_ACB_TCP/State_Running.cpp | 9 +++++++-- .../Breaker/BKR_Susol_ACB_TCP/State_Standby.cpp | 13 +++++++++++-- src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h | 8 ++++---- .../Breaker/Susol_Smart_MCCB_TCP/State_Running.cpp | 9 +++++++-- .../Breaker/Susol_Smart_MCCB_TCP/State_Standby.cpp | 11 ++++++++++- src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h | 4 ++-- 7 files changed, 42 insertions(+), 14 deletions(-) diff --git a/platformio.ini b/platformio.ini index 06422a6..6282084 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,7 +10,7 @@ [platformio] -default_envs = BKR_ABB_XT_TCP ; Select here the name of the configuration you want to download +default_envs = BKR_Susol_ACB_TCP ; Select here the name of the configuration you want to download [env] upload_port = COM50 diff --git a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Running.cpp b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Running.cpp index 3fb5e0b..a7c0ad2 100644 --- a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Running.cpp +++ b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Running.cpp @@ -61,7 +61,10 @@ State* RunningState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Running update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 1){ + if (State_Ctrl == 0.0f){ + return new StandbyState(); + } + if (State_Ctrl == 2.0f){ return new StandbyState(); } @@ -92,7 +95,9 @@ void RunningState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Running State..."); // You could also update a Modbus register to show the "standby" state - setPointValue(equipment, "Status", 4); + + setBitValue(equipment, "Status", 2, true); + setBitValue(equipment, "Tripped", 0, false); } diff --git a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Standby.cpp b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Standby.cpp index c7a1db4..b98eb98 100644 --- a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Standby.cpp +++ b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/State_Standby.cpp @@ -57,9 +57,16 @@ State* StandbyState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Standby update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 2){ + if (State_Ctrl == 1.0f){ return new RunningState(); } + + if (State_Ctrl == 0.0f){ + setBitValue(equipment, "Tripped", 0, false); + } + if (State_Ctrl == 2.0f){ + setBitValue(equipment, "Tripped", 0, true); + } // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; @@ -75,11 +82,13 @@ template<> void StandbyState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Standby State..."); - setPointValue(equipment, "Status", 0); setPointValue(equipment, "Amps A", 0.0f); setPointValue(equipment, "Amps B", 0.0f); setPointValue(equipment, "Amps C", 0.0f); + setPointValue(equipment, "Amps N", 0.0f); + + setBitValue(equipment, "Status", 2, false); } /** diff --git a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h index 89915d8..66287f0 100644 --- a/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h +++ b/src/EPMS/Breaker/BKR_Susol_ACB_TCP/config.h @@ -21,10 +21,10 @@ * @{ */ #include - const char *ssid = "wifi_name"; /**< @brief The SSID of the WiFi network. */ - const char *password = "wifi_password"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(192, 168, 1, 238); /**< @brief The static IP address for the device. */ - IPAddress gateway(192, 138, 1, 1); /**< @brief The gateway IP address. */ + const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ + const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ + IPAddress local_IP(172, 17, 33, 149); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; diff --git a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Running.cpp b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Running.cpp index 387ac71..c334bdd 100644 --- a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Running.cpp +++ b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Running.cpp @@ -68,7 +68,10 @@ State* RunningState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Running update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 1){ + if (State_Ctrl == 0.0f){ + return new StandbyState(); + } + if (State_Ctrl == 2.0f){ return new StandbyState(); } // Apply any strategies defined for the standby state @@ -116,7 +119,9 @@ void RunningState::enterState(Equipment* equipment) { // Logic to run when the equipment enters this state Serial.println("Enter Running State..."); // You could also update a Modbus register to show the "standby" state - setPointValue(equipment, "CB Position", 4096); + + setBitValue(equipment, "CB Position", 12, true); + setBitValue(equipment, "CB Position", 9, false); } diff --git a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Standby.cpp b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Standby.cpp index 13f630c..d839d21 100644 --- a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Standby.cpp +++ b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/State_Standby.cpp @@ -57,9 +57,17 @@ State* StandbyState::update(Equipment* equipment) // STATE control, add conditions if change to a different state is needed Serial.println("Standby update function"); float State_Ctrl = getPointValue(equipment, "State Control"); - if (State_Ctrl == 2){ + if (State_Ctrl == 1.0f){ return new RunningState(); } + + if (State_Ctrl == 0.0f){ + setBitValue(equipment, "CB Position", 9, false); + } + + if (State_Ctrl == 2.0f){ + setBitValue(equipment, "CB Position", 9, true); + } // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; @@ -86,6 +94,7 @@ void StandbyState::enterState(Equipment* equipment) { setPointValue(equipment, "Amps A", 0.0f); setPointValue(equipment, "Amps B", 0.0f); setPointValue(equipment, "Amps C", 0.0f); + setBitValue(equipment, "CB Position", 12, false); } /** diff --git a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h index 5d19823..cee6758 100644 --- a/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h +++ b/src/EPMS/Breaker/Susol_Smart_MCCB_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 33, 132); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 33, 141); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -64,7 +64,7 @@ modbusMap mb_map[] = {HR, 10, 0, "Load"}, {HR, 11, 0, "Rating"}, - {IR, 207, 0, "CB Position"}, //bit 9 tripp bit 12 open closed + {IR, 207, 0, "CB Position"}, //bit 9 trip bit 12 open closed {IR_FLOAT, 215, 0, "Amps A"}, {IR_FLOAT, 217, 0, "Amps B"}, {IR_FLOAT, 219, 0, "Amps C"}, From 8157deaae7abfe5448de14a3fa9fa1363dd6fe78 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Thu, 30 Oct 2025 12:32:28 -0700 Subject: [PATCH 07/11] Added General Alarm, VSD Output Freq Added General Alarm, VSD Output Frequency registers. Updated modbus register to actual instead of test registers. --- .../CHILLER/CH_York_YVAA_RTU/StateUtils.cpp | 8 +++ src/BMS/CHILLER/CH_York_YVAA_RTU/config.h | 51 ++++++++++--------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp b/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp index 696d09a..f695598 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp @@ -41,8 +41,10 @@ void updateAlarms(Equipment* equipment){ Modbus_Point* Sys1FanAlarmCommand = equipment->getModbus_Point("Sys 1 Fan Fault ON"); Modbus_Point* Sys2FanAlarmCommand = equipment->getModbus_Point("Sys 2 Fan Fault ON"); + Modbus_Point* GeneralAlarmCommand = equipment->getModbus_Point("General Alarm ON"); Modbus_Point* Sys1FanAlarm = equipment->getModbus_Point("Sys 1 Fan Fault Alarm"); Modbus_Point* Sys2FanAlarm = equipment->getModbus_Point("Sys 2 Fan Fault Alarm"); + Modbus_Point* GeneralAlarm = equipment->getModbus_Point("General Alarm"); if (Sys1FanAlarmCommand) { Sys1FanAlarm->setValue(Sys1FanAlarmCommand->getValue()); if (Sys1FanAlarmCommand->getValue() == 1){ @@ -57,6 +59,8 @@ void updateAlarms(Equipment* equipment){ } else equipment->setModbus_Point("Sys 2 Fault Code", 0); } + GeneralAlarm->setValue(GeneralAlarmCommand->getValue()); + } /** @@ -74,6 +78,9 @@ void updateFreeCooling(Equipment* equipment){ Modbus_Point* FreeCoolingCommand = equipment->getModbus_Point("Free Cooling Mode ON"); Modbus_Point* FreeCoolingMode = equipment->getModbus_Point("Free Cooling Mode"); Modbus_Point* FreeCoolingValve = equipment->getModbus_Point("Free Cooling Valve"); + FreeCoolingMode->setValue(FreeCoolingCommand->getValue()); + FreeCoolingValve->setValue(FreeCoolingCommand->getValue()); + /** if (FreeCoolingCommand->getValue() == 1) { FreeCoolingMode->setValue(1); FreeCoolingValve->setValue(1); @@ -82,4 +89,5 @@ void updateFreeCooling(Equipment* equipment){ FreeCoolingMode->setValue(0); FreeCoolingValve->setValue(0); } + */ } \ No newline at end of file diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h b/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h index fbd900f..16eb93f 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h @@ -54,25 +54,30 @@ */ modbusMap mb_map[] = { - {COIL, 0, 0, "Chiller Start Command"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {COIL, 1, 0, "Sys 1 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {COIL, 2, 0, "Sys 2 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {COIL, 3, 0, "Sys 1 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only - {COIL, 4, 0, "Sys 2 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only - {COIL, 5, 0, "Free Cooling Mode ON"}, // Use in Modscan - Used for Arduino simulation only + {COIL, 0, 0, "Chiller Start Command"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only. Signal should come from PLC. + {COIL, 1, 0, "Sys 1 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only --> INDICATION ONLY + {COIL, 2, 0, "Sys 2 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only --> INDICATION ONLY + {COIL, 3, 0, "Sys 1 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only --> FAILSTATE + {COIL, 4, 0, "Sys 2 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only --> FAILSTATE + {COIL, 5, 0, "Free Cooling Mode ON"}, // Use in Modscan - Used for Arduino simulation only + {COIL, 6, 0, "General Alarm ON"}, // Use in Modscan - Used for Arduino simulation only - {DI, 0, 0, "Sys 1 Fan Fault Alarm"}, - {DI, 1, 0, "Sys 2 Fan Fault Alarm"}, + {DI, 65, 0, "General Alarm"}, // part of Modbus map, but not included in code --> INDICATION ONLY + {DI, 174, 0, "Sys 1 Fan Fault Alarm"}, + {DI, 175, 0, "Sys 2 Fan Fault Alarm"}, - {HR, 0, 0, "Chiller Status"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {HR, 1, 0, "Chiller Temp Setpoint"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {HR, 2, 0, "Supply Temp"}, // Use in Modscan - Hard IO in SCP (PICS?), Used for Arduino simulation only - {HR, 3, 0, "Return Temp"}, // Use in Modscan - Hard IO in SCP (PICS?), Used for Arduino simulation only + {IR, 130, 0, "Free Cooling Mode"}, + {IR, 165, 0, "Free Cooling Valve"}, - {HR, 4, 70, "System CHW Out"}, - {HR, 5, 70, "System CHW In"}, - {HR, 7, 0, "Sys 1 Condenser Temp"}, - {HR, 9, 0, "Ambient Temp"}, + {HR, 0, 0, "Chiller Status"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only + {HR, 1, 0, "Chiller Temp Setpoint"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only + {HR, 2, 0, "Supply Temp"}, // Use in Modscan - Hard IO in SCP (PICS?), Used for Arduino simulation only + {HR, 3, 0, "Return Temp"}, // Use in Modscan - Hard IO in SCP (PICS?), Used for Arduino simulation only + + {HR, 4, 70, "System CHW Out"}, + {HR, 5, 70, "System CHW In"}, + {HR, 7, 0, "Sys 1 Condenser Temp"}, + {HR, 9, 0, "Ambient Temp"}, {HR, 11, 0, "Sys 1 Oil Pressure"}, {HR, 12, 0, "Sys 1 Suction Pressure"}, @@ -88,6 +93,8 @@ modbusMap mb_map[] = {HR, 24, 0, "Sys 2 Run Hours"}, {HR, 25, 0, "Sys 2 Starts"}, + {HR, 26, 0, "VSD Output Frequency"}, // part of Modbus map, but not included in code + {HR, 29, 77, "Sys 1 Operational Code"}, {HR, 30, 0, "Sys 1 Fault Code"}, {HR, 31, 77, "Sys 2 Operational Code"}, @@ -95,13 +102,11 @@ modbusMap mb_map[] = {HR, 39, 0, "Local Leaving Temp Setpoint"}, - {HR, 40, 0, "Sys 1 Fan KW"}, - {HR, 41, 0, "Sys 1 Compressor KW"}, - {HR, 42, 0, "Sys 2 Fan KW"}, - {HR, 43, 0, "Sys 2 Compressor KW"}, - {HR, 49, 0, "Sys 2 Condenser Temp"}, - {HR, 50, 0, "Free Cooling Mode"}, - {HR, 51, 0, "Free Cooling Valve"}, + {HR, 49, 0, "Sys 2 Condenser Temp"}, + {HR, 140, 0, "Sys 1 Fan KW"}, + {HR, 141, 0, "Sys 1 Compressor KW"}, + {HR, 142, 0, "Sys 2 Fan KW"}, + {HR, 143, 0, "Sys 2 Compressor KW"}, }; //Size of modbus map used in FOR cycles, automatically calculated. From 12e397c855e6c5c00f5f9207ba54d30ed0379158 Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Thu, 30 Oct 2025 16:53:26 -0500 Subject: [PATCH 08/11] save --- platformio.ini | 9 +- .../State_Running.cpp | 115 ++++++------- .../CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/config.h | 159 +++++++++--------- 3 files changed, 137 insertions(+), 146 deletions(-) diff --git a/platformio.ini b/platformio.ini index 6282084..1999fbd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,7 +10,7 @@ [platformio] -default_envs = BKR_Susol_ACB_TCP ; Select here the name of the configuration you want to download +default_envs = CRAH_PETRA_PAHHC_600_C6_TCP ; Select here the name of the configuration you want to download [env] upload_port = COM50 @@ -36,6 +36,13 @@ extends = common_env_options build_flags = -D USE_MODBUS_IP ;Importat configuration, this flags is used to configure the program build_src_filter = -<*> + ;Add the specific folder path here ;---------------------------------------------------------------------------------------------------- +[env:CRAH_PETRA_PAHHC_600_C6_TCP] +platform = espressif32 +board = dfrobot_firebeetle2_esp32e +extends = common_env_options +build_flags = -D USE_MODBUS_IP +build_src_filter = -<*> + + [env:POD_MBB_Power_Meter_TCP] platform = espressif32 board = dfrobot_firebeetle2_esp32e diff --git a/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/State_Running.cpp b/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/State_Running.cpp index b0f5399..6a2c459 100644 --- a/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/State_Running.cpp +++ b/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/State_Running.cpp @@ -38,16 +38,26 @@ */ template<> RunningState::RunningState() { - addStrategy("CW Valve Position", new PIDStrategy("RAT Setpoint", 1000, "RAT")); - addStrategy("Operating Hours EC Fan #1", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #2", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #3", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #4", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #5", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #6", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #7", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #8", new TotalizerStrategy(10000)); - addStrategy("Operating Hours EC Fan #9", new TotalizerStrategy(10000)); + addStrategy("CW Valve Position", new PIDStrategy("SAT Setpoint", 2000, "SAT Reading")); + addStrategy("SAT Reading", new SingleValueStrategy(0.0f, 3.0f, 1000)); + addStrategy("Speed EC Fan #1", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #2", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #3", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #4", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #5", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #6", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #7", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #8", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Speed EC Fan #9", new RampStrategy(0.0f, 500.0f, 1000)); + addStrategy("Operating Hours EC Fan #1", new TotalizerStrategy(1100)); + addStrategy("Operating Hours EC Fan #2", new TotalizerStrategy(1200)); + addStrategy("Operating Hours EC Fan #3", new TotalizerStrategy(1300)); + addStrategy("Operating Hours EC Fan #4", new TotalizerStrategy(1250)); + addStrategy("Operating Hours EC Fan #5", new TotalizerStrategy(1350)); + addStrategy("Operating Hours EC Fan #6", new TotalizerStrategy(1450)); + addStrategy("Operating Hours EC Fan #7", new TotalizerStrategy(1150)); + addStrategy("Operating Hours EC Fan #8", new TotalizerStrategy(1180)); + addStrategy("Operating Hours EC Fan #9", new TotalizerStrategy(1340)); } /** @@ -74,63 +84,36 @@ State* RunningState::update(Equipment* equipment) return new StandbyState(); } - Modbus_Point* faultCode = equipment->getModbus_Point("Fault Code"); - int faultCodeValue = faultCode ? faultCode->getValue() : 0; - switch (faultCodeValue){ - case 1: - return new FailState({"Alarm SAT Sensor Fault"}); - case 2: - return new FailState({"Alarm RAH Sensor Fault"}); - case 3: - return new FailState({"Alarm RAT Sensor Fault"}); - case 4: - return new FailState({"Alarm Filter DP Sensor Fault"}); - case 5: - return new FailState({"Alarm Flooding"}); - case 6: - return new FailState({"Alarm Dirty Filter"}); - case 7: - return new FailState({"Alarm High RAT"}); - case 8: - return new FailState({"Alarm Low RAT"}); - case 9: - return new FailState({"Alarm High SAT"}); - case 10: - return new FailState({"Alarm Low SAT"}); - case 11: - return new FailState({"Alarm High RAH"}); - case 12: - return new FailState({"Alarm Low RAH"}); - case 13: - return new FailState({"Alarm Phase Failure"}); - case 14: - return new FailState({"Alarm Condensate Pump"}); - case 15: - return new FailState({"Alarm Smoke"}); - case 16: - return new FailState({"Alarm Fire"}); - case 17: - return new FailState({"Alarm EC Fan #1"}); - case 18: - return new FailState({"Alarm EC Fan #2"}); - case 19: - return new FailState({"Alarm EC Fan #3"}); - case 20: - return new FailState({"Alarm EC Fan #4"}); - case 21: - return new FailState({"Alarm EC Fan #5"}); - case 22: - return new FailState({"Alarm EC Fan #6"}); - case 23: - return new FailState({"Alarm EC Fan #7"}); - case 24: - return new FailState({"Alarm EC Fan #8"}); - case 25: - return new FailState({"Alarm EC Fan #9"}); - default: - break; - } + float rat = getPointValue(equipment, "RAT"); + setPointValue(equipment, "RAT Reading", rat); + float speed = getPointValue(equipment, "Setting EC Fan Speed"); + Strategy_Behavior* fan1_rs = getStrategy("Speed EC Fan #1"); + static_cast(fan1_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan2_rs = getStrategy("Speed EC Fan #2"); + static_cast(fan2_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan3_rs = getStrategy("Speed EC Fan #3"); + static_cast(fan3_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan4_rs = getStrategy("Speed EC Fan #4"); + static_cast(fan4_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan5_rs = getStrategy("Speed EC Fan #5"); + static_cast(fan5_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan6_rs = getStrategy("Speed EC Fan #6"); + static_cast(fan6_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan7_rs = getStrategy("Speed EC Fan #7"); + static_cast(fan7_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan8_rs = getStrategy("Speed EC Fan #8"); + static_cast(fan8_rs)->setTarget(4200.0f * (speed /100.0f)); + Strategy_Behavior* fan9_rs = getStrategy("Speed EC Fan #9"); + static_cast(fan9_rs)->setTarget(4200.0f * (speed /100.0f)); + + + + float value = getPointValue(equipment, "CW Valve Position"); + Serial.printf("CW Valve Position: %0.2f\n", value); + float sat_setpoint = getPointValue(equipment, "SAT Setpoint"); + Strategy_Behavior* sat_svs = getStrategy("SAT Reading"); + static_cast(sat_svs)->setSetpoint(sat_setpoint); // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/config.h b/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/config.h index bd4ad09..d115f19 100644 --- a/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/config.h +++ b/src/BMS/CRAH/CRAH_PETRA_PAHHC_600_C6_TCP/config.h @@ -21,10 +21,10 @@ * @{ */ #include - const char *ssid = "wifi_name"; /**< @brief The SSID of the WiFi network. */ - const char *password = "wifi_password"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(192, 168, 1, 234); /**< @brief The static IP address for the device. */ - IPAddress gateway(192, 168, 1, 1); /**< @brief The gateway IP address. */ + const char *ssid = "QTS_CDR_Arduino"; /**< @brief The SSID of the WiFi network. */ + const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ + IPAddress local_IP(172, 17, 33, 11); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 33, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; @@ -60,81 +60,82 @@ */ modbusMap mb_map[] = { - {HR, 15, 0, "State Control"}, //Internal to control from Modscan - {HR, 16, 0, "Fault Code"}, - {HR_FLOAT, 18, 0, "RAT"}, //Internal Fault code from Modscan - {HR_FLOAT, 1, 0, "SAT Setpoint"}, - {HR_FLOAT, 681, 0, "RAT Setpoint"}, - {HR_FLOAT, 111, 0, "High RAT Limit"}, - {HR_FLOAT, 114, 0, "Low RAT Limit"}, - {HR_FLOAT, 118, 0, "High SAT Limit"}, - {HR_FLOAT, 122, 0, "Low SAT Limit"}, - {HR_FLOAT, 685, 0, "High RAH Limit"}, - {HR_FLOAT, 689, 0, "Low RAH Limit"}, - {HR, 5, 0, "Setting the EC Fan Max Speed"}, - {HR, 695, 0, "Setting the EC Fan Min Speed"}, - {HR_FLOAT, 693, 0, "Setting Room Temp"}, - {HR, 691, 0, "Setting EC Fan Speed "}, - {DI, 146, 0, "Alarm SAT Sensor Fault"}, - {DI, 1246, 0, "Alarm RAH Sensor Fault"}, - {DI, 1245, 0, "Alarm RAT Sensor Fault"}, - {DI, 1250, 0, "Alarm Filter DP Sensor Fault"}, - {DI, 51, 0, "Alarm Flooding"}, - {DI, 1096, 0, "Alarm Dirty Filter"}, - {DI, 1367, 0, "Alarm High RAT"}, - {DI, 1099, 0, "Alarm Low RAT"}, - {DI, 118, 0, "Alarm High SAT"}, - {DI, 122, 0, "Alarm Low SAT"}, - {DI, 1307, 0, "Alarm High RAH"}, - {DI, 1308, 0, "Alarm Low RAH"}, - {DI, 1342, 0, "Alarm Common"}, - {DI, 148, 0, "Alarm Phase Failure"}, - {DI, 1370, 0, "Alarm Condensate Pump"}, - {DI, 1368, 0, "Alarm Smoke"}, - {DI, 1369, 0, "Alarm Fire"}, - {DI, 131, 0, "Alarm EC Fan #1"}, - {DI, 132, 0, "Alarm EC Fan #2"}, - {DI, 133, 0, "Alarm EC Fan #3"}, - {DI, 134, 0, "Alarm EC Fan #4"}, - {DI, 135, 0, "Alarm EC Fan #5"}, - {DI, 136, 0, "Alarm EC Fan #6"}, - {DI, 1360, 0, "Alarm EC Fan #7"}, - {DI, 1361, 0, "Alarm EC Fan #8"}, - {DI, 1362, 0, "Alarm EC Fan #9"}, - {DI, 138, 0, "Run Status EC Fan #1"}, - {DI, 139, 0, "Run Status EC Fan #2"}, - {DI, 140, 0, "Run Status EC Fan #3"}, - {DI, 141, 0, "Run Status EC Fan #4"}, - {DI, 142, 0, "Run Status EC Fan #5"}, - {DI, 143, 0, "Run Status EC Fan #6"}, - {DI, 1363, 0, "Run Status EC Fan #7"}, - {DI, 1364, 0, "Run Status EC Fan #8"}, - {DI, 1365, 0, "Run Status EC Fan #9"}, - {IR_FLOAT, 99, 0, "SAT Reading"}, - {IR_FLOAT, 70, 0, "RAH Reading"}, - {IR_FLOAT, 101, 0, "RAT Reading"}, - {IR_FLOAT, 106, 0, "Filter DP Reading"}, - {IR_FLOAT, 496, 0, "CW Valve Position"}, - {IR, 53, 0, "Speed EC Fan #1"}, - {IR, 228, 0, "Speed EC Fan #2"}, - {IR, 229, 0, "Speed EC Fan #3"}, - {IR, 230, 0, "Speed EC Fan #4"}, - {IR, 231, 0, "Speed EC Fan #5"}, - {IR, 232, 0, "Speed EC Fan #6"}, - {IR, 678, 0, "Speed EC Fan #7"}, - {IR, 679, 0, "Speed EC Fan #8"}, - {IR, 680, 0, "Speed EC Fan #9"}, - {IR, 274, 0, "Operating Hours EC Fan #1"}, - {IR, 233, 0, "Operating Hours EC Fan #2"}, - {IR, 244, 0, "Operating Hours EC Fan #3"}, - {IR, 235, 0, "Operating Hours EC Fan #4"}, - {IR, 236, 0, "Operating Hours EC Fan #5"}, - {IR, 245, 0, "Operating Hours EC Fan #6"}, - {IR, 486, 0, "Operating Hours EC Fan #7"}, - {IR, 487, 0, "Operating Hours EC Fan #8"}, - {IR, 488, 0, "Operating Hours EC Fan #9"}, - {COIL, 301, 0, "ON/OFF Command By BMS"}, - {COIL, 302, 0, "Enable Off By Supervisory"}, + {HR, 13, 0, "Delta"}, + {HR, 14, 0, "State Control"}, //Internal to control from Modscan + {HR, 15, 0, "Fault Code"}, + {HR_FLOAT, 17, 0, "RAT"}, //Internal Fault code from Modscan + {HR_FLOAT, 0, 0, "SAT Setpoint"}, + {HR_FLOAT, 680, 0, "RAT Setpoint"}, + {HR_FLOAT, 110, 0, "High RAT Limit"}, + {HR_FLOAT, 113, 0, "Low RAT Limit"}, + {HR_FLOAT, 117, 0, "High SAT Limit"}, + {HR_FLOAT, 121, 0, "Low SAT Limit"}, + {HR_FLOAT, 684, 0, "High RAH Limit"}, + {HR_FLOAT, 688, 0, "Low RAH Limit"}, + {HR, 4, 0, "Setting the EC Fan Max Speed"}, + {HR, 694, 0, "Setting the EC Fan Min Speed"}, + {HR_FLOAT, 692, 0, "Setting Room Temp"}, + {HR_FLOAT, 690, 0, "Setting EC Fan Speed"}, + {DI, 145, 0, "Alarm SAT Sensor Fault"}, + {DI, 1245, 0, "Alarm RAH Sensor Fault"}, + {DI, 1244, 0, "Alarm RAT Sensor Fault"}, + {DI, 1249, 0, "Alarm Filter DP Sensor Fault"}, + {DI, 50, 0, "Alarm Flooding"}, + {DI, 1095, 0, "Alarm Dirty Filter"}, + {DI, 1366, 0, "Alarm High RAT"}, + {DI, 1098, 0, "Alarm Low RAT"}, + {DI, 117, 0, "Alarm High SAT"}, + {DI, 121, 0, "Alarm Low SAT"}, + {DI, 1306, 0, "Alarm High RAH"}, + {DI, 1307, 0, "Alarm Low RAH"}, + {DI, 1341, 0, "Alarm Common"}, + {DI, 147, 0, "Alarm Phase Failure"}, + {DI, 1369, 0, "Alarm Condensate Pump"}, + {DI, 1367, 0, "Alarm Smoke"}, + {DI, 1368, 0, "Alarm Fire"}, + {DI, 130, 0, "Alarm EC Fan #1"}, + {DI, 131, 0, "Alarm EC Fan #2"}, + {DI, 132, 0, "Alarm EC Fan #3"}, + {DI, 133, 0, "Alarm EC Fan #4"}, + {DI, 134, 0, "Alarm EC Fan #5"}, + {DI, 135, 0, "Alarm EC Fan #6"}, + {DI, 1359, 0, "Alarm EC Fan #7"}, + {DI, 1360, 0, "Alarm EC Fan #8"}, + {DI, 1361, 0, "Alarm EC Fan #9"}, + {DI, 137, 0, "Run Status EC Fan #1"}, + {DI, 138, 0, "Run Status EC Fan #2"}, + {DI, 139, 0, "Run Status EC Fan #3"}, + {DI, 140, 0, "Run Status EC Fan #4"}, + {DI, 141, 0, "Run Status EC Fan #5"}, + {DI, 142, 0, "Run Status EC Fan #6"}, + {DI, 1362, 0, "Run Status EC Fan #7"}, + {DI, 1363, 0, "Run Status EC Fan #8"}, + {DI, 1364, 0, "Run Status EC Fan #9"}, + {IR_FLOAT, 98, 0, "SAT Reading"}, + {IR_FLOAT, 69, 0, "RAH Reading"}, + {IR_FLOAT, 100, 0, "RAT Reading"}, + {IR_FLOAT, 105, 0, "Filter DP Reading"}, + {IR_FLOAT, 495, 0, "CW Valve Position"}, + {IR, 52, 0, "Speed EC Fan #1"}, + {IR, 227, 0, "Speed EC Fan #2"}, + {IR, 228, 0, "Speed EC Fan #3"}, + {IR, 229, 0, "Speed EC Fan #4"}, + {IR, 230, 0, "Speed EC Fan #5"}, + {IR, 231, 0, "Speed EC Fan #6"}, + {IR, 677, 0, "Speed EC Fan #7"}, + {IR, 678, 0, "Speed EC Fan #8"}, + {IR, 679, 0, "Speed EC Fan #9"}, + {IR, 273, 0, "Operating Hours EC Fan #1"}, + {IR, 232, 0, "Operating Hours EC Fan #2"}, + {IR, 243, 0, "Operating Hours EC Fan #3"}, + {IR, 234, 0, "Operating Hours EC Fan #4"}, + {IR, 235, 0, "Operating Hours EC Fan #5"}, + {IR, 244, 0, "Operating Hours EC Fan #6"}, + {IR, 485, 0, "Operating Hours EC Fan #7"}, + {IR, 486, 0, "Operating Hours EC Fan #8"}, + {IR, 487, 0, "Operating Hours EC Fan #9"}, + {COIL, 300, 0, "ON/OFF Command By BMS"}, + {COIL, 301, 0, "Enable Off By Supervisory"}, {COIL, 264, 0, "Alarm Reset"} }; //Size of modbus map used in FOR cycles, automatically calculated. From b6c00d32e23dbd616efd325c9dfc321c3426e080 Mon Sep 17 00:00:00 2001 From: Emmanuel HC Date: Fri, 31 Oct 2025 10:40:19 -0500 Subject: [PATCH 09/11] ATS update --- .../ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp | 11 ++++++++++- .../ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp | 13 ++++++++++++- src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h | 1 + .../ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp | 10 ++++++++++ .../ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp | 10 ++++++++++ src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h | 1 + 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp index accba63..8075096 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Running.cpp @@ -100,7 +100,16 @@ State* RunningState::update(Equipment* equipment) float pf = getPointValue(equipment, "Power Factor"); float a_pwr = pwr * (pf/100.0f); setPointValue(equipment, "Total Apparent Power", a_pwr*1000.0f); - + + float preferred = getPointValue(equipment, "ATS_Preferred"); + if (preferred == 1.0f){ + setPointValue(equipment, "Source 1 Preferred", 1.0f); + setPointValue(equipment, "Source 2 Preferred", 0.0f); + } + if (preferred == 2.0f){ + setPointValue(equipment, "Source 1 Preferred", 0.0f); + setPointValue(equipment, "Source 2 Preferred", 1.0f); + } _applyStrategies(equipment); return nullptr; diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp index 39347b3..100cf86 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/State_Standby.cpp @@ -97,7 +97,18 @@ State* StandbyState::update(Equipment* equipment) float a_pwr = pwr * (pf/100.0f); setPointValue(equipment, "Total Apparent Power", a_pwr*1000.0f); - + /*setPointValue(equipment, "S2 kW", kw); + setPointValue(equipment, "S2 MWh", mwh);*/ + + float preferred = getPointValue(equipment, "ATS_Preferred"); + if (preferred == 1.0f){ + setPointValue(equipment, "Source 1 Preferred", 1.0f); + setPointValue(equipment, "Source 2 Preferred", 0.0f); + } + if (preferred == 2.0f){ + setPointValue(equipment, "Source 1 Preferred", 0.0f); + setPointValue(equipment, "Source 2 Preferred", 1.0f); + } _applyStrategies(equipment); return nullptr; } diff --git a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h index b781b9e..6df64d2 100644 --- a/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h +++ b/src/EPMS/ATS/ATS_Eaton_ATC900_RPD_TCP/config.h @@ -60,6 +60,7 @@ */ modbusMap mb_map[] = { + {HR, 8, 0, "ATS_Preferred"}, //Internal to control from Modscan {HR, 9, 0, "ATS_Source"}, //Internal to control from Modscan {HR, 10, 0, "ATS_Load"}, //Internal Fault code from Modscan {HR, 11, 0, "ATS_Rating"}, //Internal Fault code from Modscan diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp index 9dafbf6..cd10304 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Running.cpp @@ -105,6 +105,16 @@ State* RunningState::update(Equipment* equipment) setPointValue(equipment, "S2 kW", kw); setPointValue(equipment, "S2 MWh", mwh); + float preferred = getPointValue(equipment, "ATS_Preferred"); + if (preferred == 1.0f){ + setBitValue(equipment, "Source Preferred", 9, true); + setBitValue(equipment, "Source Preferred", 8, false); + } + if (preferred == 2.0f){ + setBitValue(equipment, "Source Preferred", 9, false); + setBitValue(equipment, "Source Preferred", 8, true); + } + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp index 10fd829..cb1a547 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/State_Standby.cpp @@ -96,6 +96,16 @@ State* StandbyState::update(Equipment* equipment) float kw = (1.732f * ((real_v_AB + real_v_BC + real_v_CA)/3.0f) * sim_load * pf)*10; float mwh = kw *600.0f; + float preferred = getPointValue(equipment, "ATS_Preferred"); + if (preferred == 1.0f){ + setBitValue(equipment, "Source Preferred", 9, true); + setBitValue(equipment, "Source Preferred", 8, false); + } + if (preferred == 2.0f){ + setBitValue(equipment, "Source Preferred", 9, false); + setBitValue(equipment, "Source Preferred", 8, true); + } + setPointValue(equipment, "S1 kW", kw); setPointValue(equipment, "S1 MWh", mwh); _applyStrategies(equipment); diff --git a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h index 7b5d59e..3f7bcf0 100644 --- a/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h +++ b/src/EPMS/ATS/ATS_Woodward_DTSC200A_TCP/config.h @@ -60,6 +60,7 @@ */ modbusMap mb_map[] = { + {HR, 8, 0, "ATS_Preferred"}, //Internal to control from Modscan {HR, 9, 0, "ATS_Source"}, //Internal to control from Modscan {HR, 10, 0, "ATS_Load"}, {HR, 11, 0, "ATS_Rating"}, //Internal Fault code from Modscan From 25688908f2799dbe518b3420f103e1b069f6d913 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Fri, 31 Oct 2025 10:34:07 -0700 Subject: [PATCH 10/11] Added General Alarm, Fail State Added General Alarm, Fail State, changed some registers to 10x. --- src/BMS/CHILLER/CH_York_YVAA_RTU/README.md | 55 ++++++++++---- .../CHILLER/CH_York_YVAA_RTU/StateUtils.cpp | 30 ++++---- .../CHILLER/CH_York_YVAA_RTU/State_Fail.cpp | 56 +++++++++++---- .../CH_York_YVAA_RTU/State_Running.cpp | 33 ++++++--- .../CH_York_YVAA_RTU/State_Standby.cpp | 14 +++- src/BMS/CHILLER/CH_York_YVAA_RTU/config.h | 71 +++++++++---------- 6 files changed, 169 insertions(+), 90 deletions(-) diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md b/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md index 0d95a1b..83edb97 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md @@ -1,16 +1,12 @@ # CHILLER YORK YVAA 0428IOK46BAVTXX TCP ## Brief Introduction - -*** NOTE! *** -This code has not been verified with Chiller and Chiller Manager PLC program. -It is a best-guess based on a preliminary review of Chiller PLC program, but -has yet to be fully vetted and local tested with PLC programs. - -Chiller receives Temp SP and Enable from PLC (Modscan) -Alarms are also simulated via Modscan, though those signals will be internal to Chiller -Many hard IO points are simulated using Modscan. -Assumes all Modbus points are for monitoring only and go to Ignition - not sent to PLC +Chiller receives Chiller Temp SP and Enable from PLC. The Supply Temp will ramp to Chiller Temp SP in Run Mode. +Alarms are also simulated via Modscan, though those signals will be internal to Chiller. +Hard IO points simulated with Modscan: Sys 1 Alarm, Sys 2 Alarm. +Chiller Status is sent back to PLC. +In practice, all Modbus points are for monitoring only and go to Ignition - not sent to PLC. +For the sake of simulation, some hard IO points (simulated as Modbus points) will go back to PLC for feedback or will be sent from PLC to Arduino. ## List of Equipment This cofiguration has been used for these models: @@ -24,20 +20,51 @@ The code is written for an ESP8266/ESP32-style microcontroller with WiFi capabil --- ## States and Strategies -Updates Alarms States. If any active alarms --> FailState +Updates Alarms States. Only the Sys 1 Fan Fault or Sys 2 Fan Fault will end unit --> FailState +Sys 1 Alarm, Sys 2 Alarm, and General Alarm will annunciate only, will not stop the unit (this is an assumption the program follows, may differ in field). Updates Free Cooling Mode: Free Cooling Mode is activated using a coil, for simulation purposes only. Modbus points are simulated, mostly with a SingleValue strategy for image verification in Ignition. -While in RunningState, the Supply Temp dynamically ramps to the Supply Temp SP sent from PLC (Modscan) +While in RunningState, the Supply Temp dynamically ramps to the Supply Temp SP sent from PLC (or Modscan) The CHW In and CHW Out temperature values also dynamically ramp to match the Return and Supply Temps. ### Standby State * **Chiller Status**: set to 0 * **Operational Code**: set to 77 * **Chiller Start Command**: set to 0 +Supply Temp = 80 +/- 1 +Return Temp = 80 +/- 1 +System CHW Out = 80 +/- 1 +System CHW In = 80 +/- 1 +Ambient Temp = 1-- +/- 1 +Sys 1, 2 Oil Pressure = 420 +/- 1 +Sys 1, 2 Suction Pressure = 70 +/- 1 +Sys 1, 2 Discharge Pressure = 70 +/- 1 +Sys 1, 2 Condenser Temp = 124 +/- 1 ### Running State * **Chiller status**: set to 1 -* **Supply Temperature**: **Ramp Strategy** ramps to Temp Setpoint from PLC (Modscan) +* **Operational Code**: set to 78 (running) +* **Supply Temperature**: **Ramp Strategy** ramps to Chiller Temp Setpoint from PLC (Modscan) +Supply Temp dynamically ramps to Chiller Temp Setpoint as sent from PLC (or Modscan) +Return Temp sawStrategy (79-83) +System CHW Out dynamically ramps to follow Supply Temp +System CHW In dynamically ramps to follow Return Temp +Ambient Temp = 1-- +/- 1 +Sys 1, 2 Oil Pressure = 450 +/- 5 +Sys 1, 2 Suction Pressure = 70 +/- 2 +Sys 1, 2 Discharge Pressure = 375 +/- 4 +Sys 1, 2 Compressor Pct FLA = 93 +/- 2 +Sys 1, 2 Condenser Temp = 125 +/- 5 +Sys 1 Fan kW = 35 +/- 2 +Sys 2 Fan kW = 23 +/- 2 +Sys 1 Compressor kW = 304 +/- 5 +Sys 2 Compressor kW = 198 +/- 5 ### Fail State -* **Chiller Status**: set to 0 \ No newline at end of file +All values match that of Standby State. +The difference is in Fail State, if a Start Command is sent it will not start the Chiller. +All faults must be cleared, then unit transitions to Standby State. +* **Chiller Status**: set to 0 +* **Operational Code**: set to 77 +* **Chiller Start Command**: set to 0 +All analog values same as in Standby State \ No newline at end of file diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp b/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp index f695598..434a1f3 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/StateUtils.cpp @@ -32,19 +32,19 @@ * @brief Updates Alarms states * * This function will update the Alarm status DI bits according to the Alarm Commands from Coils (Modscan) - * The appropriate Fault Code will also be set to 56 (Condenser Fan VSD Warning) + * The appropriate Fault Code will also be set to 56 (Condenser Fan VSD Warning). + * Also updates the General Alarm bit. If any alarms are active, General Alarm --> 1, else 0. * * This is a function used in the update() of the Standby, Running, and Fail States. * */ void updateAlarms(Equipment* equipment){ + // Updates Sys 1, 2 Fan Fault Alarms with associated Fault Code Modbus_Point* Sys1FanAlarmCommand = equipment->getModbus_Point("Sys 1 Fan Fault ON"); Modbus_Point* Sys2FanAlarmCommand = equipment->getModbus_Point("Sys 2 Fan Fault ON"); - Modbus_Point* GeneralAlarmCommand = equipment->getModbus_Point("General Alarm ON"); Modbus_Point* Sys1FanAlarm = equipment->getModbus_Point("Sys 1 Fan Fault Alarm"); Modbus_Point* Sys2FanAlarm = equipment->getModbus_Point("Sys 2 Fan Fault Alarm"); - Modbus_Point* GeneralAlarm = equipment->getModbus_Point("General Alarm"); if (Sys1FanAlarmCommand) { Sys1FanAlarm->setValue(Sys1FanAlarmCommand->getValue()); if (Sys1FanAlarmCommand->getValue() == 1){ @@ -59,8 +59,20 @@ void updateAlarms(Equipment* equipment){ } else equipment->setModbus_Point("Sys 2 Fault Code", 0); } - GeneralAlarm->setValue(GeneralAlarmCommand->getValue()); + // Update General Alarm (if any Alarm is active, make general alarm active) + const std::vector alarmDescriptions = { + "Sys 1 Alarm", "Sys 2 Alarm", "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm" + }; + int numAlarms = 0; + for (int i =0; i < alarmDescriptions.size(); ++i) { + Modbus_Point* alarmPoint = equipment->getModbus_Point(alarmDescriptions[i]); + if (alarmPoint) { + if (alarmPoint->getValue() == 1) numAlarms++; + } + } + if (numAlarms >= 1) equipment->setModbus_Point("General Alarm", 1); + else equipment->setModbus_Point("General Alarm", 0); } /** @@ -80,14 +92,4 @@ void updateFreeCooling(Equipment* equipment){ Modbus_Point* FreeCoolingValve = equipment->getModbus_Point("Free Cooling Valve"); FreeCoolingMode->setValue(FreeCoolingCommand->getValue()); FreeCoolingValve->setValue(FreeCoolingCommand->getValue()); - /** - if (FreeCoolingCommand->getValue() == 1) { - FreeCoolingMode->setValue(1); - FreeCoolingValve->setValue(1); - } - else { - FreeCoolingMode->setValue(0); - FreeCoolingValve->setValue(0); - } - */ } \ No newline at end of file diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Fail.cpp b/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Fail.cpp index 0991bb1..d3996c3 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Fail.cpp +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Fail.cpp @@ -6,6 +6,7 @@ * * This file contains the implementation for the FailState, which defines * the behavior of the equipment when it has entered a fault condition. + * The unit enters Fail State if Sys 1 Fan Fault Alarm or Sys 2 Fan Fault Alarm is active. */ #include "ModbusPoints/Modbus_Point.h" #include "Equipment/Equipment.h" @@ -29,15 +30,31 @@ * @brief Constructs a new FailState object. * * This constructor receives a list of alarm descriptions and creates strategies - * to set the Compressor and Fan kW to 0. + * to set the unit back into an idle, de-energized state. * - * @param activeAlarms A vector of strings, where each string is the - * description of a Modbus point to be set as an active alarm. + * @param activeFaults A vector of strings, where each string is the + * description of the currently active faults. */ template<> -FailState::FailState(const std::vector& activeAlarms) { +FailState::FailState(const std::vector& activeFaults) { + addStrategy("Supply Temp", new SingleValueStrategy(80.0f, 1.0f, 1000)); + addStrategy("Return Temp", new SingleValueStrategy(80.0f, 1.0f, 1000)); + addStrategy("Ambient Temp", new SingleValueStrategy(100.0f, 1.0f, 1000)); + + addStrategy("System CHW Out", new SingleValueStrategy(80.0f, 1.0f, 1000)); + addStrategy("System CHW In", new SingleValueStrategy(80.0f, 1.0f, 1000)); + addStrategy("Sys 1 Condenser Temp", new SingleValueStrategy(124.0f, 1.0f, 1000)); + addStrategy("Sys 2 Condenser Temp", new SingleValueStrategy(124.0f, 1.0f, 1000)); + addStrategy("Sys 1 Oil Pressure", new SingleValueStrategy(420.0f, 1.0f, 1000)); + addStrategy("Sys 2 Oil Pressure", new SingleValueStrategy(420.0f, 1.0f, 1000)); + addStrategy("Sys 1 Suction Pressure", new SingleValueStrategy(70.0f, 1.0f, 1000)); + addStrategy("Sys 2 Suction Pressure", new SingleValueStrategy(70.0f, 1.0f, 1000)); + addStrategy("Sys 1 Discharge Pressure", new SingleValueStrategy(70.0f, 1.0f, 1000)); + addStrategy("Sys 2 Discharge Pressure", new SingleValueStrategy(70.0f, 1.0f, 1000)); addStrategy("Sys 1 Compressor Pct FLA", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 2 Compressor Pct FLA", new SingleValueStrategy(0.0f, 0.0f, 1000)); + addStrategy("Local Leaving Temp Setpoint", new SingleValueStrategy(70.0f, 0.0f, 1000)); + addStrategy("VSD Output Frequency", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 1 Fan KW", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 2 Fan KW", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 1 Compressor KW", new SingleValueStrategy(0.0f, 0.0f, 1000)); @@ -48,33 +65,44 @@ FailState::FailState(const std::vector& activeAlarms) { * @brief Executes the fail state's logic for one update cycle. * * This method first updates all alarms states and Free Cooling Mode (for ease of testing). - * If all alarms have been cleared --> StandbyState. - * If alarms are still active, ensures the Chiller Start Command remains at 0. + * If all faults have been cleared --> StandbyState. + * If faults are still active, ensures the Chiller Start Command remains at 0. * * @param equipment Pointer to the Equipment instance. * @return A pointer to a new State if a transition should occur, otherwise nullptr. */ template<> State* FailState::update(Equipment* equipment) { - // Update alarms states, Free Cooling mode, Freeze Protection Mode + // Update alarms states, Free Cooling mode updateAlarms(equipment); updateFreeCooling(equipment); - const std::vector alarmDescriptions = { - "Sys 1 Alarm", "Sys 2 Alarm", "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm", + const std::vector FaultDescriptions = { + "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm", }; - // If no alarms active --> send to StandbyState() - bool alarms_active = false; - for (const auto& desc : alarmDescriptions) { + // If no faults active --> send to StandbyState() + bool faults_active = false; + for (const auto& desc : FaultDescriptions) { Modbus_Point* point = equipment->getModbus_Point(desc); if (point->getValue() == 1) { - alarms_active = true; + faults_active = true; } } - if (!alarms_active) return new StandbyState(); + if (!faults_active) return new StandbyState(); setPointValue(equipment, "Chiller Start Command", 0); + + // Update Operational Code depending on Free Cooling Mode + int freeCoolingState = getPointValue(equipment, "Free Cooling Mode ON"); + if (freeCoolingState == 1){ + setPointValue(equipment, "Sys 1 Operational Code", 82); + setPointValue(equipment, "Sys 2 Operational Code", 82); + } + else{ + setPointValue(equipment, "Sys 1 Operational Code", 77); + setPointValue(equipment, "Sys 2 Operational Code", 77); + } _applyStrategies(equipment); return nullptr; diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Running.cpp b/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Running.cpp index b891f34..b476d17 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Running.cpp +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Running.cpp @@ -60,11 +60,11 @@ RunningState::RunningState() { addStrategy("Sys 1 Run Hours", new TotalizerStrategy(1000)); addStrategy("Sys 2 Run Hours", new TotalizerStrategy(1000)); addStrategy("Local Leaving Temp Setpoint", new SingleValueStrategy(70.0f, 0.0f, 1000)); + addStrategy("VSD Output Frequency", new SingleValueStrategy(59.0f, 1.0f, 1000)); addStrategy("Sys 1 Fan KW", new SingleValueStrategy(35.0f, 2.0f, 1000)); addStrategy("Sys 2 Fan KW", new SingleValueStrategy(23.0f, 2.0f, 1000)); addStrategy("Sys 1 Compressor KW", new SingleValueStrategy(304.0f, 5.0f, 1000)); addStrategy("Sys 2 Compressor KW", new SingleValueStrategy(198.0f, 5.0f, 1000)); - } /** @@ -88,23 +88,23 @@ State* RunningState::update(Equipment* equipmen updateAlarms(equipment); updateFreeCooling(equipment); - std::vector activeAlarmsDescriptions = {}; - const std::vector alarmDescriptions = { - "Sys 1 Alarm", "Sys 2 Alarm", "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm", + std::vector activeFaultDescriptions = {}; + const std::vector FaultDescriptions = { + "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm" }; - // Loop through alarms, create array of active alarms and send to FailState if any alarms are active - bool alarms_active = false; - for (const auto& desc : alarmDescriptions) { + // Loop through faults, create array of active faults and send to FailState if any faults are active + bool faults_active = false; + for (const auto& desc : FaultDescriptions) { Modbus_Point* point = equipment->getModbus_Point(desc); if (point->getValue() == 1) { - activeAlarmsDescriptions.push_back(desc); - alarms_active = true; + activeFaultDescriptions.push_back(desc); + faults_active = true; } } - if (alarms_active) return new FailState(activeAlarmsDescriptions); + if (faults_active) return new FailState(activeFaultDescriptions); - // If no alarms active and Start Command = 0--> send to StandbyState() + // If no faults active and Start Command = 0--> send to StandbyState() int Chiller_Enable = getPointValue(equipment, "Chiller Start Command"); // Modscan COIL 1 if (Chiller_Enable == 0){ return new StandbyState(); @@ -124,6 +124,17 @@ State* RunningState::update(Equipment* equipmen static_cast(CHW_In_strat)->setTarget(returnTemp); } + // Update Operational Code depending on Free Cooling Mode + int freeCoolingState = getPointValue(equipment, "Free Cooling Mode ON"); + if (freeCoolingState == 1){ + setPointValue(equipment, "Sys 1 Operational Code", 82); + setPointValue(equipment, "Sys 2 Operational Code", 82); + } + else{ + setPointValue(equipment, "Sys 1 Operational Code", 78); + setPointValue(equipment, "Sys 2 Operational Code", 78); + } + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Standby.cpp b/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Standby.cpp index 9448627..b5309ba 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Standby.cpp +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/State_Standby.cpp @@ -55,6 +55,7 @@ StandbyState::StandbyState() { addStrategy("Sys 1 Compressor Pct FLA", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 2 Compressor Pct FLA", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Local Leaving Temp Setpoint", new SingleValueStrategy(70.0f, 0.0f, 1000)); + addStrategy("VSD Output Frequency", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 1 Fan KW", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 2 Fan KW", new SingleValueStrategy(0.0f, 0.0f, 1000)); addStrategy("Sys 1 Compressor KW", new SingleValueStrategy(0.0f, 0.0f, 1000)); @@ -82,7 +83,7 @@ State* StandbyState::update(Equipment* equipmen std::vector activeAlarmsDescriptions = {}; const std::vector alarmDescriptions = { - "Sys 1 Alarm", "Sys 2 Alarm", "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm", + "Sys 1 Fan Fault Alarm", "Sys 2 Fan Fault Alarm" }; // Loop through alarms, create array of active alarms and send to FailState if any alarms are active @@ -102,6 +103,17 @@ State* StandbyState::update(Equipment* equipmen return new RunningState(); } + // Update Operational Code depending on Free Cooling Mode + int freeCoolingState = getPointValue(equipment, "Free Cooling Mode ON"); + if (freeCoolingState == 1){ + setPointValue(equipment, "Sys 1 Operational Code", 82); + setPointValue(equipment, "Sys 2 Operational Code", 82); + } + else{ + setPointValue(equipment, "Sys 1 Operational Code", 77); + setPointValue(equipment, "Sys 2 Operational Code", 77); + } + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h b/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h index 16eb93f..e240df1 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h @@ -55,58 +55,57 @@ modbusMap mb_map[] = { {COIL, 0, 0, "Chiller Start Command"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only. Signal should come from PLC. - {COIL, 1, 0, "Sys 1 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only --> INDICATION ONLY - {COIL, 2, 0, "Sys 2 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only --> INDICATION ONLY - {COIL, 3, 0, "Sys 1 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only --> FAILSTATE - {COIL, 4, 0, "Sys 2 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only --> FAILSTATE - {COIL, 5, 0, "Free Cooling Mode ON"}, // Use in Modscan - Used for Arduino simulation only - {COIL, 6, 0, "General Alarm ON"}, // Use in Modscan - Used for Arduino simulation only + {COIL, 1, 0, "Sys 1 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only --> INDICATION ONLY (assumption) + {COIL, 2, 0, "Sys 2 Alarm"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only --> INDICATION ONLY (assumption) + {COIL, 3, 0, "Sys 1 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only --> FAILSTATE (assumption) + {COIL, 4, 0, "Sys 2 Fan Fault ON"}, // Use in Modscan - Used for Arduino simulation only --> FAILSTATE (assumption) + {COIL, 5, 0, "Free Cooling Mode ON"}, // Use in Modscan - Used for Arduino simulation only - {DI, 65, 0, "General Alarm"}, // part of Modbus map, but not included in code --> INDICATION ONLY + {DI, 65, 0, "General Alarm"}, // if any alarm is active, General Alarm = 1 --> used for INDICATION ONLY (assumption) {DI, 174, 0, "Sys 1 Fan Fault Alarm"}, {DI, 175, 0, "Sys 2 Fan Fault Alarm"}, {IR, 130, 0, "Free Cooling Mode"}, {IR, 165, 0, "Free Cooling Valve"}, - {HR, 0, 0, "Chiller Status"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {HR, 1, 0, "Chiller Temp Setpoint"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only - {HR, 2, 0, "Supply Temp"}, // Use in Modscan - Hard IO in SCP (PICS?), Used for Arduino simulation only - {HR, 3, 0, "Return Temp"}, // Use in Modscan - Hard IO in SCP (PICS?), Used for Arduino simulation only + {HR, 0, 0, "Chiller Status"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only + {HR, 1, 0, "Chiller Temp Setpoint"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only + {HR, 2, 0, "Supply Temp"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only + {HR, 3, 0, "Return Temp"}, // Use in Modscan - Hard IO in SCP, Used for Arduino simulation only {HR, 4, 70, "System CHW Out"}, {HR, 5, 70, "System CHW In"}, - {HR, 7, 0, "Sys 1 Condenser Temp"}, - {HR, 9, 0, "Ambient Temp"}, + {HR_10x, 7, 0, "Sys 1 Condenser Temp"}, + {HR_10x, 9, 0, "Ambient Temp"}, - {HR, 11, 0, "Sys 1 Oil Pressure"}, - {HR, 12, 0, "Sys 1 Suction Pressure"}, - {HR, 13, 0, "Sys 1 Discharge Pressure"}, - {HR, 14, 0, "Sys 1 Compressor Pct FLA"}, - {HR, 15, 0, "Sys 1 Run Hours"}, - {HR, 16, 0, "Sys 1 Starts"}, + {HR_10x, 11, 0, "Sys 1 Oil Pressure"}, + {HR_10x, 12, 0, "Sys 1 Suction Pressure"}, + {HR_10x, 13, 0, "Sys 1 Discharge Pressure"}, + {HR_10x, 14, 0, "Sys 1 Compressor Pct FLA"}, + {HR, 15, 0, "Sys 1 Run Hours"}, + {HR, 16, 0, "Sys 1 Starts"}, - {HR, 20, 0, "Sys 2 Oil Pressure"}, - {HR, 21, 0, "Sys 2 Suction Pressure"}, - {HR, 22, 0, "Sys 2 Discharge Pressure"}, - {HR, 23, 0, "Sys 2 Compressor Pct FLA"}, - {HR, 24, 0, "Sys 2 Run Hours"}, - {HR, 25, 0, "Sys 2 Starts"}, + {HR_10x, 20, 0, "Sys 2 Oil Pressure"}, + {HR_10x, 21, 0, "Sys 2 Suction Pressure"}, + {HR_10x, 22, 0, "Sys 2 Discharge Pressure"}, + {HR_10x, 23, 0, "Sys 2 Compressor Pct FLA"}, + {HR, 24, 0, "Sys 2 Run Hours"}, + {HR, 25, 0, "Sys 2 Starts"}, - {HR, 26, 0, "VSD Output Frequency"}, // part of Modbus map, but not included in code + {HR_10x, 26, 0, "VSD Output Frequency"}, // part of Modbus map, but not included in code - {HR, 29, 77, "Sys 1 Operational Code"}, - {HR, 30, 0, "Sys 1 Fault Code"}, - {HR, 31, 77, "Sys 2 Operational Code"}, - {HR, 32, 0, "Sys 2 Fault Code"}, + {HR, 29, 77, "Sys 1 Operational Code"}, // 77:not running, 78:running, 82:free cooling + {HR, 30, 0, "Sys 1 Fault Code"}, // 56:condenser fan VSD warning + {HR, 31, 77, "Sys 2 Operational Code"}, // 77:not running, 78:running, 82:free cooling + {HR, 32, 0, "Sys 2 Fault Code"}, // 56:condenser fan VSD warning - {HR, 39, 0, "Local Leaving Temp Setpoint"}, + {HR, 39, 0, "Local Leaving Temp Setpoint"}, - {HR, 49, 0, "Sys 2 Condenser Temp"}, - {HR, 140, 0, "Sys 1 Fan KW"}, - {HR, 141, 0, "Sys 1 Compressor KW"}, - {HR, 142, 0, "Sys 2 Fan KW"}, - {HR, 143, 0, "Sys 2 Compressor KW"}, + {HR_10x, 49, 0, "Sys 2 Condenser Temp"}, + {HR_10x, 140, 0, "Sys 1 Fan KW"}, + {HR_10x, 141, 0, "Sys 1 Compressor KW"}, + {HR_10x, 142, 0, "Sys 2 Fan KW"}, + {HR_10x, 143, 0, "Sys 2 Compressor KW"}, }; //Size of modbus map used in FOR cycles, automatically calculated. From 94dbd4c5c00d4b569b098e0ceaeaa03d5549f2c3 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Fri, 31 Oct 2025 11:08:48 -0700 Subject: [PATCH 11/11] minor adjustments --- src/BMS/CHILLER/CH_York_YVAA_RTU/README.md | 2 +- src/BMS/CHILLER/CH_York_YVAA_RTU/config.h | 2 +- src/BMS/CHILLER/CH_York_YVAA_RTU/main.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md b/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md index 83edb97..f2bc7c7 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/README.md @@ -20,7 +20,7 @@ The code is written for an ESP8266/ESP32-style microcontroller with WiFi capabil --- ## States and Strategies -Updates Alarms States. Only the Sys 1 Fan Fault or Sys 2 Fan Fault will end unit --> FailState +Updates Alarms States. Only the Sys 1 Fan Fault or Sys 2 Fan Fault will send unit --> FailState Sys 1 Alarm, Sys 2 Alarm, and General Alarm will annunciate only, will not stop the unit (this is an assumption the program follows, may differ in field). Updates Free Cooling Mode: Free Cooling Mode is activated using a coil, for simulation purposes only. Modbus points are simulated, mostly with a SingleValue strategy for image verification in Ignition. diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h b/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h index e240df1..79e7383 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/config.h @@ -92,7 +92,7 @@ modbusMap mb_map[] = {HR, 24, 0, "Sys 2 Run Hours"}, {HR, 25, 0, "Sys 2 Starts"}, - {HR_10x, 26, 0, "VSD Output Frequency"}, // part of Modbus map, but not included in code + {HR_10x, 26, 0, "VSD Output Frequency"}, {HR, 29, 77, "Sys 1 Operational Code"}, // 77:not running, 78:running, 82:free cooling {HR, 30, 0, "Sys 1 Fault Code"}, // 56:condenser fan VSD warning diff --git a/src/BMS/CHILLER/CH_York_YVAA_RTU/main.cpp b/src/BMS/CHILLER/CH_York_YVAA_RTU/main.cpp index 5dbc9f1..ec953c3 100644 --- a/src/BMS/CHILLER/CH_York_YVAA_RTU/main.cpp +++ b/src/BMS/CHILLER/CH_York_YVAA_RTU/main.cpp @@ -1,11 +1,11 @@ /** * @file main.cpp - * @brief Main execution program for the Daikin Chiller (RTU) Emulator. - * @author Emmanuel Hernandez Cruz + * @brief Main execution program for the York YVAA Chiller (RTU) Emulator. + * @author Emmanuel Hernandez Cruz, Robert J. Davis * @date 2025-09-02 * * @details This file contains the main execution program for an Arduino-based - * emulator of a Daikin Chiller unit. The program communicates via the + * emulator of a York YVAA Chiller unit. The program communicates via the * Modbus RTU protocol over a serial connection. * * The setup() function initializes the following: