Gå till innehållet

08 — Stegmotor för flödesbromsen (CL57RS)

Stegmotorn -MA1 vrider flödesbromsens snedsätesventil -QN7 genom en vinkelväxel. Drivaren -TB1 sitter på Modbus-kedjan som slav 2 — inkoppling, DIP-lägen och terminering står i 05-modbus.md. HMI-sidan (MQTT-topics, handratt, gränssnitt) beskrivs i projektdokumentet claude/hmi-brake-stegmotor.md.

Allt i avsnitten om enheter och homing är uppmätt eller provat på bänken 2026-09-29.

Status 2026-09-30. Flip-PLC på grenen claude/homing-params-persist (byggd på claude/nonblocking-modbus-homing, commit 06fbf69) har homingen inbyggd och styr bromsen i varv från homingläget, öppet = positivt — se PLC-grenen. Den grenen är inte provkörd på Opta och inte sammanslagen med main. Flip-HMI använder fortfarande de gamla topics (cmd/zero, cmd/position_steps) som inte finns i grenen. Avsnitten "Vad som inte stämmer i dag" och "Så går den till" nedan beskriver läget före grenen (testprogrammet och main).

PLC-grenen: varv, homing och parametrar (2026-09-30)

Källa: Flip-PLC include/stepper_control.h, src/stepper_control.cpp, src/persist.cpp och README 2026-09-30. Ej verifierat på hårdvaran.

  • Position i varv på ventilaxeln från homingläget, öppet = positivt (0 = stängt/homingläge). 200 000 kommandosteg = 80 000 encoderpulser = 1 varv.
  • Efter PLC-omstart är bromsen EJ HOMAD och vägrar positionskommandon tills cmd/home körts. Homingen startar aldrig av sig själv. Nollan sätts bara av homingen; cmd/zero och cmd/position_steps är borttagna.
  • Gräns: position_turns klipps till 0 … max_turns (default 5 varv).
  • Kommandon: flipbench/plc/brake/cmd/home, cmd/stop, cmd/position_turns, cmd/reset_alarm, max_turns/set, homing/<namn>/set.
  • Status: status/position_turns (bara när homad), status/homing_state (NOT_HOMED/HOMING/HOMED/FAILED), status/direction (OPENING/CLOSING/STOPPED), status/overload, comm, moving, alarm_code, torque_percent; retained eko max_turns och homing/<namn>.
  • Rörelsespärr: nya mål vägras om senast uppmätta kraft under rörelse ≥ 100 %. Nollställs av lyckad/avbruten homing och av cmd/reset_alarm.

Homing-parametrar över MQTT

Alla 15 parametrar läses från retained eko flipbench/plc/brake/homing/<namn> och ändras med …/<namn>/set (inte retained). Ogiltigt avvisas och gällande värde ekas; utanför min/max klipps. Homingen arbetar mot en ögonblicksbild tagen vid cmd/home. Defaultvärdena är identiska med de tidigare fasta värdena.

<namn> Default Min – max Betydelse
direction 1 −1 eller 1 +1 = sök mot stängt
seek_rpm 20 1 – 100 motor-rpm
backoff_rpm 100 1 – 300 motor-rpm vid backning
acc_ms 300 10 – 3000 ms per 1000 rpm
load_threshold_percent 60,0 5 – 100 % load för anslag
hits 2 1 – 20 mätningar i rad
blank_ms 600 0 – 10 000 ignorera efter sökstart
backoff_steps 10 000 100 – 200 000 kommandosteg
travel_steps 2 000 000 20 000 – 4 000 000 kommandosteg (10 varv)
sample_interval_ms 100 50 – 1000 tid mellan prov
seek_timeout_ms 900 000 10 000 – 1 800 000 max söktid
settle_stop_ms 200 0 – 5000 efter anslag, före backning
settle_timeout_ms 3000 500 – 30 000 backa senast efter
backoff_settle_ms 300 0 – 5000 efter backning, före "klar"
backoff_timeout_ms 30 000 1000 – 120 000 backningen klar inom

Min/max är rimlighetsspärrar valda i koden, inte uppmätta gränser för drivare eller ventil.

Beständig lagring (flash)

