From 5259754a66585131bd4a74f9d8dd8fa5dd10aa22 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Wed, 26 Nov 2025 12:47:06 -0700 Subject: [PATCH 01/10] updates from Schertz site visit Added 40029, 30100, 40100 --- platformio.ini | 11 +++++++-- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp | 2 -- src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp | 8 ++++-- src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp | 18 ++++++++++---- src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp | 9 ++++--- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 26 +++++++++++--------- 6 files changed, 47 insertions(+), 27 deletions(-) diff --git a/platformio.ini b/platformio.ini index cb47d6d..26350a5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,10 +11,10 @@ [platformio] -default_envs = CH_York_YVAA_RTU ; Select here the name of the configuration you want to download +default_envs = CRAH_UMAS_TCP ; Select here the name of the configuration you want to download [env] -upload_port = COM9 +upload_port = COM11 [common_env_options] framework = arduino @@ -200,3 +200,10 @@ platform = espressif32 board = dfrobot_firebeetle2_esp32e extends = common_env_options build_src_filter = -<*> + + +[env:CRAH_UMAS_TCP] +platform = espressif32 +board = dfrobot_firebeetle2_esp32e +extends = common_env_options +build_flags = -D USE_MODBUS_IP +build_src_filter = -<*> + \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp index 056bf7b..8fdfcc1 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp @@ -112,7 +112,6 @@ void updateAnalogs(Equipment* equipment){ else if (equipment->getModbus_Point("RA Temp High Alarm ON")->getValue()==1){ equipment->setModbus_Point("Return Air Temp", 104.0f); } - else equipment->setModbus_Point("Return Air Temp", 74.0f); if (equipment->getModbus_Point("RA Humidity Low Alarm ON")->getValue()==1){ equipment->setModbus_Point("Return Air Humidity", 15.0f); @@ -120,5 +119,4 @@ void updateAnalogs(Equipment* equipment){ else if (equipment->getModbus_Point("RA Humidity High Alarm ON")->getValue()==1){ equipment->setModbus_Point("Return Air Humidity", 65.0f); } - else equipment->setModbus_Point("Return Air Humidity", 35.0f); } \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp index eafcf6b..ceeb819 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp @@ -16,6 +16,7 @@ #include "Strategies/Strategy_Ramp.h" #include "Strategies/Strategy_SingleValue.h" #include "Strategies/Strategy_PID.h" +#include "Strategies/Strategy_Saw.h" #include "States/State_Standby.h" #include "States/State_Running.h" #include "States/State_Fail.h" @@ -39,6 +40,9 @@ FailState::FailState(const std::vector& activeAlarms) { // Fan speed --> 0, Run Status --> 0, Amps --> 0 addStrategy("CW Valve Position", new RampStrategy(0.0f, 5.0f, 1000)); + addStrategy("Supply Air Temp", new SingleValueStrategy(74.0f, 1.0f, 1000)); + addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 1000)); + addStrategy("Return Air Humidity", new SingleValueStrategy(35.0f, 2.0f, 1000)); addStrategy("Speed Fan 1", new RampStrategy(0.0f, 10.0f, 1000)); addStrategy("Speed Fan 2", new RampStrategy(0.0f, 10.0f, 1000)); addStrategy("Speed Fan 3", new RampStrategy(0.0f, 10.0f, 1000)); @@ -57,7 +61,7 @@ FailState::FailState(const std::vector& activeAlarms) { addStrategy("Amps Fan 7", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 8", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 9", new RampStrategy(0.0f, 4.5f, 1000)); - + addStrategy("CRAH Heartbeat", new SawStrategy(0.0f, 60.0f, 1.0f, 1000)); } /** @@ -112,7 +116,7 @@ void FailState::enterState(Equipment* equipment) { for (const auto& desc : motorStatusDescriptions) { Modbus_Point* point = equipment->getModbus_Point(desc); if (point) { - point->setValue(1); + point->setValue(0); } }; diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp index f85524b..a1c8f16 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp @@ -71,11 +71,13 @@ RunningState::RunningState() { addStrategy("Operating Hours Fan 7", new TotalizerStrategy(1000)); addStrategy("Operating Hours Fan 8", new TotalizerStrategy(1000)); addStrategy("Operating Hours Fan 9", new TotalizerStrategy(1000)); - addStrategy("Supply Air Temp", new SawStrategy(60.0f, 100.0f, 2.0f, 1000)); // Won't initialize at lower bound; always initializes at 0 b/c FLOAT; initialize manually via Modscan - addStrategy("Return Air Temp", new SawStrategy(70.0f, 80.0f, 1.0f, 1000)); + addStrategy("Supply Air Temp", new SawStrategy(60.0f, 100.0f, 2.2f, 1000)); // Won't initialize at lower bound; always initializes at 0 b/c FLOAT; initialize manually via Modscan + addStrategy("Return Air Humidity", new SawStrategy(25.0f, 40.0f, 1.1f, 1000)); + addStrategy("Return Air Temp", new SawStrategy(70.0f, 80.0f, 0.8f, 1000)); addStrategy("Filter Differential Pressure", new SawStrategy(0.0f, 5.0f, 0.2f, 1000)); addStrategy("CW Valve Position", new PIDStrategy("Supply Air Temp Setpoint", 1000, "Supply Air Temp")); // SAT must be greater than SAT Setpoint for this PID to work. - + addStrategy("CRAH Heartbeat", new SawStrategy(0.0f, 60.0f, 1.0f, 1000)); + addStrategy("Fan Speed Feedback", new RampStrategy(0.0f, 1.0f, 200)); } /** @@ -141,6 +143,12 @@ State* RunningState::update(Equipment* equipment) } } + // Fan Speed Feedback dynamically ramp to Fan Speed Setpoint sent to Arduino + Strategy_Behavior* speedFeedback = getStrategy("Fan Speed Feedback"); + if (speedFeedback){ + static_cast(speedFeedback)->setTarget(BMS_Speed_Setpoint); + } + // Apply any strategies defined for the standby state _applyStrategies(equipment); return nullptr; @@ -168,7 +176,7 @@ void RunningState::enterState(Equipment* equipment) { for (const auto& desc : motorStatusDescriptions) { Modbus_Point* point = equipment->getModbus_Point(desc); if (point) { - point->setValue(0); + point->setValue(1); } } } @@ -193,7 +201,7 @@ void RunningState::exitState(Equipment* equipment) { for (const auto& desc : motorStatusDescriptions) { Modbus_Point* point = equipment->getModbus_Point(desc); if (point) { - point->setValue(1); + point->setValue(0); } } } \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp index 70be6d4..2b78791 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp @@ -41,8 +41,9 @@ StandbyState::StandbyState() { // You can add initialization code here if needed. // These strategies are applied at the end of the update function. addStrategy("CW Valve Position", new RampStrategy(0.0f, 5.0f, 1000)); - addStrategy("Supply Air Temp", new RampStrategy(74.0f, 1.0f, 1000)); - addStrategy("Return Air Temp", new RampStrategy(86.0f, 1.0f, 1000)); + addStrategy("Supply Air Temp", new SingleValueStrategy(74.0f, 1.0f, 1000)); + addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 1000)); + addStrategy("Return Air Humidity", new SingleValueStrategy(35.0f, 2.0f, 1000)); addStrategy("Speed Fan 1", new RampStrategy(0.0f, 10.0f, 1000)); addStrategy("Speed Fan 2", new RampStrategy(0.0f, 10.0f, 1000)); addStrategy("Speed Fan 3", new RampStrategy(0.0f, 10.0f, 1000)); @@ -61,7 +62,7 @@ StandbyState::StandbyState() { addStrategy("Amps Fan 7", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 8", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 9", new RampStrategy(0.0f, 4.5f, 1000)); - + addStrategy("CRAH Heartbeat", new SawStrategy(0.0f, 60.0f, 1.0f, 1000)); } /** @@ -125,7 +126,7 @@ void StandbyState::enterState(Equipment* equipment) { for (const auto& desc : motorStatusDescriptions) { Modbus_Point* point = equipment->getModbus_Point(desc); if (point) { - point->setValue(1); + point->setValue(0); } }; diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 9490535..972a36c 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "TP-Link_D91A"; /**< @brief The SSID of the WiFi network. */ const char *password = "52761492"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(192, 168, 1, 234); /**< @brief The static IP address for the device. */ + IPAddress local_IP(192, 168, 0, 234); /**< @brief The static IP address for the device. */ IPAddress gateway(192, 168, 1, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -99,15 +99,15 @@ modbusMap mb_map[] = {IR, 50, 0, "Alarm Fan 7"}, {IR, 54, 0, "Alarm Fan 8"}, {IR, 58, 0, "Alarm Fan 9"}, - {IR, 27, 1, "Run Status Fan 1"}, // Send to PLC - {IR, 31, 1, "Run Status Fan 2"}, // Send to PLC - {IR, 35, 1, "Run Status Fan 3"}, // Send to PLC - {IR, 39, 1, "Run Status Fan 4"}, // Send to PLC - {IR, 43, 1, "Run Status Fan 5"}, // Send to PLC - {IR, 47, 1, "Run Status Fan 6"}, // Send to PLC - {IR, 51, 1, "Run Status Fan 7"}, // Send to PLC - {IR, 55, 1, "Run Status Fan 8"}, // Send to PLC - {IR, 59, 1, "Run Status Fan 9"}, // Send to PLC + {IR, 27, 0, "Run Status Fan 1"}, // Send to PLC + {IR, 31, 0, "Run Status Fan 2"}, // Send to PLC + {IR, 35, 0, "Run Status Fan 3"}, // Send to PLC + {IR, 39, 0, "Run Status Fan 4"}, // Send to PLC + {IR, 43, 0, "Run Status Fan 5"}, // Send to PLC + {IR, 47, 0, "Run Status Fan 6"}, // Send to PLC + {IR, 51, 0, "Run Status Fan 7"}, // Send to PLC + {IR, 55, 0, "Run Status Fan 8"}, // Send to PLC + {IR, 59, 0, "Run Status Fan 9"}, // Send to PLC {IR, 25, 0, "Speed Fan 1"}, {IR, 29, 0, "Speed Fan 2"}, {IR, 33, 0, "Speed Fan 3"}, @@ -135,7 +135,8 @@ modbusMap mb_map[] = {IR_FLOAT, 73, 0, "Amps Fan 6"}, {IR_FLOAT, 75, 0, "Amps Fan 7"}, {IR_FLOAT, 77, 0, "Amps Fan 8"}, - {IR_FLOAT, 79, 0, "Amps Fan 9"}, + {IR_FLOAT, 79, 0, "Amps Fan 9"}, + {IR_FLOAT, 99, 0, "CRAH Heartbeat"}, {HR_FLOAT, 13, 0, "Fan Speed Setpoint"}, // Receive signal from PLC {HR_FLOAT, 17, 0, "Supply Air Temp Setpoint"}, // Receive signal from PLC @@ -143,7 +144,8 @@ modbusMap mb_map[] = {HR_FLOAT, 23, 0, "Fan Max Speed"}, // Send to PLC {HR, 25, 0, "BMS Control Source"}, // Receive signal from PLC 0:Speed, 1:Room Temp {HR, 26, 2, "BMS Enable Source"}, // Receive signal from PLC 0:Keypad, 1:DI, 2:BMS - {HR, 99, 0, "CRAH Heartbeat"} // Placeholder - we don't have this from UMAS yet. Not used in logic yet. + {HR_FLOAT, 28, 0, "Fan Speed Feedback"}, + {HR_FLOAT, 99, 0, "PLC Heartbeat"}, // This will be seconds from PLC - if doesn't change for 15 seconds set BMS Enable Source to Local (0) }; //Size of modbus map used in FOR cycles, automatically calculated. From 245d01ed61576330898d92a6a3f5d2ca6522d1d2 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Mon, 1 Dec 2025 16:08:34 -0700 Subject: [PATCH 02/10] Added alarm setpoints Added alarm setpoint registers, adjusted individual fan speed --> RPM, ensured Fan Speed Feedback (40029) --> 0 in Standby/Fail mode. --- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp | 8 +++---- src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp | 19 ++++++++------- src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp | 25 ++++++++++---------- src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp | 19 ++++++++------- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 7 ++++++ 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp index 8fdfcc1..c3e3522 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp @@ -107,16 +107,16 @@ void updateAlarms(Equipment* equipment){ // Note: The Common Alarm is not configured to annunciate with these analog low/high alarms. void updateAnalogs(Equipment* equipment){ if (equipment->getModbus_Point("RA Temp Low Alarm ON")->getValue() ==1){ - equipment->setModbus_Point("Return Air Temp", 68.0f); + equipment->setModbus_Point("Return Air Temp", 60.0f); } else if (equipment->getModbus_Point("RA Temp High Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Temp", 104.0f); + equipment->setModbus_Point("Return Air Temp", 110.0f); } if (equipment->getModbus_Point("RA Humidity Low Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 15.0f); + equipment->setModbus_Point("Return Air Humidity", 5.0f); } else if (equipment->getModbus_Point("RA Humidity High Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 65.0f); + equipment->setModbus_Point("Return Air Humidity", 80.0f); } } \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp index ceeb819..b9d847b 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp @@ -43,15 +43,16 @@ FailState::FailState(const std::vector& activeAlarms) { addStrategy("Supply Air Temp", new SingleValueStrategy(74.0f, 1.0f, 1000)); addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 1000)); addStrategy("Return Air Humidity", new SingleValueStrategy(35.0f, 2.0f, 1000)); - addStrategy("Speed Fan 1", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 2", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 3", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 4", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 5", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 6", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 7", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 8", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 9", new RampStrategy(0.0f, 10.0f, 1000)); + addStrategy("Speed Fan 1", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 2", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 3", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 4", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 5", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 6", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 7", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 8", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 9", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Fan Speed Feedback", new RampStrategy(0.0f, 10.0f, 1000)); addStrategy("Amps Fan 1", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 2", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 3", new RampStrategy(0.0f, 4.5f, 1000)); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp index a1c8f16..eda823e 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp @@ -44,15 +44,15 @@ template<> RunningState::RunningState() { addStrategy("Fan Min Speed", new SingleValueStrategy(30.0f, 0.0f, 1000)); addStrategy("Fan Max Speed", new SingleValueStrategy(100.0f, 0.0f, 1000)); - addStrategy("Speed Fan 1", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 2", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 3", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 4", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 5", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 6", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 7", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 8", new RampStrategy(0.0f, 1.0f, 200)); - addStrategy("Speed Fan 9", new RampStrategy(0.0f, 1.0f, 200)); + addStrategy("Speed Fan 1", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 2", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 3", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 4", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 5", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 6", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 7", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 8", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 9", new RampStrategy(0.0f, 100.0f, 200)); addStrategy("Amps Fan 1", new RampStrategy(15.0f, 2.5f, 1000)); addStrategy("Amps Fan 2", new RampStrategy(15.0f, 2.5f, 1000)); addStrategy("Amps Fan 3", new RampStrategy(15.0f, 2.5f, 1000)); @@ -125,7 +125,8 @@ State* RunningState::update(Equipment* equipment) float BMS_Speed_Setpoint_Pct = BMS_Speed_Setpoint / 100.0f; float Fan_Min_Speed = getPointValue(equipment, "Fan Min Speed"); float Fan_Max_Speed = getPointValue(equipment, "Fan Max Speed"); - float Fan_Speed_Setpoint = BMS_Speed_Setpoint_Pct * (Fan_Max_Speed - Fan_Min_Speed) + Fan_Min_Speed; + float Fan_Nominal_Speed = 1900.0f; + float Fan_Speed_Setpoint = (BMS_Speed_Setpoint_Pct * (Fan_Max_Speed - Fan_Min_Speed) + Fan_Min_Speed)/100.0f * Fan_Nominal_Speed; for (int i = 0; i < 10; i++){ std::string pointName = "Speed Fan " + std::to_string(i); Strategy_Behavior* strat = getStrategy(pointName); @@ -133,10 +134,10 @@ State* RunningState::update(Equipment* equipment) RampStrategy* ramp = static_cast(strat); if (ramp){ if (BMS_Speed_Setpoint > 100){ - Fan_Speed_Setpoint = Fan_Max_Speed; + Fan_Speed_Setpoint = Fan_Max_Speed / 100.0f * Fan_Nominal_Speed; } else if (BMS_Speed_Setpoint < 0){ - Fan_Speed_Setpoint = Fan_Min_Speed; + Fan_Speed_Setpoint = Fan_Min_Speed / 100.0f * Fan_Nominal_Speed; } ramp->setTarget(Fan_Speed_Setpoint); } diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp index 2b78791..90be569 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp @@ -44,15 +44,16 @@ StandbyState::StandbyState() { addStrategy("Supply Air Temp", new SingleValueStrategy(74.0f, 1.0f, 1000)); addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 1000)); addStrategy("Return Air Humidity", new SingleValueStrategy(35.0f, 2.0f, 1000)); - addStrategy("Speed Fan 1", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 2", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 3", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 4", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 5", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 6", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 7", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 8", new RampStrategy(0.0f, 10.0f, 1000)); - addStrategy("Speed Fan 9", new RampStrategy(0.0f, 10.0f, 1000)); + addStrategy("Speed Fan 1", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 2", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 3", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 4", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 5", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 6", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 7", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 8", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Speed Fan 9", new RampStrategy(0.0f, 300.0f, 1000)); + addStrategy("Fan Speed Feedback", new RampStrategy(0.0f, 10.0f, 1000)); addStrategy("Amps Fan 1", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 2", new RampStrategy(0.0f, 4.5f, 1000)); addStrategy("Amps Fan 3", new RampStrategy(0.0f, 4.5f, 1000)); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 972a36c..5829224 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -138,8 +138,15 @@ modbusMap mb_map[] = {IR_FLOAT, 79, 0, "Amps Fan 9"}, {IR_FLOAT, 99, 0, "CRAH Heartbeat"}, + {HR_FLOAT, 1, 0, "High Return Air Temp Setpoint"}, // default: 100, set locally on unit + {HR_FLOAT, 3, 0, "Low Return Air Temp Setpoint"}, // default: 72, set locally on unit + {HR_FLOAT, 5, 0, "High Supply Air Temp Setpoint"}, // default: 78, set locally on unit + {HR_FLOAT, 7, 0, "Low Return Air Temp Setpoint"}, // default: 72, set locally on unit + {HR_FLOAT, 9, 0, "High Return Humidity Setpoint"}, // default: 60, set locally on unit + {HR_FLOAT, 11, 0, "Low Return Humidity Setpoint"}, // default: 20, set locally on unit {HR_FLOAT, 13, 0, "Fan Speed Setpoint"}, // Receive signal from PLC {HR_FLOAT, 17, 0, "Supply Air Temp Setpoint"}, // Receive signal from PLC + {HR_FLOAT, 19, 0, "Return Air Temp Setpoint"}, // set locally on unit {HR_FLOAT, 21, 0, "Fan Min Speed"}, // Send to PLC {HR_FLOAT, 23, 0, "Fan Max Speed"}, // Send to PLC {HR, 25, 0, "BMS Control Source"}, // Receive signal from PLC 0:Speed, 1:Room Temp From 7bcbda8f38b4096581536d2a7eaa8a57b89aaead Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Tue, 2 Dec 2025 16:35:25 -0700 Subject: [PATCH 03/10] 40029, HB registers Updated Fan speed feedback calculation, Heartbeat registers --- src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp | 42 +++++++++++--------- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 6 +-- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp index eda823e..14a1b28 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp @@ -44,15 +44,15 @@ template<> RunningState::RunningState() { addStrategy("Fan Min Speed", new SingleValueStrategy(30.0f, 0.0f, 1000)); addStrategy("Fan Max Speed", new SingleValueStrategy(100.0f, 0.0f, 1000)); - addStrategy("Speed Fan 1", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 2", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 3", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 4", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 5", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 6", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 7", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 8", new RampStrategy(0.0f, 100.0f, 200)); - addStrategy("Speed Fan 9", new RampStrategy(0.0f, 100.0f, 200)); + addStrategy("Speed Fan 1", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 2", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 3", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 4", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 5", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 6", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 7", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 8", new RampStrategy(0.0f, 100.0f, 1000)); + addStrategy("Speed Fan 9", new RampStrategy(0.0f, 100.0f, 1000)); addStrategy("Amps Fan 1", new RampStrategy(15.0f, 2.5f, 1000)); addStrategy("Amps Fan 2", new RampStrategy(15.0f, 2.5f, 1000)); addStrategy("Amps Fan 3", new RampStrategy(15.0f, 2.5f, 1000)); @@ -73,11 +73,11 @@ RunningState::RunningState() { addStrategy("Operating Hours Fan 9", new TotalizerStrategy(1000)); addStrategy("Supply Air Temp", new SawStrategy(60.0f, 100.0f, 2.2f, 1000)); // Won't initialize at lower bound; always initializes at 0 b/c FLOAT; initialize manually via Modscan addStrategy("Return Air Humidity", new SawStrategy(25.0f, 40.0f, 1.1f, 1000)); - addStrategy("Return Air Temp", new SawStrategy(70.0f, 80.0f, 0.8f, 1000)); - addStrategy("Filter Differential Pressure", new SawStrategy(0.0f, 5.0f, 0.2f, 1000)); + addStrategy("Return Air Temp", new SawStrategy(84.0f, 87.0f, 0.2f, 1000)); + addStrategy("Filter Differential Pressure", new SawStrategy(0.1f, 5.1f, 0.2f, 1000)); addStrategy("CW Valve Position", new PIDStrategy("Supply Air Temp Setpoint", 1000, "Supply Air Temp")); // SAT must be greater than SAT Setpoint for this PID to work. addStrategy("CRAH Heartbeat", new SawStrategy(0.0f, 60.0f, 1.0f, 1000)); - addStrategy("Fan Speed Feedback", new RampStrategy(0.0f, 1.0f, 200)); + addStrategy("Fan Speed Feedback", new RampStrategy(0.0f, 2.0f, 200)); } /** @@ -121,12 +121,14 @@ State* RunningState::update(Equipment* equipment) // This will update the Fan Speed Setpoint dynamically while in run mode. Fan Speed Setpoint changed through Modscan. // This functioanlity matches the UMAS SOO specifically for how it calculates Speed Setpoint. - float BMS_Speed_Setpoint = getPointValue(equipment, "Fan Speed Setpoint"); - float BMS_Speed_Setpoint_Pct = BMS_Speed_Setpoint / 100.0f; float Fan_Min_Speed = getPointValue(equipment, "Fan Min Speed"); float Fan_Max_Speed = getPointValue(equipment, "Fan Max Speed"); float Fan_Nominal_Speed = 1900.0f; - float Fan_Speed_Setpoint = (BMS_Speed_Setpoint_Pct * (Fan_Max_Speed - Fan_Min_Speed) + Fan_Min_Speed)/100.0f * Fan_Nominal_Speed; + + float BMS_Speed_Setpoint = getPointValue(equipment, "Fan Speed Setpoint"); + float BMS_Speed_Setpoint_Pct = BMS_Speed_Setpoint / 100.0f; + float Fan_Speed_Setpoint = BMS_Speed_Setpoint_Pct * (Fan_Max_Speed - Fan_Min_Speed) + Fan_Min_Speed; + float Fan_Speed_Setpoint_RPM = Fan_Speed_Setpoint / 100.0f * Fan_Nominal_Speed; for (int i = 0; i < 10; i++){ std::string pointName = "Speed Fan " + std::to_string(i); Strategy_Behavior* strat = getStrategy(pointName); @@ -134,12 +136,14 @@ State* RunningState::update(Equipment* equipment) RampStrategy* ramp = static_cast(strat); if (ramp){ if (BMS_Speed_Setpoint > 100){ - Fan_Speed_Setpoint = Fan_Max_Speed / 100.0f * Fan_Nominal_Speed; + Fan_Speed_Setpoint = Fan_Max_Speed; + Fan_Speed_Setpoint_RPM = Fan_Max_Speed / 100.0f * Fan_Nominal_Speed; } else if (BMS_Speed_Setpoint < 0){ - Fan_Speed_Setpoint = Fan_Min_Speed / 100.0f * Fan_Nominal_Speed; + Fan_Speed_Setpoint = Fan_Min_Speed; + Fan_Speed_Setpoint_RPM = Fan_Min_Speed / 100.0f * Fan_Nominal_Speed; } - ramp->setTarget(Fan_Speed_Setpoint); + ramp->setTarget(Fan_Speed_Setpoint_RPM); } } } @@ -147,7 +151,7 @@ State* RunningState::update(Equipment* equipment) // Fan Speed Feedback dynamically ramp to Fan Speed Setpoint sent to Arduino Strategy_Behavior* speedFeedback = getStrategy("Fan Speed Feedback"); if (speedFeedback){ - static_cast(speedFeedback)->setTarget(BMS_Speed_Setpoint); + static_cast(speedFeedback)->setTarget(Fan_Speed_Setpoint); } // Apply any strategies defined for the standby state diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 5829224..307d76b 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -135,8 +135,7 @@ modbusMap mb_map[] = {IR_FLOAT, 73, 0, "Amps Fan 6"}, {IR_FLOAT, 75, 0, "Amps Fan 7"}, {IR_FLOAT, 77, 0, "Amps Fan 8"}, - {IR_FLOAT, 79, 0, "Amps Fan 9"}, - {IR_FLOAT, 99, 0, "CRAH Heartbeat"}, + {IR_FLOAT, 79, 0, "Amps Fan 9"}, {HR_FLOAT, 1, 0, "High Return Air Temp Setpoint"}, // default: 100, set locally on unit {HR_FLOAT, 3, 0, "Low Return Air Temp Setpoint"}, // default: 72, set locally on unit @@ -152,7 +151,8 @@ modbusMap mb_map[] = {HR, 25, 0, "BMS Control Source"}, // Receive signal from PLC 0:Speed, 1:Room Temp {HR, 26, 2, "BMS Enable Source"}, // Receive signal from PLC 0:Keypad, 1:DI, 2:BMS {HR_FLOAT, 28, 0, "Fan Speed Feedback"}, - {HR_FLOAT, 99, 0, "PLC Heartbeat"}, // This will be seconds from PLC - if doesn't change for 15 seconds set BMS Enable Source to Local (0) + {HR, 95, 0, "CRAH Heartbeat"}, + {HR, 96, 0, "BMS Heartbeat"}, // This will be seconds from PLC - if doesn't change for 15 seconds set BMS Enable Source to Local (0) }; //Size of modbus map used in FOR cycles, automatically calculated. From b25048f0e6e4340e0b88752555c6cf08d41fb92a Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Mon, 8 Dec 2025 17:45:30 -0600 Subject: [PATCH 04/10] change IP address for Schertz testing --- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 307d76b..93fc80a 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -21,10 +21,10 @@ * @{ */ #include - const char *ssid = "TP-Link_D91A"; /**< @brief The SSID of the WiFi network. */ - const char *password = "52761492"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(192, 168, 0, 234); /**< @brief The static IP address for the device. */ - IPAddress gateway(192, 168, 1, 1); /**< @brief The gateway IP address. */ + const char *ssid = "ArduinoWifiB"; /**< @brief The SSID of the WiFi network. */ + const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ + IPAddress local_IP(172, 17, 32, 10); /**< @brief The static IP address for the device. */ + IPAddress gateway(172, 17, 32, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ ModbusIP mb; From 9adcdd8a39a0949936ed30dcf13d1d5e0e669131 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Mon, 8 Dec 2025 21:02:12 -0600 Subject: [PATCH 05/10] Updated RA Temp, SA Temp, RA Humidity Alarms Added capability to set RA Temp, SA Temp, RA Humidity to Low, Normal, High range for alarms testing (added alarm registers). Updated Common alarm code appropriately. --- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp | 196 ++++++++++++++++--- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h | 12 +- src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp | 5 +- src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp | 5 +- src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp | 11 +- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 65 +++--- 6 files changed, 225 insertions(+), 69 deletions(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp index c3e3522..0d661c2 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp @@ -53,6 +53,158 @@ void updateControlMode(Equipment* equipment){ equipment->setModbus_Point("Control Mode Selected", Control_Mode_Selected); } +/** + * @brief The purpose of this function is for testing the RA Temp, SA Temp, and RA Humidity alarms (Ignition HMI display) + * User will manually set Alarms through Modscan coils, which will change RA Temp or RA Humidity accordingly. + * The RA Temp alarm limits (reference Ignition UDT) are 72, 100. + * The SA Temp alarm limits (reference Ignition UDT) are 72, 78. + * The RA Humidity alarm limits (reference Ignition UDT) are 20, 60. + * If an associated alarm coil is not active, the analog values are set to a safe, un-alarmed value. + * + * This is a function used in the update() of the Running State. + * +*/ + +void updateAnalogs(Equipment* equipment){ + if (equipment->getModbus_Point("RA Temp NORMAL")->getValue()==1){ + equipment->setModbus_Point("Return Air Temp", 86.0f); + equipment->setModbus_Point("RA Temp Low Alarm ON", 0); + equipment->setModbus_Point("RA Temp High Alarm ON", 0); + equipment->setModbus_Point("RA Temp NORMAL", 0); + } + else if (equipment->getModbus_Point("RA Temp Low Alarm ON")->getValue() ==1){ + equipment->setModbus_Point("Return Air Temp", 62.0f); + equipment->setModbus_Point("RA Temp High Alarm ON", 0); + } + else if (equipment->getModbus_Point("RA Temp High Alarm ON")->getValue()==1){ + equipment->setModbus_Point("Return Air Temp", 106.0f); + equipment->setModbus_Point("RA Temp Low Alarm ON", 0); + } + + if (equipment->getModbus_Point("RA Humidity NORMAL")->getValue()==1){ + equipment->setModbus_Point("Return Air Humidity", 25.0f); + equipment->setModbus_Point("RA Humidity Low Alarm ON", 0); + equipment->setModbus_Point("RA Humidity High Alarm ON", 0); + equipment->setModbus_Point("RA Humidity NORMAL", 0); + } + else if (equipment->getModbus_Point("RA Humidity Low Alarm ON")->getValue()==1){ + equipment->setModbus_Point("Return Air Humidity", 6.0f); + equipment->setModbus_Point("RA Humidity High Alarm ON", 0); + } + else if (equipment->getModbus_Point("RA Humidity High Alarm ON")->getValue()==1){ + equipment->setModbus_Point("Return Air Humidity", 80.0f); + equipment->setModbus_Point("RA Humidity Low Alarm ON", 0); + } + + if (equipment->getModbus_Point("SA Temp NORMAL")->getValue()==1){ + equipment->setModbus_Point("Supply Air Temp", 76.0f); + equipment->setModbus_Point("SA Temp Low Alarm ON", 0); + equipment->setModbus_Point("SA Temp High Alarm ON", 0); + equipment->setModbus_Point("SA Temp NORMAL", 0); + } + else if (equipment->getModbus_Point("SA Temp Low Alarm ON")->getValue() ==1){ + equipment->setModbus_Point("Supply Air Temp", 60.0f); + equipment->setModbus_Point("SA Temp High Alarm ON", 0); + } + else if (equipment->getModbus_Point("SA Temp High Alarm ON")->getValue()==1){ + equipment->setModbus_Point("Supply Air Temp", 90.0f); + equipment->setModbus_Point("SA Temp Low Alarm ON", 0); + } + +} + +void updateReturnAirTempAlarms(Equipment* equipment){ + Modbus_Point* returnAirTemp = equipment -> getModbus_Point("Return Air Temp"); + Modbus_Point* returnTempHighAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm High SP"); + Modbus_Point* returnTempLowAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm Low SP"); + //Modbus_Point* returnTempHighAlarm = equipment->getModbus_Point("Alarm High Return Air Temp"); + //Modbus_Point* returnTempLowAlarm = equipment->getModbus_Point("Alarm Low Return Air Temp"); + + //int RATemp = returnAirTemp->getValue(); + //int RATempHighAlm = returnTempHighAlarmSP->getValue(); + //int RATempLowAlm = returnTempLowAlarmSP->getValue(); + + //equipment->setModbus_Point("RATemp Value", RATemp); + //equipment->setModbus_Point("RATempHighAlm Value", RATempHighAlm); + //equipment->setModbus_Point("RATempLowAlm Value", RATempLowAlm); + + if (returnAirTemp->getValue() < returnTempLowAlarmSP->getValue()) { + equipment->setModbus_Point("Alarm Low Return Air Temp", 1); + equipment->setModbus_Point("Alarm High Return Air Temp", 0); + //returnTempHighAlarm->setValue(1); + } + else if (returnAirTemp->getValue() > returnTempHighAlarmSP->getValue()) { + equipment->setModbus_Point("Alarm High Return Air Temp", 1); + equipment->setModbus_Point("Alarm Low Return Air Temp", 0); + //returnTempLowAlarm->setValue(1); + } + else{ + equipment->setModbus_Point("Alarm High Return Air Temp", 0); + equipment->setModbus_Point("Alarm Low Return Air Temp", 0); + //returnTempHighAlarm->setValue(0); + //returnTempLowAlarm->setValue(0); + } + +} + +void updateSupplyAirTempAlarms(Equipment* equipment){ + Modbus_Point* supplyAirTemp = equipment -> getModbus_Point("Supply Air Temp"); + Modbus_Point* supplyTempHighAlarmSP = equipment->getModbus_Point("Supply Air Temp Alarm High SP"); + Modbus_Point* supplyTempLowAlarmSP = equipment->getModbus_Point("Supply Air Temp Alarm Low SP"); + + /** + int SATemp = supplyAirTemp->getValue(); + int SATempHighAlm = supplyTempHighAlarmSP->getValue(); + int SATempLowAlm = supplyTempLowAlarmSP->getValue(); + + equipment->setModbus_Point("SATemp Value", SATemp); + equipment->setModbus_Point("SATempHighAlm Value", SATempHighAlm); + equipment->setModbus_Point("SATempLowAlm Value", SATempLowAlm); + */ + + if (supplyAirTemp->getValue() > supplyTempHighAlarmSP->getValue()) { + equipment->setModbus_Point("Alarm High Supply Temp", 1); + equipment->setModbus_Point("Alarm Low Supply Temp", 0); + } + else if (supplyAirTemp->getValue() < supplyTempLowAlarmSP->getValue()) { + equipment->setModbus_Point("Alarm Low Supply Temp", 1); + equipment->setModbus_Point("Alarm High Supply Temp", 0); + } + else{ + equipment->setModbus_Point("Alarm High Supply Temp", 0); + equipment->setModbus_Point("Alarm Low Supply Temp", 0); + } +} + +void updateReturnHumidityAlarms(Equipment* equipment){ + Modbus_Point* returnHumidity = equipment -> getModbus_Point("Return Humidity"); + Modbus_Point* returnHumHighAlarmSP = equipment->getModbus_Point("Return Humidity Alarm High SP"); + Modbus_Point* returnHumLowAlarmSP = equipment->getModbus_Point("Return Humidity Alarm Low SP"); + + /** + int RAHum = returnHumidity->getValue(); + int RAHumHighAlm = returnHumHighAlarmSP->getValue(); + int RAHumLowAlm = returnHumLowAlarmSP->getValue(); + + equipment->setModbus_Point("RAHum Value", RAHum); + equipment->setModbus_Point("RAHumHighAlm Value", RAHumHighAlm); + equipment->setModbus_Point("RAHumLowAlm Value", RAHumLowAlm); + */ + + if (returnHumidity->getValue() > returnHumHighAlarmSP->getValue()) { + equipment->setModbus_Point("Alarm High Return Humidity", 1); + equipment->setModbus_Point("Alarm Low Return Humidity", 0); + } + else if (returnHumidity->getValue() < returnHumLowAlarmSP->getValue()) { + equipment->setModbus_Point("Alarm Low Return Humidity", 1); + equipment->setModbus_Point("Alarm High Return Humidity", 0); + } + else{ + equipment->setModbus_Point("Alarm High Return Humidity", 0); + equipment->setModbus_Point("Alarm Low Return Humidity", 0); + } +} + /** * @brief This function will update the Alarm status DI bits according to the Alarm Commands from Coils (Modscan) * It will also update the Common Alarm: if any alarm is active, the Common alarm will also be active. @@ -75,6 +227,12 @@ void updateAlarms(Equipment* equipment){ "Alarm Condensate Pump ON", "Alarm Fire ON", "Alarm Smoke ON" }; + const std::vector alarmAnalogs = { + "Alarm High Return Air Temp", "Alarm Low Return Air Temp", "Alarm High Return Humidity", "Alarm Low Return Humidity", + "Alarm High Supply Temp", "Alarm Low Supply Temp" + }; + + // NOTE: Per UMAS hardwire signals, alarm opened in case of normal operation, closed in case of alarm condition // 0: no alarm, 1: alarm int numAlarms = 0; @@ -86,37 +244,13 @@ void updateAlarms(Equipment* equipment){ if (alarmPoint->getValue() == 1) numAlarms++; } } + // If any of the analog alarms = 1, increment counter for number of active alarms + for (int j = 0; j* alarmAnalogPoint = equipment->getModbus_Point(alarmAnalogs[j]); + if (alarmAnalogPoint) { + if (alarmAnalogPoint->getValue() == 1) numAlarms++; + } + } if (numAlarms >= 1) equipment->setModbus_Point("Common Alarm", 1); else equipment->setModbus_Point("Common Alarm", 0); -} - -/** - * @brief The purpose of this function is for testing the RA Temp and RA Humidity alarms (Ignition HMI display) - * User will manually set Alarms through Modscan coils, which will change RA Temp or RA Humidity accordingly. - * The RA Temp alarm limits (reference Ignition UDT) are 72, 100. - * The SA Temp alarm limits (reference Ignition UDT) are 72, 78. - * The RA Humidity alarm limits (reference Ignition UDT) are 20, 60. - * If an associated alarm coil is not active, the analog values are set to a safe, un-alarmed value. - * - * NOTE: These analog alarms will not activate the Common Alarm in the Arduino test. - * Since these alarms will be set in Ignition, will not be sent over Modbus from CRAH to Ignition. - * - * This is a function used in the update() of the Running State. - * -*/ -// Note: The Common Alarm is not configured to annunciate with these analog low/high alarms. -void updateAnalogs(Equipment* equipment){ - if (equipment->getModbus_Point("RA Temp Low Alarm ON")->getValue() ==1){ - equipment->setModbus_Point("Return Air Temp", 60.0f); - } - else if (equipment->getModbus_Point("RA Temp High Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Temp", 110.0f); - } - - if (equipment->getModbus_Point("RA Humidity Low Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 5.0f); - } - else if (equipment->getModbus_Point("RA Humidity High Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 80.0f); - } } \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h index 23b56cb..7b80a30 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h @@ -35,16 +35,14 @@ class State; */ void updateControlMode(Equipment* equipment); -/** - * @brief Checks common alarms (non-fail alarms) and updates the Common Alarm Modbus point. - * @param equipment Pointer to the Equipment instance. - * @return true if any common alarm is active, false otherwise. - */ -void updateAlarms(Equipment* equipment); +void updateAnalogs(Equipment* equipment); +void updateReturnAirTempAlarms(Equipment* equipment); +void updateSupplyAirTempAlarms(Equipment* equipment); +void updateReturnHumidityAlarms(Equipment* equipment); /** * @brief Checks common alarms (non-fail alarms) and updates the Common Alarm Modbus point. * @param equipment Pointer to the Equipment instance. * @return true if any common alarm is active, false otherwise. */ -void updateAnalogs(Equipment* equipment); \ No newline at end of file +void updateAlarms(Equipment* equipment); \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp index b9d847b..4c1198b 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp @@ -82,8 +82,11 @@ State* FailState::update(Equipment* equipment) { // Still want Control Mode and Alarms to be updated while in Fail State // Ensure BMS Command is set to Off: want operator to re-start from BMS once Leak Detect Alarm is cleared. updateControlMode(equipment); - updateAlarms(equipment); updateAnalogs(equipment); + updateReturnAirTempAlarms(equipment); + updateSupplyAirTempAlarms(equipment); + updateReturnHumidityAlarms(equipment); + updateAlarms(equipment); setPointValue(equipment, "ON/OFF Command By BMS", 0); // The only way to exit the Fail State is for Leak Detect Alarm to turn off, then enter Standby State. diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp index 14a1b28..964c7fc 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp @@ -104,8 +104,11 @@ State* RunningState::update(Equipment* equipment) int BMS_Enable_Source = getPointValue(equipment, "BMS Enable Source"); // Modscan HR 2 updateControlMode(equipment); - updateAlarms(equipment); updateAnalogs(equipment); + updateReturnAirTempAlarms(equipment); + updateSupplyAirTempAlarms(equipment); + updateReturnHumidityAlarms(equipment); + updateAlarms(equipment); // Check to see if Leak Detect alarm is active (only alarm which will make unit FAIL and turn off) --> Send to FailState bool leakDetect = getPointValue(equipment, "Alarm Leak Detect"); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp index 90be569..1c9492c 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp @@ -41,9 +41,9 @@ StandbyState::StandbyState() { // You can add initialization code here if needed. // These strategies are applied at the end of the update function. addStrategy("CW Valve Position", new RampStrategy(0.0f, 5.0f, 1000)); - addStrategy("Supply Air Temp", new SingleValueStrategy(74.0f, 1.0f, 1000)); - addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 1000)); - addStrategy("Return Air Humidity", new SingleValueStrategy(35.0f, 2.0f, 1000)); + addStrategy("Supply Air Temp", new SingleValueStrategy(76.0f, 1.0f, 2000)); + addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 3000)); + addStrategy("Return Air Humidity", new SingleValueStrategy(25.0f, 1.0f, 4000)); addStrategy("Speed Fan 1", new RampStrategy(0.0f, 300.0f, 1000)); addStrategy("Speed Fan 2", new RampStrategy(0.0f, 300.0f, 1000)); addStrategy("Speed Fan 3", new RampStrategy(0.0f, 300.0f, 1000)); @@ -87,8 +87,11 @@ State* StandbyState::update(Equipment* equipment) int BMS_Enable_Source = getPointValue(equipment, "BMS Enable Source"); // Modscan HR 2 updateControlMode(equipment); - updateAlarms(equipment); updateAnalogs(equipment); + updateReturnAirTempAlarms(equipment); + updateSupplyAirTempAlarms(equipment); + updateReturnHumidityAlarms(equipment); + updateAlarms(equipment); // Check to see if Leak Detect alarm is active (only alarm which will make unit FAIL and turn off) --> Send to FailState bool leakDetect = getPointValue(equipment, "Alarm Leak Detect"); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 93fc80a..647caea 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "ArduinoWifiB"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 32, 10); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 32, 11); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 32, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -59,27 +59,42 @@ modbusMap mb_map[] = { {COIL, 0, 0, "ON/OFF Command By BMS"}, // Receive signal from PLC - {COIL, 1, 0, "Alarm Fan 1 ON"}, // Just for Arduino testing. Sets Alarm Fan 1 to 1. - {COIL, 2, 0, "Alarm Fan 2 ON"}, // Just for Arduino testing. Sets Alarm Fan 2 to 1. - {COIL, 3, 0, "Alarm Dirty Filter ON"}, // Just for Arduino testing. Sets Alarm Dirty Filter to 1. - {COIL, 4, 0, "Alarm Leak Detect ON"}, // Just for Arduino testing. Sets Alarm Fan 1 to 1. - {COIL, 5, 0, "RA Temp Low Alarm ON"}, // Just for Arduino testing. Sets RA Temp to 68F (low alarm) - {COIL, 6, 0, "RA Temp High Alarm ON"}, // Just for Arduino testing. Sets RA Temp to 104F (high alarm) - {COIL, 7, 0, "RA Humidity Low Alarm ON"}, // Just for Arduino testing. Sets RA Humidity to 15% (low alarm) - {COIL, 8, 0, "RA Humidity High Alarm ON"}, // Just for Arduino testing. Sets RA Humidity to 65% (high alarm) - {COIL, 9, 0, "Alarm Fan 3 ON"}, // Just for Arduino testing. Sets Alarm Fan 3 to 1. - {COIL, 10, 0, "Alarm Fan 4 ON"}, // Just for Arduino testing. Sets Alarm Fan 4 to 1. - {COIL, 11, 0, "Alarm Fan 5 ON"}, // Just for Arduino testing. Sets Alarm Fan 5 to 1. - {COIL, 12, 0, "Alarm Fan 6 ON"}, // Just for Arduino testing. Sets Alarm Fan 6 to 1. - {COIL, 13, 0, "Alarm Fan 7 ON"}, // Just for Arduino testing. Sets Alarm Fan 7 to 1. - {COIL, 14, 0, "Alarm Fan 8 ON"}, // Just for Arduino testing. Sets Alarm Fan 8 to 1. - {COIL, 15, 0, "Alarm Fan 9 ON"}, // Just for Arduino testing. Sets Alarm Fan 9 to 1. - {COIL, 16, 0, "Alarm Condensate Pump ON"}, // Just for Arduino testing. Sets Alarm Condensate Pump to 1. - {COIL, 17, 0, "Alarm Fire ON"}, // Just for Arduino testing. Sets Alarm Fire to 1. - {COIL, 18, 0, "Alarm Smoke ON"}, // Just for Arduino testing. Sets Alarm Smoke to 1. + {COIL, 1, 0, "Alarm Dirty Filter ON"}, // Just for Arduino testing. Sets Alarm Dirty Filter to 1. + {COIL, 2, 0, "Alarm Leak Detect ON"}, // Just for Arduino testing. Sets Alarm Fan 1 to 1. + + {COIL, 3, 0, "Alarm Fan 1 ON"}, // Just for Arduino testing. Sets Alarm Fan 1 to 1. + {COIL, 4, 0, "Alarm Fan 2 ON"}, // Just for Arduino testing. Sets Alarm Fan 2 to 1. + {COIL, 5, 0, "Alarm Fan 3 ON"}, // Just for Arduino testing. Sets Alarm Fan 3 to 1. + {COIL, 6, 0, "Alarm Fan 4 ON"}, // Just for Arduino testing. Sets Alarm Fan 4 to 1. + {COIL, 7, 0, "Alarm Fan 5 ON"}, // Just for Arduino testing. Sets Alarm Fan 5 to 1. + {COIL, 8, 0, "Alarm Fan 6 ON"}, // Just for Arduino testing. Sets Alarm Fan 6 to 1. + {COIL, 9, 0, "Alarm Fan 7 ON"}, // Just for Arduino testing. Sets Alarm Fan 7 to 1. + {COIL, 10, 0, "Alarm Fan 8 ON"}, // Just for Arduino testing. Sets Alarm Fan 8 to 1. + {COIL, 11, 0, "Alarm Fan 9 ON"}, // Just for Arduino testing. Sets Alarm Fan 9 to 1. + {COIL, 12, 0, "Alarm Condensate Pump ON"}, // Just for Arduino testing. Sets Alarm Condensate Pump to 1. + {COIL, 13, 0, "Alarm Fire ON"}, // Just for Arduino testing. Sets Alarm Fire to 1. + {COIL, 14, 0, "Alarm Smoke ON"}, // Just for Arduino testing. Sets Alarm Smoke to 1. + + {COIL, 15, 0, "RA Temp Low Alarm ON"}, // Just for Arduino testing. Sets RA Temp to 68F (low alarm) + {COIL, 16, 0, "RA Temp NORMAL"}, // Just for Arduino testing. Sets RA Temp to 68F (low alarm) + {COIL, 17, 0, "RA Temp High Alarm ON"}, // Just for Arduino testing. Sets RA Temp to 104F (high alarm) + + {COIL, 18, 0, "SA Temp Low Alarm ON"}, // Just for Arduino testing. Sets RA Temp to 68F (low alarm) + {COIL, 19, 0, "SA Temp NORMAL"}, // Just for Arduino testing. Sets RA Temp to 68F (low alarm) + {COIL, 20, 0, "SA Temp High Alarm ON"}, // Just for Arduino testing. Sets RA Temp to 104F (high alarm) + + {COIL, 21, 0, "RA Humidity Low Alarm ON"}, // Just for Arduino testing. Sets RA Humidity to 15% (low alarm) + {COIL, 22, 0, "RA Humidity NORMAL"}, // Just for Arduino testing. Sets RA Temp to 68F (low alarm) + {COIL, 23, 0, "RA Humidity High Alarm ON"}, // Just for Arduino testing. Sets RA Humidity to 65% (high alarm) {DI, 4, 0, "Alarm Leak Detect"}, {DI, 5, 0, "Alarm Dirty Filter"}, + {DI, 6, 0, "Alarm High Return Air Temp"}, // suggested default 100, operator inputs High RA Temp SP for alarm limit + {DI, 7, 0, "Alarm Low Return Air Temp"}, // suggested default 72, operator inputs Low RA Temp SP for alarm limit + {DI, 8, 0, "Alarm High Supply Temp"}, // suggested default 78, operator inputs High SA Temp SP for alarm limit + {DI, 9, 0, "Alarm Low Supply Temp"}, // suggested default 72, operator inputs Low SA Temp SP for alarm limit + {DI, 10, 0, "Alarm High Return Humidity"}, // suggested default 60, operator inputs High Return Humidity SP for alarm limit + {DI, 11, 0, "Alarm Low Return Humidity"}, // suggested default 20, operator inputs Low Return Humidity SP for alarm limit {DI, 12, 0, "Common Alarm"}, // Send to PLC {DI, 14, 0, "Alarm Condensate Pump"}, {DI, 15, 0, "Alarm Smoke"}, @@ -137,12 +152,12 @@ modbusMap mb_map[] = {IR_FLOAT, 77, 0, "Amps Fan 8"}, {IR_FLOAT, 79, 0, "Amps Fan 9"}, - {HR_FLOAT, 1, 0, "High Return Air Temp Setpoint"}, // default: 100, set locally on unit - {HR_FLOAT, 3, 0, "Low Return Air Temp Setpoint"}, // default: 72, set locally on unit - {HR_FLOAT, 5, 0, "High Supply Air Temp Setpoint"}, // default: 78, set locally on unit - {HR_FLOAT, 7, 0, "Low Return Air Temp Setpoint"}, // default: 72, set locally on unit - {HR_FLOAT, 9, 0, "High Return Humidity Setpoint"}, // default: 60, set locally on unit - {HR_FLOAT, 11, 0, "Low Return Humidity Setpoint"}, // default: 20, set locally on unit + {HR_FLOAT, 1, 100, "Return Air Temp Alarm High SP"}, // default: 100, set locally on unit + {HR_FLOAT, 3, 72, "Return Air Temp Alarm Low SP"}, // default: 72, set locally on unit + {HR_FLOAT, 5, 78, "Supply Air Temp Alarm High SP"}, // default: 78, set locally on unit + {HR_FLOAT, 7, 72, "Supply Air Temp Alarm Low SP"}, // default: 72, set locally on unit + {HR_FLOAT, 9, 60, "Return Humidity Alarm High SP"}, // default: 60, set locally on unit + {HR_FLOAT, 11, 20, "Return Humidity Alarm Low SP"}, // default: 20, set locally on unit {HR_FLOAT, 13, 0, "Fan Speed Setpoint"}, // Receive signal from PLC {HR_FLOAT, 17, 0, "Supply Air Temp Setpoint"}, // Receive signal from PLC {HR_FLOAT, 19, 0, "Return Air Temp Setpoint"}, // set locally on unit From 9f48ade1862dd04b401b7b93765d58f09a504caf Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Mon, 8 Dec 2025 21:11:23 -0600 Subject: [PATCH 06/10] removed float initialize --- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 647caea..8e0a308 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -152,12 +152,12 @@ modbusMap mb_map[] = {IR_FLOAT, 77, 0, "Amps Fan 8"}, {IR_FLOAT, 79, 0, "Amps Fan 9"}, - {HR_FLOAT, 1, 100, "Return Air Temp Alarm High SP"}, // default: 100, set locally on unit - {HR_FLOAT, 3, 72, "Return Air Temp Alarm Low SP"}, // default: 72, set locally on unit - {HR_FLOAT, 5, 78, "Supply Air Temp Alarm High SP"}, // default: 78, set locally on unit - {HR_FLOAT, 7, 72, "Supply Air Temp Alarm Low SP"}, // default: 72, set locally on unit - {HR_FLOAT, 9, 60, "Return Humidity Alarm High SP"}, // default: 60, set locally on unit - {HR_FLOAT, 11, 20, "Return Humidity Alarm Low SP"}, // default: 20, set locally on unit + {HR_FLOAT, 1, 0, "Return Air Temp Alarm High SP"}, // default: 100, set locally on unit + {HR_FLOAT, 3, 0, "Return Air Temp Alarm Low SP"}, // default: 72, set locally on unit + {HR_FLOAT, 5, 0, "Supply Air Temp Alarm High SP"}, // default: 78, set locally on unit + {HR_FLOAT, 7, 0, "Supply Air Temp Alarm Low SP"}, // default: 72, set locally on unit + {HR_FLOAT, 9, 0, "Return Humidity Alarm High SP"}, // default: 60, set locally on unit + {HR_FLOAT, 11, 0, "Return Humidity Alarm Low SP"}, // default: 20, set locally on unit {HR_FLOAT, 13, 0, "Fan Speed Setpoint"}, // Receive signal from PLC {HR_FLOAT, 17, 0, "Supply Air Temp Setpoint"}, // Receive signal from PLC {HR_FLOAT, 19, 0, "Return Air Temp Setpoint"}, // set locally on unit From c49c99869de9c0d63ac2da22fa7657fff8441019 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Tue, 9 Dec 2025 08:03:23 -0600 Subject: [PATCH 07/10] updates from EG CRAH --- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp | 60 +++----------------- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h | 1 - src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp | 2 +- src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp | 6 +- src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp | 2 +- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 2 +- 6 files changed, 14 insertions(+), 59 deletions(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp index 0d661c2..9651fa2 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp @@ -53,46 +53,34 @@ void updateControlMode(Equipment* equipment){ equipment->setModbus_Point("Control Mode Selected", Control_Mode_Selected); } -/** - * @brief The purpose of this function is for testing the RA Temp, SA Temp, and RA Humidity alarms (Ignition HMI display) - * User will manually set Alarms through Modscan coils, which will change RA Temp or RA Humidity accordingly. - * The RA Temp alarm limits (reference Ignition UDT) are 72, 100. - * The SA Temp alarm limits (reference Ignition UDT) are 72, 78. - * The RA Humidity alarm limits (reference Ignition UDT) are 20, 60. - * If an associated alarm coil is not active, the analog values are set to a safe, un-alarmed value. - * - * This is a function used in the update() of the Running State. - * -*/ - void updateAnalogs(Equipment* equipment){ if (equipment->getModbus_Point("RA Temp NORMAL")->getValue()==1){ - equipment->setModbus_Point("Return Air Temp", 86.0f); + equipment->setModbus_Point("Return Air Temp", 84.0f); equipment->setModbus_Point("RA Temp Low Alarm ON", 0); equipment->setModbus_Point("RA Temp High Alarm ON", 0); equipment->setModbus_Point("RA Temp NORMAL", 0); } else if (equipment->getModbus_Point("RA Temp Low Alarm ON")->getValue() ==1){ - equipment->setModbus_Point("Return Air Temp", 62.0f); + equipment->setModbus_Point("Return Air Temp", 60.0f); equipment->setModbus_Point("RA Temp High Alarm ON", 0); } else if (equipment->getModbus_Point("RA Temp High Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Temp", 106.0f); + equipment->setModbus_Point("Return Air Temp", 110.0f); equipment->setModbus_Point("RA Temp Low Alarm ON", 0); } if (equipment->getModbus_Point("RA Humidity NORMAL")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 25.0f); + equipment->setModbus_Point("Return Humidity", 25.0f); equipment->setModbus_Point("RA Humidity Low Alarm ON", 0); equipment->setModbus_Point("RA Humidity High Alarm ON", 0); equipment->setModbus_Point("RA Humidity NORMAL", 0); } else if (equipment->getModbus_Point("RA Humidity Low Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 6.0f); + equipment->setModbus_Point("Return Humidity", 5.0f); equipment->setModbus_Point("RA Humidity High Alarm ON", 0); } else if (equipment->getModbus_Point("RA Humidity High Alarm ON")->getValue()==1){ - equipment->setModbus_Point("Return Air Humidity", 80.0f); + equipment->setModbus_Point("Return Humidity", 80.0f); equipment->setModbus_Point("RA Humidity Low Alarm ON", 0); } @@ -117,32 +105,18 @@ void updateReturnAirTempAlarms(Equipment* equipment){ Modbus_Point* returnAirTemp = equipment -> getModbus_Point("Return Air Temp"); Modbus_Point* returnTempHighAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm High SP"); Modbus_Point* returnTempLowAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm Low SP"); - //Modbus_Point* returnTempHighAlarm = equipment->getModbus_Point("Alarm High Return Air Temp"); - //Modbus_Point* returnTempLowAlarm = equipment->getModbus_Point("Alarm Low Return Air Temp"); - - //int RATemp = returnAirTemp->getValue(); - //int RATempHighAlm = returnTempHighAlarmSP->getValue(); - //int RATempLowAlm = returnTempLowAlarmSP->getValue(); - - //equipment->setModbus_Point("RATemp Value", RATemp); - //equipment->setModbus_Point("RATempHighAlm Value", RATempHighAlm); - //equipment->setModbus_Point("RATempLowAlm Value", RATempLowAlm); if (returnAirTemp->getValue() < returnTempLowAlarmSP->getValue()) { equipment->setModbus_Point("Alarm Low Return Air Temp", 1); equipment->setModbus_Point("Alarm High Return Air Temp", 0); - //returnTempHighAlarm->setValue(1); } else if (returnAirTemp->getValue() > returnTempHighAlarmSP->getValue()) { equipment->setModbus_Point("Alarm High Return Air Temp", 1); equipment->setModbus_Point("Alarm Low Return Air Temp", 0); - //returnTempLowAlarm->setValue(1); } else{ equipment->setModbus_Point("Alarm High Return Air Temp", 0); equipment->setModbus_Point("Alarm Low Return Air Temp", 0); - //returnTempHighAlarm->setValue(0); - //returnTempLowAlarm->setValue(0); } } @@ -152,16 +126,6 @@ void updateSupplyAirTempAlarms(Equipment* equipment){ Modbus_Point* supplyTempHighAlarmSP = equipment->getModbus_Point("Supply Air Temp Alarm High SP"); Modbus_Point* supplyTempLowAlarmSP = equipment->getModbus_Point("Supply Air Temp Alarm Low SP"); - /** - int SATemp = supplyAirTemp->getValue(); - int SATempHighAlm = supplyTempHighAlarmSP->getValue(); - int SATempLowAlm = supplyTempLowAlarmSP->getValue(); - - equipment->setModbus_Point("SATemp Value", SATemp); - equipment->setModbus_Point("SATempHighAlm Value", SATempHighAlm); - equipment->setModbus_Point("SATempLowAlm Value", SATempLowAlm); - */ - if (supplyAirTemp->getValue() > supplyTempHighAlarmSP->getValue()) { equipment->setModbus_Point("Alarm High Supply Temp", 1); equipment->setModbus_Point("Alarm Low Supply Temp", 0); @@ -181,16 +145,6 @@ void updateReturnHumidityAlarms(Equipment* equipment){ Modbus_Point* returnHumHighAlarmSP = equipment->getModbus_Point("Return Humidity Alarm High SP"); Modbus_Point* returnHumLowAlarmSP = equipment->getModbus_Point("Return Humidity Alarm Low SP"); - /** - int RAHum = returnHumidity->getValue(); - int RAHumHighAlm = returnHumHighAlarmSP->getValue(); - int RAHumLowAlm = returnHumLowAlarmSP->getValue(); - - equipment->setModbus_Point("RAHum Value", RAHum); - equipment->setModbus_Point("RAHumHighAlm Value", RAHumHighAlm); - equipment->setModbus_Point("RAHumLowAlm Value", RAHumLowAlm); - */ - if (returnHumidity->getValue() > returnHumHighAlarmSP->getValue()) { equipment->setModbus_Point("Alarm High Return Humidity", 1); equipment->setModbus_Point("Alarm Low Return Humidity", 0); @@ -251,6 +205,8 @@ void updateAlarms(Equipment* equipment){ if (alarmAnalogPoint->getValue() == 1) numAlarms++; } } + // If any alarms are active, set the Common Alarm = 1, else Common Alarm = 0. + if (numAlarms >= 1) equipment->setModbus_Point("Common Alarm", 1); else equipment->setModbus_Point("Common Alarm", 0); } \ No newline at end of file diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h index 7b80a30..7c49f8f 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.h @@ -34,7 +34,6 @@ class State; * @return The selected control mode (int). */ void updateControlMode(Equipment* equipment); - void updateAnalogs(Equipment* equipment); void updateReturnAirTempAlarms(Equipment* equipment); void updateSupplyAirTempAlarms(Equipment* equipment); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp index 4c1198b..5e9c124 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Fail.cpp @@ -42,7 +42,7 @@ FailState::FailState(const std::vector& activeAlarms) { addStrategy("CW Valve Position", new RampStrategy(0.0f, 5.0f, 1000)); addStrategy("Supply Air Temp", new SingleValueStrategy(74.0f, 1.0f, 1000)); addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 1000)); - addStrategy("Return Air Humidity", new SingleValueStrategy(35.0f, 2.0f, 1000)); + addStrategy("Return Humidity", new SingleValueStrategy(30.0f, 1.0f, 3000)); addStrategy("Speed Fan 1", new RampStrategy(0.0f, 300.0f, 1000)); addStrategy("Speed Fan 2", new RampStrategy(0.0f, 300.0f, 1000)); addStrategy("Speed Fan 3", new RampStrategy(0.0f, 300.0f, 1000)); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp index 964c7fc..9290275 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Running.cpp @@ -71,9 +71,9 @@ RunningState::RunningState() { addStrategy("Operating Hours Fan 7", new TotalizerStrategy(1000)); addStrategy("Operating Hours Fan 8", new TotalizerStrategy(1000)); addStrategy("Operating Hours Fan 9", new TotalizerStrategy(1000)); - addStrategy("Supply Air Temp", new SawStrategy(60.0f, 100.0f, 2.2f, 1000)); // Won't initialize at lower bound; always initializes at 0 b/c FLOAT; initialize manually via Modscan - addStrategy("Return Air Humidity", new SawStrategy(25.0f, 40.0f, 1.1f, 1000)); - addStrategy("Return Air Temp", new SawStrategy(84.0f, 87.0f, 0.2f, 1000)); + addStrategy("Supply Air Temp", new SawStrategy(73.0f, 77.0f, 0.2f, 1000)); // Won't initialize at lower bound; always initializes at 0 b/c FLOAT; initialize manually via Modscan + addStrategy("Return Humidity", new SawStrategy(25.0f, 35.0f, 0.2f, 1000)); + addStrategy("Return Air Temp", new SawStrategy(80.0f, 90.0f, 0.2f, 1000)); addStrategy("Filter Differential Pressure", new SawStrategy(0.1f, 5.1f, 0.2f, 1000)); addStrategy("CW Valve Position", new PIDStrategy("Supply Air Temp Setpoint", 1000, "Supply Air Temp")); // SAT must be greater than SAT Setpoint for this PID to work. addStrategy("CRAH Heartbeat", new SawStrategy(0.0f, 60.0f, 1.0f, 1000)); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp index 1c9492c..c863fcd 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/State_Standby.cpp @@ -43,7 +43,7 @@ StandbyState::StandbyState() { addStrategy("CW Valve Position", new RampStrategy(0.0f, 5.0f, 1000)); addStrategy("Supply Air Temp", new SingleValueStrategy(76.0f, 1.0f, 2000)); addStrategy("Return Air Temp", new SingleValueStrategy(86.0f, 1.0f, 3000)); - addStrategy("Return Air Humidity", new SingleValueStrategy(25.0f, 1.0f, 4000)); + addStrategy("Return Humidity", new SingleValueStrategy(25.0f, 1.0f, 4000)); addStrategy("Speed Fan 1", new RampStrategy(0.0f, 300.0f, 1000)); addStrategy("Speed Fan 2", new RampStrategy(0.0f, 300.0f, 1000)); addStrategy("Speed Fan 3", new RampStrategy(0.0f, 300.0f, 1000)); diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 8e0a308..614956b 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -101,7 +101,7 @@ modbusMap mb_map[] = {DI, 16, 0, "Alarm Fire"}, {IR_FLOAT, 1, 0, "Supply Air Temp"}, - {IR_FLOAT, 3, 0, "Return Air Humidity"}, // Ignition visual only + {IR_FLOAT, 3, 0, "Return Humidity"}, // Ignition visual only {IR_FLOAT, 5, 0, "Return Air Temp"}, // Send to PLC {IR_FLOAT, 7, 0, "Filter Differential Pressure"}, // sawStrategy between 0 and 5 {IR_FLOAT, 9, 0, "CW Valve Position"}, From adb319d7633361b39e3726b58093d4da751f7fc5 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Tue, 9 Dec 2025 16:36:33 -0600 Subject: [PATCH 08/10] IP address changes for Schertz setup --- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 614956b..6ef768a 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "ArduinoWifiB"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 32, 11); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 32, 49); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 32, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */ @@ -56,6 +56,9 @@ * This array defines all the Modbus points available on the emulated device. * The `description` field is crucial as it's used to look up points within the application logic. */ + + // "One-Based" Addressing for IR, HR registers + modbusMap mb_map[] = { {COIL, 0, 0, "ON/OFF Command By BMS"}, // Receive signal from PLC From cde17f28e788b2e18b88c006432f1409b9350917 Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Fri, 12 Dec 2025 11:32:17 -0700 Subject: [PATCH 09/10] added comments --- src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp index 9651fa2..f479c57 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/StateUtils.cpp @@ -53,6 +53,11 @@ void updateControlMode(Equipment* equipment){ equipment->setModbus_Point("Control Mode Selected", Control_Mode_Selected); } +/** This function will set RA Temp, SA Temp, RA Humidity analog values to a LOW or HIGH range for testing alarms in Ignition. + * There is an associated COIL for performing each of those functions. + * There is also a NORMAL bit, which sends a one-shot to reset the associated analog value back into a normal range. + */ + void updateAnalogs(Equipment* equipment){ if (equipment->getModbus_Point("RA Temp NORMAL")->getValue()==1){ equipment->setModbus_Point("Return Air Temp", 84.0f); @@ -101,6 +106,7 @@ void updateAnalogs(Equipment* equipment){ } +// Updates the RA Temp Alarms void updateReturnAirTempAlarms(Equipment* equipment){ Modbus_Point* returnAirTemp = equipment -> getModbus_Point("Return Air Temp"); Modbus_Point* returnTempHighAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm High SP"); @@ -121,6 +127,7 @@ void updateReturnAirTempAlarms(Equipment* equipment){ } +// Updates the SA Temp Alarms void updateSupplyAirTempAlarms(Equipment* equipment){ Modbus_Point* supplyAirTemp = equipment -> getModbus_Point("Supply Air Temp"); Modbus_Point* supplyTempHighAlarmSP = equipment->getModbus_Point("Supply Air Temp Alarm High SP"); @@ -140,6 +147,7 @@ void updateSupplyAirTempAlarms(Equipment* equipment){ } } +// Updates the RA Humidity Alarms void updateReturnHumidityAlarms(Equipment* equipment){ Modbus_Point* returnHumidity = equipment -> getModbus_Point("Return Humidity"); Modbus_Point* returnHumHighAlarmSP = equipment->getModbus_Point("Return Humidity Alarm High SP"); From 1226c4541803d174cabca9dab14595f609b11b0f Mon Sep 17 00:00:00 2001 From: RobertJDavis Date: Tue, 24 Feb 2026 15:34:17 -0700 Subject: [PATCH 10/10] Update config.h --- src/BMS/CRAH/CRAH_UMAS_TCP/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h index 6ef768a..0fac917 100644 --- a/src/BMS/CRAH/CRAH_UMAS_TCP/config.h +++ b/src/BMS/CRAH/CRAH_UMAS_TCP/config.h @@ -23,7 +23,7 @@ #include const char *ssid = "ArduinoWifiB"; /**< @brief The SSID of the WiFi network. */ const char *password = "123abc456"; /**< @brief The password for the WiFi network. */ - IPAddress local_IP(172, 17, 32, 49); /**< @brief The static IP address for the device. */ + IPAddress local_IP(172, 17, 32, 232); /**< @brief The static IP address for the device. */ IPAddress gateway(172, 17, 32, 1); /**< @brief The gateway IP address. */ IPAddress subnet(255, 255, 255, 0); /**< @brief The subnet mask. */