Two years ago this morning would have ended with the gas furnace cycling on backup and a four-hundred-dollar utility bill she would discover three weeks later. This morning the installer who commissioned the unit — Devin, out of a three-truck shop in St. Louis Park — receives a notification on his phone over breakfast. The cold-climate profile he pushed to her controller in October has just executed its third defrost cycle of the night without dropping setpoint in the master bedroom by so much as half a degree. He sees the curve. He sees what he needs to see. The corpus logged every minute of the run and made it defensible if the utility ever asks. The control program refused, before it ever ran, any profile that would have let Don's room drift below the line the cardiologist drew. Devin's three-truck shop runs a thousand homes from one console — the profile keeping Don warm was pushed by Mitsubishi to every cold-climate unit in the region last Tuesday, in the time it took to drink a coffee.
Margaret pours hers. The kitchen is climbing back. Don is asleep. The furnace, which two years ago would have been the loudest thing in the house at six-forty in the morning, is silent because it has not been asked to run. She does not think about her furnace, which is the entire point.
Two years ago she would have written the curve on a clipboard taped to the side of the roaster and prayed her opening barista could read her handwriting on Monday. This afternoon the development-time-ratio she is shaping in real time — the four-minute window between first crack and drop — is being logged by the controller against a profile her head roaster wrote in Portland and pushed to her drum on Thursday. The control program refused, before it ever ran, any curve where development time would have outrun the drum-temperature ramp; that class of error, the one that bricks a batch, can no longer reach her bean. Twenty years of her own palate sits underneath the profile, available now to every barista at every one of her three new locations. She watches first crack roll across the trier. She listens for the pop to settle into a rhythm. She drops the batch at four minutes and twelve seconds, which is what the bean asked for.
On Tuesday morning, in a café in Brooklyn, a customer will lift the cup and taste bergamot at the front of the palate and stone fruit behind it, and will set the cup down and order a second one without quite knowing why. He will not know Lena Ostrowski exists. He will not know there is a roastery in Bend or a controller on a Probat or a profile pushed on a Thursday. And that is also the entire point.
Two years ago he would have lived with it and written a non-conformance after the Rockwell came back soft three days later. Tonight the controller has cross-referenced the thermocouple drift against every load that came off Furnace 7 in the last eighteen months, isolated the bias to a single junction, flagged it at 0300 to the morning-shift engineer's console in the office upstairs, and held the soak an extra ninety seconds to compensate. The program enforced AMS 2750 at the type-system level; it could not have been argued into letting the load drop cold. Frank reads the alert, reads the correction, reads the temperature trace, and signs off on the load.
The shafts go into the quench on spec. Rockwell will come back where it needs to come back. They will be ground, shot-peened, magnafluxed, certified, crated, and shipped. They will end up in the landing gear of an aircraft that will roll out of a paint shop in Renton in February. In nine months that aircraft will touch down at Changi at four in the afternoon local time, two hundred and forty souls aboard, after thirteen hours over the Pacific. The pilot will not know the airplane's gear was ever a billet in a furnace in Cleveland. He will not think about Frank Delaney, which is the way Frank prefers it.
The doctor was on her way too. Only not in her car — she had already donned her surgical gear and worked through procedures. She was focused. These transplant surgeries were never routine, and always unexpected. The heart was en route. The clock was ticking. The organ had to remain at a certain temperature, even with that, time was not a friend. Officially called cold ischemia, and it was its own clock without forgiveness.
The cold storage container that was previously used had a digital thermometer; the transit tech would call as often as possible with updates. They only knew what the thermostat was reading, not what was actually happening inside the container, next to and internally with the organ. That had all changed fairly recently. It was still taking some getting used to. The container that held the organ was feeding her live data, to her phone, updating every two seconds. Four readings from the container. Top, bottom, next to the heart and — shockingly — inside the organ itself. All live, right to her device. Her colleagues were logged in, watching it as well, live in the operating room while they prepped.
So far, the only significant temperature event had been moving from the ambulance to the plane. It took a few minutes longer, and the controller logged the anomaly. A 0.3-degree change for three minutes was logged by the sensor near the top of the container. All the rest held temp. And the controller made adjustments to the cooling mechanism on the container to remain within the right tolerance. No calls, no texts, no I think so's. Live, confirmed hard data.
Before, she wouldn't be able to confidently spin up the rest of her team until the organ was thirty minutes away and they could confirm it was still in the safety window. This live data changed the game. Three hours of prep time. Felt like a lifetime compared to the past. The patient could arrive, prep, be sedated, and the pre-procedures could begin. The organ could arrive at almost the same time the team was ready to place it in the patient. While there were still plenty of risks, controlling the environment and knowing in real time the status — on the ground or in the air — having the live updates reduced the risk of a compromised organ by nearly ninety-five percent. They'd been using this for the past eighteen months. They had yet to lose an organ in transit. Who knew that simple programming and data capture could turn into exactly the knowledge she needed. The heart would arrive in near perfect condition. And the boy would walk out a week later with a sore chest, and dreams to chase.
At eleven-twenty-two a heater string on the north panel begins to lag its commanded ramp by 1.4 degrees per minute. Two years ago this would have been a scribbled note in a logbook and a phone call to a thermal analyst in Denver who would not pick up until Monday morning, after the article had drifted out of spec and the test had to be re-run. This morning the controller has cross-referenced the lag against the program's declared ramp tolerance, paused the cycle inside one second, held the article isothermal at the last good setpoint, and logged the deviation to the program manager's console before Aaron's coffee is cool enough to drink. The corpus tells him which heater string is failing and which spare is on the shelf. The program will not let the cycle resume until the substitution is verified — MIL-STD-1540 isn't a checklist anymore, it's baked into the firmware. He swaps the string. He re-arms the cycle. Total time from anomaly to recovery: thirty-eight minutes.
The launch slips by zero days. In November an Atlas V will lift the transponder out of Cape Canaveral and put it on a geostationary transfer orbit. Three weeks later it will reach station-keeping at thirty-five thousand seven hundred and eighty-six kilometers above the equator. It will stay there, talking to the ground, for fifteen years.
Two years ago this would have been a maintenance ticket logged on Monday and a thermal runaway investigation on Wednesday. This afternoon the controller has correlated the divergence against the corpus of every charge cycle Container 7 has logged since commissioning, identified the failing pump on the secondary loop, derated Rack 14 by twelve percent to hold cell temperature below the program's declared ceiling, and flagged the work order to the O&M contractor's phone before Marisol has finished the sentence she was speaking. The thermal program will not, at any setpoint, let a cell exceed CATL's published envelope. The derate is automatic. The grid does not notice it. Marisol does not have to call anyone.
At four o'clock ERCOT calls a four-hour discharge into the West Texas heat. The site delivers full contracted power for the full four hours, Rack 14 included. Forty miles north, at University Medical Center in Lubbock, the NICU charge nurse never sees the lights flicker. Three premature infants stay on their isolettes, on their monitors, on their ventilators, on warmers calibrated to the half-degree. None of their parents will know how close the grid came to a shed event at four-eighteen. None of them will hear the name Marisol Reyes. The site delivers. The grid holds. The babies stay warm.
Two years ago he would have watched the cure on a chart recorder and trusted his eyes and a stopwatch and the smell coming off the door seal. This morning the program declares its dwell at one-seventy-seven Celsius for one hundred and twenty minutes minimum — a hard floor the controller cannot be argued out of — and the corpus shows him every cure this autoclave has run on this tool in the last four years, ramp by ramp, deviation by deviation. He sees three prior tools that ran cold on the leading edge. He sees how the program corrected each one. At hour three the bag bleeds and a leading-edge thermocouple lags by four degrees in a span of ninety seconds. The program does not panic. It does not abort. It extends the dwell by eleven minutes on the affected zone alone, restoring the cure profile for that square footage of laminate without re-cooking the rest of the part. Hexcel's resin chemists wrote the kinetics. The program enforces them. The certification engineer downstairs will defend the part to the FAA with cure data at a resolution the FAA has never been handed before.
The part comes out on spec. It will be trimmed, drilled, ultrasonically inspected, certified, mated to its spar, painted, and installed on an airframe in Mirabel in October. It will fly six hundred and forty thousand cycles before it retires, carrying somebody's mother home from Toronto on a Tuesday night, every Tuesday night, for thirty years.
The control language is the product. Everything else is plumbing.
Every value carries a unit. Temp · Dur · Pct · RampRate · Setpoint · Envelope. Pass a percentage where a ramp-rate belongs and the program does not compile. Declare a soak floor of 0°C on a composite cure and the program does not compile. The class of error that bricks a batch cannot reach the bench.
Safety envelopes are declared once and enforced by the type system. setpoint_ceiling, ramp_max, fault classes, and the fail-to state are properties of the source code, not setpoints on a screen a tired operator can dial past. AMS 2750G, 21 CFR Part 11, MIL-STD-1540, IEC 61508 — the standards stop being checklists and start being compiler rules.
The corpus is queryable. Every cure, every cycle, every defrost — timestamped, version-tagged, cryptographically signed. publish corpus { every: 100ms, retain: 10y } ships with every program. The fleet learns. New sites auto-tune from sibling-asset histories at commissioning.
Temp/Dur · slope-typedprogram CompositeCure_IM7_8552 : ThermalProgram { manufacturer: Hexcel envelope: CureEnvelope.IM7_8552 // from supplier corpus stage 01 "Ramp" : { kind: Ramp, to: Temp(82°C), rate: RampRate(2.5°C/min) } stage 02 "Soak A" : { kind: Soak, at: Temp(82°C), for: Dur(30 min) } stage 03 "Ramp" : { kind: Ramp, to: Temp(177°C), rate: RampRate(2.5°C/min) } stage 04 "Cure Dwell" : { kind: Dwell, at: Temp(177°C), for: Dur(120 min), floor: Temp(176°C), // type-enforced hard floor on_lag: ExtendZone(Dur(11 min)) } stage 05 "Cool" : { kind: Cool, to: Temp(60°C), rate: RampRate(3°C/min, max) } // safety envelope — declared, type-enforced, immutable at runtime declare safety { setpoint_ceiling: Temp(185°C) // cannot be exceeded under any condition setpoint_floor: Temp(0°C) ramp_max: RampRate(3.0°C/min) fault_on: [tc_open, tc_short, comms_loss > Dur(5s)] fail_to: State.Cool } publish corpus { every: Dur(100ms), retain: Dur(10y) } }
PID is the floor, not the ceiling. The loop engine composes cascade, feedforward, gain-scheduled, and predictive topologies into the program the user actually declared. A heater with a tool mass under it does not need the same loop as a battery cell next to a coolant plate; both are spelled in the same language and resolve to whatever topology fits the physics.
The adaptive tuner is corpus-grounded. The loop does not auto-tune by injecting steps and watching what happens — it tunes against the history of every prior cycle on this asset, on this tool, on this cell, weighted by similarity. The result is a starting set of gains that already knows how this thing behaves on a Tuesday morning in February, before the first sample is taken.
Anti-windup, bumpless transfer, manual takeover, and synchronized multi-zone coordination are not configuration switches — they are properties of the loop the program declares. When an operator takes a zone manual mid-cure, the program does not lose the integral. When a thermocouple opens, the affected zone fails to its declared safe state in milliseconds. When a multi-zone article needs every zone to ramp in lock-step, the controller synchronizes them at the language level, not the wiring level.
Sensor diversity is the entry point. A composite cure shop runs Type T below 250°C and Type K above. An aerospace TVAC chamber runs Type B for the high zones and platinum RTDs for the cold side. A battery container runs hundreds of cell-level thermistors in parallel. The HAL accepts every standard TC type and RTD configuration without firmware-side conditional logic — the channel declares its type, the program reads the value.
Fault detection is sub-millisecond and corpus-aware. Open, short, out-of-range, drift, and lag are five distinct fault classes — each with its own detection method, its own confidence interval, and its own declared fail-to response. A thermocouple two degrees out of agreement with its three sibling channels is flagged before the affected zone moves a single degree past the envelope.
Drift compensation is the second-order intelligence — it is what makes the fleet learn. The corpus knows what every TC on this asset has read at every setpoint, in every season, across every cycle. A two-degree-high pyrometer that has read two degrees high for a week is detected, isolated to a single junction, and compensated at the loop level long before the QA engineer asks about the soft Rockwell on the witness coupon.
An envelope is not a setpoint. setpoint_ceiling, setpoint_floor, ramp_max, dwell_max, and the fault classes that bound them are properties of the program source. They are sealed at compile and remain sealed for the life of the flash. No menu, no admin password, no operator combination dials past them — the controller does not know how to violate the envelope, because the firmware that would do so does not exist on the device.
Fail-to is physics, not a callback. Every envelope declares the state the system enters when control is lost — cold_vented for a composite oven, hold_isolated for a battery rack, dark for a clean-room lamp, flooded for a cryogenic transfer. The state is reached by the physical hardware — relays normally-open, SSRs opto-isolated, solenoids spring-return — not by a routine that may or may not run.
Functional-safety targets are compile-time gates. A program targeted at a SIL 3 medical or aerospace asset will not compile against a SIL 2 controller binary. AMS 2750G, 21 CFR Part 11, ISO 13485, DO-178C, IEC 61508 — each declared as a program-level constraint, each verified before flash, each cryptographically signed into the audit corpus alongside every cycle the program runs. Certification is not a sticker; it is a property of the file.
safety_envelope CompositeCure_IM7_8552 : Envelope { setpoint_ceiling: Temp(185°C) // sealed · cannot be raised at runtime setpoint_floor: Temp(0°C) ramp_max: RampRate(3.0°C/min) dwell_max: Dur(240 min) fault_on: [ tc_open, tc_short, tc_out_of_range, drift_exceeds(Temp(2°C)), voting_disagreement > Pct(5), comms_loss > Dur(5s), watchdog_miss ] fail_to: State.ColdVented // physics · relays NO · SSR opto-iso · solenoid spring certification: [ "AMS_2750G", "NADCAP_AC7118", "IEC_61508_SIL2", "AS9100D" ] audit: { every: Dur(100ms), sign: hw_id, retain: Dur(10y) } }
The HAL is declared, not stitched. A channel says what it is — a Type K thermocouple on a 24-bit isolated front end, a 4–20 mA actuator on RS-485, a contactor on a CAN-Open node — and the language resolves the path. The control program does not know what bus an actuator sits on; the safety envelope does not care whether voting reconciles between two channels on the same isolated front end or across a Modbus segment. Replace the back end and the program continues to compile.
Industrial protocols are first-class. Modbus RTU + TCP, EtherCAT, PROFINET, EtherNet/IP, OPC UA, BACnet, CAN-Open, MQTT — each ships as a transport that the language consumes, not a sidecar with its own configuration tool and its own failure modes. A point on the EtherCAT ring and a register on a Modbus slave both publish as a typed channel; the program declares which one it wants and the HAL holds the rope.
Isolation is non-negotiable. Every signal that enters the controller crosses an isolation barrier — galvanic on TC and RTD front ends, reinforced opto on SSR and contactor outputs, transformer-coupled on industrial Ethernet, transceiver-isolated on RS-485 and CAN. The plant floor is electrically loud; the controller treats every line as hostile until proven otherwise.
hal CompositeCellHAL : HAL { // internal front end · 24-bit isolated TC + RTD bus local : SPI(10 MHz, isolated: true) { driver tc[16] : TC_AD7124 { types: [K, T, J, N], cjc: per_block } driver rtd[4] : RTD_MAX31865 { wiring: FourWire, ref: 4.02 kΩ } } // power stage · opto-isolated SSR + contactor bus power : GPIO(isolated: true, opto: Reinforced_5kV) { driver ssr[8] : SSR_ZeroCross { fail_to: open } driver contactor[4] : Contactor_NO { fail_to: open, aux_feedback: true } } // field bus · industrial Ethernet ring bus field : EtherCAT(cycle: Dur(1ms), redundancy: RingDual) { node vfd_blower : CIA402_VFD { fail_to: coast } node vfd_chiller : CIA402_VFD { fail_to: coast } node vacuum_valve : Valve_SpringRtn { fail_to: vented } } // process bus · Modbus to legacy plant SCADA bus scada : RS485(115200, isolated: true) { protocol: Modbus_RTU(slave_id: 17, cycle: Dur(50ms)) map: corpus.expose("holding[0..127]") } // north bus · OPC UA + MQTT to fleet corpus bus north : Ethernet(1 GbE, isolated: TransformerCoupled) { protocol: OPC_UA(security: Basic256Sha256, role: server) protocol: MQTT(broker: fleet.tcs.io, tls: mTLS, qos: 1) } }
Built on a bench. Shipped to the world.
Talk to us before the build.
This isn't a webstore. Each ThermoLogic program is a co-engineering engagement: scoped, benched, validated, and shipped on a cadence that matches your release. Four steps.
For the people writing about where thermal goes next.
Reporters, editors, partner engineers — anything on this page is on record. Anything you need to verify, we can sit at the bench with you.