Modul persist.h/.cpp (mbed KVStore). Sparas vid ändring och läses in vid uppstart: de 15 homing-parametrarna, max_turns samt tankarnas börvärde och hysteres. heater_enabled sparas medvetet inte — elpatronerna startar alltid AV efter omstart. Skrivning fördröjd 3 s och sammanslagen, högst en per loop-varv, ny försök efter 30 s; lagringen är aldrig kritisk (default vid fel). Persist::begin() körs före watchdogen eftersom första start formaterar flash. Kontrollpunkter vid första start finns i Flip-PLC README 2026-09-30. Antaganden att verifiera: sketchen under 768 kB, KVStore-ytan oanvänd av annat, och att en flash-radering inte överskrider watchdogens 4 s.

Komponenter

Beteckning Del Typ Data
-TB1 Drivare StepperOnline CL57RS 48 VDC, Modbus RTU slav 2, 9600 8E1
-MA1 Motor StepperOnline 17E1K-07 NEMA 17 closed loop, 1,8° = 200 helsteg/varv, 72 Ncm, 2,0 A
-MA1 Encoder inbyggd i motorn Optisk inkrementell, differentiell, 2 kanaler, 5 V, 1000 PPR = 4000 CPR
-MA1 Växel StepperOnline RYG17-G20 Vinkelväxel 20:1, glapp 20 bågminuter

Motorns fasanslutning: stift 1 A+, 2 A−, 3 B+, 4 B−. Motor och encoder ansluts till -TB1 med kabel -WD20.

Upplösning, enheter och riktning (verifierat 2026-09-29)

Uppmätt på bänken 2026-09-29 med testprogrammet stepper-homing-test (CL57RS ensam på bussen, styrt från seriella monitorn).

Drivarens upplösning

Parameter Register Värde Källa
Pulser per motorvarv Pr0.00, Modbus 0x0001 10 000 P/R (fabriksvärde, intervall 200–51 200) CLRS-manualen + mätning nedan
Mikrosteg – 50 per helsteg (10 000 / 200) Beräknat

Mikrostegningen sätts inte med DIP — CL57RS:s SW1–SW8 används för adress, baud och terminering. Den ändras bara via Pr0.00 (Modbus eller tuningprogrammet). Ändras Pr0.00 ändras alla omräkningar nedan.

Två olika enheter — blanda dem inte

Vad Enhet Per motorvarv Per ventilvarv (20:1)
Kommandosteg — PR0-mål, jog, cmd/position_steps Pr0.00-pulser 10 000 200 000
Återläsning 0x1014/0x1015 (feedback position) Encoderpulser (CPR) 4 000 80 000

Kvot: kommandosteg = 2,5 × encoderpulser, alltså pos = 2,5 × rått och rått = pos / 2,5.

Verifierat på två sätt: * jog -1000 (relativ PR0-rörelse) ändrade återläsningen med −400. * jog -200000 vred ventilaxeln exakt ett varv, mot öppet.

4 000 helsteg per ventilvarv i avsnittet ovan är fortfarande rätt — det är helsteg före mikrostegning. I kommandosteg är samma varv 200 000.

Absoluta PR-mål och återläsningen delar inte nollpunkt

Drivarens absoluta PR0-mål (Pr9.00 = 0x0001) och återläsningen 0x1014 har varken samma enhet eller samma nollpunkt. Ett absolut mål som räknats fram ur återläsningen ("kör till där axeln står", "backa N från här") hamnar därför fel — i fält både för kort och åt fel håll, med en brytpunkt som ändrade sig mellan körningar.

Det som fungerar är relativa rörelser: Pr9.00 = 0x0041 (TYPE=1 positionering + bit6=1 relativ). Provat i fält 2026-09-29 för sökning, backning och jog. Det som ska visas räknas om från återläsningen med kvoten 2,5 och en egen nollpunkt.

Riktning

  • Positiva steg stänger, negativa öppnar. Bekräftat i fält; stämmer med Flip-PLC (stepper_control.cpp) och kBrakeClosingIsPositive = true i Flip-HMI (se claude/hmi-broms-riktning-overlast.md, där konventionen tidigare stod som antagande).
  • Homing görs mot stängd ventil (+). Lägen för öppen broms blir därmed negativa räknat från homingnollan.

