I'm pretty sure the firmware sends a special message once the preheating (M109 or M190) is complete. So it really doesn't matter what temperatures are getting sent back to s3d, those are just for monitoring purposes. Once the firmware says "preheating is done!" the software will move on and continue printing.
However, it is very possible there is some issue with the firmware where it somehow gets stuck and never sends the "preheat is finished" message. I know some of the temperature control logic for the heated beds in the Marlin firmware is pretty simple. For example, just using bit-bang heating until the temperature exceeds the desired setpoint. Perhaps the issue here is that you are never actually exceeding the 90C setpoint! If you look through the Marlin firmware logic, I don't think the firmware would ever exit the preheat state if you don't exceed the bed setpoint.
The relevant code from Marlin is below
Code: Select all
case 190: // M190 - Wait for bed heater to reach target.
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
LCD_MESSAGEPGM(MSG_BED_HEATING);
if (code_seen('S')) {
setTargetBed(code_value());
CooldownNoWait = true;
} else if (code_seen('R')) {
setTargetBed(code_value());
CooldownNoWait = false;
}
codenum = millis();
cancel_heatup = false;
target_direction = isHeatingBed(); // true if heating, false if cooling
while ( (target_direction)&&(!cancel_heatup) ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false)) ) <<==== this is the important line!!
{
if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{
float tt=degHotend(active_extruder);
SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL(tt);
SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)active_extruder);
SERIAL_PROTOCOLPGM(" B:");
SERIAL_PROTOCOL_F(degBed(),1);
SERIAL_PROTOCOLLN("");
codenum = millis();
}
manage_heater();
manage_inactivity();
lcd_update();
}
LCD_MESSAGEPGM(MSG_BED_DONE);
previous_millis_cmd = millis();
#endif
break;
Note that the while() loop will never exit unless the isHeatingBed() command returns false.
Code: Select all
FORCE_INLINE bool isHeatingBed() {
return target_temperature_bed > current_temperature_bed;
};
And as you can see, that will never happen unless the current bed temperature is greater than or equal to the setpoint. Not sure if I would classify this as a firmware bug or perhaps just poorly tuned PID values that aren't driving enough current to the bed to exceed the setpoint temperature. Hard to say which one is at fault.