Flytskjema – Støvblåsersystem (DustBlower)

Helautomatisk, ingen HMI. Laser auto-kalibrering, asymmetrisk feil-logikk, adaptiv baseline, S4 kollisjon-latch med bjelke-syklus-krav.
① System-oversikt ② Laser-logikk (FB_LaserMonitor) ③ Hovedflyt per bjelke ④ L1-signalkjede ⑤ S4 kollisjonssikring med bjelke-syklus-krav ⑥ Reset-sekvens og auto-arm ⑦ Tre-lags kollisjonsvern ⑧ Hovedtilstandsmaskin (E_BlowerState) ⑨ I/O og signalpolaritet ⑩ Parametere ⑪ Debug-status og diagnostikk ⑫ Simulator (PRG_Simulator) ⑬ Sjekkliste for produksjon
OK / aktiv
Advarsel / venting
Feil / kollisjon
Laser-relatert

① System-oversikt

Systemet styrer en blåsefot (Y1) som blåser sagsponer ut av kappesporet i en limtrebjelke etter sagbladet. Fire brytere (S1–S4) og en laser (L1) inngår i sikkerhetslogikken. Alle brytere er fysisk normalt HØY og LAV når trigget; S1 og S2 inverteres i MAIN for å matche FB_BlowerArm's logiske "AKTIV"-konvensjon.

