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:
Diffstat (limited to 'src/Heating/Heater.cpp')
-rw-r--r--src/Heating/Heater.cpp76
1 files changed, 50 insertions, 26 deletions
diff --git a/src/Heating/Heater.cpp b/src/Heating/Heater.cpp
index 19017fa5..ef340c91 100644
--- a/src/Heating/Heater.cpp
+++ b/src/Heating/Heater.cpp
@@ -41,26 +41,29 @@ constexpr ObjectModelTableEntry Heater::objectModelTable[] =
{
// Within each group, these entries must be in alphabetical order
// 0. Heater members
- { "active", OBJECT_MODEL_FUNC(self->GetActiveTemperature(), 1), ObjectModelEntryFlags::live },
- { "avgPwm", OBJECT_MODEL_FUNC(self->GetAveragePWM(), 3), ObjectModelEntryFlags::live },
- { "current", OBJECT_MODEL_FUNC(self->GetTemperature(), 2), ObjectModelEntryFlags::live },
- { "max", OBJECT_MODEL_FUNC(self->GetHighestTemperatureLimit(), 1), ObjectModelEntryFlags::none },
- { "min", OBJECT_MODEL_FUNC(self->GetLowestTemperatureLimit(), 1), ObjectModelEntryFlags::none },
- { "model", OBJECT_MODEL_FUNC((const FopDt *)&self->GetModel()), ObjectModelEntryFlags::none },
- { "monitors", OBJECT_MODEL_FUNC_ARRAY(0), ObjectModelEntryFlags::none },
- { "sensor", OBJECT_MODEL_FUNC((int32_t)self->GetSensorNumber()), ObjectModelEntryFlags::none },
- { "standby", OBJECT_MODEL_FUNC(self->GetStandbyTemperature(), 1), ObjectModelEntryFlags::live },
- { "state", OBJECT_MODEL_FUNC(self->GetStatus().ToString()), ObjectModelEntryFlags::live },
+ { "active", OBJECT_MODEL_FUNC(self->GetActiveTemperature(), 1), ObjectModelEntryFlags::live },
+ { "avgPwm", OBJECT_MODEL_FUNC(self->GetAveragePWM(), 3), ObjectModelEntryFlags::live },
+ { "current", OBJECT_MODEL_FUNC(self->GetTemperature(), 2), ObjectModelEntryFlags::live },
+ { "max", OBJECT_MODEL_FUNC(self->GetHighestTemperatureLimit(), 1), ObjectModelEntryFlags::none },
+ { "maxBadReadings", OBJECT_MODEL_FUNC((int32_t)self->maxBadTemperatureCount), ObjectModelEntryFlags::none },
+ { "maxHeatingFaultTime", OBJECT_MODEL_FUNC(self->maxHeatingFaultTime, 1), ObjectModelEntryFlags::none },
+ { "maxTempExcursion", OBJECT_MODEL_FUNC(self->maxTempExcursion, 1), ObjectModelEntryFlags::none },
+ { "min", OBJECT_MODEL_FUNC(self->GetLowestTemperatureLimit(), 1), ObjectModelEntryFlags::none },
+ { "model", OBJECT_MODEL_FUNC((const FopDt *)&self->GetModel()), ObjectModelEntryFlags::none },
+ { "monitors", OBJECT_MODEL_FUNC_ARRAY(0), ObjectModelEntryFlags::none },
+ { "sensor", OBJECT_MODEL_FUNC((int32_t)self->GetSensorNumber()), ObjectModelEntryFlags::none },
+ { "standby", OBJECT_MODEL_FUNC(self->GetStandbyTemperature(), 1), ObjectModelEntryFlags::live },
+ { "state", OBJECT_MODEL_FUNC(self->GetStatus().ToString()), ObjectModelEntryFlags::live },
// 1. Heater.monitors[] members
- { "action", OBJECT_MODEL_FUNC_IF(self->monitors[context.GetLastIndex()].GetTrigger() != HeaterMonitorTrigger::Disabled,
- (int32_t)self->monitors[context.GetLastIndex()].GetAction()), ObjectModelEntryFlags::none },
- { "condition", OBJECT_MODEL_FUNC(self->monitors[context.GetLastIndex()].GetTriggerName()), ObjectModelEntryFlags::none },
- { "limit", OBJECT_MODEL_FUNC_IF(self->monitors[context.GetLastIndex()].GetTrigger() != HeaterMonitorTrigger::Disabled,
- self->monitors[context.GetLastIndex()].GetTemperatureLimit(), 1), ObjectModelEntryFlags::none },
+ { "action", OBJECT_MODEL_FUNC_IF(self->monitors[context.GetLastIndex()].GetTrigger() != HeaterMonitorTrigger::Disabled,
+ (int32_t)self->monitors[context.GetLastIndex()].GetAction()), ObjectModelEntryFlags::none },
+ { "condition", OBJECT_MODEL_FUNC(self->monitors[context.GetLastIndex()].GetTriggerName()), ObjectModelEntryFlags::none },
+ { "limit", OBJECT_MODEL_FUNC_IF(self->monitors[context.GetLastIndex()].GetTrigger() != HeaterMonitorTrigger::Disabled,
+ self->monitors[context.GetLastIndex()].GetTemperatureLimit(), 1), ObjectModelEntryFlags::none },
};
-constexpr uint8_t Heater::objectModelTableDescriptor[] = { 2, 10, 3 };
+constexpr uint8_t Heater::objectModelTableDescriptor[] = { 2, 13, 3 };
DEFINE_GET_OBJECT_MODEL_TABLE(Heater)
@@ -93,6 +96,7 @@ float Heater::lastCoolingRate;
FansBitmap Heater::tuningFans;
unsigned int Heater::tuningPhase;
uint8_t Heater::idleCyclesDone;
+bool Heater::tuningQuietMode;
Heater::HeaterParameters Heater::fanOffParams, Heater::fanOnParams;
@@ -286,7 +290,8 @@ GCodeResult Heater::StartAutoTune(GCodeBuffer& gb, const StringRef& reply, FansB
const float ambientTemp = (seenA) ? gb.GetFValue() : currentTemp;
if (ambientTemp + 20 >= targetTemp)
{
- reply.printf("Target temperature must be at least 20C above ambient temperature");
+ reply.copy("Target temperature must be at least 20C above ambient temperature");
+ return GCodeResult::error;
}
// Get and store the optional parameters
@@ -295,6 +300,7 @@ GCodeResult Heater::StartAutoTune(GCodeBuffer& gb, const StringRef& reply, FansB
tuningPwm = (gb.Seen('P')) ? gb.GetLimitedFValue('P', 0.1, 1.0) : GetModel().GetMaxPwm();
tuningHysteresis = (gb.Seen('Y')) ? gb.GetLimitedFValue('Y', 1.0, 20.0) : DefaultTuningHysteresis;
tuningFanPwm = (gb.Seen('F')) ? gb.GetLimitedFValue('F', 0.1, 1.0) : DefaultTuningFanPwm;
+ tuningQuietMode = gb.Seen('Q') && gb.GetUIValue() != 0;
const GCodeResult rslt = StartAutoTune(reply, seenA, ambientTemp);
if (rslt == GCodeResult::ok)
@@ -419,14 +425,23 @@ void Heater::SetAndReportModelAfterTuning(bool usingFans) noexcept
if (Succeeded(rslt))
{
tuned = true;
- str.printf( "Auto tuning heater %u completed after %u idle and %u tuning cycles in %" PRIu32 " seconds. This heater needs the following M307 command:\n ",
+ str.printf( "Auto tuning heater %u completed after %u idle and %u tuning cycles in %" PRIu32 " seconds",
GetHeaterNumber(),
idleCyclesDone,
(usingFans) ? fanOffParams.numCycles + fanOnParams.numCycles : fanOffParams.numCycles,
(millis() - tuningBeginTime)/(uint32_t)SecondsToMillis
);
- GetModel().AppendM307Command(GetHeaterNumber(), str.GetRef(), !reprap.GetHeat().IsBedOrChamberHeater(GetHeaterNumber()));
+ if (tuningQuietMode)
+ {
+ str.cat('\n');
+ }
+ else
+ {
+ str.cat( ". This heater needs the following M307 command:\n");
+ GetModel().AppendM307Command(GetHeaterNumber(), str.GetRef(), !reprap.GetHeat().IsBedOrChamberHeater(GetHeaterNumber()));
+ }
reprap.GetPlatform().Message(LoggedGenericMessage, str.c_str());
+
if (reprap.Debug(moduleHeat))
{
str.printf("Long term gain %.1f/%.1f", (double)fanOffParams.GetNormalGain(), (double)fanOffParams.gain);
@@ -438,13 +453,16 @@ void Heater::SetAndReportModelAfterTuning(bool usingFans) noexcept
reprap.GetPlatform().Message(GenericMessage, str.c_str());
}
- if (reprap.GetGCodes().SawM501InConfigFile())
+ if (!tuningQuietMode)
{
- reprap.GetPlatform().Message(GenericMessage, "Send M500 to save this command in config-override.g\n");
- }
- else
- {
- reprap.GetPlatform().MessageF(GenericMessage, "Edit the M307 H%u command in config.g to match this. Omit the V parameter if the heater is not powered from VIN.\n", GetHeaterNumber());
+ if (reprap.GetGCodes().SawM501InConfigFile())
+ {
+ reprap.GetPlatform().Message(GenericMessage, "Send M500 to save this command in config-override.g\n");
+ }
+ else
+ {
+ reprap.GetPlatform().MessageF(GenericMessage, "Edit the M307 H%u command in config.g to match this. Omit the V parameter if the heater is not powered from VIN.\n", GetHeaterNumber());
+ }
}
}
else
@@ -461,6 +479,7 @@ GCodeResult Heater::ConfigureFaultDetectionParameters(GCodeBuffer& gb, const Str
bool seenValue = false;
gb.TryGetNonNegativeFValue('P', maxHeatingFaultTime, seenValue);
gb.TryGetNonNegativeFValue('T', maxTempExcursion, seenValue);
+ gb.TryGetLimitedUIValue('R', maxBadTemperatureCount, seenValue, 51);
if (seenValue)
{
const GCodeResult rslt = UpdateFaultDetectionParameters(reply);
@@ -468,7 +487,8 @@ GCodeResult Heater::ConfigureFaultDetectionParameters(GCodeBuffer& gb, const Str
return rslt;
}
- reply.printf("Heater %u allowed excursion %.1f" DEGREE_SYMBOL "C, fault trigger time %.1f seconds", heaterNumber, (double)maxTempExcursion, (double)maxHeatingFaultTime);
+ reply.printf("Heater %u allowed excursion %.1f" DEGREE_SYMBOL "C, fault trigger time %.1f seconds, max %" PRIu32 " consecutive bad readings",
+ heaterNumber, (double)maxTempExcursion, (double)maxHeatingFaultTime, maxBadTemperatureCount);
return GCodeResult::ok;
}
@@ -674,6 +694,10 @@ GCodeResult Heater::SetFaultDetectionParameters(const CanMessageSetHeaterFaultDe
{
maxTempExcursion = msg.maxTempExcursion;
maxHeatingFaultTime = msg.maxFaultTime;
+ if (msg.version35)
+ {
+ maxBadTemperatureCount = msg.maxBadTemperatureCount;
+ }
return GCodeResult::ok;
}