Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Crocker <dcrocker@eschertech.com>2020-11-26 13:35:42 +0300
committerDavid Crocker <dcrocker@eschertech.com>2020-11-26 13:35:42 +0300
commit06a810a343f9e6e01205b8b6875f8f0103c80bd2 (patch)
tree592b1423efe5b3544275081f9ca02a41a2be6079 /src/Heating
parent9ea8c5a4b6bd97e75ed8fc8ff08cd113bad7633f (diff)
Removed order dependency of M307, M143, M140, M141 and M563
Diffstat (limited to 'src/Heating')
-rw-r--r--src/Heating/FOPDT.cpp45
-rw-r--r--src/Heating/FOPDT.h3
-rw-r--r--src/Heating/Heat.cpp24
-rw-r--r--src/Heating/Heat.h5
-rw-r--r--src/Heating/Heater.cpp71
-rw-r--r--src/Heating/Heater.h7
-rw-r--r--src/Heating/LocalHeater.cpp5
-rw-r--r--src/Heating/RemoteHeater.cpp5
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)
{