Vad som inte stämmer i dag (Flip-PLC main, före grenen)

  • Flip-PLC main skickar HMI:ts steg rakt till PR0 (kommandosteg) men publicerar återläsningen 0x1014 oskalad (encoderpulser). HMI:t visar därför 0,4 × det beordrade läget. Nollpunkten s_zeroOffsetSteps är ett encodervärde som läggs direkt på ett absolut PR0-mål — samma blandning som ovan, och troligen en del av förklaringen till att nollningen verkade "glömmas". Inte åtgärdat.
  • kBrakeStepsMin/Max = ±50 000 i Flip-HMI/include/net_config.h är i kommandosteg bara ¼ varv på ventilaxeln. Gränsen behöver sättas efter ventilens verkliga slag (antal varv stängt → öppet, inte uppmätt ännu).

Homing mot stängt — sensorlöst (testprogram 2026-09-29)

CL57RS har ingen inbyggd sensorlös homing. Pr8.10 (0x600A) erbjuder bara gränslägesbrytare, nollägesbrytare och Z-signal. Homingen görs därför i programmet, mot stängd ventil, genom att känna när motorn tar i.

Så går den till

  1. Sök — relativ PR0-rörelse (Pr9.00 = 0x0041) i +-riktning (mot stängt), längst travel kommandosteg, med seekrpm.
  2. Känn anslaget — följefelet 0x1010/0x1011 läses ungefär var 100 ms och räknas till load-% = |följefel| / Pr0.05 (samma mått som HMI:ts Load). De första blank ms ignoreras, eftersom accelerationen också ger utslag.
  3. Stopp — när load ≥ thr i hits mätningar i rad: snabbstopp (Pr8.02 = 0x0040).
  4. Backa — relativ rörelse backoff kommandosteg mot öppet (−), med moverpm. Det släpper uppspänningen i växel och ventil efter anslaget.
  5. Nolla — där axeln står efter backningen blir pos 0. Nollpunkten hålls i programmet som ett sparat råvärde från 0x1014, inte med drivarens eget 0x0021 (som inte nollställer pålitligt).

Därefter är alla lägen negativa mot öppet och positiva mot stängt, räknat i kommandosteg (pos = 2,5 × (rått − nollpunkt)).

Värden i bruk (Daniel, 2026-09-29)

Inställning Värde Betyder
dir + Sök mot stängt
seekrpm 20 20 motorvarv/min = 1 varv/min på ventilaxeln
moverpm 100 Fart vid backning (och jog/go)
acc 300 ms per 1000 rpm, acc och dec
thr 60 % Load-tröskel för anslag
hits 2 Mätningar i rad över tröskeln
blank 600 ms Ingen detektering direkt efter start
backoff 10 000 Kommandosteg = 1 motorvarv = 1/20 ventilvarv (18°)
travel 2 000 000 Kommandosteg = 10 ventilvarv, längsta sökväg
Pr0.05 4000 Läst ur drivaren, nämnare i load-%

Erfarenheter från fält

  • Load stiger gradvis medan axeln går i full fart — sätet tar emot mer och mer. Det blir ingen tvärstopp, så tröskeln avgör hur hårt ventilen dras mot sätet innan stopp. Tidigare prov med 70 % fungerade också.
  • Kort backning (några hundra steg) lämnar kvar last i vila — växel och ventil är fortfarande uppspända.
  • Följefelet står på ett fast värde även i vila (t.ex. −52 428 ≈ 13 % load, oförändrat före och efter en jog). Jämför load mot vilovärdet, inte mot noll.
  • Absoluta PR0-mål får inte räknas fram ur återläsningen — se avsnittet om enheter. Tidiga versioner gjorde det och backade då åt fel håll vid kort backoff.

Testprogrammet (stepper-homing-test) är ett fristående PlatformIO-projekt för Opta och ligger inte i något repo. Homingen finns i Flip-PLC bara på grenen claude/nonblocking-modbus-homing och claude/homing-params-persist (se PLC-grenen ovan), inte på main. Värdena i tabellen ovan är där defaultvärden för parametrarna.

Larmåterställning

Larmkoden som synts orsakades av mekanisk överlast; drivaren fastnar i felläge tills larmet återställs. Flip-PLC skriver 0x1111 på cmd/reset_alarm till Pr8.02 (0x6002), overifierat. CLRS-manualen anger i stället kontrollordet 0x1801; testprogrammet har båda (reset = 0x1801, reset2 = 0x6002). Den som faktiskt tar bort larmet avgör.