flowchart LR
    subgraph FELT["Felt / Sensorer"]
        S1[S1 Land
Vippe, normalt HOY] S2[S2 Trommel
Vippe, normalt HOY] S3[S3 Maks bredde
NC, normalt HOY] S4[S4 Kollisjon
Induktiv, normalt HOY] L1[L1 Laser
0-10V] end subgraph MAIN_ROUTE["MAIN"] INVERT["Inverter S1, S2"] SIMSW["Simulator switch
(xUseSimulator)"] end subgraph PLS["FB_BlowerArm"] LASER["FB_LaserMonitor
asymmetrisk + adaptiv"]:::laser GAPTOF["TOF: gap-toleranse
S1 tidlig-cut"]:::laser TRANSIT["TON: transit L1-Y1
(bypass i test)"]:::laser LAG2["Forrigling
S1 AND S2 AND S3"] LAG3["S4 kollisjon-latch
bjelke-syklus"]:::critical AND{"AND
alle betingelser"}:::gate end subgraph UTG["Utganger"] Y1["Y1 Sylinder
Fot UT/IN"]:::output end S1 --> SIMSW S2 --> SIMSW S3 --> SIMSW S4 --> SIMSW L1 --> SIMSW SIMSW --> INVERT INVERT --> LAG2 SIMSW --> LAG2 SIMSW --> LAG3 SIMSW --> LASER LASER --> GAPTOF GAPTOF --> TRANSIT TRANSIT --> AND LAG2 --> AND LAG3 --> AND INVERT --> GAPTOF AND --> Y1 classDef laser fill:#bbd,stroke:#567,color:#000 classDef critical fill:#fcc,stroke:#933,color:#000 classDef gate fill:#ffd,stroke:#aa0,color:#000 classDef output fill:#cfc,stroke:#393,color:#000

② Laser-logikk (FB_LaserMonitor)

Problemstilling: Limtrebjelker har lamell-forskyvning, kan mangle bit foran (trapp), og har naturlig variasjon i tykkelse (skruehull, kvister, limstriper). L1 må automatisk lære baselinen og skille reelle farer (utstikkere) fra ufarlige variasjoner (hull, tynnere seksjoner).

Asymmetrisk feil-logikk under MONITORING:

2.1 Tilstandsmaskin

stateDiagram-v2
    [*] --> IDLE
    IDLE --> LEARNING: Bjelke oppdaget
(dist under terskel) LEARNING --> LEARNING: Nytt minimum
rMinSeen = dist
restart timer LEARNING --> MONITORING: Quiet-timer ferdig
baseline = rMinSeen LEARNING --> ERROR: Timeout
nMaxLearningCycles LEARNING --> IDLE: Bjelken forlot sonen MONITORING --> ERROR: Negativt avvik
eller plutselig naermere MONITORING --> IDLE: Bjelken forlot sonen ERROR --> IDLE: Bjelken forlot sonen note right of LEARNING Sporer minste avstand (rMinSeen) Baseline laases naar ingen nye minima i nQuietCyclesRequired sykluser end note note right of MONITORING Asymmetrisk: - Negativ avvik: ERROR (utstikker) - Positiv avvik: OK (adaptiv baseline) end note

2.2 LEARNING-fase (per syklus)

flowchart TD
    START([Ny syklus i LEARNING]) --> CHK_BEAM{Bjelke fortsatt
i sonen?} CHK_BEAM -- Nei --> IDLE[IDLE] CHK_BEAM -- Ja --> CHK_TIMEOUT{Totaltid over
nMaxLearningCycles?} CHK_TIMEOUT -- Ja --> ERROR[ERROR
timeout]:::error CHK_TIMEOUT -- Nei --> CHK_MIN{dist under rMinSeen
minus hysterese?} CHK_MIN -- Ja
nytt minimum --> UPD_MIN[rMinSeen = dist
nQuietCycles = 0]:::warn UPD_MIN --> END([Neste syklus]) CHK_MIN -- Nei
stabilt --> INC[nQuietCycles++] INC --> CHK_READY{nQuietCycles over
nQuietCyclesRequired?} CHK_READY -- Nei --> END CHK_READY -- Ja --> LOCK[baseline = rMinSeen
MONITORING]:::ok classDef ok fill:#cfc,stroke:#393,color:#000 classDef warn fill:#ffd,stroke:#aa0,color:#000 classDef error fill:#fcc,stroke:#933,color:#000

2.3 MONITORING-fase (asymmetrisk, per syklus)

flowchart TD
    START([Ny syklus i MONITORING]) --> CHK_BEAM{Bjelke fortsatt
i sonen?} CHK_BEAM -- Nei --> IDLE[IDLE] CHK_BEAM -- Ja --> CALC[rDeviation = dist - baseline] CALC --> CHK_NEG{rDeviation under
minus rMaxDeviation?
(utstikker)} CHK_NEG -- Ja --> ERR1[ERROR
negativt avvik]:::error CHK_NEG -- Nei --> CHK_STEP{rStep under
minus rMaxStep?
(plutselig naermere)} CHK_STEP -- Ja --> ERR2[ERROR
plutselig naermere]:::error CHK_STEP -- Nei --> CHK_POS{rDeviation over
rBaselineUpdateHysterese?} CHK_POS -- Nei --> NORMAL[xBeamOK = TRUE
stopp tracking]:::ok CHK_POS -- Ja --> CHK_TRACK{Tracker aktiv?} CHK_TRACK -- Nei --> START_TRACK[Start tracking
kandidat = dist]:::warn CHK_TRACK -- Ja --> CHK_STABLE{dist naer
kandidat?} CHK_STABLE -- Nei --> RESET_TRACK[kandidat = dist
teller = 0]:::warn CHK_STABLE -- Ja --> INC[teller++] INC --> CHK_READY{teller over
nBaselineUpdateCycles?} CHK_READY -- Ja --> UPDATE[baseline = kandidat
adoptert]:::ok CHK_READY -- Nei --> END([Neste syklus]) START_TRACK --> END RESET_TRACK --> END NORMAL --> END UPDATE --> END classDef ok fill:#cfc,stroke:#393,color:#000 classDef warn fill:#ffd,stroke:#aa0,color:#000 classDef error fill:#fcc,stroke:#933,color:#000

2.4 Test-scenarioer

A – Normal bjelke med lamell-forskyvning

Bjelke starter med 600 mm (kun indre lamell), går til 500 mm når ytre lamell kommer inn. Baseline låses på 500.

tL1 [mm]rMinSeennQuietCyclesTilstand
02000––IDLE
t₁6006000LEARNING start
t₁+80ms5005000Nytt min, restart
t₁+380ms50050030Stabilt, teller
t₁+480ms500500 (låst)–MONITORING

B – Utstikker under drift

Baseline låst på 500. Plutselig 492 mm (avvik −8, treffer rMaxDeviation_mm = 8.0).

tL1 [mm]rDeviationTilstandY1
t₀5000MONITORING1
t₁492−8ERROR0
tₑₙₐ2000–IDLE0

C – Bjelke blir tynnere halvveis (adaptiv baseline)

Baseline 500. Bjelke blir tynnere (530 mm) og holder seg der. Ny baseline adopteres etter 2 s stabil.

tL1 [mm]rBaselineTrackerY1
t₀500500–1
t₁530500Start: 0/2001
t₁+1s531500100/2001
t₁+2s530530Adoptert1

D – Skruehull (kort transient)

Spike til 540 mm i 100 ms, tilbake til 500. For kort til å adoptere – baseline uendret.

tL1 [mm]rBaselineTracker
t₀500500–
t₁540500Start: 0/200
t₁+50ms5405005/200
t₁+100ms500500Stopp

③ Hovedflyt per bjelke

flowchart TD
    START([System idle
Y1=0]) --> CHK_ARM{xArmed?} CHK_ARM -- Nei --> WAIT_RESET[Venter paa auto-arm
alle sensorer idle] CHK_ARM -- Ja --> WAIT_BEAM[Venter paa bjelke] WAIT_BEAM --> BEAM_ARR{Bjelke ankommer?
L1 og/eller S2} BEAM_ARR -- Nei --> WAIT_BEAM BEAM_ARR -- Ja --> LEARN[L1 LEARNING
baseline bygges]:::laser LEARN --> LEARN_OK{Baseline laast?} LEARN_OK -- Nei --> LEARN LEARN_OK -- Ja --> MON[L1 MONITORING
xBeamOK TRUE]:::laser MON --> CHK_ALL{Alle betingelser OK?
S1 AND S2 AND S3 AND
xBeamOK_delayed AND
NOT xCollisionLatch
AND Armed} CHK_ALL -- Nei --> WAIT_COND[Venter paa
manglende betingelse] WAIT_COND --> CHK_ALL CHK_ALL -- Ja --> Y1_OUT[Y1 UT
BLAASING]:::ok Y1_OUT --> MONITOR{Alle betingelser
fortsatt OK?} MONITOR -- Ja --> Y1_OUT MONITOR -- Nei --> CHK_REASON{Hvorfor falt?} CHK_REASON -- S4 INAKTIV --> COLL[KOLLISJON
Y1=0
xCollisionLatch=TRUE]:::error CHK_REASON -- L1 ERROR --> LERR[Y1=0
venter paa bjelke
ut av sonen]:::error CHK_REASON -- S1 drop --> DONE[Y1=0
bjelke ferdig
tidlig-cut]:::ok CHK_REASON -- Annet --> Y1_IN[Y1=0
fot trekkes inn]:::warn COLL --> COLL_WAIT{S4 OK +
S1 sett INAKTIV +
S2 sett INAKTIV?} COLL_WAIT -- Nei --> COLL COLL_WAIT -- Ja --> LATCH_CLR[xCollisionLatch = FALSE
latch klarert]:::ok LATCH_CLR --> START LERR --> LERR_WAIT{Bjelke ute
av L1-sone?} LERR_WAIT -- Nei --> LERR LERR_WAIT -- Ja --> START DONE --> START Y1_IN --> MONITOR classDef ok fill:#cfc,stroke:#393,color:#000 classDef warn fill:#ffd,stroke:#aa0,color:#000 classDef error fill:#fcc,stroke:#933,color:#000 classDef laser fill:#bbd,stroke:#567,color:#000

④ L1-signalkjede (gap-toleranse og transit)

L1-signalet går gjennom flere foredlingstrinn før det inngår i Y1-betingelsen:

xBeamOK (fra FB_LaserMonitor, TRUE ved MONITORING)
  ↓
TOF + S1 tidlig-cut:
  xBeamOK_Held = (xBeamOK OR (TOF.Q AND xS1_Land)) AND NOT xLaserError
  ↓
TON transit-forsinkelse (bypass i test):
  xBeamOK_delayed = xBeamOK_Held (bypass) ELLER TON.Q (produksjon)
  ↓
xAllConditionsOK = S1 AND S2 AND S3 AND xBeamOK_delayed AND NOT xCollisionLatch AND Armed
  ↓
Y1_Sylinder

4.1 Gap-toleranse med S1 som tidlig-cut

Når L1 mister bjelken, holdes xBeamOK_Held høy opp til tBeamGapTolerance sekunder, FORUTSATT at S1 bekrefter at bjelken fremdeles er under Y1. S1 er fysisk ved Y1's posisjon, så S1 INAKTIV = bjelke har passert Y1 = umiddelbar cut.

xBeamOKxS1_LandTOF.QxLaserErrorxBeamOK_HeldBetyr
TRUE––FALSETRUENormal drift
FALSETRUETRUEFALSETRUEL1 mistet, S1 bekrefter bjelke ved Y1
FALSEFALSETRUEFALSEFALSES1 drop: tidlig-cut
FALSETRUEFALSEFALSEFALSETimeout (TOF expired)
–––TRUEFALSEL1 ERROR: umiddelbar cut

4.2 Sekvens-diagram: L1 mister bjelke (3 alternativer)

sequenceDiagram
    participant L1 as L1 Laser
    participant S1 as S1 Land
    participant FB as FB_BlowerArm
    participant Y1 as Y1

    Note over L1,Y1: Bjelke under Y1, blåser
    L1->>FB: xBeamOK=TRUE
    Note over S1: S1 AKTIV
    FB->>Y1: Y1 HIGH

    Note over L1: Bjelke forlater L1
    L1->>FB: xBeamOK=FALSE
TOF starter Note over FB: xBeamGapActive=TRUE
Y1 holdes via S1 alt S1 drop innen 2s (bjelke passert Y1) S1->>FB: S1 INAKTIV Note over FB: tidlig-cut via S1 FB->>Y1: Y1 LOW else Ny bjelke innen 2s (seamless) L1->>FB: xBeamOK=TRUE Note over FB: TOF nullstilles
seamless overgang FB->>Y1: Y1 forblir HIGH else 2s utloep, S1 fortsatt AKTIV Note over FB: TOF expired FB->>Y1: Y1 LOW (timeout-cut) end

4.3 Transit-forsinkelse (kun produksjon)

L1 er 60 cm oppstrøms Y1. Seksjonen L1 akkurat godkjente er ikke under Y1 før rL1Y1Distance_mm / rFeedSpeed_mm_s sekunder senere. En TON-timer sikrer at Y1 ikke blåser på ikke-godkjent materiale.

I test-modus (xBypassTransitDelay = TRUE) er denne forsinkelsen omgått for rask verifisering av logikk. Sett FALSE for produksjon.

⑤ S4 kollisjonssikring med bjelke-syklus-krav

Viktig sikkerhetslogikk: Etter en S4-kollisjon holder systemet xCollisionLatch = TRUE som forhindrer Y1 fra å gå ut igjen. Latchen klareres IKKE bare fordi S4 blir AKTIV igjen — systemet krever at begge S1 og S2 har vært INAKTIV etter kollisjonen (dvs. den nåværende bjelken har forlatt sonen og en ny bjelke-syklus har startet).

Logikken fungerer slik:

  1. S4 INAKTIV → xCollisionLatch = TRUE, nullstill S1/S2-sett-flagg
  2. Spor om S1 har vært INAKTIV etter kollisjonen (xS1SeenInactive)
  3. Spor om S2 har vært INAKTIV etter kollisjonen (xS2SeenInactive)
  4. Klarer latchen NÅR: S4 OK OG S1 var inaktiv OG S2 var inaktiv
  5. Resultat: armen går ikke ut igjen før BEGGE brytere har sett bjelken forlate OG en ny bjelke ankommer

5.1 Flytskjema

flowchart TD
    START([S4 INAKTIV
KOLLISJON]) --> LATCH[xCollisionLatch = TRUE
xS1SeenInactive = FALSE
xS2SeenInactive = FALSE
Y1 = 0]:::error LATCH --> S4CHK{S4 AKTIV igjen?} S4CHK -- Nei --> LATCH S4CHK -- Ja --> TRACK[S4 OK
sporer S1/S2]:::warn TRACK --> S1CHK{S1 INAKTIV?} S1CHK -- Ja --> S1OK[xS1SeenInactive = TRUE] S1CHK -- Nei --> S2CHK S1OK --> S2CHK{S2 INAKTIV?} S2CHK -- Ja --> S2OK[xS2SeenInactive = TRUE] S2CHK -- Nei --> BOTHCHK S2OK --> BOTHCHK{Begge sett?
xS1SeenInactive AND
xS2SeenInactive} BOTHCHK -- Nei --> TRACK BOTHCHK -- Ja --> CLEAR[xCollisionLatch = FALSE
latch klarert]:::ok CLEAR --> NEWBEAM([Ny bjelke kan
starte normal syklus]):::ok classDef ok fill:#cfc,stroke:#393,color:#000 classDef warn fill:#ffd,stroke:#aa0,color:#000 classDef error fill:#fcc,stroke:#933,color:#000

5.2 Sekvens-diagram: full gjenopprettingsprosess

sequenceDiagram
    participant S4 as S4 Kollisjon
    participant S1 as S1 Land
    participant S2 as S2 Trommel
    participant FB as FB_BlowerArm
    participant Y1 as Y1

    Note over S4,Y1: Normal drift, Y1 ute
    FB->>Y1: Y1 HIGH

    S4->>FB: S4 INAKTIV (kollisjon!)
    Note over FB: xCollisionLatch = TRUE
xS1SeenInactive = FALSE
xS2SeenInactive = FALSE FB->>Y1: Y1 LOW (umiddelbart) Note over S4: Fjær presser S4 tilbake S4->>FB: S4 AKTIV igjen Note over FB: S4 OK, men latch fortsatt satt
venter paa S1+S2 inaktiv Note over S1,S2: Bjelke forlater sonen S1->>FB: S1 INAKTIV (bjelke borte fra land) Note over FB: xS1SeenInactive = TRUE S2->>FB: S2 INAKTIV (trommel ned) Note over FB: xS2SeenInactive = TRUE Note over FB: Alle krav oppfylt:
S4 OK + S1 sett + S2 sett Note over FB: xCollisionLatch = FALSE Note over S1,S2: Ny bjelke ankommer S2->>FB: S2 AKTIV S1->>FB: S1 AKTIV Note over FB: Normal syklus starter FB->>Y1: Y1 HIGH (naar alle betingelser OK)

⑥ Reset-sekvens og auto-arm

Mellom to bjelker må systemet "armes på nytt" for å unngå at foten aktiveres for raskt ved overgang. Koden bruker auto-arm når alle sensorer er idle (robust for manuell testing og reelle scenarios) + en reset-sekvens-sporing (S2↓ → S1↓ innen 2 s) for diagnose.

flowchart TD
    IDLE([xArmed = FALSE]) --> CHK{Alle sensorer idle?
S1=FALSE AND
S2=FALSE AND
xS2_Delayed=FALSE} CHK -- Ja --> ARM[xArmed = TRUE]:::ok CHK -- Nei --> IDLE ARM --> RUN[Kjører normalt] RUN --> DROP{S2 faller} DROP --> WIN[xS2FellFirst = TRUE
Start 2s vindu]:::warn WIN --> S1FALL{S1 faller
innen 2s?} S1FALL -- Ja --> RE_ARM[Reset OK
xArmed forblir TRUE]:::ok S1FALL -- Nei
2s ut --> ABORT[Reset abortert
xArmed forblir TRUE
pga auto-arm] classDef ok fill:#cfc,stroke:#393,color:#000 classDef warn fill:#ffd,stroke:#aa0,color:#000

⑦ Tre-lags kollisjonsvern

flowchart TD
    START([Fot staar eller skal UT]) --> LAG1{"Lag 1
FB_LaserMonitor
xBeamOK_delayed = TRUE?"}:::laser LAG1 -- Nei --> STOP_L1[Fot inn]:::warn1 LAG1 -- Ja --> LAG2{"Lag 2
S1 AND S2 AND S3"} LAG2 -- Nei --> STOP_L2[Fot inn]:::warn LAG2 -- Ja --> LAG3{"Lag 3
S4 AKTIV?
(med bjelke-syklus latch)"}:::critical LAG3 -- Nei --> STOP_L3[KOLLISJON
Y1=0
xCollisionLatch=TRUE
krever bjelke-syklus]:::error LAG3 -- Ja --> OK[Fot UT]:::ok STOP_L1 --> RETRY1{Gjenoppretting?} STOP_L2 --> RETRY2{Gjenoppretting?} STOP_L3 --> AUTO{S4 OK +
S1 sett inaktiv +
S2 sett inaktiv?} RETRY1 -- Ja --> START RETRY2 -- Ja --> START AUTO -- Ja --> START AUTO -- Nei --> STOP_L3 classDef ok fill:#cfc,stroke:#393,color:#000 classDef warn1 fill:#ffd,stroke:#aa0,color:#000 classDef warn fill:#fc9,stroke:#c60,color:#000 classDef error fill:#fcc,stroke:#933,color:#000 classDef laser fill:#bbd,stroke:#567,color:#000 classDef critical fill:#fcc,stroke:#933,color:#000

⑧ Hovedtilstandsmaskin (E_BlowerState)

stateDiagram-v2
    [*] --> IDLE
    IDLE --> ARMED: Alle sensorer idle (auto-arm)
    ARMED --> BEAM_PRESENT: S1 eller S2 AKTIV
    BEAM_PRESENT --> BLOWING: Alle betingelser OK
    BEAM_PRESENT --> ARMED: Bjelke forsvinner
    BLOWING --> CONDITIONS_LOST: En betingelse feiler
    BLOWING --> COLLISION: S4 INAKTIV
    CONDITIONS_LOST --> BLOWING: Betingelser gjenopprettet
    CONDITIONS_LOST --> IDLE: Bjelke borte
    BLOWING --> IDLE: Bjelke ferdig
    COLLISION --> IDLE: Bjelke-syklus fullfort
(S4 OK + S1 sett + S2 sett) note right of COLLISION Krever bjelke-syklus for aa klarere: S4 AKTIV + S1 var INAKTIV + S2 var INAKTIV (IKKE bare S4 aktiv) end note

⑨ I/O og signalpolaritet

Alle digitale brytere er fysisk normalt HØY og LAV når trigget. S1 og S2 inverteres i MAIN for å matche FB_BlowerArm's "logiske AKTIV"-konvensjon. S3 (NC) og S4 er allerede i riktig polaritet siden deres normaltilstand = AKTIV.
SignalTypeRått signalLogisk i FBInvertert?
S1DIHØY = ingen bjelke / LAV = bjelke på landxS1_Land TRUE = bjelkeJa
S2DIHØY = trommel nede / LAV = trommel oppexS2_Trommel TRUE = oppeJa
S3DI (NC)HØY = innenfor bredde / LAV = for bredxS3_MaksBredde TRUE = OKNei
S4DIHØY = ser metall / LAV = kollisjonxS4_Kollisjon TRUE = normalNei
L1AI0-10V / 50-2000 mm (Sick DT35)–
Y1DOPneumatisk sylinder (5/2-vei)–
Merk: Q1 (fremdriftstillatelse) er fjernet fra systemet. Det finnes kun én utgang: Y1 Sylinder.

Betingelsesmatrise

HendelseS1S2S3L1S4LatchY1
Foten inne, hvile–––––FALSEAv
Foten ute, alle OKAKTIVAKTIVAKTIVMONITORINGAKTIVFALSEPå
Venter på baselineAKTIVAKTIVAKTIVLEARNINGAKTIVFALSEAv
L1 ERROR (utstikker)–––ERROR––Av
L1 mistet, S1 AKTIV (gap-tol)AKTIV––IDLEAKTIVFALSEPå
L1 mistet, S1 INAKTIV (tidlig-cut)INAKTIV––IDLE––Av
S2 mister bjelke–INAKTIV¹––––Av
Bjelken for bred––INAKTIV–––Av
KOLLISJON––––INAKTIVTRUEAv
Etter kollisjon, S4 OK men latch––––AKTIVTRUEAv

¹ S2 passerer gjennom 300 ms off-delay før det påvirker Y1.

⑩ Parametere

Gjeldende verdier (bruker-modifisert). Produksjonsverdi for rMaxDeviation_mm er 8.0 mm — 10 mm utstikker skader armen.
ParameterVerdiFormål
MONITORING (asymmetrisk)
rMaxDeviation_mm8.0Maks NEGATIV avvik (10 mm skader armen)
rMaxStep_mm6.0Maks NEGATIVT step per syklus
LEARNING
rMinDropThreshold_mm5.0Hysterese for "nytt minimum"
nQuietCyclesRequired30Sykluser stabile for baseline-lås
nMaxLearningCycles1000 (10 s)Timeout for LEARNING
Adaptiv baseline (upward tracking)
nBaselineUpdateCycles200 (2 s)Sykluser stabil over baseline
rBaselineUpdateHysterese5.0 mmToleranse for "samme nivå"
L1 → Y1 transit-forsinkelse
rL1Y1Distance_mm600.0 mmFysisk avstand L1 → Y1
rFeedSpeed_mm_s100.0 mm/sMatehastighet (må tunes for produksjon)
xBypassTransitDelayTRUE (test)Hopper over transit (sett FALSE for prod)
Gap-toleranse
tBeamGapToleranceT#2SHvor lenge Y1 holdes etter L1-loss
Reset og systemkontroll
tResetWindowT#2SVindu S2↓ → S1↓
tS2OffDelayT#300MSS2 off-delay
xLaserEnableTRUEAktiver L1
xUseSimulatorFALSEBruk PRG_Simulator i stedet for ekte I/O
DT35 sensor-midling: Midling/filtrering gjøres på selve DT35-sensoren via IO-Link, IKKE i PLC-koden. Konfigureres via IO-Link: Index 103 = Expert mode, Index 67 = filter depth.

⑪ Debug-status og diagnostikk

Systemet har ingen HMI. To menneske-lesbare strenger oppdateres hver PLS-syklus og kan leses i TwinCAT online-view:

11.1 fbBlowerArm.sStatus – hovedstatus

Prioritet: S4 kollisjon > kollisjon-latch > L1 feil > L1 læring > normaldrift.

MeldingBetyr
KOLLISJON! S4 inaktiv - fot inneS4 utløst, Y1 av
KOLLISJON-LATCH: S4 OK, venter paa S1 inaktivS4 tilbake, S1 ikke sett inaktiv ennå
KOLLISJON-LATCH: S4 OK, venter paa S2 inaktivS4 tilbake, S2 ikke sett inaktiv ennå
KOLLISJON-LATCH: S4 OK, venter paa S1+S2 inaktivS4 tilbake, begge mangler
KOLLISJON-LATCH: alle krav oppfylt, klarerer latchBjelke-syklus fullført, latch klareres
L1 FEIL - avvik fra baseline, fot inneL1 flagget utstikker
L1 LEARNING - sporer min-avstand, venter paa stabil baselineBaseline bygges
BLAASER - fot ute, alle betingelser OKNormal drift
BLAASER - L1 mistet bjelke, men S1 bekrefter bjelke ved Y1 (gap-tol)Gap-modus aktiv
STOPP - S3 trigget (bjelke for bred)S3 har løst ut
Venter paa S2 off-delay (bjelke ankommer)S2 AKTIV, off-delay holder
Venter paa S2 (trommel ikke oppe enna)Venter trommel
Venter paa S1 (bjelke har ikke naadd landsiden)S2 OK, venter S1
Venter paa at L1 blir klarL1 ikke i MONITORING
L1 OK - venter paa L1->Y1 transit-tidKun uten bypass
Reset-sekvens: S2 falt - venter paa S1 (innen 2s)Reset-vindu aktivt
Ikke armet - venter paa reset-sekvens (S2 -> S1)xArmed FALSE (sjelden)
ARMED - klar for neste bjelkeAlle idle, klar
IDLEStartup

11.2 fbBlowerArm.sLaserStatus – L1-status

MeldingnErrorCauseTuning-hint
L1 IDLE - venter paa bjelke0–
L1 LEARNING - sporer minimum, venter paa stabil avstand0Juster rMinDropThreshold_mm
L1 MONITORING - baseline laast, overvaaker negativt avvik0Normal drift
L1 MONITORING - avstand okt, tracker ny baseline (2s stabil)0Adaptiv baseline aktiv
L1 ERROR - negativt avvik (naermere sensor = utstikker)1Øk rMaxDeviation_mm hvis falske alarm
L1 ERROR - plutselig naermere (brå endring ned)2Øk rMaxStep_mm / DT35-filter
L1 ERROR - timeout under LEARNING3Øk nMaxLearningCycles

11.3 Diagnostiske outputs i online-view

VariabelBetyr
fbBlowerArm.fbLaser.rBaseline_mmLåst baseline
fbBlowerArm.fbLaser.rDeviation_mmAktuelt avvik
fbBlowerArm.fbLaser.rStep_out_mmEndring per syklus
fbBlowerArm.fbLaser.rMinSeen_mmMinste under LEARNING
fbBlowerArm.fbLaser.nQuietCyclesTeller i LEARNING
fbBlowerArm.fbLaser.rNewBaselineCandidateForeslått ny baseline
fbBlowerArm.fbLaser.nUpwardStableCyclesSykluser stabil over baseline
fbBlowerArm.xBeamOK_delayedL1 OK + transit-tid
fbBlowerArm.xBeamGapActiveGap-toleranse aktiv
fbBlowerArm.xCollisionLatchKollisjon-latch satt (krever bjelke-syklus)
fbBlowerArm.xS1SeenInactiveS1 sett inaktiv etter kollisjon
fbBlowerArm.xS2SeenInactiveS2 sett inaktiv etter kollisjon
fbBlowerArm.xArmedReset-sekvens fullført
fbBlowerArm.xResetWindowActiveReset-vindu aktivt

⑫ Simulator (PRG_Simulator)

Testing uten hardware. Produserer rå sensor-signaler i MAIN.xUseSimulator = TRUE.

12.1 Bjelkesekvens (state 0 → 7)

stateDiagram-v2
    [*] --> S0
    S0: 0 IDLE
L1=2000 mm S1: 1 L1 LAMELL
L1=600 mm S2: 2 L1 FULL
L1=500 mm S3: 3 S2 AKTIV
trommel opp S4: 4 FULLT INN
S1+S2 LAV
BLAASING S5: 5 L1 RELEASE
L1=2000 mm S6: 6 S2 RELEASE
S2 HOY S7: 7 S1 RELEASE
alle normale S0 --> S1: xStartBeam S1 --> S2: tLamellTransition S2 --> S3: tL1Stable S3 --> S4: tS2ToS1 S4 --> S5: tBlowingDuration S5 --> S6: tL1Release S6 --> S7: tS2Release S7 --> S0: xAutoRepeat=FALSE S7 --> S1: xAutoRepeat=TRUE

12.2 Feil-injeksjon

VariabelEffektForventet resultat
xInjectProtrusionL1 = 450 mm i state 4L1 ERROR (utstikker), fot inn
xInjectHoleL1 = 550 mm i state 4OK, baseline oppdateres etter 2 s
xInjectCollisionS4 = LAVKOLLISJON: Y1 av, latch satt, krever bjelke-syklus
xInject_S3_TooWideS3 = LAVFot inn (for bred bjelke)

12.3 Bruk

  1. I TwinCAT XAE: login (F4)
  2. Sett MAIN.xUseSimulator := TRUE
  3. Sett PRG_Simulator.xEnabled := TRUE
  4. Sett PRG_Simulator.xStartBeam := TRUE for én bjelkesyklus
  5. Watch fbBlowerArm.sStatus og fbBlowerArm.sLaserStatus
  6. Eksperimenter med xInjectProtrusion, xInjectCollision, etc

⑬ Sjekkliste for produksjon

Gå gjennom denne listen før systemet tas i drift:
SjekkHvordan
☐ Deaktiver simulatorMAIN.xUseSimulator := FALSE
☐ Deaktiver transit-bypassxBypassTransitDelay := FALSE
☐ Tun matehastighetrFeedSpeed_mm_s = faktisk målt hastighet
☐ Tun L1-toleranserrMaxDeviation_mm (nå 8.0), rMaxStep_mm (nå 6.0), rMinDropThreshold_mm — basert på observert normal variasjon + margin. 10 mm utstikker skader armen.
☐ Verifiser L1-kalibreringSjekk at rDistance_mm matcher faktisk målt avstand
☐ Verifiser S1/S2-inverteringSammenlign MAIN.xRaw_S1 vs fbBlowerArm.xS1_Land i online-view
☐ Verifiser S4-fjærmekanismeTest at fjæren presser stangen tilbake til normal etter kollisjon
☐ Verifiser S4 latch-gjenopprettingTrigg S4, verifiser at Y1 forblir av til S1 og S2 begge har vært INAKTIV. Sjekk xCollisionLatch, xS1SeenInactive, xS2SeenInactive
☐ Test én bjelkeObserver hele sekvensen via sStatus, verifiser at Y1 går ut i rett tid og tilbake når bjelke passerer
☐ Test gap mellom bjelkerVerifiser at Y1 holdes ved nær bjelke-overgang (xBeamGapActive)
☐ Test utstikker-deteksjonSimulér utstikker fysisk, verifiser at Y1 trekkes inn før kollisjon
☐ Test kollisjon (kontrollert)Trigg S4 manuelt, verifiser at Y1 slukkes umiddelbart
☐ Konfigurer DT35 via IO-LinkIndex 103 = Expert mode, Index 67 = filter depth. Midling gjøres på sensoren, ikke i PLC