Áttekintés
A szoftver fő célja több AM1 mérési fájl egyesítése és automatizált elemzése ügyfél szintű riportoláshoz.
- Több `.am1` fájl importja egyszerre (`part_0000.am1`, `part_0001.am1`, ...).
- 2/3/4 csatorna automatikus felismerése.
- ADC család auto-detekció a nyers mintatartomány alapján (ADS1015-szerű / ADS1115-szerű skálázás).
- Automatikus trimming, ha a payload nem osztható frame mérettel.
- Összefűzött idővonal és csatornánkénti engineering görbe (`mm` vagy `bar`).
- Többcsatornás checkboxos nézet (`All` + egyedi csatornák), külön analysis channel választással.
- Csatornánként külön mértékegység-választó és skála-beállítás: `mm` vagy `bar`.
- `mm` módban csatornánként választható: `File scale`, `40 mm`, `80 mm`.
- `bar` módban csatornánként külön `min` és `max` tartomány állítható.
- Eseménydetektálás belső `shot / flush / unknown` típusokkal, amelyek a felületen `Squeeze / Lubrication / Unknown` néven látszanak.
- Típusfüggő duration, stroke és slope ellenőrzés, egyenkénti hibajelzésekkel.
- Ciklusdetektálás (`shot + flush`), cycle target/tolerance alapú bad cycle jelölés.
- Downtime számítás Squeeze/Lubrication eseménymentes szakaszokból, minimum-idő küszöb szűréssel.
- Valós idő megjelenítés fájlból felismert vagy manuálisan megadott méréskezdet alapján.
- Kapcsolható csatorna baseline-align kizárólag vizuális célra.
- Külön `/gaps` tesztoldal gap és fájlhatár vizualizációhoz.
- KPI-k, events/cycles táblák, cycle trend chart, fájlhatár-jelölések, CSV exportok és nyomtatható/PDF riport.
Az elemzés mindig egy kijelölt csatornán fut. Több csatorna egyszerre is megjeleníthető, de az eseménydetektálás és a ciklusdetektálás egy konkrét analysis channel alapján történik.
Gyors indulás
- Nyisd meg az alkalmazást.
- Válassz ki egy vagy több `.am1` fájlt.
- Állítsd be a rendezést (`Filename` javasolt).
- Várd meg a parsing és merge folyamat végét.
- Jelöld ki a megjelenítendő csatornákat; ha több csatorna aktív, válaszd ki az analysis channel-t is.
- Ha szükséges, állítsd be a mérés kezdeti idejét `Auto from file` vagy `Manual` módban.
- Finomhangold az `Analysis settings` paramétereket.
- Értékeld a KPI-ket, a grafikonokat, az Events és Cycles táblákat, valamint a cycle trend chartot.
- Exportáld a szükséges adatokat (`combined.csv`, `events.csv`, `downtime.csv`, PDF).
Teljes munkafolyamat
1) Import
A fájlok kliens oldalon kerülnek beolvasásra. A rendszer a kiválasztott fájlokat rendezheti fájlnév szerint vagy megtarthatja a manuális kiválasztási sorrendet.
2) Parsing és validálás
A parser beolvassa a fejlécet, azonosítja a csatornaszámot, kiszámolja a frame struktúrát, majd nyers mintákból származtatott mértékegységeket képez. A nyers minták amplitúdója alapján automatikusan kiválasztja a 12 bites vagy 16 bites gain-táblát is.
3) Merge
A part fájlok idősorai folyamatos idővonallá állnak össze. Ha átfedés vagy nulláról újraindulás látható, a rendszer időeltolással illeszti a következő részt. A merge metaadatként part-határokat is tárol, ezekből rajzolódnak a szaggatott fájlhatár-vonalak a grafikonon.
A merge a fájlok startEpoch metaadatait is eltárolja. A jelenlegi logika szerint az automatikus méréskezdet az első importált fájl startEpoch értékéből származik, mert ez felel meg a valós mérésindulásnak. Ha az első fájl kezdőideje hiányzik vagy érvénytelen, az automatikus kezdőidő nem használható, és manuális megadás szükséges.
4) Eseményanalízis
Dinamikus küszöbökkel történik a szegmentálás, majd eseményenként statisztika, osztályozás, slope és bad jelölés készül. Az események akkor is kapnak elsődleges típust, ha kiesnek a pontos időtartam-tartományból; ezt a rendszer a `durationOk` mezőben külön validálja. Ciklusdetektálás is készül (`shot + flush` párok), célidő-alapú eltérésvizsgálattal.
5) Vizualizáció és riport
A grafikonon mm és sebesség görbe is bekapcsolható, az Events/Cycles táblákból fókuszálható a nézet, és külön trend chartok mutatják a ciklushossz, valamint a `Squeeze` és `Lubrication` rise slope alakulását. A rise trend chartok mind az Events, mind a Cycles nézetben láthatók; pontkattintásra az aktuális nézetnek megfelelő event vagy cycle fókuszálódik, és a megfelelő tábla automatikusan leszűr a kiválasztott sorra. A `Distribution view` külön hisztogramnézetet ad a fő metrikákhoz, KPI tile-okkal és bin-alapú rekordszűréssel. A táblák görgethetők, sticky fejléccel dolgoznak, és a sidebar magasságához igazodnak.
AM1 fájlformátum (bináris)
Fejléc általános képlete
Header méret: 16 + 15 * N, ahol N a csatornaszám. Frame méret: 4 + 2 * N.
- Közös rész (16 byte): magic(4), version(u16), reserved(u16), start_epoch(u32), time_scale_us(u32).
- Csatorna blokkok: sps(u16) * N, gain_code(u8) * N, shunt(f32) * N, fullScale(f32) * N, offset(f32) * N.
Magic ellenőrzés
Elfogadott értékek: AM01, AM02, AM10, AM1\0.
Trim viselkedés
Ha a payload maradékot ad (payload % frameSize != 0), a maradék byte-ok levágásra kerülnek és a trim érték logolódik, de a feldolgozás nem áll le.
ADC skála autodetekció
A rendszer a legnagyobb abszolút raw mintából dönti el, hogy 12 bites vagy 16 bites konverziós táblát használjon. Ha maxAbsRaw <= 2047, akkor 12 bites skálázás lép életbe, egyébként 16 bites.
Összefűzés (merge)
A merge logika célja a part fájlokból folytonos, növekvő időtengely létrehozása.
- A rendszer meghatározza a part medián mintaközét (
medianDt) pozitív időkülönbségekből. - Ha a következő part kezdete átfed az előző végével (
t0 + offset <= prevEnd + dt*0.5) vagy majdnem nulláról indul (t0 < dt*2), időeltolás történik. - Eltolás képlete:
offset = prevEnd + dt - t0. - A merge stratégia jelenleg
shift. - A merge eredmény
partRangesmetaadatot is tartalmaz: start, end, gapBefore és shifted jelzővel. - A merge eredmény tárolja a partok
startEpochértékeit, valamint egyresolvedStartEpochmezőt, amely az első importált part érvényes kezdőidejét tartalmazza, ha rendelkezésre áll.
Az import logban fájlonként látható: feldolgozási sorrend, csatornaszám, minta darabszám, trim byte, első és utolsó időbélyeg.
Eseménydetektálás
1) Dinamikus küszöbök
A rendszer robust quantile alapú küszöböt számol az mm jelből: q10, q90, majd hiszterézis:
span = max(1e-6, q90 - q10)
entry = q10 + 0.55 * span
exit = q10 + 0.40 * span2) Szegmensképzés
- Belépés: amikor mm eléri vagy meghaladja az `entry` küszöböt.
- Kilépés: amikor mm visszaesik az `exit` alá.
- Minimum hossz: legalább 3 minta különbség.
- Közeli szegmensek összevonása, ha a köztük lévő rés <= 0.2 s.
3) Eseménytípus besorolás
- Belső típusok: `shot`, `flush`, `unknown`.
- Felületi megnevezések: `Squeeze`, `Lubrication`, `Unknown`.
- `shot`: ha `shotMinS <= durationS <= shotMaxS`.
- `flush`: ha `flushMinS <= durationS <= flushMaxS`.
- Ha egyik tartományba sem esik bele, a rendszer akkor is a közelebbi családhoz sorolja, de `durationOk = false` lesz.
- Ha ugyanaz az esemény mindkét tartományba beleesik, a középértékhez közelebbi osztály nyer.
4) Stroke és slope
- `strokeMm = peakMm - baselineMm`.
- `strokeTimeS` azt mutatja, hogy a jel mennyi idő alatt fut fel a nyugalmi szint közeléből a felső szint közeléig.
- A stroke idő kezdete a zajtűrés miatt a `baselineMm + 5% * strokeMm` szint első átlépése, vége a `baselineMm + 95% * strokeMm` első átlépése.
- A plató és a végén lévő leszálló szakasz nem számít bele a stroke időbe.
- `baselineMm` elsődlegesen az esemény előtti 2.0 s ablak 10. percentilise, ha ehhez elég minta áll rendelkezésre.
- Ha ez nem stabil, a rendszer fallbackként az utolsó 400 véges minta 10. percentilisét, végső esetben a globális `q10` értéket használja.
- `strokeOk` típusfüggő küszöbbel számol: Squeeze és Lubrication külön target + tolerancia alapján.
- `areaUnderCurveMmS` az esemény nyugalmi szint feletti integrálja: a baseline feletti jel trapézszabály szerinti összesített területe (`mm*s`). Ez mutatja az esemény teljes összhatását időben.
- `riseVelocityAreaMm` a stroke felfutási ablak pozitív sebességének integrálja. Mivel a sebesség idő szerinti integrálja elmozdulás, az érték mm-ben értelmezhető.
- Ha van mentett Squeeze vagy Lubrication referencia, az integrál eltérés is hibának számít, ha kilép a `shapeAreaTolerancePct` százalékos sávból.
- A `riseSlope` lineáris legkisebb négyzetes illesztéssel készül a stroke felfutási szakaszán.
- Az `Emelkedési ablak kezdete` azt adja meg, hogy a stroke felfutás kezdetétől hány másodperccel később induljon a riseSlope illesztés.
- Az illesztés vége a `baselineMm + 95% * strokeMm` szint első átlépése.
- A `fallSlope` továbbra is technikai exportmező, de a fő felület nem használja minősítésre.
5) Hibajelölések
A slope minősítés két külön logikából állhat. Ha nincs kézi minimum küszöb, a rendszer az összes squeeze `riseSlope` érték 10. percentilisét használja automata minimum thresholdnak.
lower-bound: az esemény hibás, hariseSlope < minimumSlopeThreshold.reference-deviation: az esemény hibás, ha a rise slope a kézi referenciaértéktől a megadott százalékos sávnál jobban eltér.combined: a fenti két szabály együtt fut.Unknownesemény referenciaalapú slope minősítést nem kap.- A `minimumStrokeTimeS` külön, abszolút másodperc alapú ellenőrzés: ha `strokeTimeS` ez alá esik, az Events table Bad jelzést és konkrét hibaokot mutat.
referenceDeviation = abs(riseSlope - referenceSlope) / referenceSlope
badSlopeReference = referenceDeviation > tolerancePct / 100Best practice szerint akkor érdemes referenciaalapú módot használni, ha van egy jóváhagyott referencia mérésed. Ilyenkor a referencia mérés tipikus `Squeeze` és/vagy `Lubrication` rise slope értékét kézzel megadod, majd toleranciát állítasz köré. Így nem csak a túl alacsony, hanem a túl magas, a normáltól eltérő slope-ok is hibának számítanak.
- Ajánlott induló beállítás:
slopeQualityMode = combined. - Tipikus kezdő tolerancia:
±10%, majd igény szerint szigorítható vagy lazítható. - A `Squeeze` és `Lubrication` referencia slope külön érték, mert a két eseménytípus dinamikája eltérhet.
eventIsBad = !durationOk || !strokeOk || badSlopeA felületi hibajelölés ezt kiegészítheti referencia görbe alapú hibákkal is: formaeltérés, integrál / terület eltérés, max. slope eltérés és stroke idő eltérés. Ezek a `Görbeforma figyelés` beállításaiból és a Hasonlóság tabon mentett referencia eseményekből számolódnak.
Ciklus elemzés
1) Ciklus párosítás
- Az események időrendbe rendezve kerülnek feldolgozásra.
- A rendszer mindig a legutóbbi még el nem párosított `shot` eseményt tartja meg jelöltként.
- Egy `flush` esemény ezzel a legutóbbi megelőző `shot` eseménnyel alkot ciklust.
- `unknown` esemény nem alkot ciklust.
- Ez a szabály ellenállóbb arra az esetre, amikor egy lubrication kimarad, és több squeeze érkezik egymás után.
2) Ciklus mezők
- `shotDurationS`, `flushDurationS`, `gapAfterShotS`.
- `durationS = tEnd - tStart`.
- `deltaS = durationS - cycleTargetS` (ha target elérhető).
- `badDuration = abs(deltaS) > cycleToleranceS`.
- `shotStrokeMm`, `flushStrokeMm`: a két esemény stroke értéke külön-külön.
- `shotRiseSlope`, `flushRiseSlope`: a két esemény rise slope értéke külön-külön.
3) Cycle target
- `auto` módban: a detektált ciklushosszak mediánja.
- `manual` módban: a felhasználó által megadott `cycleTargetS` érték.
- A tolerancia mindig `cycleToleranceS`.
4) Squeeze–Lubrication egyformaság ellenőrzés
A rendszer külön cycle-level hibaként jelöli, ha a squeeze és lubrication egy cikluson belül túl hasonlóvá válik. Ez az ügyféloldali logikában tipikusan rendellenes működésre vagy felismerési hibára utal.
- `durationSimilarity = min(shotDuration, flushDuration) / max(shotDuration, flushDuration)`.
- `strokeSimilarity = min(shotStroke, flushStroke) / max(shotStroke, flushStroke)`.
- `riseSimilarity = min(shotRiseSlope, flushRiseSlope) / max(shotRiseSlope, flushRiseSlope)`.
- Mindegyik mutató `0..1` tartományban van; minél közelebb van `1`-hez, annál egyformább a pár.
- Az auto küszöbök robusztusan készülnek: medián + MAD alapú számolással, metrikánként külön minimum ráhagyással.
- `badPairDuration`, `badPairStroke`, `badPairRise` külön zászlók, és ezek együtt képezik a `badAny` cycle-level állapotot.
5) Downtime számítás
A detektált `Squeeze` és `Lubrication` események időintervallumai összevonásra kerülnek (átfedések nélkül), majd downtime a teljes mérésen belüli, eseménymentes szakaszokból képződik.
A `downtimeThresholdS` mező aktív: csak azok az eseménymentes szakaszok kerülnek be a summary-ba és a `downtime.csv` exportba, amelyek elérik ezt a minimum hosszt.
Képletek és számolások
Raw → mV konverzió
mv = raw * lsbMv, ahol lsbMv a gain kódtól függő táblázatos érték.
A parser automatikusan választ 12-bit (ADS1015-szerű) és 16-bit (ADS1115-szerű) gain tábla között a raw tartomány alapján.
12-bit gain map: 0:3.0, 1:2.0, 2:1.0, 3:0.5, 4:0.25, 5:0.125 mV/LSB.
16-bit gain map: 0:0.1875, 1:0.125, 2:0.0625, 3:0.03125, 4:0.015625, 5:0.0078125 mV/LSB.
mV → mA konverzió
ma = mv / shuntOhms, ha shuntOhms > 0.1, különben 0.
mA → mm konverzió (4-20 mA)
pct = clamp((ma - 4.0) / 16.0 * 100.0, 0, 100)
mm = (pct / 100.0) * fullScaleMm + offsetMmHa a felületen `40 mm` vagy `80 mm` override van kiválasztva, akkor a rendszer a 4-20 mA jelet közvetlenül `0..40 mm` vagy `0..80 mm` tartományra képezi le.
mA → bar konverzió (állítható bar min/max)
pct = clamp((ma - 4.0) / 16.0 * 100.0, 0, 100)
bar = barMin + (pct / 100.0) * (barMax - barMin)A jelenlegi verzióban a `bar` skála csatornánként állítható. PR110 esetén tipikus alapérték: `0..600 bar`, de ettől eltérő `min/max` is megadható a felületen.
Lineáris meredekség illesztés
Illesztés: y = a*t + b, ahol a keresett meredekség a. Zárt forma:
a = (n*sum(t*y) - sum(t)*sum(y)) / (n*sum(t*t) - sum(t)^2)Sebesség (mm/s) számítás
- Első pont: előre differencia.
- Köztes pontok: középső differencia.
- Utolsó pont: visszafelé differencia.
- Opcionális simítás: mozgóátlag, alapértelmezett ablak = 5 minta.
Sampling és gap statisztikák
A mintaközből medián és p95 készül (sampling alapú mintaalkalmazással), gap akkor számít, ha dt > medianDt * 10.
Ciklus képletek
cycleDuration = cycle.tEnd - cycle.tStart
deltaS = cycleDuration - cycleTargetS
badDuration = abs(deltaS) > cycleToleranceS
areaUnderCurveMmS = integral(max(0, mm - baselineMm) dt)
riseVelocityAreaMm = sum(max(0, mm[i] - mm[i-1])) over rise window
badStrokeTimeMinimum = minimumStrokeTimeS != null && strokeTimeS < minimumStrokeTimeS
durationSimilarity = min(shotDuration, flushDuration) / max(shotDuration, flushDuration)
strokeSimilarity = min(shotStroke, flushStroke) / max(shotStroke, flushStroke)
riseSimilarity = min(shotRiseSlope, flushRiseSlope) / max(shotRiseSlope, flushRiseSlope)
badAny = badDuration || badPairDuration || badPairStroke || badPairRise
totalCycleS = union_length(all_cycle_ranges)
rawDowntimeSegments = complement_of(union_length(all_squeeze_and_lubrication_event_ranges))
totalDowntimeS = sum(rawDowntimeSegments >= downtimeThresholdS)Paraméter referencia
| Paraméter | Alapérték | Mértékegység | Jelentés |
|---|---|---|---|
shotMinS | 2.0 | s | Squeeze esemény minimális időtartama. A belső típusnév ehhez: shot. |
shotMaxS | 3.0 | s | Squeeze esemény maximális időtartama. |
flushMinS | 5.0 | s | Lubrication esemény minimális időtartama. A belső típusnév ehhez: flush. |
flushMaxS | 9999.0 | s | Lubrication esemény maximális időtartama. |
shotExpectedStrokeMm | 25.0 | mm | Squeeze események elvárt stroke értéke. A jelenlegi stroke definíció a nyugalmi szinttől a csúcsig mért elmozdulás. |
shotStrokeTolMm | 3.0 | mm | Squeeze stroke tolerancia. Ezen belül strokeOK = true. |
flushExpectedStrokeMm | 25.0 | mm | Lubrication események elvárt stroke értéke, külön targettel a squeeze értékhez képest. |
flushStrokeTolMm | 3.0 | mm | Lubrication stroke tolerancia. |
riseWindowS | 0.30 | s | A stroke felfutási idején belüli kezdő offset. A riseSlope ettől a ponttól a stroke felső szintjéig számolódik. |
slopeThresholdMmPerS | null (auto) | mm/s | Minimum slope küszöb. Ha üres, automatikusan a squeeze események riseSlope értékeinek 10. percentilise lesz a küszöb. |
slopeQualityMode | combined | - | Slope minősítési mód. `lower-bound`: csak minimum küszöb, `reference-deviation`: csak referenciaeltérés, `combined`: a kettő együtt. Új beállításnál ez az ajánlott alapmód. |
shotReferenceSlopeMmPerS | null | mm/s | Kézi Squeeze referencia slope. Ha meg van adva, a rendszer ehhez képest is nézi az eltérést. |
shotReferenceTolerancePct | 10 | % | Megengedett Squeeze eltérés a referencia slope körül. |
flushReferenceSlopeMmPerS | null | mm/s | Kézi Lubrication referencia slope. Ha meg van adva, a rendszer ehhez képest is nézi az eltérést. |
flushReferenceTolerancePct | 10 | % | Megengedett Lubrication eltérés a referencia slope körül. |
shapeReferenceDeviationPct | 15 | % | Mentett referencia görbéhez képesti megengedett formaeltérés. A Hasonlóság tab eseményszintű minősítésében használja a rendszer. |
shapeAreaTolerancePct | 20 | % | Mentett referencia esemény integrál / terület értékéhez képesti megengedett eltérés. Ez állítja az integrál trend chart toleranciasávját is. |
shapeStrokeTimeTolerancePct | 20 | % | Mentett referencia esemény stroke idejéhez képesti megengedett eltérés. |
minimumStrokeTimeS | null | s | Opcionális abszolút minimum stroke idő. Ha meg van adva, az ennél rövidebb stroke idő Bad jelzést kap. |
downtimeThresholdS | 30.0 | s | A detektált downtime szegmensek minimum hossza. Downtime-nak az a threshold-feletti időszak számít, ahol nincs detektált Squeeze vagy Lubrication esemény. |
cycleTargetMode | auto | - | Cycle target forrása: auto (medián) vagy manual. |
cycleTargetS | 0 | s | Manuális cycle target érték (csak manual módban aktív). |
cycleToleranceS | 1.0 | s | Megengedett eltérés a cycle target körül. Ha túllépi, a ciklus bad jelölést kap. |
velocityAxisMode | auto | - | Sebesség tengely skálázási mód: auto, clamp, symmetric. |
velocityClampTop | -100 | mm/s | Clamp módban a sebesség tengely felső határa. |
A beállítások böngészőben perzisztensen tárolódnak: localStorage["am1.settings.v1"].
Régebbi mentett beállítások automatikusan migrálódnak az új sémára, például a korábbi egyetlen stroke target/tolerance kettéválik squeeze és lubrication értékekre.
Grafikon és nézetek
- Measured value (`mm` vagy `bar`) és Velocity (mm/s) külön-külön kapcsolható.
- A csatornák checkboxokkal választhatók: `All` + egyedi `CH1..CH4`.
- Több aktív csatorna esetén külön `Analysis channel` választható; egyetlen aktív csatornánál az analízis automatikusan azon fut.
- `mm` módban csatornánként választható `File scale`, `40 mm` vagy `80 mm` skála.
- `bar` módban csatornánként szabadon állítható a `min` és `max` tartomány; PR110 esetén tipikus alapérték: `0..600 bar`.
- Az esemény- és cycle-analízis csak `mm` csatornán fut, és a kiválasztott `mm` skálázást használja; a `bar` csatornák trendként jelennek meg.
- Automatikus downsample: 3000-6000 kirajzolt pont a teljesítmény miatt.
- A grafikon lineáris időtengelyt használ.
- Zoom slider, egér/pointer drag pan, teljes nézet visszaállítás.
- Kapcsolható `Align channel baselines` opció: a kijelölt csatornák q10 baseline-ját az analysis channel-hez igazítja, kizárólag vizuális célra.
- Esemény kiválasztáskor automatikus fókusz történik az esemény ablakára.
- Ciklus kiválasztáskor automatikus fókusz történik a kiválasztott ciklus időablakára.
- Aktív event chip: az aktuális viewport közepén lévő esemény gyorsan szűrhető a táblában.
- Az `Aktuális esemény` sorban előző/következő gombbal vagy konkrét sorszám beírásával kézzel is fókuszálható egy esemény.
- Events/Cycles/Distribution tab váltás a három fő elemző nézet között.
- Cycle trend chart: kattintható pontok, target és ±tolerance referenciavonalakkal; pontkattintás a megfelelő ciklusra fókuszál, és a Cycles table automatikusan leszűr erre az egy ciklusra.
- Külön `Squeeze` és `Lubrication` trend chartok mutatják a kiválasztott metrika alakulását nézetfüggő sorszámozással.
- A trend chartokon választható metrika: rise slope, max. rise slope, stroke, stroke idő, integrál / terület, felfutási sebesség integrál vagy esemény-időtartam.
- Az integrál / terület trend az esemény nyugalmi szint feletti teljes területét mutatja (`mm*s`), ezért jól jelzi, ha az esemény összhatása változik, még akkor is, ha a csúcs vagy a stroke önmagában hasonló.
- A stroke idő trend chart megőrzi a referencia vonalat, és bekapcsolt `Minimum stroke idő` esetén külön alsó határ vonalat is rajzol.
- A felfutási sebesség integrál trend a felfutás közbeni pozitív mozgás összegét mutatja mm-ben.
- Az integrál trend Y tengelye nem fixen 0-ról indul, hanem a mért értékek köré számolt robusztus tartományt használ, hogy az 50 körüli kis eltérések is láthatók legyenek túlzott felnagyítás nélkül.
- Mentett referencia esetén az integrál trend chart referencia vonalat és ± integrál tolerancia sávot mutat; a sávon kívüli események hibás integrál eltérést kapnak.
- Az Events nézetben a trend pontjaira kattintva a megfelelő `Squeeze` vagy `Lubrication` esemény fókuszálódik, és az Events table automatikusan csak erre az egy sorra szűr.
- A Cycles nézetben ugyanez a megfelelő ciklust választja ki, és a Cycles table automatikusan csak erre az egy ciklusra szűr.
- Az Events nézetben a trend x-tengelye az esemény sorszámát (`Squeeze #` vagy `Lubrication #`) mutatja; a Cycles nézetben továbbra is a ciklusszám látszik.
- A `Distribution view` metric-választóval (pl. Squeeze duration, Cycle time, Stroke, Stroke time, Rise slope, Integrál, Downtime duration) hisztogramot rajzol, `All / Good only / Bad only` scope szűréssel.
- A hisztogram oszlopaira kattintva a nézet a kiválasztott binhez tartozó rekordokat listázza, és esemény/ciklus rekord esetén a fő grafikon ugyanarra a rekordra fókuszálható.
- A Distribution KPI tile-ok a kiválasztott metric és subset alapján `Count`, `Median`, `P95`, `Mean`, `Range` és `Bad share` összesítőt mutatnak.
- Ha kézi referencia slope van megadva, a trend chartok referencia vonalat és ± tolerancia sávot is mutatnak.
- A rise trend pontok színezése követi az aktív slope minősítést: referenciaeltérés vagy lower-bound sértés esetén piros kiemelést kapnak.
- Ha nincs kézi referencia, a trend chartok medián referencia vonalat mutatnak, minősítési sáv nélkül.
- A Hasonlóság tab eseményszintű összehasonlítást használ: Squeeze eseményeket Squeeze referenciához, Lubrication eseményeket Lubrication referenciához mér.
- A referencia görbe vizualizáció overlay és abszolút eltérés nézetben mutatja az adott típus referencia-görbéjét és a kijelölt esemény görbéjét.
- A Hasonlóság tab hibaoszlopa formaeltérést, integrál eltérést és stroke idő eltérést jelöl; a max slope eltérés itt csak tájékoztató érték.
- A `Cycles table` hasonlósági oszlopai (`dur sim %`, `stroke sim %`, `rise sim %`) és a Summary breakdown mezői info ikonnal magyarázhatók a felületen.
- Kapcsolható `Show file boundaries` opció szaggatott szürke függőleges vonalakkal.
- A görbe idősorhézagoknál step/bridge logikát használ: kisebb hézagoknál megtartja az előző szintet, nagy hézagoknál visszaejti a jelet a nyugalmi szintre.
- A `/gaps` oldalon külön tesztjelleggel megjeleníthetők a gap háttérsávok, a gap összesítő és a fájlhatárok.
- Az Events és Cycles táblák teljes listát mutatnak görgethető, sticky fejlécű nézetben.
- Az Events és Cycles táblák `Start time` / `End time` oszlopokat is mutatnak, ha a méréshez van feloldott valós kezdőidő.
- Az abszolút idő cellák két sorba törnek (`dátum` + `idő`), hogy a táblák oldalirányú scroll nélkül olvashatóak maradjanak.
Az X tengely továbbra is relatív másodpercben marad. A valós idő csak a táblákban és a nyomtatható/PDF nézetben jelenik meg.
Velocity tengely módok
- auto: dinamikus minimum/maximum az adatokból.
- clamp: fix felső határ a
velocityClampTopalapján. - symmetric: 0 körüli szimmetrikus skála.
Exportok
1) combined.csv
| Oszlop | Jelentés |
|---|---|
time_s | Idő másodpercben. |
raw_chX | Nyers ADC érték csatornánként (X = 0..N-1). |
mm_chX | Kalibrált pozíció mm-ben csatornánként. |
Formátum: time_s 6 tizedes, mm_chX 2 tizedes.
A `combined.csv` nem tartalmaz merge metaadatot, fájlhatárt vagy partRanges információt, csak az összevont idősorokat.
2) events.csv
| Oszlop | Jelentés |
|---|---|
index | Esemény sorszáma (1-alapú). |
type | Belső típusérték: shot / flush / unknown. A felületen ezek Squeeze / Lubrication / Unknown néven jelennek meg. |
t_start_s, t_end_s, t_peak_s | Kezdő, záró és csúcsidő. |
duration_s | Esemény hossza másodpercben. |
peak_mm, min_mm, max_mm | Eseményen belüli szélsőértékek. |
stroke_mm | Nyugalmi szint -> peak elmozdulás. A nyugalmi szintet a rendszer az esemény előtti ablak alacsony kvantiliséből becsüli. |
area_under_curve_mm_s | Az esemény nyugalmi szint feletti integrálja. |
rise_velocity_area_mm | A felfutási ablak pozitív sebességgörbéje alatti terület, mm-ben értelmezve. |
stroke_time_s | Becsült felfutási idő másodpercben: a baseline + 5% stroke szinttől a baseline + 95% stroke szintig. A plató és a leszálló szakasz nem számít bele. |
bad_stroke_time_minimum | 1, ha az esemény stroke ideje a beállított abszolút minimum stroke idő alatt van. |
stroke_ok | 1, ha a stroke a tolerancián belül van, egyébként 0. |
rise_slope_mm_per_s | Felfutó szakasz lineáris meredeksége. |
fall_slope_mm_per_s | Lefutó szakasz lineáris meredeksége. |
bad_slope | 1, ha az aktív slope minősítési mód szerint hibás az esemény. Ez lehet minimum threshold vagy referenciaeltérés alapú is. |
Az `events.csv` jelenleg nem exportálja külön a `durationOk` mezőt, az összesített `eventIsBad` státuszt vagy a felületen látható részletes hibamagyarázatot. A `bad_slope` oszlop az összesített slope flaget tartalmazza; a `badSlopeLowerBound`, `badSlopeReference`, `referenceSlopeMmPerS`, `slopeDeltaMmPerS` és `slopeDeltaPct` segédmezők csak a felületi értelmezésben jelennek meg.
3) downtime.csv
| Oszlop | Jelentés |
|---|---|
index | Downtime szegmens sorszáma. |
t_start_s, t_end_s | Szünet kezdete és vége. |
duration_s | Szünet időtartama. |
A `downtime.csv` már a `downtimeThresholdS` szerint szűrt szegmenseket tartalmazza.
4) cycles.csv
| Oszlop | Jelentés |
|---|---|
index | Ciklus sorszáma (1-alapú). |
shot_index, flush_index | A ciklust alkotó squeeze és lubrication esemény sorszáma. |
t_start_s, t_end_s | A teljes ciklus kezdete és vége relatív másodpercben. |
shot_duration_s, flush_duration_s | A squeeze és lubrication külön időtartama. |
gap_after_shot_s | A squeeze vége és a lubrication kezdete közötti rés. |
cycle_duration_s, delta_s | Teljes ciklushossz és a cycle targettől vett eltérés. |
shot_stroke_mm, flush_stroke_mm | A két esemény stroke értéke. |
shot_rise_slope_mm_per_s, flush_rise_slope_mm_per_s | A két esemény rise slope értéke. |
duration_similarity, stroke_similarity, rise_similarity | A squeeze-lubrication pár hasonlósági mutatói 0..1 tartományban. |
bad_duration, bad_pair_duration, bad_pair_stroke, bad_pair_rise, bad_any | Cycle-level hibaflagek 0/1 formában. |
A `cycles.csv` export már tartalmazza az új squeeze-lubrication similarity mezőket és a cycle-level hibaflageket is.
5) PDF
A PDF export a böngésző nyomtatási folyamata (window.print()) alapján készül, fekvő (landscape) oldallal.
Ha van feloldott méréskezdet, a kiválasztott event vagy cycle a PDF-ben abszolút `Start time` / `End time` mezőkkel jelenik meg; ha nincs, ezek helyén `n/a` látszik.
KPI-k és minőség
KPI definíciók
total: összes detektált esemény.cycles: detektált ciklusok száma (`shot + flush`).badCycles: az összes cycle-level hibás ciklus száma, vagyis `badAny = true`.badCycleDuration: target/tolerance miatt hibás ciklusok száma.badPairDuration: túl hasonló squeeze/lubrication időtartam miatt jelölt ciklusok száma.badPairStroke: túl hasonló squeeze/lubrication stroke miatt jelölt ciklusok száma.badPairRise: túl hasonló squeeze/lubrication rise slope miatt jelölt ciklusok száma.shots,flush,unknown: belső típus szerinti darabszámok, UI-n: Squeeze / Lubrication / Unknown.badDuration: olyan események száma, ahol `durationOk = false`.badStroke: olyan események száma, ahol `strokeOk = false`.badSlope: olyan események száma, ahol az aktív slope minősítési mód alapján `badSlope = true`.badSlopeLowerBound: olyan események száma, ahol a rise slope a minimum threshold alá esett.badSlopeReference: olyan események száma, ahol a rise slope a kézi referenciaértéktől a tolerált sávon túl eltért.badTotal: olyan események száma, ahol `!durationOk || !strokeOk || badSlope`.badRate = badTotal / total.totalCycleS: az összes ciklus egyesített időtartama, átfedésmentesen.totalDowntime: a Squeeze/Lubrication eseménymentes, már küszöb szerint szűrt szakaszok összege.downtimeRatio = totalDowntime / totalMeasurementTime.
cycleBadRate = badCycles / cycles
qualityScore = clamp(100 * (1 - (badRate + downtimeRatio) / 2), 0, 100)Minél nagyobb az érték, annál jobb a minőség. A mutató a hibaarányt és az állásidő-arányt egyszerre veszi figyelembe.
Hibaelhárítás
Nem tölt be a fájl
- Ellenőrizd, hogy valóban AM1 formátumú fájlt adtál meg.
- Ha a magic érték eltér a támogatottaktól, parse hiba keletkezik.
Furcsa eseményszám / rossz besorolás
- Állítsd a `shotMinS`, `shotMaxS`, `flushMinS`, `flushMaxS` értékeket a valós squeeze/lubrication időkhöz.
- Ha egy esemény jó típusba kerül, de mégis rossznak látszik, ellenőrizd külön a duration, stroke és slope okokat a táblázat `bad` oszlopában.
- Finomítsd az `Emelkedési ablak kezdete` értéket, ha a rise slope-ot korábban vagy később szeretnéd mérni a stroke felfutásán belül.
- Adj kézi `slopeThresholdMmPerS` értéket, ha az auto minimum küszöb nem stabil.
- Ha nem a túl alacsony slope, hanem a referencia méréstől való eltérés a fontos, használd a `combined` vagy `reference-deviation` módot kézi referencia slope-pal.
Túl sok downtime
- Ellenőrizd a `shotMinS`, `shotMaxS`, `flushMinS`, `flushMaxS` beállításokat (ezekből áll össze a ciklus).
- Ellenőrizd, hogy valóban képződnek-e ciklusok (Cycles table és trend chart).
- Nézd meg a mintavételi gap statisztikát, mert idősor hézagok torzíthatnak.
Nincs detektált ciklus
- Csökkentsd vagy szélesítsd a squeeze és lubrication időtartományokat.
- Ellenőrizd, hogy a folyamatban ténylegesen van-e lubrication minden ciklushoz; ha ez hiányzik, a kimaradt lubrication nem képez ciklust.
- Ha több squeeze érkezik egymás után, a rendszer a legutóbbi squeeze-t párosítja a következő lubricationnel.
- Nézd át az import sorrendet és a smart merge figyelmeztetéseket.
Túl sok “Bad pair” jelzés a ciklusoknál
- Nézd meg a `Cycles table` similarity oszlopait és a hover info ikonokat; ezek megmondják, hogy időtartam, stroke vagy rise alapján lett-e túl hasonló a pár.
- Ellenőrizd a `Squeeze` és `Lubrication` trend chartokat rise slope, stroke, stroke idő, integrál vagy időtartam nézetben: gyakran itt látszik először, ha a két görbe dinamikája összecsúszik.
- Ha a folyamat valójában természetesen hasonlóvá vált, a current-file auto threshold miatt a jelölések számát a teljes ciklushalmaz mintázata befolyásolja.
Hasonlóság tab referencia nélkül
- Válassz ki egy jó Squeeze eseményt, majd a Hasonlóság tabon mentsd Squeeze referenciának.
- Válassz ki egy jó Lubrication eseményt is, és mentsd Lubrication referenciának.
- A tab táblázata csak az adott eseménytípus saját referenciájához képest jelöl hibaokot; a ciklustábla hibái itt nem keverednek bele.
- Az integrál / terület hiba csak akkor aktív, ha van mentett referencia az adott eseménytípushoz.
Import sorrend problémák
- Használd a `Sort files by: Filename` módot (ajánlott).
- Kapcsold be a `Smart merge check` opciót az átfedés figyelmeztetésekért.
Modulok és architektúra
| Fájl | Felelősség |
|---|---|
core/am1/parse.ts | AM1 bináris parser: fejléc olvasás, csatorna autodetekció, 12/16 bites ADC-skála autodetekció, mértékegység-konverzió (raw -> mV -> mA -> engineering value: mm vagy bar). |
core/am1/merge.ts | Több part idővonal-összefűzése, overlap/zero-start kezelése shift stratégiával, partRanges meta generálása a fájlhatárok kirajzolásához, valamint a partok startEpoch konzisztencia-ellenőrzése. |
workers/am1-worker.ts | Web Worker oldali parse + merge futtatás; progress és eredmény visszaküldése UI-nak. |
core/analysis/events.ts | Eseménydetektálás, kategorizálás, slope elemzés, ciklusdetektálás, downtime számítás, sampling statisztikák. |
core/analysis/velocity.ts | Sebesség számítása középső differenciával, opcionális simítással. |
components/MmChart.tsx | Grafikon kirajzolás (mm + sebesség), zoom/pan, nézetváltás, többcsatornás megjelenítés, opcionális baseline-align, event vagy cycle fókusz. |
components/CycleChart.tsx | Újrahasznosítható metric chart: cycle duration trend, squeeze rise trend, lubrication rise trend, target/tolerance sáv, valamint kattintható event- vagy cikluskiválasztás és nézetfüggő x-tengely címkézés. |
components/HistogramChart.tsx | Újrahasznosítható hisztogram chart a Distribution view-hoz, kattintható oszlopokkal és bin-alapú rekordszűréssel. |
core/csv/export.ts | Összefűzött idősor CSV export. |
core/csv/events.ts | Események, ciklusok és downtime export CSV formátumban. A CSV-k a fő validációs mezőket exportálják, de nem minden UI-magyarázó szöveget. |
app/page.tsx | Fő felület: import, beállítások, KPI-k, event/cycle táblák, trend chart, export, nyomtatás/PDF. |
A parse és merge folyamat Web Worker-ben fut, így nagy fájloknál is folyamatos marad a felület válaszkészsége.