Skip to content
Abschnitte der Dokumentation

API-Änderungsprotokoll

Jede Änderung an der öffentlichen API, die ein Aufrufer bemerken könnte, die neueste zuerst. Jeder Eintrag trägt das Datum, an dem er hier angekündigt wurde; eine Änderung, die für bestehende Aufrufer nicht abwärtskompatibel ist, wird spätestens mit dem Release angekündigt, das sie einführt, und ist als Inkompatibel markiert. 29 der 81 Einträge unten sind inkompatibel.

  1. rf-link-budget nimmt 0,5 dB atmosphärische Dämpfung an, wenn atmosphericLoss weggelassen wird

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Ein Aufruf ohne atmosphericLoss wurde mit 0 dB berechnet, während seine provenance.inputs den dokumentierten Standardwert von 0,5 dB meldeten. Jetzt wird er mit 0,5 dB berechnet, wie es die Rechnerseite und die Provenienz angeben; bei einem solchen Aufruf verschieben sich rxPower, linkMargin und maxRangeKm also um dieses halbe Dezibel. Ein Aufruf, der die Eingabe sendet, ist unverändert.

    Jede andere Eingabe jedes Rechners wurde auf dieselbe Weise geprüft: Weggelassen wird sie entweder abgelehnt (400, nichts abgerechnet) oder mit ihrem dokumentierten Standardwert berechnet.

  2. GET /v1/usage kann die Aufrufe pro Tag zurückgeben

    • GET /api/py/v1/usage

    Übergeben Sie ?days=N, von 1 bis 90, und die Antwort erhält daily: einen Eintrag {date, calls} für jeden der letzten N Tage in UTC, die ältesten zuerst, bis heute. Die calls eines Tages werden über alle Schlüssel des Kontos summiert, abzüglich gutgeschriebener Aufrufe, und ein Tag ohne Aufrufe zeigt 0. Tage vor dem 2026-09-24, als die stündliche Zählung begann, zeigen 0.

    Ohne days ist die Antwort unverändert. Das Abfragen der Nutzung wird weiterhin nie gezählt.

  3. Die Portzahl eines Touchstone-Uploads wird aus seinen Zeilen gelesen, vor seinem Namen

    • rf_cascade
    • sparam_pipeline
    • impedance_match
    • eye_diagram

    Lässt die Zahl der Werte einer Datei mehr als eine Portzahl zu, entscheiden ihre Zeilen vor ihrer Endung: Drei Ein-Port-Punkte in einer Datei namens .s2p sind ein Port, nicht ein Zwei-Port-Punkt, und ein Name, dem die Daten widersprechen, wird gemeldet (port_count_mismatch in rf_cascade). Ein Schlüsselwort [Number of Ports] entscheidet weiterhin zuerst.

    Das Augendiagramm scheitert nicht mehr an einer Datei, deren Endung mehr Ports nennt, als ihre Daten enthalten.

  4. Die Monte-Carlo-Simulation des Filters führt bis zu 1.000 Durchläufe kostenlos und 100.000 bei Pro und API aus, innerhalb eines Arbeitsbudgets

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • POST /api/py/v1/jobs/estimate
    • GET /api/py/v1/jobs/types
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    monteCarloIterations reicht im Free-Tarif bis 1.000 (vorher 500) und bei Pro und API bis 100.000 (vorher 10.000). Die Zeitobergrenze des Jobs liegt bei 180 s (vorher 120 s).

    Die Kosten eines Laufs sind seine Durchläufe mal die Kettenleiter-Auswertungen, die jeder braucht, bestimmt durch seine Bauteile und passCriteria. Ein Lauf, dessen Vorhersage das Budget seiner Rechenumgebung überschreitet (120 s in der bezahlten, 60 s in der kostenlosen), wird beim Einreichen und von der Schätzung mit errorKind: "too_large" abgelehnt, bevor etwas abgerechnet wird. Das Detail nennt monteCarloIterations und gibt die Kosten, das Limit und in allowed.max die größte Zahl von Durchläufen an, die passt. 100.000 Durchläufe eines Kettenleiters aus 5 Bauteilen mit drei Kriterien passen; ein Kettenleiter aus 20 Bauteilen mit acht Kriterien passt bis 53.304.

    Die Schätzung meldet withinBudget, ein budget der Art ladderEvaluations und work als trials und ladderEvaluationsPerTrial, was auch computeCost.work eines Jobs festhält.

  5. Die Stufenliste einer HF-Kaskade wird beim Einreichen geprüft

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • rf_cascade

    Ein fehlerhaftes stages (kein JSON, leer, eine Stufe, die kein Objekt ist, ein Wert, der keine endliche Zahl ist) wird mit einem 400 abgelehnt, der die Stufe und den Schlüssel nennt, bevor etwas abgerechnet wird. Früher wurde es angenommen und scheiterte dann als Fehler (fault).

    Die Stufenwerte sind begrenzt: gain_db ±1000 dB, nf_db 0 bis 1000 dB, iip3_dbm und p1db_dbm ±1000 dBm, und die Verstärkung der Kette nach jeder Stufe innerhalb von ±1000 dB. NaN, Infinity und true/false werden abgelehnt; als Text geschriebene Zahlen werden weiterhin gelesen.

    Ein Stufenschlüssel, der sich von einem bekannten nur in der Groß- und Kleinschreibung unterscheidet (gain_dB, IIP3_dbm, Name), wird abgelehnt, mit der Stufe und dem richtigen Schlüssel; früher wurde er ignoriert, und die Stufe lief mit dem Standardwert. Jeder andere Schlüssel, den eine Stufe nicht annimmt (notes, part), wird mit einer Warnung unknown_stage_key ignoriert.

    Eine Stufe, deren sparamFile nicht mit dem Job hochgeladen wurde, wird abgelehnt, statt mit ihrer eingetippten Verstärkung berechnet zu werden.

  6. Ohne Interceptpunkt lautet der Wert null, nicht 99 dBm

    • POST /api/py/v1/jobs
    • rf_cascade

    Der IIP3 einer passiven Stufe sowie IIP3, OIP3, P1dB und SFDR einer Kette, wo keine Stufe sie begrenzt, sind null (sie waren 99 dBm und 99 + Verstärkung). Die Monte-Carlo-Perzentile und das Histogramm des IIP3 sind dort null, und die IIP3-Ausbeute ist 100 %.

    Eine passive Stufe fügt keinen Interceptpunkt von 99 dBm mehr hinzu: Ein 150-dB-Dämpfungsglied vor einem Verstärker mit 0 dBm IIP3 ergibt jetzt 150 dBm, nicht 99.

  7. HF-Kaskade: passives Rauschen aus Dateien, Vorzeichen im Monte-Carlo, exakte Interceptpunkte, Warnungen

    • rf_cascade

    Eine passive Stufe, deren Verstärkung aus einer Datei stammt, leitet ihre Rauschzahl aus dieser Verstärkung ab.

    Das Monte-Carlo bewegt die Rauschzahl einer passiven Stufe mit ihrer Dämpfung; das Vorzeichen war umgekehrt.

    Eingangs-IIP3 und P1dB werden exakt berechnet, wie tief sie auch fallen (drei 300-dB-Verstärker: −600 dBm und −610 dBm, die vorher −270 dBm ergaben); eine Untergrenze von −270 dBm bleibt nur als Schutz, wo die Summe hinter einem Punkt keine positive, endliche Zahl ist, was die Stufengrenzen unerreichbar machen, sodass ein P1dB den Job nicht mehr scheitern lässt.

    Warnungen unknown_stage_type, unknown_stage_key und file_not_uploaded.

  8. Die Impedanzanpassung rastet logarithmisch ein und rechnet den Sweep mit dem Leistungswellen-Reflexionsfaktor

    • POST /api/py/v1/jobs
    • impedance_match

    Bauteile der E12-, E24- und E96-Reihe sind der Normwert, der auf logarithmischer Skala am nächsten liegt, so wie die Reihen gestuft sind; genau in der Mitte der kleinere. 2,099 nH ist jetzt 2,2 nH, nicht 2,0 nH. Wo die beiden Regeln sich unterscheiden, können sich die Bauteile, die Rückflussdämpfung und der Zweig ändern, den auto wählt.

    |S11|, die Smith-Trajektorie, die Rückflussdämpfung im ungünstigsten Fall und die Bandbreite verwenden den Leistungswellen-Reflexionsfaktor (Z − Zs*)/(Z + Zs), wie es die Werte bei f0 tun. Eine reelle Quelle ist unverändert; eine komplexe Quelle, eingetippt oder aus einer Datei gelesen, ergibt ein anderes |S11|.

  9. Die Impedanzanpassung nennt ihre Entwurfsfrequenz, das Frequenzmodell ihrer Last und ihre Werte bei f0

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • impedance_match

    Jeder neue Parameter ist optional; eine Anfrage ohne sie erhält die Antwort, die sie vorher erhielt.

    designFreq (Hz): f0, getrennt von freqStart–freqStop und innerhalb davon angegeben; fehlt er, die Bandmitte.

    loadModel: constant (fehlt er), series_rc oder series_rl (bei f0 angepasst; eine Reaktanz mit falschem Vorzeichen wird abgelehnt) oder file (die eigenen Frequenzpunkte der hochgeladenen Last). branchPreference: any, lowpass oder highpass, mit einer Warnung branch_preference_unmet, wo es keinen solchen Zweig gibt. Eine Lastdatei .s1p wird angenommen.

    Neue Ergebnisse: designFreqHz, loadModel, unmatchedLoad, performance.ideal und .standard (Rückflussdämpfung, VSWR, beseitigter Fehlanpassungsverlust und die Bandbreite mit RL ≥ 10 dB mit ihren Grenzen und ihrem Anteil an f0, per Bisektion aufgelöst), branch und qDefinitions.

  10. Das Augendiagramm nimmt einen Sendehub, einen CTLE und eine Maske an

    • POST /api/py/v1/jobs (eye_diagram)
    • MCP simulate_eye_diagram

    Jeder neue Parameter ist optional, und eine Anfrage ohne sie erhält die Antwort, die sie vorher erhielt.

    launchSwing (mV Spitze-Spitze, Standardwert 2000, die ±1 V, die jedes frühere Ergebnis annahm) skaliert jede Spannung; eyeHeightPctOfSwing gibt die Augenhöhe als Anteil davon an.

    equalization: ctle wendet das zeitkontinuierliche Filter aus IEEE 802.3 Annex 93A an. ctleDcGain (−12 bis 0 dB) legt seine Verstärkung fest; leer wird die beste aus −12 bis 0 dB in 1-dB-Schritten gewählt. ctle meldet die Verstärkung, die Anhebung bei Nyquist, den Durchlauf und das Auge davor.

    maskType (hexagon oder rectangle), maskHalfHeight (mV) und maskWidth (UI) liefern mask.pass, margin_mV und die Verletzungen. samplingPhase (UI nach dem Nulldurchgang) und lossFrequency (Hz) ergänzen sampling und lossAtFrequency.

    Jedes Ergebnis trägt channelFile, uiMeasured und traceCount.

  11. Die Radardetektion nimmt einen Zufalls-Seed an

    • POST /api/py/v1/jobs (radar_detection)
    • provenance.seed

    randomSeed (eine ganze Zahl, 0 oder mehr) ersetzt den festen Monte-Carlo-Seed 42 und wird als provenance.seed festgehalten, sodass sich ein Lauf wiederholen und eine Was-wäre-wenn-Variante auf denselben Zufallszahlen erneut einreichen lässt. Ohne ihn ist jedes Ergebnis unverändert.

  12. Die Monte-Carlo-Simulation des Filters rechnet einen Kettenleiter wie aufgebaut durch, gegen von Ihnen gesetzte Kriterien, und sagt, was enger toleriert werden muss

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    Jeder neue Parameter ist optional, und eine Anfrage ohne sie erhält die Antwort, die sie vorher erhielt, mit neuen Ergebnisfeldern daneben.

    parts (1 bis 20, von der Quelle zur Last: ref, kind L oder C, position series oder shunt, value in H oder F, optional tolerance in %) simuliert den Kettenleiter wie angegeben, ohne Rundung auf E24. passCriteria (1 bis 8: insertionLoss über fStart–fStop höchstens maxDb, cutoff3dB innerhalb von fMin–fMax, attenuation bei freq oder über fStart–fStop mindestens minDb) ersetzt rippleSpec_db und rejectionSpec_db. yieldTarget (%, 95, wenn leer).

    Neue Ergebnisse: circuit, yieldTarget mit einem Urteil gegen das 95-%-Intervall, criteria mit Statistiken, Histogrammen und dem varianceShare (r²) jedes Bauteils, failingTrials (die ersten 200), sampleTrials und, bei eingegebenen Kriterien, whatIfs: die Bauteile, die das am häufigsten verfehlte Kriterium bestimmen, eine Toleranzstufe enger, auf denselben Durchläufen neu gerechnet. Ein erneutes Einreichen mit dem randomSeed des Laufs und diesen Toleranzen ergibt dieselbe Ausbeute.

  13. Der Regelkreis des Schaltnetzteils nimmt seinen Kompensator in Bauteilen an, löst nach einer Durchtrittsfrequenz auf und gibt ein Urteil

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • smps_control_loop result

    Jede neue Eingabe ist optional, und eine Anfrage ohne sie erhält die Antwort, die sie vorher erhielt.

    compensatorType: type2_ota mit compRc, compCc, compChf, compGm und compVref beschreibt einen Typ-II-Kompensator mit Transkonduktanzverstärker über seine Bauteile, exakt auf K, f_z und f_p abgebildet. Ein compVref über Vout wird abgelehnt.

    solveFor: crossover mit targetCrossover (Hz, Standardwert Fsw/10), resistorSeries (E96) und capacitorSeries (E12) setzt R_c, C_c und C_hf im Peak-Current-Mode und meldet, was sie erreichen.

    minPhaseMargin (45°) und minGainMargin (10 dB) bestimmen das Urteil und die Monte-Carlo-Ausbeute.

    Neue Ergebnisse: verdict, polesZeros, nominal.phaseCrossoverHz, nominal.loopGainAt100HzDb, compensatorParts, solve, runSummary und bodeAboveHalfFsw, die Frequenzgänge bis 2·Fsw, wo keine Reserve abgelesen wird.

  14. Sechzehn Timing-Rechner bewerten ihr Timing gegen ein Budget

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Jede neue Eingabe ist optional, und eine Anfrage ohne sie erhält die Antwort, die sie vorher erhielt, außer wo die folgenden Einträge etwas anderes sagen.

    uart-baud-rate: oversampling (16 oder 8), divisorFraction (0 ein ganzzahliger Teiler, 1 ein Bruch in Schritten von 1/oversampling) und errorBudget (%, 2, dem die Warnung zum Baudratenfehler folgt); divisorSet, baudError_pct (vorzeichenbehaftet) und stopSampleOffset_bits.

    can-bus-timing: sjw (tq, 1); bitRateActual, bitRateError_pct, samplePointActual und oscTolerance_pct, die Takttoleranz, die ISO 11898-1 jedem Knoten erlaubt.

    lin-bus-timing: slotTime (ms, 10); frameTimeMax, 1,4 × der Nennrahmen (LIN 2.x). modbus-frame-timing: charGap (ms, 0), den die Rahmenzeit jetzt mitzählt; t15, charGapChars und t15Chars.

    spi-timing: riseTime (2,2τ) und edgeShare_pct. i2s-timing: mclk (MHz, 16,9344) und rateBudget (%, 0,1); mclkDivider, bclkActual, sampleRateActual und sampleRateError_pct. pwm-duty-cycle: timerClock (MHz, 16) und requiredBits (8); periodCounts, onCounts, dutyActual, frequencyActual und dutyResolution_bits.

    555-timer: targetTime (ms, 2), errorBudget (%, 5), rTolerance und cTolerance (%, 0); timeMin, timeMax und timingError_pct. rc-time-constant: rTolerance (%, 1), cTolerance (%, 5) und tauBudget (%, 10), mit einer Warnung darüber hinaus; tauMinUs, tauMaxUs und tauErrorPct.

    inductor-energy: requiredTime (µs, 20). battery-charge-time: requiredTime (h, 3). supercapacitor-backup: holdUpTime (s, 60). motor-inrush-current: dipLimit (%, 10). via-step-response: slowdownBudget (%, 10), dem die Warnung zur Verlangsamung jetzt folgt. Jeder dieser Werte wird bei 0 oder darunter abgelehnt.

    inrush-current-limiter: ntcR25 (Ω, 0 für den erforderlichen Wert) und ntcTolerance (%, 20); peakInrushMax. Mit gesetztem ntcR25 folgen peakInrush, timeConstant und limitingResistor dem angepassten Thermistor. pid-tuning: overshootBudget (%, 25); overshootPct und settlingTime aus einer simulierten Sprungantwort des geschlossenen Regelkreises.

  15. Vierzehn Frequenzrechner zählen ihre Produkte innerhalb eines Bandes

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Jede neue Eingabe ist optional, und eine Anfrage ohne sie erhält die Antwort, die sie vorher erhielt, außer wo die folgenden Einträge etwas anderes sagen.

    mixer-spur-calculator: rfBandLow/rfBandHigh (MHz, 902/928), ifBandwidth (MHz, 10) und nearMargin (MHz, 50); spursInBand, spursNearBand, nearestSpur, imageFreq, imageToBand und loToBand, aus jedem HF-Eingang, der in die ZF umsetzt, f_RF = (m·f_LO ± f_IF)/n (m die LO-Harmonische, n die HF-Harmonische, wie in der älteren Zählung), m + n bis maxOrder.

    intermodulation-distortion: bandLow/bandHigh (MHz, 88/108); productsInBand. vibration-phase-noise: offsetBandLow/offsetBandHigh (Hz, 1000/10000); sidebandsInBand. phase-noise-to-jitter: pointsIntegrated.

    ism-coexistence: channelWidth1_MHz/channelWidth2_MHz (20/2); overlappingChannels, mit den Kanälen gleichmäßig über das Band verteilt. channels1 und channels2 sind auf 100 begrenzt.

    via-stub-resonance: dataRate (Gb/s, 10); nyquistFreq, resonancesInBand und resonancesNearBand. chassis-resonance: bandLow/bandHigh (MHz, 30/1000); f011MHz und modesInBand. room-modes: bandLow/bandHigh (Hz, 20/200); modesInBand, modesNearBand und modalBandwidth.

    sampling-nyquist: harmonicOrder (5); aliasesInBand (der Ton selbst, ins Signalband gefaltet), harmonicAliasesInBand (seine hineingefalteten Harmonischen, die bis zum SFDR des Wandlers zählen) und lowestAliasingInput. fft-bin-resolution: toneFreq (Hz, 1000) und sidebandSpacing (Hz, 100); toneBin, toneLevelError, resolutionBandwidth und sidebandsUnresolved (null für einen Ton über f_s/2).

    am-modulation-index: channelWidth (kHz, 10); powerInChannel, sidebandsInChannel und sidebandsOutside. fm-modulation-index: channelLow/channelHigh (kHz, 98000/98200); occupiedBandwidth, powerInChannel, sidebandsInChannel und sidebandsOutside (null über β = 1000, mit einer Warnung).

    oversampling-snr: signalBandwidth (Hz, 24000); modulatorRate, outOfBandNoise und foldBands. digital-filter-order: toneFreq (Hz, 1000) und maxHarmonic (5); harmonicsInPassband, harmonicsInTransition, nearestHarmonic, butterworthAttenuation und chebyshevAttenuation.

  16. can-bus-timing: der Vorteiler und die Quanten, die der Bitrate am nächsten kommen

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Von jedem Bit mit 8 bis 25 Zeitquanten (CAN 2.0), mit dem Vorteiler auf beiden Seiten des geforderten, das der Bitrate am nächsten liegende; dann der Abtastpunkt, der dem angefragten am nächsten liegt (CiA 601-3); dann 16 Quanten; dann der kleinste Vorteiler. Bisher wurde der Vorteiler genommen, der 16 Quanten am nächsten kam, gleich welche Rate sich daraus ergab: 36 MHz bei 500 kbps waren 5 × 14 Quanten, 2,86 % zu schnell, und sind jetzt 3 × 24, exakt. prescaler, nominalBitTime, tq und die Segmente ändern sich, wo eine exakte oder genauere Einstellung existiert; jeder Standardwert und jede Voreinstellung bleibt unverändert.

    Der Abtastpunkt liegt höchstens ein Quantum vor dem Ende des Bits, sodass die Segmente sich dazu aufsummieren (8 Quanten bei 95 % waren 9).

  17. modbus-frame-timing: feste Zeitgeber über 19 200 Bd

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Über 19 200 Bd ist t35 fest 1,75 ms (Modbus over Serial Line V1.02, Abschnitt 2.5.1.1), nicht mehr 3,5 Zeichen (0,334 ms bei 115 200 Bd 8E1), und maxFrameRate folgt; das neue t15 ist dort fest 750 µs.

  18. intermodulation-distortion: im3High ist ein Betrag

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    im3High ist |2f₂ − f₁|, wie es im3Low schon war: Unter f₂ = f₁/2 war es negativ (100 und 40 MHz: −20, jetzt 20 MHz).

  19. chassis-resonance: exaktes c und die Mode (0,1,1)

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Die Lichtgeschwindigkeit ist exakt, 29 979 245 800 cm/s, nicht 3 × 10¹⁰: fLowest, f101MHz und f110MHz sinken um 0,07 % (901,39 → 900,76 MHz bei den Standardwerten).

    fLowest schließt (0,1,1) ein, die tiefste Mode, wenn die Länge die kürzeste Seite ist (Pozar, Microwave Engineering, 4. Aufl., Abschnitt 6.3): Ein Gehäuse von 10 × 30 × 20 cm ergab 1581 MHz und ergibt jetzt 900,76 MHz; wavelengthAtResonance folgt.

  20. phase-noise-to-jitter: das Profil als Potenzgesetze integriert

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Mit profileMode 1 wird das Profil zwischen seinen Punkten als Potenzgesetze integriert, als Geraden in doppelt logarithmischer Darstellung (Drakhlis, Microwaves & RF, Januar 2001), und das Band endet dort beim eigenen Pegel des Profils. Ein lineares Trapez überschätzte ein fallendes Profil, und L₄ wurde bis zum Bandende gehalten, selbst wo es jenseits davon liegt: Das Standardprofil bei 100 MHz ergab 0,166 ps und ergibt jetzt 0,084 ps. rmsJitter, cycleToCycleJitter, phaseNoisePower, rmsPhaseError und adcSnrLimit ändern sich in diesem Modus; der Modus mit einem einzigen Pegel ist unverändert.

  21. sampling-nyquist: Der Alias faltet sich auf das nächste Vielfache von f_s

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    aliasFreq_Hz ist |f − k·f_s| mit k der ganzen Zahl, die f/f_s am nächsten liegt (Kester, MT-002). Es war |f_s − f|, nur bis 1,5·f_s richtig: 10 kHz bei 4 kSa/s ergaben 6000 Hz und ergeben jetzt 2000 Hz.

  22. fm-modulation-index: die Bessel-Bandbreite aus den Bessel-Funktionen

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    besselBandwidth umfasst die Seitenbänder über 1 % des unmodulierten Trägers, 2·n·f_m (Haykin, Communication Systems): Es war 2(β + 1)·f_m, noch einmal die Carson-Regel. Bei β = 5 waren es 180 kHz, jetzt 240 kHz. Über β = 1000 ist es null, mit einer Warnung.

  23. digital-filter-order: die exakte elliptische Ordnung

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    ellipticOrder löst die Gradgleichung K(k)·K′(k₁)/(K′(k)·K(k₁)) mit k = f_p/f_s und k₁ = ε_p/ε_s. Es war die Tschebyscheff-Ordnung durch 1,5, in den meisten Entwürfen zu hoch und in manchen zu niedrig: Die Standardwerte brauchen 3, nicht 4; ein Übergang 2:1 bei 1 und 20 dB braucht 3, nicht 2.

  24. via-stub-resonance: kein Stub, keine Resonanz

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Mit dem Ausgang auf der letzten Lage gibt es keinen Stub: resonantFreq und backdrillBenefit sind null (eine unbegrenzte Resonanz), nicht mehr 0.

  25. room-modes und inductor-energy: Ablehnungen, die nennen, was falsch ist

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    room-modes lehnt eine Schallgeschwindigkeit oder eine Nachhallzeit von 0 oder darunter mit einer eigenen Meldung ab und gibt neben einer Ablehnung keine Werte zurück; vorher gab es Nullen zurück und nannte die Raummaße.

    inductor-energy lehnt einen Serienwiderstand von 0 oder darunter ab, wie es die Website immer tat; die API scheiterte daran.

  26. Acht weitere Wandler- und Treiberrechner nehmen einen Betriebsbereich an, wählen ihre Bauteile und ergänzen ein Verlustmodell

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Wie buck-converter: Jede Eingabe, die im Betrieb schwankt, ist ein Paar <input>Min und <input>Max, wobei 0 (der Standardwert) die Nenneingabe bedeutet. Jeder ungünstigste Fall ist eine Ausgabe, mit den Eingabewerten, bei denen er auftritt, als eigene Ausgaben (rippleWorstA bei rippleWorstVin). Bauteile werden mindestens so gewählt, wie die ungünstigste Ecke es verlangt, eine Induktivität aus der E12-Reihe und eine Nennspannung als nächster Normwert ab dem 1,5-Fachen der höchsten Spannung (der Schalter des Sperrwandlers ab seiner geklemmten Drain-Spitze). Die Eingaben des Verlustmodells haben typische Standardwerte; seine Verluste gelten im Nennpunkt, in W, und addieren sich zu lossTotal. Eine Anfrage ohne die neuen Eingaben erhält die Antwort, die sie vorher erhielt, außer wo die folgenden Einträge etwas anderes sagen.

    boost-converter: inputVoltageMin/inputVoltageMax; coutEach sowie rdsOn, tSwitch, qg, vGate, vDiode, qrr, dcr, coreLoss, esrOut des Verlustmodells. Zu den neuen Ausgaben gehören dutyMin/dutyMax, inductorMinWorstUH und inductorChosenUH, ilPeakWorst, inputCurrentWorst, q1RmsA, coutRmsA, outputRippleMV, vdsRating, acht Verluste und efficiencyLossModel; die Eingabe efficiency bestimmt weiterhin die Ströme.

    flyback-converter: vinMin/vinMax, an jeder Ecke mit dem Nenntransformator gerechnet; rdsOn, tFall, qg, vGate, vDiode, rPri, rSec, coreLoss, leakageInductance (µH, Standardwert 2,6) und clampRatio (Standardwert 2, ab 1,1) des Verlustmodells, mit dem Verlust der RCD-Klemmschaltung ½·L_lk·I_pk²·f·k/(k − 1). Zu den neuen Ausgaben gehören die Spitzen- und Effektivströme beider Wicklungen, reflectedVoltage, clampVoltage, vdsPeakWorst, vdsRating, diodeVrWorst, diodeVrRating, sieben Verluste und efficiencyLossModel.

    charge-pump-voltage: inputVoltageMin/inputVoltageMax und pumpCurrentMin/pumpCurrentMax; switchResistance (Ω, Standardwert 1) und esr (mΩ, Standardwert 10), zum Ladungsteilungswiderstand addiert, wie es R_O im Datenblatt des ICL7660 ist. Zu den neuen Ausgaben gehören loadedVoltageMin/loadedVoltageMax, outputResistance, loadedVoltageWithLosses, die Nennwerte der Kondensatoren und Schalter, drei Verluste und efficiencyLossModel (gleich efficiency bei idealen Bauteilen).

    switching-regulator-ripple: outputCurrent (A, Standardwert 2), inputVoltageMin/inputVoltageMax und das Verlustmodell des Abwärtswandlers für seine eigenen Bauteile (sein esr ist der des Ausgangskondensators). Zu den neuen Ausgaben gehören die Welligkeiten und Effektivströme im ungünstigsten Fall, vdsRating, acht Verluste und efficiency.

    mosfet-power-dissipation: drainCurrentMin/drainCurrentMax und tAmbientMin/tAmbientMax (jeder Wert außer 0, das den Nennwert bedeutet); rdsonTempco (%/°C, Standardwert 0), in geschlossener Form bis zur Sperrschicht gelöst, coss (pF, Standardwert 0), qg und vGate. Zu den neuen Ausgaben gehören junctionTempWorst mit seinem Strom und seiner Umgebungstemperatur, totalLossWorst, efficiencyWorst, vdsRating, vier Verluste und efficiencyLossModel.

    h-bridge-selection und motor-driver-power: motorCurrentMin/motorCurrentMax und der Bereich der Versorgung (motorVoltageMin/motorVoltageMax, supplyVoltageMin/supplyVoltageMax); die Totzeit tDead und vBody der Body-Diode (TI SLVA504A), und bei der H-Brücke dutyCycle (%, Standardwert 75), tSwitch, qg und vGate. Zu den neuen Ausgaben gehören der größte Brückenverlust, der heißeste FET, vdsRating, die Verluste und efficiencyLossModel.

    class-d-efficiency: outputPowerMin/outputPowerMax und supplyVoltageMin/supplyVoltageMax; switchingFreq (kHz, Standardwert 400), filterCutoff (kHz, Standardwert 40), tSwitch, coss, qg, vGate sowie dcr und coreLoss der Filterinduktivität. Zu den neuen Ausgaben gehören das Ausgangsfilter (TI SLAA701B), wie berechnet und wie gewählt, fünf Verluste, loadPower, efficiencyLossModel, der schlechteste Wirkungsgrad und der größte Verlust mit ihren Ecken, headroomWorst (negativ, wo die Brücke den Ausgang nicht aussteuern kann), Welligkeits- und Spitzenströme des Filters sowie die Nennwerte.

  27. boost-converter: Das Tastverhältnis ist das aus TI SLVA372D

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Das Tastverhältnis war 1 − V_in/(V_out·η), sodass Verluste es verkürzten, im Widerspruch zum Eingangsstrom des Rechners selbst. Jetzt ist es TI SLVA372D Gl. 1, D = 1 − V_in·η/V_out. Bei den Standardwerten (5 V auf 12 V, 0,5 A, 100 kHz, 88 %) wird dutyCycle von 52,65 % zu 63,33 %, inductorValue von 64,35 µH zu 77,41 µH und outputCapacitor von 4,388 µF zu 5,278 µF.

    Die Ablehnung und die Warnung verschieben sich mit: Eine Eingangsspannung zwischen η·V_out und V_out, vorher abgelehnt, wird jetzt berechnet (nur V_out ≤ V_in wird abgelehnt), und die Warnung bei 95 % Tastverhältnis kommt bei V_in·η/V_out ≤ 0,05.

  28. switching-regulator-ripple: Eine Ausgangsspannung gleich oder über der Eingangsspannung wird abgelehnt

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Der Rechner ist ein Abwärtswandler. Mit outputVoltage gleich oder über inputVoltage lieferte er ein Tastverhältnis von 99 % und eine negative Welligkeit; jetzt lehnt er mit „Output voltage must be less than input voltage“ ab und gibt keine Werte zurück.

  29. buck-converter: ein Eingangsbereich, die gewählten Bauteile und ihre Belastungen sowie ein Verlustmodell mit dem Wirkungsgrad

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    vinMin und vinMax geben die Eingangsspannung als Bereich an (0, der Standardwert, ist der Nennwert vin). Die Induktivität wird dort dimensioniert, wo ihre Welligkeit am größten ist, und ab diesem Wert aus der E12-Reihe gewählt (inductorMinWorstUH, inductorChosenUH); jede Belastung wird dort gemeldet, wo sie am größten ist, mit der Eingangsspannung, bei der sie auftritt: rippleWorstA/rippleWorstVin, ilPeakWorst/ilPeakWorstVin, outputRippleMV/outputRippleVin, cinMinWorstUF, cinRmsA, q1RmsA, q2RmsA (jeweils mit ihrem …Vin) sowie dutyMin, dutyMax. Die Ausgangsbank besteht aus coutCount Kondensatoren mit coutEach µF; die Nennspannungen der Bauteile sind vdsRating, cinVoltageRating, coutVoltageRating (der angebotene Nennwert ab dem 1,5-Fachen der Spannung).

    Ein Verlustmodell, jede Eingabe optional: rdsOnHigh, rdsOnLow, tSwitch, qg, vGate, tDead, vBody, dcr, coreLoss, esrOut, esrIn. Bei Nenneingangsspannung und Nennlast sind die Verluste lossDcr, lossCore, lossHsConduction, lossLsConduction, lossHsSwitching, lossGateDrive, lossDeadTime, lossCapEsr und lossTotal (W), mit outputPower und efficiency (%). Eine Anfrage ohne die neuen Eingaben erhält die fünf Ausgaben, die sie vorher erhielt, außer cinUF (siehe buck-converter-input-capacitance).

  30. buck-converter: Der Eingangskondensator wird für die Welligkeit des Eingangs ausgelegt

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    cinUF teilte durch die Welligkeitsspannung des Ausgangs (deltaVout von vout). Jetzt nimmt es die eigene Welligkeit des Eingangs, die neue Eingabe deltaVin (% von vin, Standardwert 1), wie in TI SLVA477B Gl. 12: C_in = I_out·D·(1 − D)/(f_sw·ΔV_in). Bei den Standardwerten (12 V auf 5 V, 1 A, 500 kHz) werden aus 9,72 µF 4,05 µF.

  31. Dreiundzwanzig weitere Rechner nehmen eine Bauteilreihe an und melden den Entwurf, wie er gebaut wird

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    eSeries (0 für ideale Werte, oder 12, 24, 48, 96) rundet jeden Widerstand, Kondensator oder jede Induktivität, die der Rechner entwirft oder liest, auf den nächsten Wert dieser Reihe, und jede Ausgabe ist dann die des gerundeten Entwurfs. Sein Standardwert lässt einer Anfrage ohne ihn die Antwort, die sie vorher erhielt: 24 bei attenuator-designer, led-resistor und zener-diode, deren E24-Ausgaben (piR1Nearest bis tR2Nearest, rNearest, iActual, pNearest, e24Resistor) ihm jetzt folgen, und 0 bei voltage-divider, opamp-gain, comparator-hysteresis, schmitt-trigger, transistor-switch, current-mirror, crystal-load-capacitance, photodiode-transimpedance, lm317-resistors, rs485-termination, pll-loop-filter, wilkinson-power-divider, rc-snubber, rcd-clamp-snubber, emi-filter-lc, power-supply-ripple-filter, conducted-emissions-filter, differential-mode-filter, speaker-crossover und tweeter-capacitor. Die Bauteile von directional-coupler sind Leitungen und nehmen keine an.

    Neue Ausgaben beschreiben den gerundeten Entwurf: attenuator-designer piAttenuationBuilt (dB) und piInputImpedanceBuilt (Ω); wilkinson-power-divider isolationBuilt (dB bei f₀, null mit dem exakten Widerstand, wo sie unbegrenzt ist); rcd-clamp-snubber clampVoltageBuilt, rippleVoltageBuilt, clampPowerBuilt und peakDrainVoltageBuilt; pll-loop-filter crossoverBuilt (kHz, der 0-dB-Durchgang des Regelkreises; pmActual ist die Reserve dort); rs485-termination failsafeVoltage (mV, die A–B-Spannung des Busses im Ruhezustand); emi-filter-lc insertionLossBuilt (dB bei 10·f_c); conducted-emissions-filter cornerBuilt, attenuationBuilt und outputLevelBuilt; speaker-crossover wooferCutoffBuilt und tweeterCutoffBuilt; tweeter-capacitor crossoverBuilt; zener-diode zenerCurrentBuilt (mA) und zenerPowerBuilt (mW) bei Volllast über den eingesetzten Widerstand, der Strom negativ, wo der Widerstand die Last nicht tragen kann.

    Bezeichnungen, Schlüssel unverändert: Die gerundeten Widerstände des Dämpfungsglieds heißen „(rounded)“ statt „(E24)“; rNearest „Nearest Series Value“, pNearest „Power (series R)“, e24Resistor „Nearest Series Resistor“; error von current-mirror „Output Current Error“, die Unterschreitung gegenüber N·I_ref (mit einer Reihe schließt sie die Rundung ein, und ein Widlar-Ausgang wird aus V_T·ln(I_ref/I) = I·R_E mit dem gerundeten R_E gelöst).

    Damit sich ein Bauteil für eine Zielausgabe auflösen lässt, nennen diese Eingaben jetzt ein Maximum (ein Wert darüber wird trotzdem berechnet, mit der Warnung der Provenienz): comparator-hysteresis r1 und r2 10 000 kΩ; photodiode-transimpedance feedbackResistance 1e7 kΩ und feedbackCapacitance 100 000 pF; differential-mode-filter inductance 100 000 µH und capacitance 1 000 µF; power-supply-ripple-filter inductance 100 000 µH und capacitance 100 000 µF.

  32. schmitt-trigger: Schwellen per Überlagerung am +-Eingang

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Das Band war V_cc·R2/(R2 + R3), was R1 auslässt, symmetrisch um die Spannung des Teilers gelegt. Die Schwellen ergeben sich jetzt aus der Überlagerung am +-Knoten (TI SNOA997A): V_TH+ = V_cc·R1/(R1 + R2∥R3) und V_TH− = V_cc·(R1∥R3)/(R2 + R1∥R3); centerVoltage ist die Mitte des Bands. Bei den Standardwerten (5 V, 10, 10 und 100 kΩ) werden vth_high, vth_low und hysteresis von 2,727, 2,273 und 0,4545 V zu 2,6190, 2,3810 und 0,2381 V. Die Schaltung ist ein invertierender Trigger; die Beschreibung nannte sie nicht invertierend.

  33. conducted-emissions-filter: L und C passen zur Last

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    L und C wurden als √(LC·Z) und √(LC/Z) aufgeteilt, was √(L/C) auf √Z setzte (7,07 Ω in 50 Ω; das Filter überhöhte um 17 dB bei 47 kHz aus einer Spannungsquelle). Jetzt sind sie L = Z/ω₀ und C = 1/(ω₀·Z). Bei den Standardwerten (80 dBµV bei 150 kHz, 20 dB, 50 Ω) wird lValue von 23,7 µH zu 167,8 µH und cValue von 0,475 µF zu 0,0671 µF. Die Eckfrequenz, und damit die Dämpfung von 40 dB/Dekade, ist unverändert.

  34. attenuator-designer, led-resistor, zener-diode: E24-Werte unter 10 Ω

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Ihre E24-Suche begann bei 10 Ω, sodass ein Bauteil unter 10 Ω als 10 Ω eingesetzt wurde: Die Serienwiderstände von 2,875 Ω eines T-Dämpfungsglieds mit 1 dB und 50 Ω wurden zu 10 Ω (das gebaute Glied ergab 1,336 dB und 54 Ω), und ein LED-Widerstand von 5 Ω zu 10 Ω. Die Suche beginnt jetzt bei 0,10 Ω (3,0 Ω und 5,1 Ω). Über 10 Ω ändert sich nichts.

  35. pll-loop-filter und class-d-efficiency: Eine Ablehnung gibt keine Werte zurück

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    pll-loop-filter (bei jeder Ablehnung) und class-d-efficiency (in der API) gaben neben dem Fehler Nullen zurück. Jetzt geben sie keine Werte zurück, wie andere Rechner.

  36. filter-designer: der Frequenzgang des Kettenleiters, wie er gebaut wird, eine exakte Verschiebung der Grenzfrequenz und Grenzfrequenzen bis 1 GHz

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Sechs neue Ausgaben beschreiben den Kettenleiter, den die Bauteilwerte ergeben, gelöst als Kaskade von ABCD-Matrizen zwischen Z₀ und seiner Last: loadImpedance (Z₀, oder Z₀/g_{N+1} bei einem Tschebyscheff gerader Ordnung, g_{N+1}·Z₀ beim Hochpass), cutoffBuilt_Hz (die −3-dB-Frequenz, Tief- und Hochpass), fLowBuilt_Hz und fHighBuilt_Hz (die −3-dB-Kanten eines Bandpasses), passbandLoss_dB (die größte Dämpfung bis 0,8·f_c, über 1,25·f_c oder über die mittleren 80 % eines Bands) und stopbandBuilt_dB (die Dämpfung dort, wo der Prototyp das Doppelte seiner Grenzfrequenz erreicht). Mit gesetztem eSeries sind sie die des gerundeten Entwurfs; mit idealen Bauteilen ist das Sperrband gleich attenuation_at_2fc.

    fcShiftPercent war die Hälfte des größten Bauteilfehlers. Jetzt gibt es an, wie weit die Rundung die −3-dB-Frequenz des gebauten Kettenleiters (beim Bandpass: die Mitte seines −3-dB-Bands) gegenüber dem idealen verschoben hat: Der Butterworth 5. Ordnung mit 100 MHz und E24-Bauteilen ergibt +0,997 %, wo die Schätzung +1,31 % ergab. Mit eSeries 0 ist es 0, wie zuvor.

    fc nimmt bis zu 1 GHz an (es endete bei 10 MHz).

  37. voltage-drop: Jeder Querschnitt wird berechnet, und Aluminium ist das aus IEC 60889

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Ein wireGauge, den die Tabelle nicht aufführt (ein ungerader oder ein gebrochener Querschnitt), wurde mit dem Widerstand von 12 AWG berechnet. Jetzt gilt dieselbe Formel wie für die Tabelle, Kupfer nach IEC 60028 (1/58 Ω·mm²/m) über den Querschnitt nach ASTM B258; die aufgeführten Querschnitte sind unverändert.

    conductorType 1 (Aluminium) nahm das 1,61-Fache des Kupferwiderstands. Jetzt nimmt es die 0,028264 Ω·mm²/m aus IEC 60889, das 1,6393-Fache von Kupfer, sodass jeder Spannungsabfall bei Aluminium 1,8 % größer ist: 10 AWG mit 15 A über 30 m bei 120 V ergeben einen Abfall von 4,03 %, wo es 3,96 % waren.

  38. coax-loss: Dämpfung aus den Herstellerdaten; acht weitere Kabel, Eingangs- und Ausgangsleistung

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Die Kabeltabelle lag etwa beim 1,7-Fachen der dB/100 ft der Datenblätter, sodass die Dämpfung jedes Kabels zu niedrig war. Die Dämpfung pro 100 m ist jetzt k₁√f + k₂f mit f in MHz: die veröffentlichten Koeffizienten von Times Microwave (25 °C) für die LMR-Kabel und eine Anpassung nach der Methode der kleinsten Quadrate an die Tabellen von Belden und CommScope (20 °C) für die übrigen. Alt → neu lossPer100m bei 100, 435 und 2400 MHz: LMR-400 2,15 → 4,10, 4,62 → 8,74, 11,50 → 21,70; LMR-240 3,60 → 8,05, 7,69 → 17,04, 19,40 → 41,51; LMR-200 4,80 → 10,64, 10,35 → 22,43, 26,00 → 54,18; LMR-100A 10,80 → 23,84, 23,45 → 51,01, 61,00 → 127,68; RG-58/U 10,00 → 12,45, 22,65 → 28,77, 64,00 → 84,61; RG-8X 6,10 → 10,10, 13,50 → 22,74, 38,00 → 63,62; RG-213/U 4,70 → 6,30, 10,35 → 15,21, 28,50 → 48,34; RG-174/U 19,00 → 28,12, 43,33 → 65,75, 120,00 → 197,64; Belden 9913 2,50 → 4,34, 5,42 → 9,23, 13,70 → 22,75; Andrew LDF4-50A 0,70 → 2,17, 1,53 → 4,66, 3,95 → 11,81. attenuation_dB sowie die Leistungs- und Spannungsanteile folgen. Andrew LDF4-50A ist das 1/2-Zoll-Kabel; es war als 7/8 Zoll bezeichnet.

    cableIndex 0–9 behalten ihre Kabel und reichen jetzt bis 17: LMR-600, LMR-195, LMR-400-UltraFlex, LMR-400-LLPL (Plenum), RG-316, RG-6 (75 Ω), Andrew LDF5-50A (7/8 Zoll) und LMR-900. Neue optionale Eingabe inputPower (dBm, Standardwert 30); neue Ausgaben powerOut_dBm, powerOut_W und lossPerMeter. Eine Frequenz über dem Nennmaximum eines Kabels, jenseits des letzten Punkts einer angepassten Tabelle oder unter der Frequenz, ab der eine Anpassung auf 10 % genau gilt, erhält eine Warnung, keine Ablehnung.

  39. Achtzehn Rechner nehmen Listen an: Stufen, Verluste, Terme, Lagen, Lasten, Bauteile und Flächen

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Jede Liste ist eine Anzahl und indizierte Eingaben (numLoads mit load1Current, load2Current, …), sodass eine Anfrage ein flaches Objekt bleibt. Jede Anzahl hat als Standardwert die Liste, die der Rechner vorher hatte, sodass eine Anfrage ohne die neuen Eingaben die Antwort erhält, die sie vorher erhielt (geprüft mit 201 Anfragen pro Rechner, Ablehnungen eingeschlossen). Eine indizierte Eingabe jenseits der Anzahl wird ignoriert.

    noise-figure-cascade: numStages reicht jetzt bis 10 (bisher 4), mit stage5Gain, stage5NF, stage5IIP3 bis stage10IIP3, und einer optionalen bandwidth (MHz, Standardwert 1); neue Ausgaben cascadedGain, noiseTemperature (290 K × (F − 1)) und noiseFloor (kT₀B plus die kaskadierte Rauschzahl).

    lora-link-budget, ble-link-budget, 5g-nr-link-budget: extraLossCount (0–6) aus extraLoss1 bis extraLoss6 (dB) und totalLoss. clock-jitter: jitterTerms (0–6) aus term{n}Jitter_ps, quadratisch addiert. emi-margin-budget: marginTerms (0–6) aus term{n}Allowance und totalAllowance. sensor-accuracy-budget: errorTerms (0–6) aus term{n}Error, quadratisch. 4-20ma-transmitter: loopElements (0–6) aus element{n}Resistance und totalLoopResistance.

    heatsink-calculator, heatsink-selection, thermal-resistance-network, junction-temperature: numLayers (0–6) aus layer{n}Theta (°C/W), in Reihe zwischen Gehäuse und Kühlkörper; die beiden Kühlkörperrechner geben zudem thetaJS und heatsinkTemp zurück.

    battery-life: numLoads (0–7) aus load{n}Current und load{n}Duty sowie selfDischargeCurrent. battery-runtime-motor: motorDuty (%, Standardwert 100) und numLoads (0–5) aus load{n}Current, load{n}Duty und load{n}Efficiency sowie batteryCurrent. solar-panel-sizing: loadHours (h pro Tag, Standardwert 24) und numLoads (0–9) aus load{n}Power und load{n}Hours.

    gear-ratio: extraStages (0–5) aus stage{n}Driver, stage{n}Driven und stage{n}Efficiency sowie totalEfficiency. series-parallel-resistor: numParts (1–8, Standardwert 4) mit r5 bis r8 und sumOfValues; r1 darf 0 sein, ein nicht bestücktes Bauteil, wie es die anderen Positionen schon durften. rt60-reverberation: numSurfaces (0–8) aus surface{n}Area und surface{n}Alpha sowie otherArea und meanAbsorption.

  40. Linkbudgets beantworten eine Entfernung von 0 ohne Pfaddämpfung

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    lora-link-budget, ble-link-budget und 5g-nr-link-budget lehnten eine Entfernung von 0 ab. Jetzt beantworten sie sie mit 0 dB Pfaddämpfung: der Link ohne Pfad, mit dem die Seiten das Budget vor dem Pfad zeigen. Eine negative Entfernung wird weiterhin abgelehnt.

  41. clock-jitter: Ohne verbleibendes Timing-Budget ist der Anteil unbegrenzt, nicht 0 %

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Wo Setup- und Hold-Zeit die ganze Taktperiode einnehmen, war budgetUsed_pct 0, was sich wie gar kein Jitter liest. Jetzt ist es null (ein unbegrenzter Anteil), mit einer Warnung, dass kein Timing-Budget übrig ist, wenn keine Setup-Verletzung zu melden ist.

  42. series-parallel-resistor: Das Teilerverhältnis bezieht sich auf die beiden bestückten Bauteile

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Mit genau zwei bestückten Bauteilen war voltDividerRatio R2/(R1 + R2), gleich welche beiden es waren, also 0 bei bestücktem R1 und R3. Jetzt ist es das zweite bestückte Bauteil geteilt durch die Summe beider, was bei R1 und R2 unverändert ist.

  43. optical-sensor-range: Eine Ablehnung gibt keine Werte zurück

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Ein Sicherheitsfaktor von 0 oder weniger wurde mit maxRange und normalizedRange von 0 neben dem Fehler abgelehnt. Die Ablehnung gibt jetzt keine Werte zurück, wie jede andere Ablehnung.

  44. broadside-coupled-pair: ohne Ebenen keine Gleichtakt- und ungekoppelte Impedanz und keine Höhe über der Ebene

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Ein ungeschirmtes Paar (shielded 0) hat keine Bezugsebenen, sodass commonImpedance, uncoupledImpedance und heightToPlane nicht definiert sind, wie es die Warnung schon sagte. Sie waren 0 und sind jetzt null.

  45. rise-time-bandwidth: ohne Takt keine Ordnung der Harmonischen

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Mit clockFrequency 0, was die Eingabe zulässt, um den Takt wegzulassen, war harmonicNumber 0, ein Wert, den kein Takt ergibt. Jetzt ist es null, wie andere Ausgaben, wo ein Wert nicht existiert.

  46. Dreizehn Rechner bewerten ihr Ergebnis gegen eine veröffentlichte Norm

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Jeder nimmt die Norm (und, wo zutreffend, die Klasse) als optionale Eingabe und gibt den Grenzwert zurück, das Ergebnis als Prozentsatz davon (über 100 ist nicht bestanden) und den Wert einer Eingabe, mit dem er die Norm erfüllen würde. Die Grenzwerte werden in der Berechnung bestimmt, sodass die API das Urteil der Seite liefert. Jede neue Eingabe ist optional, und bei ihrem Standardwert ist jede bestehende Ausgabe unverändert, außer wo ein Eintrag unten etwas anderes sagt.

    power-density: standard (0 FCC 47 CFR §1.1310, 1 ICNIRP 2020), exposureClass, groundReflection; gibt limitDensity, limitPercent, minDistance, maxEirp zurück. trace-width-current: standard (es liest die gezeichnete traceWidth, die die API bereits annimmt); limitCurrent, limitPercent, minTraceWidth. microvia-current-capacity: standard, conductorClass; limitCurrent, limitPercent, minVias, minViaDiameter. pcb-trace-temp: standard, laminate; chartRise, limitRise, limitPercent, minTraceWidth, maxCurrent.

    minimum-conductor-spacing: conductorSpacing; spacingPercent, maxVoltage (der Grenzwert ist spacing). padstack-annular-ring: standard, padDiameter, producibilityLevel; minLandDiameter, landPercent, maxDrillDiameter. solder-paste-volume: releaseCriterion; maxStencilThickness, stencilPercent, maxApertureReduction. bga-land-pad: ballType, landDiameter; ipcLand, landDeviation, landTolerance, landPercent, compliantLand.

    i2c-pullup: pullup; riseTime, riseTimePercent, maxBusCap (der Grenzwert ist riseTimeTarget_ns, der Modus ist speedMode). usb-termination: impedanceError, impedanceTolerance, impedancePercent, compliantImpedance (die Norm ist usbVersion). esd-tvs-diode: standard, testLevel, esdRating; testVoltage, limitPercent. esd-clamp-selection: standard, testLevel; testVoltage, limitPercent. radiated-emission-estimate: standard, emissionClass; eFieldUvm, limitField, limitPercent, maxCurrent, maxLoopArea.

    Wo eine Norm keinen Grenzwert setzt (ICNIRP unter 30 MHz, CISPR 32 außerhalb von 30 MHz–6 GHz, Restringe nach IPC-6012 Klasse 2, ein A6-Abstand über 3.050 m), sind die neuen Ausgaben NaN, als null zurückgegeben, mit einer Warnung, die den Grund nennt.

  47. Elf Leitungsrechner geben die Wellenlänge auf der Leitung zurück

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    microstrip-impedance, controlled-impedance, asymmetric-stripline, dual-stripline, differential-pair, edge-coupled-internal-symmetric, edge-coupled-internal-asymmetric, edge-coupled-embedded, broadside-coupled-pair, coplanar-waveguide und coax-impedance nehmen eine optionale frequency an (GHz, Standardwert 2,4) und geben guidedWavelength und quarterWavelength (mm) zurück, λg = c/(f·√εeff), bei gekoppelten Leitungen aus ihrem εeff im Gegentaktmodus. Eine Anfrage ohne frequency gibt jede bestehende Ausgabe unverändert zurück, dazu die beiden neuen bei 2,4 GHz.

  48. radiated-emission-estimate: Die Reserve folgt der gewählten Norm und Klasse

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    margin ist der Grenzwert der gewählten Norm und Klasse bei Frequenz und Abstand der Anfrage, abzüglich des Felds: standard 0 ist CISPR 32 und 1 ist FCC Part 15, Abschnitt 15.109, emissionClass 0 ist Klasse B und 1 Klasse A. Eine Anfrage ohne sie erhält wie bisher CISPR 32 Klasse B, sodass ihre Reserve unverändert ist. Die Grenzwerte der FCC gelten von 30 MHz bis 40 GHz, und die Reserve ist außerhalb des Bereichs ihrer Norm null. Die Bezeichnung der Ausgabe lautet jetzt „Margin to Limit“.

  49. minimum-conductor-spacing ergänzt die Spalten A6 und A7 für Bauteilanschlüsse sowie eine Ausgabe B4

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    condition 4 ist A6 (äußerer Bauteilanschluss oder Anschlusskontakt, unbeschichtet, Meereshöhe bis 3.050 m) und 5 ist A7 (äußerer Bauteilanschluss oder Anschlusskontakt, Schutzlack), beide aus IPC-2221B Tabelle 6-1. Über 3.050 m liefert eine A6-Anfrage für den Abstand null statt einer Zahl, mit einer Warnung, da die Tabelle A6 nur bis 3.050 m angibt. Die neue Ausgabe spacingB4 ist Spalte B4 (äußere Leiter, dauerhafte Polymerbeschichtung), neben spacingB1, spacingB2 und spacingB3. Die Bedingungen 0 bis 3 und die bestehenden Ausgaben sind unverändert.

  50. bga-land-pad bemisst das Pad nach dem Kugeldurchmesser, wie IPC-7351B

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Das Pad war der Kugeldurchmesser × 1,0, 0,9 oder 0,8 je nach Dichtestufe, was keine IPC-Tabelle angibt. Jetzt folgt es IPC-7351B: Bei einer kollabierenden Kugel ist es je nach Kugelgröße um 25, 20 oder 15 % kleiner als die Kugel. Bei den Standardwerten geht padDia von 0,55 auf 0,45 mm, und die daraus abgeleiteten Ausgaben folgen. Die Eingabe densityLevel ist ausgemustert, da IPC-7351B auf ein BGA-Pad keine Dichtestufen anwendet: Eine Anfrage, die sie sendet, wird beantwortet, mit einer Warnung, dass der Wert nicht gelesen wurde.

  51. bldc-winding: Eine Spule umspannt mindestens eine Nut

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Wo Nuten geteilt durch Pole auf 0 gerundet werden (zum Beispiel 6 Nuten unter 14 Polen), war die Spulenweite 0, der Wicklungsfaktor 0, und actualKv und deltaEquivKv waren null. Eine konzentrierte Spule ist um einen Zahn gewickelt, daher beträgt die Spulenweite jetzt mindestens eine Nut, und diese Ausgaben sind Zahlen.

  52. emi_radiated-Jobs wenden an einer Bandkante den strengeren Grenzwert an

    • POST /api/py/v1/jobs

    Bei genau 88, 216 und 960 MHz (FCC Part 15) und 230 MHz (CISPR 32) wurde der lockerere der beiden angrenzenden Grenzwerte verwendet. 47 CFR 15.109(c) besagt, dass an den Bandkanten der strengere Grenzwert gilt, und CISPR 32 wendet an einer Übergangsfrequenz den niedrigeren Grenzwert an; beides wird jetzt angewendet.

  53. Eingabebereiche bei 31 Rechnern

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Eingaben von 30 Rechnern haben ein Maximum erhalten, die meisten davon Geometrierechner (Leitungen, Pads, Antennen, Hohlleiter), damit die Seite nach ihnen auflösen kann, und die Buskapazität von i2c-pullup reicht jetzt bis 550 pF, dem Limit von Fast-mode Plus. Die API lehnt keinen Wert jenseits des Bereichs einer Eingabe ab; provenance.validRange meldet ihn als außerhalb.

  54. Zwölf Sensorrechner erhalten ein Frontend: seine Spannung, den ADC-Code und die Auflösung

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    ntc-thermistor, rtd-temperature, pt100-resistance, thermocouple-voltage, wheatstone-bridge, strain-gauge-bridge, pressure-bridge-output, load-cell-amplifier, hall-effect-sensor, current-shunt, accelerometer-sensitivity und lvdt-sensitivity nehmen optionale Frontend-Eingaben an und geben drei neue Ausgaben zurück. Die Eingaben sind ein Teiler (fixedResistor, sensorPosition oder ntcPosition) oder ein Verstärker (frontGain) und ein ADC (adcRef, adcBits), wobei eine Eingabe wiederverwendet wird, die ein Rechner schon hatte (gain, amplifierGain, adcVoltage, supplyVoltage). Die Ausgaben sind die Spannung des Frontends (dividerVoltage oder amplifiedVoltage), adcCode (ein unipolarer N-Bit-Code, zwischen 0 und 2^N − 1 gehalten) und resolution (die physikalische Größe pro ADC-Schritt an diesem Punkt).

    load-cell-amplifier nimmt die Last auf der Zelle an (appliedLoad) und gibt ihre Ausgangsspannung zurück (bridgeOutputMv); accelerometer-sensitivity nimmt acceleration an und gibt outputVoltage zurück.

    Jede neue Eingabe ist optional, und bei ihrem Standardwert ist jede bestehende Ausgabe unverändert: Eine vor dieser Änderung geschriebene Anfrage gibt die Werte zurück, die sie zurückgab, dazu die neuen Ausgaben.

  55. current-shunt: Die Verstärkung hat den Standardwert 20

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Wenn eine Anfrage amplifierGain weglässt, verwendet current-shunt jetzt 20, wo es 50 verwendete. Bei den übrigen Standardwerten (10 A durch 10 mΩ, ein ADC mit 3,3 V) führte die Verstärkung 50 zu 5 V am ADC, jenseits seiner Referenz. Die Verstärkung 20 ergibt 2 V. amplifiedVoltage und adcResolutionCurrent ändern sich bei solchen Anfragen; eine Anfrage, die amplifierGain nennt, ist nicht betroffen.

  56. hall-effect-sensor: Ein Feld von null oder darunter wird abgelehnt

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    hall-effect-sensor gibt jetzt einen Fehler für Bfield bei oder unter 0 mT zurück, wie es die Website schon tat, wo die API früher daraus berechnete Werte zurückgab.

  57. frequency-ppm-tolerance: Die Warnungen zitieren die Takttoleranzen, die gelten

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Die Warnungen von frequency-ppm-tolerance zitierten ein UART-Budget von ±50 ppm (ein UART verträgt etwa 2 %) und nannten ±100 ppm zu locker für USB, das bei Full Speed ±2500 ppm erlaubt. Über ±50 ppm zitiert die Warnung jetzt 100BASE-TX-Ethernet und den Funktakt von Bluetooth LE. Über ±100 ppm zitiert sie jeden Ethernet-Takt und über ±500 ppm USB 2.0 High Speed. Die Schwellen bei 50 und 100 ppm sind unverändert; die bei 500 ppm ist neu.

  58. Platinenspezifische Leiterbahnbreite und Temperaturerhöhung aus dem eigenen Wärmemodell von rftools

    • POST /api/py/v1/calculate (trace-width-current, pcb-trace-temp)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    trace-width-current erhält widthBoardMm, die Mindestbreite für diese Platine, und pcb-trace-temp erhält tempRiseBoard und maxTempBoard, die Erwärmung und die Höchsttemperatur darauf; beide erhalten inModelRange. Sie stammen aus dem eigenen Wärmemodell von rftools, nie als IPC-2152 bezeichnet: ein geschlossenes thermisches Netzwerk, angepasst an einen nur für Tests verwendeten 2-D-Finite-Volumen-Löser für Leiterbahn, Laminat, Ebene und ruhende Luft (Konvektion und Strahlung), der gegen veröffentlichte Messungen geprüft ist (Bedingungen nach IPC-TM-650 2.5.4.1A, die Anpassungen von Brooks & Adam an die Diagramme von IPC-2152 und weitere) und auf die Erwärmung eine Reserve von 15 % aus der ungünstigsten davon trägt. Innerhalb seines validierten Bereichs (Leiterbahnbreite 0,25–5,1 mm, Platine 1,4–3,2 mm, eine Innenlagen-Leiterbahn ab 1,27 mm Breite, eine Erwärmung von 5–100 °C, eine Ebene in 0,1 mm Abstand oder mehr) liegt die Anpassung innerhalb von 2,81 % des Lösers.

    Neue Eingaben, mit Standardwerten angehängt, sodass eine bestehende Anfrage unverändert rechnet: boardThickness (mm, Standardwert 1,6), planeDistance (mm bis zu einer Kupferebene, 0 für keine) und planeCopperWeight (oz, Standardwert 0,5) bei beiden Rechnern sowie isExternal bei pcb-trace-temp. Jede bestehende Ausgabe ist unverändert. Bei den Standardwerten ist widthBoardMm 0,30212 mm, neben den 0,78144 mm aus Figure 5-1, und tempRiseBoard 10,2818 °C.

    Außerhalb des validierten Bereichs wird das Ergebnis weiterhin gemeldet, mit inModelRange 0 und einer Warnung, die die Grenze nennt; eine Platine unter 1,4 mm verweist auf Figure 5-1, wo das Modell und die veröffentlichten Dickendaten von IPC-2152 voneinander abweichen. Ein thermisches Durchgehen liefert null für die platinenspezifische Erwärmung. provenance.validRange erhält bei diesen beiden Rechnern models, jedes angepasste Modell mit seinem eigenen inside: zuerst die Anpassung an IPC-2152 Figure 5-1, dann das Wärmemodell, und status ist outside, wenn eines von beiden es ist. Eine Anfrage an diese Rechner mit einem Strom, einer Erwärmung, einem Kupfergewicht oder einer Länge von null oder darunter wird im Browser wie in der API abgelehnt, und ein negativer Strom wird abgelehnt, statt mit 500 beantwortet zu werden.

  59. Sieben Ausgaben, die die Rechner nicht berechnen konnten, sind entfernt

    • POST /api/py/v1/calculate (differential-via, usb-termination, parabolic-dish-antenna)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    differential-via gibt diffImpedance, commonImpedance, oddImpedance, evenImpedance und singleEndedImpedance nicht mehr zurück. Eine Feldlösung (ein 3-D-quasistatischer Löser, an vier geschlossenen Formen validiert und mit openEMS vollwellig auf 0,4 % gegengeprüft) zeigte, dass die Impedanz eines Via-Paars vom Abstand der Ebenen abhängt, die es durchquert, was keine Eingabe ist: Bei den Standardwerten beträgt sie 85,6 Ω bei 0,1 mm Ebenenabstand und 96,0 Ω bei 1,0 mm, wo der Rechner 44,10 Ω angab. Keine Beziehung in den Eingaben des Rechners kommt in jedem Fall auf 10 % heran, und die Gleichtaktimpedanz hängt außerdem davon ab, wo der Rückstrom fließt. Die Stub-Resonanz und die Verluste werden weiterhin zurückgegeben; siehe den Eintrag zu den Korrekturen.

    usb-termination gibt eyeOpening nicht mehr zurück, eine Heuristik, die keine USB-Spezifikation definiert. parabolic-dish-antenna gibt noiseTemperature nicht mehr zurück, das 290·(1 − η) war: Die Rauschtemperatur einer Antenne hängt von ihrer Elevation, ihrem Spillover und dem Himmel ab, und keines davon nimmt der Rechner an.

    Ein Aufrufer, der einen dieser Schlüssel liest, muss damit aufhören: Der Schlüssel fehlt, er ist nicht null. Jede andere Ausgabe der drei Rechner wird weiterhin zurückgegeben.

  60. Werte, die es nicht gibt, fehlen oder sind null, nicht die Zahl Null oder ein Platzhalterwert

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Diese Ausgaben sind jetzt null, wo die Größe nicht definiert ist, wo sie früher eine Zahl waren: signalRiseTime von usb-termination für USB 3.0, das keine Anstiegszeit des Senders festlegt (USB 2.0 nennt sein Minimum von 500 ps, T_HSR); die Kopplungsausgaben von pcb-crosstalk-emc oberhalb der Grenze schwacher Kopplung, (x_C + x_L)/2 = 0,1, wo das konzentrierte Modell nicht gilt; vbSealed und f3Sealed von subwoofer-box für Qts ≥ 0,707, wo keine geschlossene Abstimmung existiert (sie ergaben 2·Vas); qFactor von planar-spiral-inductor bei oder über der Eigenresonanz; Bohrer und Fräser zum Abdecken bei aperture-diagonal, wenn kein vorrätiges Werkzeug passt (sie ergaben 0); qFactor von lc-resonance ohne Widerstand, das unbegrenzte Q eines verlustfreien Kreises (es ergab 9999 und die Bandbreite f₀/9999; die Bandbreite ist jetzt 0); und stubResonance von differential-via, wenn es keinen Stub gibt (es ergab 0 GHz). Jedes null kommt mit einer Warnung, die den Grund nennt.

    Eine abgelehnte Eingabe gibt jetzt nur ihren Fehler und keine Werte zurück, wo diese Rechner Nullen oder Teilwerte zurückgaben: power-density, thermal-via-array, bga-breakout-width ohne Kanal, dual-stripline mit h₂ ≤ 0, fresnel-zone und jede Ablehnung von doppler-shift, reactance-calculator, broadside-coupled-pair, fusing-current, rise-time-bandwidth, current-divider, delta-wye-conversion, voltage-drop, rt60-reverberation und vfd-motor-speed. Eine Null neben einem Fehler las sich wie ein Ergebnis.

    Ein Aufrufer, der diese Werte als Zahlen behandelte, muss auf null prüfen oder auf einen fehlenden Schlüssel neben einem Fehler. /calculate/solve überspringt Punkte ohne die Ausgabe bereits.

  61. Rechner gegen ihre Quellen korrigiert, mit drei neuen Eingaben und neuen Ausgaben

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • POST /api/py/v1/jobs (emi_radiated)
    • MCP run_calculation
    • MCP simulate_emi_radiated
    • rftools-io SDK

    Konstanten. Der spezifische Widerstand von Kupfer ist überall der aus IEC 60028, 1/58 Ω·mm²/m (trace-resistance 100,217 → 100,458 mΩ bei seinen Standardwerten; die anderen Kupferrechner verschieben sich um 0,008 %, die Eindringtiefe um 0,004 %). Die Microstrip-Engine nimmt η₀/2π, wo sie 60 nahm, und die exakte Lichtgeschwindigkeit, sodass sich jede Microstrip-basierte Impedanz um −0,069 % verschiebt (microstrip-impedance 80,954 → 80,898 Ω, differential-pair 99,983 → 99,914 Ω und mit ihnen die gelösten Breiten). Jeder Rechner nutzt jetzt dasselbe η₀ = µ₀·c (CODATA 2018). Die Wellenimpedanz von power-density ist µ₀·c, 376,730 Ω (sie war 120π). Die Laufzeit von controlled-impedance ist √εeff/0,299792458 ps/mm (6,52995 → 6,53447). Der Job emi_radiated verwendet π·µ₀/c und µ₀ für seine Felder und stimmt damit jetzt mit radiated-emission-estimate überein (er lag 0,021 dB und 0,023 dB zu hoch).

    Modelle. planar-spiral-inductor nimmt die Parasitäten nach Jow & Ghovanloo und die Leiterbahnlänge seiner Form: Eigenresonanz 68,0 → 601,7 MHz und Q bei 100 MHz 814,5 → 116,8 bei den Standardwerten, mit der neuen optionalen Eingabe frequency (MHz, Standardwert 100) für Q. pcb-crosstalk-emc ist das Zwei-Enden-Modell nach Paul: Die bestehenden Schlüssel gelten pro Ende (die Hälfte der alten Werte), farEndCrosstalk ist neu, und die Standardwerte sind ein Takt mit 3,3 V und 25 MHz. subwoofer-box stimmt den Port nach Margolis & Small ab (20,246 → 40,273 Hz) und ergänzt f3Vented. pcb-crosstalk rechnet mit der Engine für gekoppelte Microstrips, mit der neuen Eingabe dielectricConst (Standardwert 4,5; Kopplung 6,77 → 5,72 %). Der Kantenwiderstand von patch-antenna ist das Modell der strahlenden Schlitze nach Balanis mit dem exakten η₀, unbegrenzt (306,80 → 321,22 Ω; der Speisewiderstand und die Einspeisetiefe für 50 Ω folgen). lc-resonance behandelt seinen Serienwiderstand in beiden Topologien als Serienverlust, Q = Z₀/R (der Parallelmodus rechnete R/Z₀), und ergänzt impedanceAtResonance_ohm: R in Reihe, L/(C·R) parallel. Die Stub-Resonanz von differential-via ist als unbelastete Obergrenze bezeichnet, und sein Leiterverlust ist die Obergrenze für dichte Ebenen (0,030 → 0,011 dB).

    Regeln. Ein Microvia-Feld wird nach seinem summierten Querschnitt bemessen, IPC-2221 Anmerkung 5 (zehn Vias 2,762 → 1,466 A). Die Eigenerwärmung eines Vias ist das Maximum der Hülse, P·L/(8kAN), in via-voltage-drop (0,2506 → 0,0313 °C) und microvia-current-capacity. bga-breakout-width zählt die äußere Reihe mit (escapeRows 1 → 2). padstack-annular-ring bewertet das Seitenverhältnis gegen IPC-2222 Tabelle 9-4, 8:1 in jeder Klasse, mit einer Prüfung des Mindestbohrdurchmessers nach Tabelle 9-6, und der innere Restring der Klasse 3 beträgt 0,025 mm. thermal-via-array zählt ganze Vias. i2c-pullup und rs485-termination geben ihre Widerstände ungerundet zurück (die Anzeige rundet weiterhin). aperture-diagonal nimmt die neue Eingabe routerBit an.

    Eine Anfrage, die eine der neuen Eingaben weglässt, erhält deren Standardwert.

  62. Vier Ausgaben, die bei jeder Eingabe denselben Wert hatten, sind entfernt

    • POST /api/py/v1/calculate (balun-transformer, opamp-bandwidth, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    Jede dieser Ausgaben gab unabhängig von den Eingaben denselben Wert zurück, und keine war ein Ergebnis: vswr (1,0, „VSWR (ideal)“) und insertionLoss (0,3 dB, „Typical Insertion Loss“) von balun-transformer; slewLimited von opamp-bandwidth (0, ein Platzhalter für eine Prüfung, die Eingaben für Anstiegsrate und Amplitude braucht, die der Rechner nicht hat); und voltageCode von capacitor-code (0 V, eine Nennspannung, die ein dreistelliger Code nicht kodiert). Sie werden nicht mehr zurückgegeben, auch nicht neben einer Ablehnung.

    Ein Aufrufer, der einen dieser Schlüssel liest, muss damit aufhören: Der Schlüssel fehlt, er ist nicht null. Wofür jeder Wert stand, steht stattdessen in provenance.assumptions: ideal-transformer bei balun-transformer (konstruktionsbedingt angepasst; Kern- und Wicklungsverluste sind nicht modelliert, und ein Ferrit-Balun verliert typisch 0,1–1 dB) und capacitance-only bei capacitor-code. Jede andere Ausgabe der drei Rechner ist unverändert.

  63. Der Gewinn von loop-antenna schließt ihren Strahlungswirkungsgrad ein

    • POST /api/py/v1/calculate (loop-antenna, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Der gain von loop-antenna war bei jeder Eingabe 1,76 dBi: die Richtwirkung einer kleinen Schleife, 3/2, ohne jeden Verlust. Jetzt ist er diese Richtwirkung mal den Strahlungswirkungsgrad e = R_rad/(R_rad + R_loss), aus den beiden Widerständen, die der Rechner schon zurückgibt: G = 10·log₁₀(1,5·e) (Balanis, Antenna Theory, 4. Aufl., Kapitel 2 und Abschnitt 5.2). Bei den Standardwerten, einer 1-m-Schleife aus 10-mm-Kupfer bei 7 MHz, ergibt er −9,4043 dBi, 11,2 dB unter dem alten Wert; eine Schleife, deren Verlust gegenüber ihrem Strahlungswiderstand klein ist, ergibt weiterhin nahezu 1,76 dBi. Der Wirkungsgrad ist die neue Ausgabe radiationEfficiency (%), 7,6467 % bei den Standardwerten.

    capacitor-code rundete in der API einen gebrochenen Code zur geraden Zahl hin, wo die Seite halbe Werte aufrundet, sodass 104,5 in der API als 100 nF und auf der Seite als 1 µF dekodiert wurde. Beide ergeben jetzt 1 µF.

  64. Acht Eingaben, die kein Ergebnis veränderten, bestimmen jetzt eines; elf neue Ausgaben

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Jede der folgenden Eingaben war deklariert und wurde von keiner Ausgabe gelesen. Jetzt bestimmt sie eine neue Ausgabe, hinter den bestehenden angehängt und aus einer Beziehung berechnet, die der Rechner bereits herstellt; keine bestehende Ausgabe ändert sich bei irgendeiner Eingabe. patch-antenna: feedOffset bestimmt feedResistance_ohm, R_edge·cos²(π·y₀/L) (Balanis, Antenna Theory, 4. Aufl., Abschnitt 14.2.1, Gl. 14-20a), 306,795 Ω bei der Standard-Kanteneinspeisung und 65,501 Ω bei 10 mm, und insetFeedPosition_mm ist die Einspeisetiefe, die 50 Ω ergibt, 10,594 mm. flyback-converter: fsw bestimmt primaryInductance (µH), Vin·D/(fsw·Ipk) für den eigenen Spitzenstrom des Rechners im Grenzbetrieb, 130,56 µH. solar-panel-sizing: batteryCapacity bestimmt batteryAutonomyDays, C·V·0,5/(P·24 h) bei der Entladetiefe von 50 %, die die erforderliche Kapazität annimmt, 0,25 Tage. rs485-termination: baudRate bestimmt baudRateUtilisation (%), die Rate als Anteil des Maximums von 10⁸ bit·m, 11,52 %. adc-snr: samplingFreq bestimmt nyquistZone, ⌊f_in/(f_s/2)⌋ + 1, und aliasFrequency (MHz), |f_in − f_s·round(f_in/f_s)| (Kester, Analog Devices MT-002): Zone 1 und 1 MHz bei den Standardwerten, Zone 2 und 30 MHz für 70 MHz bei 100 MSPS. bldc-thermal: continuousCurrent bestimmt ratedCurrentShare (%), den Betriebsstrom gegenüber dem Nennwert, 75 %. bldc-winding: supplyVoltage bestimmt noLoadSpeed (U/min), Kv·V, 11.406,44 U/min. Die Werte gelten bei den Standardwerten des jeweiligen Rechners.

    Zwei weitere neue Ausgaben: assumedBoomLength (m) bei yagi-antenna, der Boom, den ihr Elementabstand von 0,2λ voraussetzt, (N − 1)·0,2λ, 1,6655 m bei den Standardwerten, der ihre ausgemusterte Eingabe für die Boomlänge ersetzt (siehe jenen Eintrag); und radiationEfficiency (%) bei loop-antenna (siehe den Eintrag zu ihrem Gewinn). Nur auf der Website zeigt das Live-Widget zur Regulierung von ism-coexistence jetzt das Band, das sein bandIndex wählt; sein Ergebnis ist unverändert.

    Eine Anfrage, die eine dieser Eingaben weglässt, erhält deren Standardwert. patch-antenna ohne feedOffset und solar-panel-sizing ohne batteryCapacity wurden bisher mit 400 beantwortet; beide werden jetzt beantwortet.

  65. Zwölf Eingaben, die nie ein Ergebnis veränderten, sind ausgemustert; eine Anfrage, die eine davon sendet, erhält eine Warnung

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • MCP get_calculator_schema
    • rftools-io SDK

    Diese Eingaben waren deklariert, aber kein Wert davon veränderte eine Ausgabe, eine Warnung oder eine Ablehnung: smith-chart frequency, via-calculator signalLayer, stackup-builder layerCount (das Modell ist ein fester Vierlagenaufbau, was sein Titel jetzt sagt), i2c-pullup numDevices, fm-modulation-index carrierFreq, quantization-noise frequency, 555-timer vcc, bldc-efficiency polePairs, opamp-bandwidth phase_margin, battery-internal-resistance temperature, rs485-termination numNodes und yagi-antenna boomLength. Sie verlassen den Katalog, die Grenzen der Provenienz und das MCP-Schema; jeder Rechner führt sie unter retiredInputs auf, mit dem Datum.

    Eine Anfrage, die noch eine davon sendet, erhält dieselben Werte wie bisher und die bestehende Warnung „Input '<key>' is not read by this calculator and was ignored.“ Sie wird nie abgelehnt. POST /calculate/solve lehnt es ab, nach einer davon aufzulösen, wie bei jeder nicht deklarierten Eingabe; kein Raster davon hätte eine Ausgabe bewegen können. Eine Anfrage an yagi-antenna ohne boomLength, bisher mit 400 beantwortet, wird jetzt beantwortet.

    Das nächste Release von rftools-io behält jedes ausgemusterte Schlüsselwort bei: Die Übergabe eines davon löst eine DeprecationWarning aus, die den Schlüssel und das Datum seiner Ausmusterung nennt, und der Schlüssel wird nicht gesendet.

  66. trace-width-current liest seine IPC-2152-Breite aus IPC-2152 Figure 5-1; pcb-trace-temp meldet die Erwärmung nach IPC-2152

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    width2152mm von trace-width-current, als IPC-2152 bezeichnet, war die IPC-2221-Breite × 0,75 auf einer Außenlage und × 0,85 auf einer Innenlage, ein Faktor, den IPC-2152 nicht enthält, und schmaler als jede IPC-2152-Ablesung ab 2 A. Jetzt ist es IPC-2152 (2009) Figure 5-1, das Diagramm, das IPC-2152 für Innen- und Außenleiter in allen Umgebungen empfiehlt, über die veröffentlichte Anpassung I = 0,024·ΔT^0,44·A^0,725, auf jeder Lage gleich: 0,7814 mm bei den Standardwerten, vorher 0,2266 mm; bei 5 A, 10 °C Erwärmung und 1 oz auf einer Außenlage 7,194 mm, vorher 2,086 mm. Es reproduziert die Ablesungen von Olson (2010) aus Figure 5-1 von 300 und 680 sq mil auf 5 % genau. Der Schlüssel ist unverändert; seine Bezeichnung lautet jetzt „Min Width (IPC-2152 Fig. 5-1)“.

    Beide Rechner rechnen Kupfer mit 35 µm pro Unze, sodass sich width2221mm um −0,58 % verschiebt (0,3004 mm bei den Standardwerten, vorher 0,3021 mm). resistance, voltageDrop und powerDiss von trace-width-current werden für eine neue Eingabe berechnet, die gezeichnete Leiterbahnbreite, wo sie das IPC-2221-Minimum verwendeten, mit Kupfer nach IEC 60028 von 1/58 Ω·mm²/m: 0,10433 Ω bei den Standardwerten, vorher 0,17326 Ω.

    Neue optionale Eingabe, angehängt; eine Anfrage, die sie weglässt, erhält ihren Standardwert: traceWidth bei trace-width-current (mm, 0,5). Neue Ausgaben: inChartRange bei beiden Rechnern (1 innerhalb des Bereichs, den IPC-2152 Figure 5-1 zeigt, 0 außerhalb, übernommen in provenance.validRange mit dem größten Residuum der Anpassung), sowie tempRise2152 und maxTemp2152 bei pcb-trace-temp, die Erwärmung nach Figure 5-1 (k = 0,024, jede Lage) neben der Erwärmung auf der Außenlage nach IPC-2221: 25,815 °C bei den Standardwerten, neben 5,342 °C. Die bestehenden Ausgaben von pcb-trace-temp behalten ihre Schlüssel und Werte.

    Ergebnisse außerhalb der Diagramme werden gemeldet und markiert, nie abgelehnt: Eine Warnung nennt die Größe und die Diagrammgrenze, für die Kurven von 10 bis 45 °C und 700 sq mil in Figure 5-1, die 10 bis 100 °C und 700 sq mil von IPC-2221 Diagramm A auf einer Außenlage und die ½ bis 3 oz von Diagramm B; jenseits von Figure 5-1 ist provenance.validRange.status gleich outside.

    Quellenangaben: trace-width-current, pcb-trace-temp, microvia-current-capacity und via-calculator zitierten für das Stromdiagramm IPC-2221B, das diese Ausgabe (2012) nicht enthält. Jetzt zitieren sie IPC-2221A (2003) Figure 6-4, das Diagramm aus IPC-2221 (1998), und IPC-2152 (2009) Figure 5-1; kein Wert der letzten beiden ändert sich.

  67. Zwölf Rechner verwenden das Modell, das ihre Seite und ihre Quelle beschreiben

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Jeder der folgenden Rechner berechnete ein Modell, das hinter dem zurückblieb, was seine Seite und seine Quelle beschreiben, und zwar gleich im Browser, in der API und im MCP-Server. Jeder berechnet jetzt das veröffentlichte Modell und ist gegen einen veröffentlichten Fall getestet, und der Paritätsabgleich hält Browser und API auf denselben Zahlen. Gespeicherte Berechnungen speichern Eingaben und werden daher neu berechnet. bldc-winding, Teil derselben Änderung, hat einen eigenen Eintrag vom 2026-10-11.

    Werte ändern sich bei: cable-shield-effectiveness (Kopplungsimpedanz R_T + jωM_T und Schirmdämpfung gegenüber der Leitungsimpedanz, Hähner & Mund 1998: 64,95 dB bei den Standardwerten, vorher 30,97 dB gegenüber 1 Ω, ohne Untergrenze bei 0 dB), ferrite-bead (R_DC + (R_AC ∥ L ∥ C) nach Analog Devices AN-1368, verankert an der eingegebenen Impedanz bei 100 MHz, und die komplexe Einfügedämpfung zwischen Quelle und Last: die Standardperle mit 600 Ω ergibt 94,9 Ω bei 1 GHz, vorher 1897 Ω), mosfet-operating-point (der Arbeitspunkt auf der Drain-Lastgeraden, Sedra & Smith 7e Abschnitt 5.3; siehe den inkompatiblen Eintrag unten), bldc-motor (Schub bei der Drehzahl, bei der sich die Drehmomente von Motor und Propeller ausgleichen, Drela 2007, mit C_P 0,047: 140,91 g bei den Standardwerten, vorher 80,43 g bei festen 75 % der Leerlaufdrehzahl), ethernet-cable (Kabel-Einfügedämpfung nach ANSI/TIA-568-C.2 bei der Signalfrequenz jedes PHY, 31,25, 62,5 oder 400 MHz: 7,69 dB bei den Standardwerten, vorher 16,5 dB; Kategorie 8 ist bei jeder Geschwindigkeit ein 30-m-Kanal), radar-range-equation (die Reichweite bei dem SNR, das die Albersheim-Gleichung für P_d und P_fa verlangt: 35,23 km bei den Standardwerten, vorher 74,96 km bei SNR = 1, und snrAtMaxRange meldet dieses SNR, wo es 0 war), bldc-efficiency (Kupferverlust I²·R mit dem Klemmenwiderstand, Drela 2007 und das maxon Formulae Handbook: 4,500 W bei den Standardwerten, vorher 6,750 W), bldc-thermal (der Wicklungswiderstand bei der Temperatur, die er erreicht, maxon Formulae Handbook Abschnitt 9.2, mit demselben Kupferverlust: 207,61 °C bei den Standardwerten, vorher 184,47 °C; siehe den inkompatiblen Eintrag unten), class-d-efficiency (Leitung durch die FETs, die die Last gleichzeitig führen, I²·R_DS(on)·N/2: 0,625 W bei den Standardwerten, vorher 1,250 W), motor-driver-power (zwei leitende FETs und einer hart schaltend, TI SLVA504A: eine Brücke mit 0,1440 W bei den Standardwerten, vorher 0,2088 W) sowie coax-impedance und via-calculator (Z₀ aus η₀/2π = 59,9585 Ω mit den Konstanten nach CODATA 2018, wo sie 60 verwendeten: 47,990 Ω und 35,2243 Ω bei den Standardwerten, vorher 48,023 Ω und 35,2487 Ω).

    Neue optionale Eingaben, angehängt; eine Anfrage, die eine davon weglässt, erhält deren Standardwert: transferInductance (nH/m, 0,159155, was die bisherige Kopplungsimpedanz bei 10 mΩ/m reproduziert) und lineImpedance (Ω, 50) bei cable-shield-effectiveness; beadInductance (µH, 1,208), parasiticCapacitance (pF, 1,678) und sourceImpedance (Ω, 0) bei ferrite-bead; biasMode (0 löst die Lastgerade, 1 nimmt V_DS wie eingegeben; Standardwert 0) bei mosfet-operating-point; pd (0,9), pfa (1×10⁻⁶) und pulses (1, nichtkohärent integriert) bei radar-range-equation; transitionTime (ns, 50) bei motor-driver-power.

    Neue Ausgaben: vdsOperating bei mosfet-operating-point, loadedRpm und loadedCurrent bei bldc-motor sowie gateDriveLoss (2·Q_g·V·f, im Gate-Treiber umgesetzt) bei motor-driver-power.

    Schlüssel beibehalten, Bedeutungen jetzt passend zu ihren Bezeichnungen: conductionLoss von motor-driver-power ist der Verlust einer leitenden Position (I²·R), switchingLoss der des einen hart schaltenden FET, totalLossPerFet der heißeste FET, und efficiency wird gegen V·I·D genommen und berücksichtigt die Gate-Ansteuerung. Die Eingabe phaseResistance von bldc-efficiency und bldc-thermal ist als Klemmenwiderstand bezeichnet, zwischen zwei Anschlüssen gemessen, was sie immer war.

    Die Einfügedämpfung der Kategorie 8 verwendet die Entwurfskoeffizienten, die das Kanalmodell von IEEE 802.3bq für TIA Kategorie 8 angibt (Entwurf d0.7: 1,8·√f + 0,005·f + 0,25/√f dB pro 100 m), und jedes Ergebnis der Kategorie 8 sagt das, da die veröffentlichte Tabelle aus TIA-568.2-D nicht vorliegt.

    Neue Ablehnungen und Warnungen: ferrite-bead lehnt eine Impedanz bei 100 MHz ab, die ihre L und C nicht erreichen können, und nennt die größte erreichbare; radar-range-equation lehnt eine P_d ab, die kein Detektor bei dieser P_fa erreicht, und warnt außerhalb des angegebenen Bereichs von Albersheim; cable-shield-effectiveness warnt, wenn das Kabel länger als ein Sechstel einer Wellenlänge ist oder die Kopplung nicht mehr schwach ist; ethernet-cable warnt, wenn eine Kategorie jenseits der Frequenz ausgewertet wird, bis zu der sie spezifiziert ist.

  68. mosfet-operating-point löst standardmäßig die Lastgerade; bldc-thermal gibt null zurück, wo die Wicklung thermisch durchgeht

    • POST /api/py/v1/calculate (mosfet-operating-point, bldc-thermal)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    mosfet-operating-point löst jetzt standardmäßig das quadratische Gesetz zusammen mit der Drain-Lastgeraden V_DS = V_DD − I_D·R_D (Sedra & Smith, Microelectronic Circuits, 7. Aufl., Abschnitt 5.3, Beispiel 5.5), sodass vdd und rdLoad den Arbeitspunkt bestimmen und ein eingegebenes vds nicht mehr. Bei den Standardwerten ergibt er 11,96 mA im Triodenbereich bei V_DS 0,0401 V, wo er 450 mA ergab, die die Last von 1 kΩ an 12 V nicht führen kann. Ein Aufrufer, der sich auf das eingegebene vds verlässt, muss biasMode: 1 senden; das behält die bisherige Berechnung bei und warnt, wenn V_DS + I_D·R_D mehr als 1 % von V_DD abweicht. Die neue Ausgabe vdsOperating gibt in beiden Modi das V_DS des Arbeitspunkts an.

    bldc-thermal berücksichtigt jetzt den Anstieg des Wicklungswiderstands mit der Temperatur (maxon Formulae Handbook, 2012, Abschnitt 9.2). Wo α·Rθ·R₂₅·I² ≥ 1 gilt, gibt es keinen stationären Zustand: Der Kupferverlust wächst mit der Temperatur schneller, als der Wärmepfad ihn abführt. Dort sind tempRise, steadyStateTemp, thermalMargin und hotResistance null, mit einer Warnung, die den Strom nennt, unterhalb dessen sich die Wicklung einpendelt; früher waren es Zahlen (467,97 °C bei 25 A am Standardmotor, der jetzt über 23,21 A thermisch durchgeht). Ein Aufrufer, der sie als Zahlen liest, muss null behandeln. deratedCurrent und timeToLimit sind immer Zahlen.

    timeToLimit von bldc-thermal ist null, mit einer Warnung, wenn sich die Wicklung beim Spitzenstrom unterhalb ihres Grenzwerts einpendelt, der Grenzwert also nie erreicht wird. Früher war es der Platzhalterwert 9999 s, der sich wie eine echte Zeit las.

  69. bldc-winding: Der Füllfaktor zählt beide Spulenseiten, und der Wicklungsfaktor nach dem Nutenstern

    • POST /api/py/v1/calculate (bldc-winding)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    fillFactor zählt jetzt beide Spulenseiten in jeder Nut, 2·N·A_wire/A_slot (Pyrhönen, Jokinen & Hrabovcová, Design of Rotating Electrical Machines, 2008, Abschnitt 2.9): Eine Spule auf jedem Zahn legt zwei Spulenseiten in jede Nut. Früher zählte er eine, sodass sich jeder Füllfaktor verdoppelt. Er ist nicht mehr auf 100 % begrenzt: Eine Wicklung, die nicht passt, gibt ihren tatsächlichen Wert zurück, mit den Warnungen bei 75 % und 90 % wie bisher.

    windingFactor nimmt seinen Zonenfaktor aus dem Nutenstern-Verfahren, k_d = sin(π/6)/(z·sin(π/(6z))) für q = S/(3P) = z/n in gekürzter Form (Bianchi & Dai Pré, 2006). Er war 1 für jedes q, das auf 1 gerundet wurde, sodass Bruchlochwicklungen zu hoch lagen: 12 Nuten und 14 Pole ergeben jetzt 0,93301 (vorher 0,96593), 18 Nuten und 16 Pole 0,94521 (vorher 0,98481). Ganzlochwicklungen sind unverändert. turnsPerCoil, actualKv, deltaEquivKv und phaseResistance folgen: Die Standardwicklung mit 935 Kv bleibt bei 4 Windungen und erreicht 1027,61 Kv (vorher 992,59), und 920 Kv auf einem Stator von 23 × 10 mm braucht 6 Windungen (vorher 5).

    Der Standardwert von maxCurrent des Rechners ist 5 A (vorher 10 A), sodass seine Standardwicklung des EMAX MT2213 baubar ist: 4 Windungen AWG 18 bei 47,24 % Füllfaktor. Bei 10 A braucht sie AWG 14 und 119,44 %. Die API setzt keine Standardwerte ein, sodass eine Anfrage, die maxCurrent sendet, mit dem gesendeten Wert berechnet wird.

  70. Dreißig Rechner auf die Beziehung korrigiert, die sie zitieren

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Jeder der folgenden Rechner berechnete etwas anderes als seine zitierte Quelle, und zwar gleich im Browser, in der API und im MCP-Server. Jeder berechnet jetzt die Beziehung aus der Quelle und ist gegen einen veröffentlichten Wert getestet. Gespeicherte Berechnungen speichern Eingaben und werden daher neu berechnet.

    Werte ändern sich bei: equalizer-q-factor (Oktavbandbreite bei konstantem Q), capacitor-code (eine Multiplikatorziffer 8 bedeutet ×0,01, 9 bedeutet ×0,1), opamp-gain (die Bandbreite ist GBW durch die Rauschverstärkung), coax-impedance (TE11-Grenzfrequenz am mittleren Umfang), h-bridge-selection (zwei FETs leiten gleichzeitig), bldc-winding (der Faktor √3 gehört zum Stern; neue Standardwerte von einem realen 12N14P-Motor), speaker-crossover (Induktivitäten 2. Ordnung √2·R/ω_c, das Doppelte des alten Werts, auch im KiCad-Export), esd-tvs-diode (der Prüfschärfegrad nach IEC 61000-4-2 nimmt die erste Spitze der Norm von 3,75 A/kV), common-mode-choke (eine komplexe Serienimpedanz in einem 50-Ω/50-Ω-System), uart-baud-rate (Mark- und Space-Parität zählen ein Bit), bldc-motor (statischer Schub C_T·ρ·n²·D⁴ mit C_T 0,11), resistor-color-code (Orange ±0,05 %, Gelb ±0,02 %; ein weißer Toleranzring wird abgelehnt), pt100-resistance (das C aus IEC 60751 unter 0 °C und die volle Steigung), torque-units, energy-units und torque-unit-converter (exakte Faktoren nach NIST SP 811), via-thermal-resistance (Strombelastbarkeit aus der Anpassung nach IPC-2221), thermal-via-array (die galvanisierte Hülse ist Kupfer, gleich welche Füllung), stackup-builder (L3 als Stripline gelöst, L1 mit Kupferdicke, Kupfer in der Summe mitgezählt), coplanar-waveguide (geerdeter CPW bleibt für breite Streifen endlich), i2c-pullup (V_OL ist 0,2·V_DD bei 2 V oder darunter), vibration-phase-noise (der Zufallsterm fällt mit dem Offset; die Abweichung ist der Spitzenwert), inrush-current-limiter (die Spitze beim Kaltstart ist V/R_cold), shielding-effectiveness (die Reflexionsdämpfung enthält η₀; Mehrfachreflexionen ergänzt), ethernet-cable (Kategorie 5e bei 10 Gb/s besteht nicht), ground-plane-impedance (Induktivität µ₀·h·l/w; einseitiger Wechselstromwiderstand) und minimum-conductor-spacing (IPC-2221B Tabelle 6-1 nach Bereich, mit ihren Raten pro Volt über 500 V).

    Neue optionale Eingaben: separation bei ground-plane-impedance (mm, Standardwert 1) und tempRise bei via-thermal-resistance (°C, Standardwert 10). Eine Anfrage, die sie weglässt, erhält den Standardwert, der die veröffentlichten Rechenbeispiele reproduziert.

    Neue Ausgaben: hotRestartInrush bei inrush-current-limiter und multipleReflectionLoss bei shielding-effectiveness.

    Ausgaben ohne Wert kommen jetzt als null mit einer Warnung zurück, wo sie früher eine Zahl waren: Hohlleiterwellenlänge sowie Phasen- und Gruppengeschwindigkeit von waveguide-cutoff unterhalb der Grenzfrequenz und die Breite von stackup-builder für eine Zielimpedanz, die die Lage nicht erreichen kann.

    comparator-hysteresis und pcb-trace-temp ändern nur ihre Bezeichnungen und die angegebene Formel: Keine Zahl ändert sich.

    POST /api/py/v1/calculate/solve lehnt ein grid, das feiner als 1×10⁻¹² der Größenordnung des Bereichs ist, mit einer grid-Ablehnung (400) ab, vor jeder Auswertung und ohne Abrechnung. Ein solches Raster konnte eine Anfrage bis zur Zeitüberschreitung festhalten.

  71. radiated-emission-estimate: Reserve gegenüber CISPR 32 Klasse B, null, wo die Norm keinen Grenzwert setzt

    • POST /api/py/v1/calculate (radiated-emission-estimate)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    Die Reserve wird jetzt gegenüber dem Grenzwert von CISPR 32 Klasse B im Messabstand genommen: Tabellen A.4 und A.5, die Zeile für 3 m unter √30 m und die Zeile für 10 m darüber bis 1 GHz, die Mittelwertzeilen für 3 m von 1 bis 6 GHz, 20 dB/Dekade ab dem tabellierten Abstand und der niedrigere Grenzwert an einer Bandkante. Früher waren es pauschal 40 dBµV/m bei jeder Frequenz und jedem Abstand.

    Unter 30 MHz und über 6 GHz setzt CISPR 32 keinen Grenzwert für die Abstrahlung, daher ist margin dort null, mit einer Warnung. Früher war es eine Zahl. Ein Aufrufer, der margin als Zahl liest, muss null behandeln.

    Das Feld ist die Abschätzung für eine kleine Schleife im freien Raum, jetzt mit der exakten Konstante π·µ₀/c. Eine Messung über einer Masseebene kann bis zu 6 dB höher liegen, wie die Seite sagt.

  72. filter-designer und sechs HF-Rechner korrigiert

    • POST /api/py/v1/calculate
    • MCP run_calculation
    • rftools-io SDK

    filter-designer: Die Prototypwerte von Tschebyscheff waren ab der 4. Ordnung falsch (g3 1,5733, jetzt 2,3661), ein Butterworth 1. Ordnung ergab g1 = 1 (jetzt 2), und die Elementwerte des Bandpasses waren bei Q = 10 zehnmal zu klein. Die Werte werden jetzt berechnet, nicht tabelliert.

    waveguide-cutoff, free-space-path-loss, rf-link-budget, fresnel-zone, link-margin und radar-range-equation verwenden die exakte Lichtgeschwindigkeit, nicht 3×10⁸: Längen verschieben sich um etwa 0,07 % und die Pfaddämpfung um 0,006 dB. radar-range-equation verwendet außerdem die exakte Boltzmann-Konstante.

    planar-spiral-inductor lehnt einen Innendurchmesser ab, der gleich oder größer als der Außendurchmesser ist, statt NaN zurückzugeben.

    Am 2026-10-05 und 2026-10-06 kamen vierzehn Rechner hinzu, darunter die neue Kategorie iot; rufen Sie den Katalog per GET oder list_calculators ab, um sie zu sehen.

  73. PDN-Impedanz: ein konvergiertes Ebenenmodell, ein abgeleiteter Port und zwei neue Parameter

    • POST /api/py/v1/jobs (pdn_impedance)
    • POST /api/py/v1/jobs/estimate
    • MCP simulate_pdn_impedance
    • rftools-io SDK

    Weggelassene portX_mm und portY_mm setzen den Port jetzt auf den Drittelpunkt der Platine (a/3, b/3) statt in ihre Mitte. Die Mitte ist eine Nullstelle jeder Hohlraummode mit ungeradem Index, sodass die ersten Resonanzen bei einem Lauf mit Standardwerten nie sichtbar wurden. Eine Anfrage, die den Port angibt, erhält den angefragten Port.

    Zwei optionale Parameter: portSize_mm (Standardwert 1 mm, 0,25–20), die Seitenlänge des Quadrats, durch das der Strom des ICs in die Ebenen eintritt, und boardInductance_nh (Standardwert 1 nH, 0–20), die Induktivität zwischen Regler und Ebenen, die fest auf 1 nH stand. Ein Port, der über eine Platinenkante hinausragt, wird angenommen und mit seinem Spiegelbild modelliert; ein Port, dessen Mitte außerhalb der Platine liegt oder der größer als die Platine ist, wird abgelehnt.

    Die Ergebnisse ändern sich. Die Modalsumme der Ebene wurde relativ zu freqMax_hz abgeschnitten und konvergierte mit einem Punktport nie, sodass sich die Ergebnisse mit dem Sweep verschoben. Jetzt konvergiert sie und hängt unterhalb der ersten Mode nicht vom Sweep ab. Am Standardport beträgt die Ausbreitungsinduktivität der Ebene etwa 1,5 nH, wo etwa 0,2 nH angegeben waren, sodass die Serienresonanz der unbestückten Ebene von etwa 550 auf etwa 210 MHz fällt und sich die empfohlenen Kondensatorsätze ändern. Frühere Ergebnisse werden nicht neu berechnet.

    Das Urteil und summary.maxZPdnDb decken jetzt das ganze Entkopplungsband ab, das beim 0,8-Fachen der ersten Hohlraummode der Platine endet, mit dem ungünstigsten Fall zwischen den Rasterpunkten verfeinert. Neue Ergebnisfelder: summary.band, summary.worstHz, summary.unreachable, resonances[].portCoupling sowie der verwendete Port, seine Größe und die Platineninduktivität unter params. Jedes bestehende Feld bleibt erhalten.

  74. Ein Aufruf zum Auflösen nach einem Zielwert: eine Rechnereingabe für eine Zielausgabe suchen

    • POST /api/py/v1/calculate/solve

    POST /api/py/v1/calculate/solve findet den Wert einer Eingabe eines Rechners, der eine seiner Ausgaben auf einen Zielwert bringt — die Leiterbahnbreite für 50 Ω, den Abstand für eine Ziel-Differenzimpedanz —, und gibt ihn mit dem Vorwärtsergebnis genau bei diesem Wert zurück: values, warnings, errors und provenance, genau das, was /calculate für diese Eingaben zurückgibt. Ein gezählter Aufruf ersetzt die vielen Vorwärtsaufrufe, die ein Client sonst für die Suche von Hand aufwenden würde.

    Die Suche läuft über die angegebenen Grenzen der Eingabe, eingeengt durch einen optionalen range; eine Eingabe ohne angegebene Grenze braucht einen. Ein optionales grid rundet den zurückgegebenen Wert auf sein nächstes Vielfaches innerhalb des Bereichs, neben der ungerundeten Lösung. Ein Zielwert, den die Suche nicht erreichen kann, ist trotzdem ein Erfolg, mit reached: false und dem nächstgelegenen gefundenen Wert, und wird trotzdem abgerechnet. Ablehnungen — ein unbekannter Rechner, ein Eingabe- oder Ausgabename, den der Rechner nicht deklariert, ein nicht endlicher Wert, ein fehlender Bereich bei einer unbegrenzten Eingabe — kosten nichts, wie bei jeder anderen Rechner-Route.

    Client.solve() des Python-SDK (rftools-io 0.4.0) und das Werkzeug solve_calculation des MCP-Servers (2.2.0) bieten denselben Aufruf.

  75. Ein verbrauchtes Kontingent auf den Rechner-Routen ist 402, nicht 401

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Die Rechner-Routen antworteten mit 401 „Invalid or quota-exceeded API key“ sowohl bei einem ungültigen Schlüssel als auch bei einem verbrauchten Kontingent, sodass ein Skript einen falschen Schlüssel nicht von einem vollen Monat unterscheiden konnte. Ein verbrauchtes Kontingent ist jetzt 402, wie es die Job-Route schon antwortete, mit errorKind: "rate_limited", reason, limit, used, resetAt, upgradeUrl, overageUrl und einem Header Retry-After.

    401 bedeutet jetzt nur noch, dass der Schlüssel fehlt, fehlerhaft, unbekannt oder widerrufen ist, und erwähnt nie ein Kontingent. Eine Anfrage ganz ohne Schlüssel erhält 401 mit einer keyUrl, unter der es einen kostenlosen Schlüssel gibt.

    Ein Aufruf wird geprüft, bevor er gezählt wird: Ein unbekannter Rechner (404) oder eine Eingabe, die keine endliche Zahl ist (400), kostet nichts, und eine fehlgeschlagene Berechnung wird gutgeschrieben. In einem Batch werden nur die Einträge gezählt, die diese Prüfungen bestehen, und Einträge, deren Berechnung scheitert, werden gutgeschrieben. Verzweigen Sie nach dem Status und errorKind, nie nach dem Meldungstext.

  76. Das monatliche Kontingent gehört dem Konto, geteilt von all seinen Schlüsseln

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/jobs

    Früher trug jeder Schlüssel sein eigenes monatliches Kontingent, sodass ein Konto mit mehreren Schlüsseln sein Kontingent einmal pro Schlüssel verbrauchen konnte. Jetzt gehört das Kontingent dem Konto: Die Aufrufe jedes seiner Schlüssel, widerrufene eingeschlossen, werden auf einen gemeinsamen Monatswert angerechnet, der zu Beginn jedes Kalendermonats in UTC zurückgesetzt wird.

    Ein Konto mit einem Schlüssel bemerkt keinen Unterschied. Aufrufe werden weiterhin dem Schlüssel zugeordnet, der sie ausgeführt hat, und das Dashboard und GET /api/py/v1/usage führen sie pro Schlüssel auf.

  77. Ein Nutzungs-Endpunkt und Nutzungs-Header in jeder gezählten Antwort

    • GET /api/py/v1/usage
    • X-Usage-Allowance
    • X-Usage-Used
    • X-Usage-Reset
    • X-Usage-Overage

    GET /api/py/v1/usage nennt einem Schlüssel (X-API-Key oder Authorization: Bearer rfc_…) oder einer angemeldeten Sitzung den Tarif, das Kontingent, was verbraucht und was übrig ist, wann es zurückgesetzt wird, den Stand der Mehrnutzung und die Aufrufe, die jedem Schlüssel des Kontos zugeordnet sind. Die Abfrage wird nie gezählt.

    Jede gezählte Antwort trägt X-Usage-Allowance, X-Usage-Used (einschließlich dieses Aufrufs) und X-Usage-Reset sowie X-Usage-Overage, wenn Mehrnutzung gezählt wurde. Browser können sie lesen.

  78. Jedes Ergebnis gibt an, wie es berechnet wurde

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • GET /api/py/v1/jobs/{jobId}

    Rechnerergebnisse und jeder Batch-Eintrag tragen ein provenance-Objekt mit neun Feldern: method, version, formulaRef, assumptions, validRange, computedAt, inputs, seed und elapsedSeconds. Jobergebnisse trugen bereits provenance; es erhält formulaRef, assumptions, validRange und computedAt statt eines zweiten Objekts, und seine version wird als worker@<revision> geschrieben statt als bloße Revision.

    Eine Eingabe außerhalb des Bereichs, für den ein Rechner ausgelegt ist, wird trotzdem berechnet: validRange nennt sie, und eine Warnung wird hinzugefügt. Ein vor dieser Änderung gespeichertes Ergebnis behält die Felder, die es hatte; behandeln Sie ein fehlendes als unbekannt.

  79. Programme können über die Gerätefreigabe (Device Authorization Grant) einen Schlüssel erhalten

    • POST /api/py/v1/oauth/device/code
    • POST /api/py/v1/oauth/device/token
    • /device/

    Ein Programm ohne eigenen Browser kann einen Schlüssel erhalten, ohne dass sein Nutzer einen einfügt (OAuth 2.0 Device Authorization Grant, RFC 8628). Es fordert bei /oauth/device/code einen Code an, zeigt seinem Nutzer den Code und die Adresse https://rftools.io/device/ und fragt /oauth/device/token im erhaltenen Intervall ab. Sobald der Nutzer sich angemeldet und den Code freigegeben hat, liefert die nächste Abfrage einen gewöhnlichen API-Schlüssel, ein einziges Mal.

    Der Schlüssel wird gezählt, aufgelistet und kann widerrufen werden wie jeder andere, und er zählt zum Schlüssellimit des Kontos.

  80. Schlüssel-Links für Clients und Bezeichnungen für Schlüssel

    • POST /api/py/v1/apikeys
    • /dashboard/?newKey=1

    POST /api/py/v1/apikeys nimmt einen optionalen Body {"label", "client"} an und gibt beides zurück; ohne Body funktioniert es wie bisher. Ein Client kann seinen Nutzer zu https://rftools.io/dashboard/?newKey=1&client=<clientId> schicken, um einen für ihn bezeichneten Schlüssel zu erstellen, der einmal angezeigt wird.

  81. Ablehnungen nennen das Limit und den Weg darüber hinaus

    • 429 responses
    • 402 from POST /api/py/v1/jobs
    • Authorization: Bearer rfc_…

    Der 429 pro Minute trägt errorKind: "rate_limited", limit, windowSeconds und upgradeUrl neben detail, so wie jede andere Ablehnung ihr errorKind trägt. Der 402 der Job-Route für ein verbrauchtes Kontingent erhält reason, limit, used, upgradeUrl und overageUrl, und der 402 für ein verbrauchtes Kontingent der Lösungsmodi von fdtd_sparam trägt reason: "solve_mode". Bestehende Felder sind unverändert.

    Die Rechner-Routen nehmen einen Schlüssel als Authorization: Bearer rfc_… wie auch als X-API-Key an, wie es die Job-Routen schon taten.

Die vollständige Referenz ist die API-Dokumentation; die maschinenlesbare Beschreibung sind der OpenAPI-Playground und das OpenAPI-Dokument.