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
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).
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
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
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
Bjelke starter med 600 mm (kun indre lamell), går til 500 mm når ytre lamell kommer inn. Baseline låses på 500.
| t | L1 [mm] | rMinSeen | nQuietCycles | Tilstand |
|---|---|---|---|---|
| 0 | 2000 | – | – | IDLE |
| t₁ | 600 | 600 | 0 | LEARNING start |
| t₁+80ms | 500 | 500 | 0 | Nytt min, restart |
| t₁+380ms | 500 | 500 | 30 | Stabilt, teller |
| t₁+480ms | 500 | 500 (låst) | – | MONITORING |
Baseline låst på 500. Plutselig 492 mm (avvik −8, treffer rMaxDeviation_mm = 8.0).
| t | L1 [mm] | rDeviation | Tilstand | Y1 |
|---|---|---|---|---|
| t₀ | 500 | 0 | MONITORING | 1 |
| t₁ | 492 | −8 | ERROR | 0 |
| tₑₙₐ | 2000 | – | IDLE | 0 |
Baseline 500. Bjelke blir tynnere (530 mm) og holder seg der. Ny baseline adopteres etter 2 s stabil.
| t | L1 [mm] | rBaseline | Tracker | Y1 |
|---|---|---|---|---|
| t₀ | 500 | 500 | – | 1 |
| t₁ | 530 | 500 | Start: 0/200 | 1 |
| t₁+1s | 531 | 500 | 100/200 | 1 |
| t₁+2s | 530 | 530 | Adoptert | 1 |
Spike til 540 mm i 100 ms, tilbake til 500. For kort til å adoptere – baseline uendret.
| t | L1 [mm] | rBaseline | Tracker |
|---|---|---|---|
| t₀ | 500 | 500 | – |
| t₁ | 540 | 500 | Start: 0/200 |
| t₁+50ms | 540 | 500 | 5/200 |
| t₁+100ms | 500 | 500 | Stopp |
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-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
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.
| xBeamOK | xS1_Land | TOF.Q | xLaserError | xBeamOK_Held | Betyr |
|---|---|---|---|---|---|
| TRUE | – | – | FALSE | TRUE | Normal drift |
| FALSE | TRUE | TRUE | FALSE | TRUE | L1 mistet, S1 bekrefter bjelke ved Y1 |
| FALSE | FALSE | TRUE | FALSE | FALSE | S1 drop: tidlig-cut |
| FALSE | TRUE | FALSE | FALSE | FALSE | Timeout (TOF expired) |
| – | – | – | TRUE | FALSE | L1 ERROR: umiddelbar cut |
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
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.
xBypassTransitDelay = TRUE) er denne forsinkelsen omgått
for rask verifisering av logikk. Sett FALSE for produksjon.
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:
xCollisionLatch = TRUE, nullstill S1/S2-sett-flaggxS1SeenInactive)xS2SeenInactive)
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
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)
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
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
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
| Signal | Type | Rått signal | Logisk i FB | Invertert? |
|---|---|---|---|---|
| S1 | DI | HØY = ingen bjelke / LAV = bjelke på land | xS1_Land TRUE = bjelke | Ja |
| S2 | DI | HØY = trommel nede / LAV = trommel oppe | xS2_Trommel TRUE = oppe | Ja |
| S3 | DI (NC) | HØY = innenfor bredde / LAV = for bred | xS3_MaksBredde TRUE = OK | Nei |
| S4 | DI | HØY = ser metall / LAV = kollisjon | xS4_Kollisjon TRUE = normal | Nei |
| L1 | AI | 0-10V / 50-2000 mm (Sick DT35) | – | |
| Y1 | DO | Pneumatisk sylinder (5/2-vei) | – | |
| Hendelse | S1 | S2 | S3 | L1 | S4 | Latch | Y1 |
|---|---|---|---|---|---|---|---|
| Foten inne, hvile | – | – | – | – | – | FALSE | Av |
| Foten ute, alle OK | AKTIV | AKTIV | AKTIV | MONITORING | AKTIV | FALSE | På |
| Venter på baseline | AKTIV | AKTIV | AKTIV | LEARNING | AKTIV | FALSE | Av |
| L1 ERROR (utstikker) | – | – | – | ERROR | – | – | Av |
| L1 mistet, S1 AKTIV (gap-tol) | AKTIV | – | – | IDLE | AKTIV | FALSE | På |
| L1 mistet, S1 INAKTIV (tidlig-cut) | INAKTIV | – | – | IDLE | – | – | Av |
| S2 mister bjelke | – | INAKTIV¹ | – | – | – | – | Av |
| Bjelken for bred | – | – | INAKTIV | – | – | – | Av |
| KOLLISJON | – | – | – | – | INAKTIV | TRUE | Av |
| Etter kollisjon, S4 OK men latch | – | – | – | – | AKTIV | TRUE | Av |
¹ S2 passerer gjennom 300 ms off-delay før det påvirker Y1.
rMaxDeviation_mm er 8.0 mm
— 10 mm utstikker skader armen.
| Parameter | Verdi | Formål |
|---|---|---|
| MONITORING (asymmetrisk) | ||
rMaxDeviation_mm | 8.0 | Maks NEGATIV avvik (10 mm skader armen) |
rMaxStep_mm | 6.0 | Maks NEGATIVT step per syklus |
| LEARNING | ||
rMinDropThreshold_mm | 5.0 | Hysterese for "nytt minimum" |
nQuietCyclesRequired | 30 | Sykluser stabile for baseline-lås |
nMaxLearningCycles | 1000 (10 s) | Timeout for LEARNING |
| Adaptiv baseline (upward tracking) | ||
nBaselineUpdateCycles | 200 (2 s) | Sykluser stabil over baseline |
rBaselineUpdateHysterese | 5.0 mm | Toleranse for "samme nivå" |
| L1 → Y1 transit-forsinkelse | ||
rL1Y1Distance_mm | 600.0 mm | Fysisk avstand L1 → Y1 |
rFeedSpeed_mm_s | 100.0 mm/s | Matehastighet (må tunes for produksjon) |
xBypassTransitDelay | TRUE (test) | Hopper over transit (sett FALSE for prod) |
| Gap-toleranse | ||
tBeamGapTolerance | T#2S | Hvor lenge Y1 holdes etter L1-loss |
| Reset og systemkontroll | ||
tResetWindow | T#2S | Vindu S2↓ → S1↓ |
tS2OffDelay | T#300MS | S2 off-delay |
xLaserEnable | TRUE | Aktiver L1 |
xUseSimulator | FALSE | Bruk PRG_Simulator i stedet for ekte I/O |
Systemet har ingen HMI. To menneske-lesbare strenger oppdateres hver PLS-syklus og kan leses i TwinCAT online-view:
fbBlowerArm.sStatus – hovedstatusPrioritet: S4 kollisjon > kollisjon-latch > L1 feil > L1 læring > normaldrift.
| Melding | Betyr |
|---|---|
KOLLISJON! S4 inaktiv - fot inne | S4 utløst, Y1 av |
KOLLISJON-LATCH: S4 OK, venter paa S1 inaktiv | S4 tilbake, S1 ikke sett inaktiv ennå |
KOLLISJON-LATCH: S4 OK, venter paa S2 inaktiv | S4 tilbake, S2 ikke sett inaktiv ennå |
KOLLISJON-LATCH: S4 OK, venter paa S1+S2 inaktiv | S4 tilbake, begge mangler |
KOLLISJON-LATCH: alle krav oppfylt, klarerer latch | Bjelke-syklus fullført, latch klareres |
L1 FEIL - avvik fra baseline, fot inne | L1 flagget utstikker |
L1 LEARNING - sporer min-avstand, venter paa stabil baseline | Baseline bygges |
BLAASER - fot ute, alle betingelser OK | Normal 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 klar | L1 ikke i MONITORING |
L1 OK - venter paa L1->Y1 transit-tid | Kun 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 bjelke | Alle idle, klar |
IDLE | Startup |
fbBlowerArm.sLaserStatus – L1-status| Melding | nErrorCause | Tuning-hint |
|---|---|---|
L1 IDLE - venter paa bjelke | 0 | – |
L1 LEARNING - sporer minimum, venter paa stabil avstand | 0 | Juster rMinDropThreshold_mm |
L1 MONITORING - baseline laast, overvaaker negativt avvik | 0 | Normal drift |
L1 MONITORING - avstand okt, tracker ny baseline (2s stabil) | 0 | Adaptiv 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 LEARNING | 3 | Øk nMaxLearningCycles |
| Variabel | Betyr |
|---|---|
fbBlowerArm.fbLaser.rBaseline_mm | Låst baseline |
fbBlowerArm.fbLaser.rDeviation_mm | Aktuelt avvik |
fbBlowerArm.fbLaser.rStep_out_mm | Endring per syklus |
fbBlowerArm.fbLaser.rMinSeen_mm | Minste under LEARNING |
fbBlowerArm.fbLaser.nQuietCycles | Teller i LEARNING |
fbBlowerArm.fbLaser.rNewBaselineCandidate | Foreslått ny baseline |
fbBlowerArm.fbLaser.nUpwardStableCycles | Sykluser stabil over baseline |
fbBlowerArm.xBeamOK_delayed | L1 OK + transit-tid |
fbBlowerArm.xBeamGapActive | Gap-toleranse aktiv |
fbBlowerArm.xCollisionLatch | Kollisjon-latch satt (krever bjelke-syklus) |
fbBlowerArm.xS1SeenInactive | S1 sett inaktiv etter kollisjon |
fbBlowerArm.xS2SeenInactive | S2 sett inaktiv etter kollisjon |
fbBlowerArm.xArmed | Reset-sekvens fullført |
fbBlowerArm.xResetWindowActive | Reset-vindu aktivt |
Testing uten hardware. Produserer rå sensor-signaler i MAIN.xUseSimulator = TRUE.
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
| Variabel | Effekt | Forventet resultat |
|---|---|---|
xInjectProtrusion | L1 = 450 mm i state 4 | L1 ERROR (utstikker), fot inn |
xInjectHole | L1 = 550 mm i state 4 | OK, baseline oppdateres etter 2 s |
xInjectCollision | S4 = LAV | KOLLISJON: Y1 av, latch satt, krever bjelke-syklus |
xInject_S3_TooWide | S3 = LAV | Fot inn (for bred bjelke) |
MAIN.xUseSimulator := TRUEPRG_Simulator.xEnabled := TRUEPRG_Simulator.xStartBeam := TRUE for én bjelkesyklusfbBlowerArm.sStatus og fbBlowerArm.sLaserStatusxInjectProtrusion, xInjectCollision, etc| Sjekk | Hvordan |
|---|---|
| ☐ Deaktiver simulator | MAIN.xUseSimulator := FALSE |
| ☐ Deaktiver transit-bypass | xBypassTransitDelay := FALSE |
| ☐ Tun matehastighet | rFeedSpeed_mm_s = faktisk målt hastighet |
| ☐ Tun L1-toleranser | rMaxDeviation_mm (nå 8.0), rMaxStep_mm (nå 6.0), rMinDropThreshold_mm — basert på observert normal variasjon + margin. 10 mm utstikker skader armen. |
| ☐ Verifiser L1-kalibrering | Sjekk at rDistance_mm matcher faktisk målt avstand |
| ☐ Verifiser S1/S2-invertering | Sammenlign MAIN.xRaw_S1 vs fbBlowerArm.xS1_Land i online-view |
| ☐ Verifiser S4-fjærmekanisme | Test at fjæren presser stangen tilbake til normal etter kollisjon |
| ☐ Verifiser S4 latch-gjenoppretting | Trigg S4, verifiser at Y1 forblir av til S1 og S2 begge har vært INAKTIV. Sjekk xCollisionLatch, xS1SeenInactive, xS2SeenInactive |
| ☐ Test én bjelke | Observer hele sekvensen via sStatus, verifiser at Y1 går ut i rett tid og tilbake når bjelke passerer |
| ☐ Test gap mellom bjelker | Verifiser at Y1 holdes ved nær bjelke-overgang (xBeamGapActive) |
| ☐ Test utstikker-deteksjon | Simulé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-Link | Index 103 = Expert mode, Index 67 = filter depth. Midling gjøres på sensoren, ikke i PLC |