diff options
author | David Crocker <dcrocker@eschertech.com> | 2020-11-26 13:35:42 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2020-11-26 13:35:42 +0300 |
commit | 06a810a343f9e6e01205b8b6875f8f0103c80bd2 (patch) | |
tree | 592b1423efe5b3544275081f9ca02a41a2be6079 /src/Heating | |
parent | 9ea8c5a4b6bd97e75ed8fc8ff08cd113bad7633f (diff) |
Removed order dependency of M307, M143, M140, M141 and M563
Diffstat (limited to 'src/Heating')
-rw-r--r-- | src/Heating/FOPDT.cpp | 45 | ||||
-rw-r--r-- | src/Heating/FOPDT.h | 3 | ||||
-rw-r--r-- | src/Heating/Heat.cpp | 24 | ||||
-rw-r--r-- | src/Heating/Heat.h | 5 | ||||
-rw-r--r-- | src/Heating/Heater.cpp | 71 | ||||
-rw-r--r-- | src/Heating/Heater.h | 7 | ||||
-rw-r--r-- | src/Heating/LocalHeater.cpp | 5 | ||||
-rw-r--r-- | src/Heating/RemoteHeater.cpp | 5 |
8 files changed, 111 insertions, 54 deletions
diff --git a/src/Heating/FOPDT.cpp b/src/Heating/FOPDT.cpp index be274f17..e343f027 100644 --- a/src/Heating/FOPDT.cpp +++ b/src/Heating/FOPDT.cpp @@ -54,15 +54,10 @@ DEFINE_GET_OBJECT_MODEL_TABLE(FopDt) #endif -// Heater 6 on the Duet 0.8.5 is disabled by default at startup so that we can use fan 2. -// Set up sensible defaults here in case the user enables the heater without specifying values for all the parameters. +// The heater model is disabled until the user declares the heater to be a bed, chamber or tool heater FopDt::FopDt() noexcept - : heatingRate(DefaultHotEndHeaterHeatingRate), - coolingRateFanOff(DefaultHotEndHeaterCoolingRate), coolingRateChangeFanOn(0.0), - deadTime(DefaultHotEndHeaterDeadTime), maxPwm(1.0), standardVoltage(0.0), - enabled(true), usePid(true), inverted(false), pidParametersOverridden(false) { - CalcPidConstants(); + Clear(); } // Check the model parameters are sensible, if they are then save them and return true. @@ -94,6 +89,42 @@ bool FopDt::SetParameters(float phr, float pcrFanOff, float pcrFanOn, float pdt, return false; } +void FopDt::Clear() noexcept +{ + SetDefaultToolParameters(); // set some values so that we don't report rubbish in the OM + enabled = false; // heater is disabled until the parameters are set +} + +// Set up default parameters for a tool heater and enable the model +void FopDt::SetDefaultToolParameters() noexcept +{ + heatingRate = DefaultHotEndHeaterHeatingRate; + coolingRateFanOff = DefaultHotEndHeaterCoolingRate; + deadTime = DefaultHotEndHeaterDeadTime; + coolingRateChangeFanOn = 0.0; + maxPwm = 1.0; + standardVoltage = 0.0; + usePid = true; + inverted = false; + enabled = true; + CalcPidConstants(); +} + +// Set up default parameters for a bed/chamber heater and enable the model +void FopDt::SetDefaultBedOrChamberParameters() noexcept +{ + heatingRate = DefaultBedHeaterHeatingRate; + coolingRateFanOff = DefaultBedHeaterCoolingRate; + deadTime = DefaultBedHeaterDeadTime; + coolingRateChangeFanOn = 0.0; + maxPwm = 1.0; + standardVoltage = 0.0; + usePid = false; + inverted = false; + enabled = true; + CalcPidConstants(); +} + // Get the PID parameters as reported by M301 M301PidParameters FopDt::GetM301PidParameters(bool forLoadChange) const noexcept { diff --git a/src/Heating/FOPDT.h b/src/Heating/FOPDT.h index eab8d1fb..84ac8123 100644 --- a/src/Heating/FOPDT.h +++ b/src/Heating/FOPDT.h @@ -42,7 +42,10 @@ class FopDt INHERIT_OBJECT_MODEL public: FopDt() noexcept; + void Clear() noexcept; bool SetParameters(float phr, float pcrFanOff, float pcrFanOn, float pdt, float pMaxPwm, float temperatureLimit, float pVoltage, bool pUsePid, bool pInverted) noexcept; + void SetDefaultToolParameters() noexcept; + void SetDefaultBedOrChamberParameters() noexcept; // Stored parameters float GetHeatingRate() const noexcept { return heatingRate; } diff --git a/src/Heating/Heat.cpp b/src/Heating/Heat.cpp index 7815676d..0e8dbc29 100644 --- a/src/Heating/Heat.cpp +++ b/src/Heating/Heat.cpp @@ -248,7 +248,7 @@ void Heat::ResetHeaterModels() noexcept { if (h != nullptr && h->IsHeaterEnabled()) { - h->SetModelDefaults(); + h->ClearModelAndMonitors(); } } } @@ -577,6 +577,7 @@ HeaterStatus Heat::GetStatus(int heater) const noexcept void Heat::SetBedHeater(size_t index, int heater) noexcept { + // First, turn off any existing bed heater in this slot { const auto h = FindHeater(bedHeaters[index]); if (h.IsNotNull()) @@ -586,10 +587,10 @@ void Heat::SetBedHeater(size_t index, int heater) noexcept } bedHeaters[index] = heater; { - const auto h = FindHeater(bedHeaters[index]); + const auto h = FindHeater(heater); if (h.IsNotNull()) { - h->SetDefaultMonitors(); + h->SetAsBedOrChamberHeater(); } } reprap.HeatUpdated(); @@ -609,6 +610,7 @@ bool Heat::IsBedHeater(int heater) const noexcept void Heat::SetChamberHeater(size_t index, int heater) noexcept { + // First, turn off any existing chamber heater in this slot { const auto h = FindHeater(chamberHeaters[index]); if (h.IsNotNull()) @@ -617,10 +619,10 @@ void Heat::SetChamberHeater(size_t index, int heater) noexcept } } chamberHeaters[index] = heater; - const auto h = FindHeater(chamberHeaters[index]); + const auto h = FindHeater(heater); if (h.IsNotNull()) { - h->SetDefaultMonitors(); + h->SetAsBedOrChamberHeater(); } reprap.HeatUpdated(); } @@ -637,6 +639,18 @@ bool Heat::IsChamberHeater(int heater) const noexcept return false; } +// This is called when a tool is created that uses this heater +void Heat::SetAsToolHeater(int8_t heater) const noexcept +{ + const auto h = FindHeater(heater); + if (h.IsNotNull()) + { + h->SetAsToolHeater(); + } + reprap.HeatUpdated(); + +} + void Heat::SetTemperature(int heater, float t, bool activeNotStandby) THROWS(GCodeException) { const auto h = FindHeater(heater); diff --git a/src/Heating/Heat.h b/src/Heating/Heat.h index 74bccc26..f4c0288d 100644 --- a/src/Heating/Heat.h +++ b/src/Heating/Heat.h @@ -70,6 +70,9 @@ public: pre(index < NumChamberHeaters; -1 <= heater; heater < MaxHeaters); bool IsChamberHeater(int heater) const noexcept; // Check if this heater is a chamber heater + void SetAsToolHeater(int8_t heater) const noexcept; // called when a tool is created that uses this heater + bool IsBedOrChamberHeater(int heater) const noexcept; // Queried by the Platform class + bool AllHeatersAtSetTemperatures(bool includingBed, float tolerance) const noexcept; // Is everything at temperature within tolerance? void SwitchOffAll(bool includingChamberAndBed) noexcept; // Turn all heaters off @@ -101,8 +104,6 @@ public: float GetAveragePWM(size_t heater) const noexcept // Return the running average PWM to the heater as a fraction in [0, 1]. pre(heater < MaxHeaters); - bool IsBedOrChamberHeater(int heater) const noexcept; // Queried by the Platform class - float GetHeaterTemperature(size_t heater) const noexcept; // Result is in degrees Celsius const Tool* GetLastStandbyTool(int heater) const noexcept diff --git a/src/Heating/Heater.cpp b/src/Heating/Heater.cpp index 8a3b50b0..952f50ce 100644 --- a/src/Heating/Heater.cpp +++ b/src/Heating/Heater.cpp @@ -63,7 +63,7 @@ DEFINE_GET_OBJECT_MODEL_TABLE(Heater) Heater::Heater(unsigned int num) noexcept : heaterNumber(num), sensorNumber(-1), activeTemperature(0.0), standbyTemperature(0.0), maxTempExcursion(DefaultMaxTempExcursion), maxHeatingFaultTime(DefaultMaxHeatingFaultTime), - active(false) + active(false), modelSetByUser(false), monitorsSetByUser(false) { } @@ -80,21 +80,6 @@ void Heater::SetSensorNumber(int sn) noexcept if (sn != sensorNumber) { sensorNumber = sn; - SetDefaultMonitors(); - } -} - -void Heater::SetDefaultMonitors() noexcept -{ - for (HeaterMonitor& h : monitors) - { - h.Disable(); - } - - if (sensorNumber >= 0 && sensorNumber < (int)MaxSensors) - { - const float limit = (reprap.GetHeat().IsBedOrChamberHeater(heaterNumber)) ? DefaultBedTemperatureLimit : DefaultHotEndTemperatureLimit; - monitors[0].Set(sensorNumber, limit, HeaterMonitorAction::GenerateFault, HeaterMonitorTrigger::TemperatureExceeded); } } @@ -143,16 +128,20 @@ GCodeResult Heater::SetOrReportModel(unsigned int heater, GCodeBuffer& gb, const if (seen) { + // Set the model const bool inverseTemperatureControl = (inversionParameter == 1 || inversionParameter == 3); const GCodeResult rslt = SetModel(heatingRate, coolingRates[0], coolingRates[1], td, maxPwm, voltage, dontUsePid == 0, inverseTemperatureControl, reply); - if (rslt != GCodeResult::ok) + if (rslt <= GCodeResult::warning) { - return rslt; + modelSetByUser = true; } + return rslt; } - else if (!model.IsEnabled()) + + // Just report the model + if (!model.IsEnabled()) { - reply.printf("Heater %u is disabled due to bad model", heater); + reply.printf("Heater %u is disabled because its model is undefined", heater); } else { @@ -225,6 +214,7 @@ GCodeResult Heater::SetFaultDetectionParameters(float pMaxTempExcursion, float p return rslt; } +// Process M143 for this heater GCodeResult Heater::ConfigureMonitor(GCodeBuffer &gb, const StringRef &reply) THROWS(GCodeException) { // Get any parameters that have been provided @@ -256,6 +246,10 @@ GCodeResult Heater::ConfigureMonitor(GCodeBuffer &gb, const StringRef &reply) TH { monitors[index].Set(monitoringSensor, limit, action, trigger); const GCodeResult rslt = UpdateHeaterMonitors(reply); + if (rslt <= GCodeResult::warning) + { + monitorsSetByUser = true; + } reprap.HeatUpdated(); return rslt; } @@ -368,20 +362,41 @@ void Heater::SetTemperature(float t, bool activeNotStandby) THROWS(GCodeExceptio } } -void Heater::SetModelDefaults() noexcept +// This is called when config.g is about to be re-run +void Heater::ClearModelAndMonitors() noexcept { - if (reprap.GetHeat().IsBedOrChamberHeater(heaterNumber)) + model.Clear(); + for (HeaterMonitor& hm : monitors) { - model.SetParameters(DefaultBedHeaterGain, DefaultBedHeaterTimeConstant, DefaultBedHeaterTimeConstant, DefaultBedHeaterDeadTime, 1.0, DefaultBedTemperatureLimit, 0.0, false, false); + hm.Disable(); } - else + modelSetByUser = monitorsSetByUser = false; +} + +// This is called when this heater is declared to be a bed or chamber heater using M140 or M141 +void Heater::SetAsToolHeater() noexcept +{ + if (!modelSetByUser) + { + model.SetDefaultToolParameters(); + } + if (!monitorsSetByUser && sensorNumber >= 0 && sensorNumber < (int)MaxSensors) { - model.SetParameters(DefaultHotEndHeaterHeatingRate, DefaultHotEndHeaterCoolingRate, DefaultHotEndHeaterCoolingRate, DefaultHotEndHeaterDeadTime, - 1.0, DefaultHotEndTemperatureLimit, 0.0, true, false); + monitors[0].Set(sensorNumber, DefaultHotEndTemperatureLimit, HeaterMonitorAction::GenerateFault, HeaterMonitorTrigger::TemperatureExceeded); } +} - String<1> dummy; - (void)UpdateModel(dummy.GetRef()); +// This is called when a heater is declared to be a tool heater using M563 +void Heater::SetAsBedOrChamberHeater() noexcept +{ + if (!modelSetByUser) + { + model.SetDefaultBedOrChamberParameters(); + } + if (!monitorsSetByUser &&sensorNumber >= 0 && sensorNumber < (int)MaxSensors) + { + monitors[0].Set(sensorNumber, DefaultBedTemperatureLimit, HeaterMonitorAction::GenerateFault, HeaterMonitorTrigger::TemperatureExceeded); + } } // End diff --git a/src/Heating/Heater.h b/src/Heating/Heater.h index 6c34ba9f..eaed5621 100644 --- a/src/Heating/Heater.h +++ b/src/Heating/Heater.h @@ -72,7 +72,6 @@ public: const FopDt& GetModel() const noexcept { return model; } // Get the process model GCodeResult SetOrReportModel(unsigned int heater, GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeException); - void SetModelDefaults() noexcept; bool IsHeaterEnabled() const noexcept // Is this heater enabled? { return model.IsEnabled(); } @@ -80,7 +79,9 @@ public: void SetM301PidParameters(const M301PidParameters& params) noexcept { model.SetM301PidParameters(params); } - void SetDefaultMonitors() noexcept; + void ClearModelAndMonitors() noexcept; + void SetAsToolHeater() noexcept; + void SetAsBedOrChamberHeater() noexcept; protected: DECLARE_OBJECT_MODEL @@ -132,6 +133,8 @@ private: float maxHeatingFaultTime; // How long a heater fault is permitted to persist before a heater fault is raised bool active; // Are we active or standby? + bool modelSetByUser; + bool monitorsSetByUser; }; #endif /* SRC_HEATING_HEATER_H_ */ diff --git a/src/Heating/LocalHeater.cpp b/src/Heating/LocalHeater.cpp index 11d90b72..5519fb41 100644 --- a/src/Heating/LocalHeater.cpp +++ b/src/Heating/LocalHeater.cpp @@ -153,11 +153,6 @@ TemperatureError LocalHeater::ReadTemperature() noexcept // This must be called whenever the heater is turned on, and any time the heater is active and the target temperature is changed GCodeResult LocalHeater::SwitchOn(const StringRef& reply) noexcept { - if (!GetModel().IsEnabled()) - { - SetModelDefaults(); - } - if (mode == HeaterMode::fault) { reply.printf("Heater %u not switched on due to temperature fault\n", GetHeaterNumber()); diff --git a/src/Heating/RemoteHeater.cpp b/src/Heating/RemoteHeater.cpp index 8bf9e9a0..317d7b7a 100644 --- a/src/Heating/RemoteHeater.cpp +++ b/src/Heating/RemoteHeater.cpp @@ -167,11 +167,6 @@ Heater::HeaterMode RemoteHeater::GetMode() const noexcept // This isn't just called to turn the heater on, it is called when the temperature needs to be updated GCodeResult RemoteHeater::SwitchOn(const StringRef& reply) noexcept { - if (!GetModel().IsEnabled()) - { - SetModelDefaults(); - } - CanMessageBuffer * const buf = CanMessageBuffer::Allocate(); if (buf == nullptr) { |