This commit is contained in:
RobertJDavis
2025-12-08 08:37:09 -07:00
parent c5c2b28bf5
commit 7145b04717
6 changed files with 132 additions and 43 deletions

View File

@@ -28,6 +28,90 @@
#include <ModbusRTU.h>
#endif
void updateReturnAirTempAlarms(Equipment<ModbusIP>* equipment){
Modbus_Point<ModbusIP>* returnAirTemp = equipment -> getModbus_Point("Return Air Temp");
Modbus_Point<ModbusIP>* returnTempHighAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm High SP");
Modbus_Point<ModbusIP>* returnTempLowAlarmSP = equipment->getModbus_Point("Return Air Temp Alarm Low SP");
//Modbus_Point<ModbusIP>* returnTempHighAlarm = equipment->getModbus_Point("Alarm High Return Air Temp");
//Modbus_Point<ModbusIP>* 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 High Return Air Temp", 1);
//returnTempHighAlarm->setValue(1);
}
else if (returnAirTemp->getValue() < returnTempLowAlarmSP->getValue()) {
equipment->setModbus_Point("Alarm Low Return Air Temp", 1);
//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<ModbusIP>* equipment){
Modbus_Point<ModbusIP>* supplyAirTemp = equipment -> getModbus_Point("Supply Air Temp");
Modbus_Point<ModbusIP>* supplyTempHighAlarmSP = equipment->getModbus_Point("Supply Air Temp Alarm High SP");
Modbus_Point<ModbusIP>* 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);
}
else if (supplyAirTemp->getValue() < supplyTempLowAlarmSP->getValue()) {
equipment->setModbus_Point("Alarm Low Supply Temp", 1);
}
else{
equipment->setModbus_Point("Alarm High Supply Temp", 0);
equipment->setModbus_Point("Alarm Low Supply Temp", 0);
}
}
void updateReturnHumidityAlarms(Equipment<ModbusIP>* equipment){
Modbus_Point<ModbusIP>* returnHumidity = equipment -> getModbus_Point("Return Humidity");
Modbus_Point<ModbusIP>* returnHumHighAlarmSP = equipment->getModbus_Point("Return Humidity Alarm High SP");
Modbus_Point<ModbusIP>* returnHumLowAlarmSP = equipment->getModbus_Point("Return Humidity Alarm Low SP");
int RAHum = returnHumidity->getValue();
int RAHumHighAlm = returnHumHighAlarmSP->getValue();
int RAHumLowAlm = returnHumLowAlarmSP->getValue();
equipment->setModbus_Point("RATemp Value", RAHum);
equipment->setModbus_Point("RATempHighAlm Value", RAHumHighAlm);
equipment->setModbus_Point("RATempLowAlm Value", RAHumLowAlm);
if (returnHumidity->getValue() > returnHumHighAlarmSP->getValue()) {
equipment->setModbus_Point("Alarm High Return Humidity", 1);
}
else if (returnHumidity->getValue() < returnHumLowAlarmSP->getValue()) {
equipment->setModbus_Point("AAlarm Low Return Humidity", 1);
}
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.
@@ -62,48 +146,7 @@ void updateAlarms(Equipment<ModbusIP>* equipment){
"Common Alarm ON", "Alarm Pump Failure ON", "Alarm Comm Loss Condenser 1 ON", "Alarm Comm Loss Condenser 2 ON",
"Alarm Compressor 1B Overload ON", "Alarm Compressor 2B Overload ON"
};
Modbus_Point<ModbusIP>* returnAirTemp = equipment -> getModbus_Point("Return Air Temp");
Modbus_Point<ModbusIP>* supplyAirTemp = equipment -> getModbus_Point("Supply Air Temp");
Modbus_Point<ModbusIP>* returnHumidity = equipment -> getModbus_Point("Return Humidity");
//int supplyAirTemp = getPointValue(equipment, "Supply Air Temp");
//int returnHumidity = getPointValue(equipment, "Return Humidity");
// Update Return Air Temp Alarms
if (returnAirTemp > equipment->getModbus_Point("Return Air Temp Alarm High SP")) {
equipment->setModbus_Point("Alarm High Return Air Temp", 1);
}
else if (returnAirTemp < equipment->getModbus_Point("Return Air Temp Alarm Low SP")) {
equipment->setModbus_Point("Alarm Low Return Air Temp", 1);
}
else{
equipment->setModbus_Point("Alarm High Return Air Temp", 0);
equipment->setModbus_Point("Alarm Low Return Air Temp", 0);
}
// Update Supply Air Temp Alarms
if (supplyAirTemp > equipment->getModbus_Point("Supply Air Temp Alarm High SP")) {
equipment->setModbus_Point("Alarm High Supply Temp", 1);
}
else if (supplyAirTemp < equipment->getModbus_Point("Supply Air Temp Alarm Low SP")) {
equipment->setModbus_Point("Alarm Low Supply Temp", 1);
}
else{
equipment->setModbus_Point("Alarm High Supply Temp", 0);
equipment->setModbus_Point("Alarm Low Supply Temp", 0);
}
// Update Return Humidity Alarms
if (returnHumidity > equipment->getModbus_Point("Return Humidity Alarm High SP")) {
equipment->setModbus_Point("Alarm High Return Humidity", 1);
}
else if (returnHumidity < equipment->getModbus_Point("Return Humidity Alarm Low SP")) {
equipment->setModbus_Point("AAlarm Low Return Humidity", 1);
}
else{
equipment->setModbus_Point("Alarm High Return Humidity", 0);
equipment->setModbus_Point("Alarm Low Return Humidity", 0);
}
int numAlarms = 0;
for (int i =0; i< alarmCommands.size() && i < alarmDescriptions.size(); ++i) {

View File

@@ -28,6 +28,10 @@
template <typename T>
class State;
void updateReturnAirTempAlarms(Equipment<ModbusIP>* equipment);
void updateSupplyAirTempAlarms(Equipment<ModbusIP>* equipment);
void updateReturnHumidityAlarms(Equipment<ModbusIP>* equipment);
/**
* @brief Checks common alarms (non-fail alarms) and updates the Common Alarm Modbus point.
* @param equipment Pointer to the Equipment instance.

View File

@@ -62,6 +62,9 @@ State<ModbusIP>* FailState<ModbusIP>::update(Equipment<ModbusIP>* equipment) {
Serial.println("Fail update function");
setPointValue(equipment, "System On/Off Control", 0); // my programming logic: when clear fault, should be sent to Standby Mode
updateReturnAirTempAlarms(equipment);
updateSupplyAirTempAlarms(equipment);
updateReturnHumidityAlarms(equipment);
updateAlarms(equipment);
updateDehumidifier(equipment); // Dehumidifier mode can be toggled while in FailState (for ease of Ignition HMI verification)

View File

@@ -47,6 +47,11 @@ RunningState<ModbusIP>::RunningState() {
addStrategy("Return Humidity", new SawStrategy(2.0f, 80.0f, 2.0f, 1000));
addStrategy("Return Air Temp", new SawStrategy(66.0f, 110.0f, 2.0f, 1000));
addStrategy("Supply Air Temp", new SawStrategy(68.0f, 86.0f, 1.0f, 1000));
//addStrategy("Return Humidity", new SingleValueStrategy(10.0f, 0.0f, 1000));
//addStrategy("Return Air Temp", new SingleValueStrategy(50.0f, 0.0f, 1000));
//addStrategy("Supply Air Temp", new SingleValueStrategy(60.0f, 0.0f, 1000));
addStrategy("Supply Air Flow", new SawStrategy(7.0f, 10.0f, 1.0f, 1000));
addStrategy("Fan Speed", new PIDStrategy("Return Air Temp Setpoint", 1000, "Return Air Temp"));
addStrategy("Fluid Control Valve Position 1", new PIDStrategy("Supply Air Temp Setpoint", 1000, "Supply Air Temp"));
@@ -72,6 +77,10 @@ template<>
State<ModbusIP>* RunningState<ModbusIP>::update(Equipment<ModbusIP>* equipment) {
Serial.println("Running update function");
updateReturnAirTempAlarms(equipment);
updateSupplyAirTempAlarms(equipment);
updateReturnHumidityAlarms(equipment);
updateAlarms(equipment);
updateDehumidifier(equipment);

View File

@@ -46,6 +46,13 @@ StandbyState<ModbusIP>::StandbyState() {
addStrategy("Supply Air Flow", new RampStrategy(0.0f, 1.0f, 1000));
addStrategy("Fluid Control Valve Position 1", new RampStrategy(0.0f, 5.0f, 1000));
addStrategy("Fluid Control Valve Position 2", new RampStrategy(0.0f, 5.0f, 1000));
addStrategy("Return Humidity Alarm High SP", new SingleValueStrategy(60.0f, 0.0f, 1000));
addStrategy("Return Humidity Alarm Low SP", new SingleValueStrategy(20.0f, 0.0f, 1000));
addStrategy("Return Air Temp Alarm High SP", new SingleValueStrategy(100.0f, 0.0f, 1000));
addStrategy("Return Air Temp Alarm Low SP", new SingleValueStrategy(72.0f, 0.0f, 1000));
addStrategy("Supply Air Temp Alarm High SP", new SingleValueStrategy(78.0f, 1.0f, 1000));
addStrategy("Supply Air Temp Alarm Low SP", new SingleValueStrategy(72.0f, 1.0f, 1000));
}
/**
@@ -67,6 +74,10 @@ State<ModbusIP>* StandbyState<ModbusIP>::update(Equipment<ModbusIP>* equipment)
// STATE control, add conditions if change to a different state is needed
Serial.println("Standby update function");
updateReturnAirTempAlarms(equipment);
updateSupplyAirTempAlarms(equipment);
updateReturnHumidityAlarms(equipment);
updateAlarms(equipment);
updateDehumidifier(equipment);

View File

@@ -93,6 +93,9 @@ modbusMap mb_map[] =
{COIL, 30, 0, "Alarm Compressor 1B Overload ON"}, // For Arduino testing only
{COIL, 31, 0, "Alarm Compressor 2B Overload ON"}, // For Arduino testing only
//{COIL, 32, 0, "Return Humidity LOW"}, // For Arduino testing only
//{COIL, 33, 0, "Return Humidity HIGH"}, // For Arduino testing only
{DI, 24, 0, "Supply Fan Status"},
{DI, 25, 0, "Cooling Status"},
{DI, 26, 0, "Free Cooling Status"},
@@ -146,12 +149,28 @@ modbusMap mb_map[] =
{HR_10x, 53, 60, "Return Humidity Alarm High SP"},
{HR_10x, 54, 20, "Return Humidity Alarm Low SP"},
{HR, 56, 0, "RAHum Value"},
{HR, 57, 0, "RAHumHighAlm Value"},
{HR, 58, 0, "RAHumLowAlm Value"},
{HR, 732, 73, "Supply Air Temp Setpoint"},
{HR_10x, 738, 100, "Return Air Temp Alarm High SP"},
{HR_10x, 739, 72, "Return Air Temp Alarm Low SP"},
{HR_10x, 738, 0, "Return Air Temp Alarm High SP"},
{HR_10x, 739, 0, "Return Air Temp Alarm Low SP"},
{HR, 740, 0, "RATemp Value"},
{HR, 741, 0, "RATempHighAlm Value"},
{HR, 742, 0, "RATempLowAlm Value"},
{HR, 753, 80, "Return Air Temp Setpoint"},
{HR_10x, 754, 78, "Supply Air Temp Alarm High SP"},
{HR_10x, 755, 72, "Supply Air Temp Alarm Low SP"},
{HR, 740, 0, "SATemp Value"},
{HR, 741, 0, "SATempHighAlm Value"},
{HR, 742, 0, "SATempLowAlm Value"},
};
//Size of modbus map used in FOR cycles, automatically calculated.