<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Marius Gjerd</title><link>https://mariusgjerd.github.io/no/</link><description>Recent content on Marius Gjerd</description><generator>Hugo -- gohugo.io</generator><language>no</language><lastBuildDate>Tue, 30 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mariusgjerd.github.io/no/index.xml" rel="self" type="application/rss+xml"/><item><title>Kan du stole på sensordataene dine? En utviklers guide til hele stacken</title><link>https://mariusgjerd.github.io/no/posts/trust-your-sensor-data/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><author>Marius Gjerd</author><guid>https://mariusgjerd.github.io/no/posts/trust-your-sensor-data/</guid><category>data</category><category>sensorer</category><category>iot</category><category>scada</category><category>datakvalitet</category><category>datalifecycle</category><description>Sensordataene dine har blitt transformert, komprimert, tidsstemplet og tilnærmet før de når applikasjonen din. Her er hele reisen, og hvor du bør være skeptisk.</description><content:encoded><![CDATA[<p>Alle datapipelines i industriell IoT starter på samme måte: noe fysisk skjer, en sensor registrerer det, og et tall dukker opp i databasen din.</p>
<p>Gapet mellom «noe fysisk skjer» og «et tall dukker opp i databasen din» er der de fleste datakvalitetsproblemene bor. Hvis du bare har jobbet på databasesiden, er det gapet usynlig. Dette innlegget er et kart over det.</p>
<p>Vi skal følge en enkelt temperaturavlesning fra en varmeveksler hele veien til en skyapplikasjon, steg for steg. På hvert trinn viser jeg hva dataene ser ut som, hva som kan gå galt, og hva koden din bør ta høyde for.</p>
<h2 id="steg-1-den-fysiske-målingen">Steg 1: Den fysiske målingen</h2>
<p>En PT100 motstandstemperaturføler er montert i et rør. Motstanden endrer seg med temperaturen, forutsigbart men ikke perfekt. Alle PT100-er har en toleranseklasse. Klasse B (det billigere alternativet) har en nøyaktighet på ±0,3°C ved 0°C, som øker til ±1,3°C ved 300°C.</p>
<p>Sensoren din er allerede en tilnærming.</p>
<p>Det er også installasjonen å tenke på. Er sensoren montert riktig i strømmen? Er det luft rundt den som kan påvirke avlesningen? Har den vært i drift i 10 år uten rekalibrering? Sensordrift, der en sensors output gradvis avviker fra den sanne verdien over tid, er vanlig og ofte uoppdaget.</p>
<p><strong>Husk:</strong> Den fysiske målingen har iboende usikkerhet. Dataene dine har feilmarginer allerede før de forlater sensoren. ±1°C er normalt. På en varslingsterskel på ±0,5°C betyr det noe.</p>
<h2 id="steg-2-signaloverføring-4-20ma">Steg 2: Signaloverføring (4-20mA)</h2>
<p>PT100-ens motstand konverteres til et 4-20mA strømsignal av en transmitter. Denne strømmen overføres via kabel til et inngangskort i en PLS eller fjern-I/O.</p>
<p>4-20mA er en svært gammel standard og bevisst enkel og vanskelig å ødelegge: det er en strømsløyfe, så motstand i kabelen påvirker ikke avlesningen, og en brutt ledning er detekterbar (0mA betyr feil, ikke null). Men den har begrensninger:</p>
<ul>
<li>16mA-området (4 til 20) tilsvarer hele det tekniske området (for eksempel 0-200°C). Oppløsningen din begrenses av hvor fint analog-til-digital-omformeren på inngangskortet kan dele opp det området.</li>
<li>Kabellengde og elektromagnetisk interferens kan introdusere støy. Et variabelfrekvensomformermotor i nærheten kan injisere nok støy til å få en avlesning til å hoppe med flere trinn.</li>
<li>Konverteringen fra strøm til verdi bruker et kalibrert spenn. Hvis transmitteren er konfigurert for 0-200°C, men området er endret til 0-150°C og ingen har rekonfigurert det, er alle avlesninger feil skalert.</li>
</ul>
<p><strong>Husk:</strong> Innen den fysiske målingen har blitt et digitalt tall i PLSen, er den allerede skalert, kvantisert og potensielt påvirket av elektrisk støy.</p>
<h2 id="steg-3-plsens-skansyklus">Steg 3: PLSens skansyklus</h2>
<p>PLSen leser inngangene sine, utfører logikken sin og oppdaterer utgangene, i en syklus som gjentas hvert 10-100ms. Når du ber om en verdi fra PLSen, får du det som lå i minnet fra siste skan.</p>
<p>Dette introduserer en forsinkelse på opptil én skansyklus mellom den fysiske verden og PLSens bilde av den. For trege prosesser (temperaturer, trykk, nivåer) er dette irrelevant. For raske hendelser (en ventil som åpner i 20ms) kan du gå glipp av den helt.</p>
<p>Tidsstempelet på en PLS-verdi er vanligvis tidspunktet den ble lest av SCADA-systemet, ikke tidspunktet den fysiske hendelsen skjedde. Disse kan avvike med sekunder avhengig av pollingfrekvens.</p>
<p><strong>Husk:</strong> PLS-verdier er prøver, ikke en kontinuerlig strøm. Hendelser raskere enn skansyklusen er usynlige. Tidsstempelet er ofte «da vi spurte», ikke «da det skjedde».</p>
<h2 id="steg-4-scada--historikk">Steg 4: SCADA / historikk</h2>
<p>SCADA-systemet poller PLSen og lagrer verdier i en historikk (historian), en tidsserie-database bygget for industrielle data. Historian-systemer bruker en teknikk kalt <em>unntaksrapportering</em> eller <em>deadbanding</em>: de lagrer bare en ny verdi hvis avlesningen har endret seg med mer enn en konfigurert terskel.</p>
<p>Hvis temperaturen din er stabil på 73,2°C, kan historikken lagre den verdien én gang og deretter ikke igjen på en time. Dette er effektivt for lagring, men det betyr:</p>
<ul>
<li>Spørring i historikken etter «verdien kl. 14:32:17» returnerer den siste registrerte verdien før det tidspunktet, som kan være fra kl. 14:00. Hvis du ikke er klar over dette, ser trenden din flat ut fordi den er flat i databasen, ikke nødvendigvis flat i virkeligheten.</li>
<li>Terskelen for «endret nok til å lagre» er en konfigurasjonsparameter. Hvis noen satte den til 5°C for å spare lagringsplass, vil du aldri se små svingninger.</li>
</ul>
<p><strong>Husk:</strong> Historikkdata er ikke et komplett register over hva som skjedde. Det er en komprimert tilnærming. Flate linjer i dataene kan bety «ingenting endret seg» eller «vi sluttet å registrere små endringer».</p>
<h2 id="steg-5-skypipelinen">Steg 5: Skypipelinen</h2>
<p>Historikken eksporterer data til skypipelinen din via en MQTT-broker, OPC-UA-server eller et spesialtilpasset API. Hvert av disse legger til egne hensyn:</p>
<ul>
<li><strong>Buffering:</strong> Hvis tilkoblingen faller, bufrer det lokale systemet usendte data? Hvor lenge? Hva skjer ved gjenkobling? Sender det en burst, eller slipper det gapet?</li>
<li><strong>Resampling:</strong> Hvis skypipelinen forventer data i 1-minuttsintervaller, men historikken sender ved endring, må du resample. Forward-fill? Interpolering? Valget endrer dataene.</li>
<li><strong>Tidssoner:</strong> Industrielle systemer bruker ofte lokal tid. Skypipelinen din forventer sannsynligvis UTC. Hvis historikken er i Norge (CET/CEST), har du en sesongbasert 1-times forskyvning å håndtere.</li>
</ul>
<p><strong>Husk:</strong> Skypipelinen introduserer sin egen forsinkelse, bufferingsatferd og resampling-beslutninger. Hver av dem er en transformasjon som bør være eksplisitt i skjemaet ditt og dokumentert.</p>
<h2 id="steg-6-applikasjonen-din">Steg 6: Applikasjonen din</h2>
<p>Innen en temperaturavlesning når applikasjonen din, har den blitt:</p>
<ol>
<li>Målt med iboende usikkerhet (±1°C eller mer)</li>
<li>Overført som et analogsignal og konvertert til digitalt</li>
<li>Prøvetatt ved PLSens skansyklus</li>
<li>Komprimert av deadbanding i historikken</li>
<li>Overført over et nettverk som kan bufre eller miste verdier</li>
<li>Resampled for å passe pipelinens kadense</li>
</ol>
<p>Tallet i databasen din er ikke «temperaturen på det tidspunktet». Det er den beste tilgjengelige tilnærmingen, gitt alt det ovenstående.</p>
<h2 id="hva-du-kan-gjøre-med-det">Hva du kan gjøre med det</h2>
<p><strong>Dokumenter usikkerheten.</strong> Legg til metadata i skjemaet ditt: sensortype, nøyaktighetsklasse, historian-deadband, pollingintervall. Fremtidens deg, eller utvikleren som feilsøker en anomali kl. 02:00, trenger dette.</p>
<p><strong>Vær konservativ med varslingsterskler.</strong> Hvis varselet ditt utløses når temperaturen overskrider 95°C og sensornøyaktigheten din er ±1,5°C i det området, lyver kanskje varselet.</p>
<p><strong>Ikke interpoler stille.</strong> Hvis du resampler sparsomme historikkdata, gjør det synlig. En verdi fylt fra en avlesning som er 30 minutter gammel, er annerledes enn en verdi prøvetatt for 10 sekunder siden.</p>
<p><strong>Valider område og endringstakt.</strong> En PT100 som måler en rørtemperatur som hopper fra 70°C til 500°C på ett sekund, er sannsynligvis en sensorfeil, ikke virkelighet. Industrielle prosesser har fysiske grenser. Håndhev dem ved inntak.</p>
<p><strong>Spør operatørene.</strong> Menneskene som drifter anlegget, vet hvilke sensorer som er pålitelige og hvilke som «alltid leser litt høyt». Den kunnskapen er sjelden i dokumentasjonen.</p>
<hr>
<p>Sensordataene du jobber med er ærlige om hva de er, hvis du vet hvordan du skal lese dem. Hele stacken er konteksten. Uten den optimaliserer du kode på toppen av usikkerhet du ikke har tatt høyde for.</p>
<hr><p><em>Originally published at <a href="https://mariusgjerd.github.io/no/posts/trust-your-sensor-data/">mariusgjerd.github.io</a>, where I write about what happens when code touches the real world. New posts also go out by email: <a href="https://marius-newsletter-d94bcd.beehiiv.com/">subscribe here</a>.</em></p>]]></content:encoded></item><item><title>Din uptime-SLA betyr ingenting når den fysiske prosessen ikke kan vente på din tilbakestilling</title><link>https://mariusgjerd.github.io/no/posts/bridge-builder-uptime/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><author>Marius Gjerd</author><guid>https://mariusgjerd.github.io/no/posts/bridge-builder-uptime/</guid><category>ot</category><category>it</category><category>driftssikkerhet</category><category>bridgebuilder</category><description>Webutviklere og industriingeniører tenker forskjellig om oppetid. Her er hvorfor, og hva det koster når du ikke forstår forskjellen.</description><content:encoded><![CDATA[<p>Det finnes en samtale som oppstår når IT-utviklere møter operasjonell teknologi for første gang. Den pleier å gå omtrent slik:</p>
<p>«Hva er deres oppetidskrav?»</p>
<p>«99,9 prosent.»</p>
<p>«Det er omtrent 8 timer nedetid i året. Det kan vi jobbe med.»</p>
<p>«Nei, 99,9 prosent <em>per skift</em>. Vi kjører 24/7. Og hvis systemet går ned midt i et batchkjør, mister vi hele batchen.»</p>
<p>IT-utvikleren nikker, noterer noe, og regner stille om.</p>
<h2 id="hva-oppetid-betyr-i-it">Hva oppetid betyr i IT</h2>
<p>I webtjenester er oppetid et statistisk mål. Load balanceren fordeler trafikk. En rullende utrulling tar ned én instans om gangen. Hvis en deploy går galt, ruller du tilbake. Brukeren prøver forespørselen på nytt. Kanskje de ser en feilside i noen sekunder.</p>
<p>99,9 prosent oppetid betyr omtrent 8,7 timer nedetid per år. For de fleste webapplikasjoner er det akseptabelt. Modellen forutsetter at systemets tilstand er gjenopprettbar.</p>
<h2 id="hva-oppetid-betyr-i-ot">Hva oppetid betyr i OT</h2>
<p>I industrielle styringssystemer er ikke «systemet» programvaren. Det er den fysiske prosessen programvaren styrer.</p>
<p>Et vannbehandlingsanlegg pauser ikke mens du ruller tilbake en SCADA-oppdatering. En sementkjerne som kjører på 1400°C venter ikke på din deployment-pipeline. En papirmaskin som kjører på 1000 meter per minutt prøver ikke på nytt når din historikk går offline.</p>
<p>Den fysiske prosessen fortsetter uansett om programvaren er frisk eller ikke. Og hvis programvaren mister kontrollen over prosessen, selv kortvarig, måles konsekvensene i:</p>
<ul>
<li>Tapte batcher</li>
<li>Skadet utstyr fra drift utenfor trygge parametere</li>
<li>Produkt utenfor spesifikasjon som må kastes</li>
<li>I verste fall: branner, personskader, miljøhendelser</li>
</ul>
<h2 id="tilbakestillingsproblemet">Tilbakestillingsproblemet</h2>
<p>Webutviklere behandler tilbakestilling som et sikkerhetsnett. I industrielle systemer er tilbakestilling ofte ikke et alternativ midt i en prosess.</p>
<p>Hvis en PLC-programoppdatering går galt midt i en batch, kan du ikke bare gjenopprette den forrige versjonen og fortsette. Den fysiske tilstanden til prosessen har endret seg. Temperaturer, trykk og kjemiske sammensetninger er nå annerledes enn det den forrige versjonen forventet.</p>
<p>Dette er grunnen til at industrielle systemer har endringsstyringsprosesser som virker byråkratiske for IT-øyne: planlagte vedlikeholdsvindu, testede tilbakestillingsprosedyrer, operatørgodkjenninger. Det er ikke byråkrati for sin egen skyld. Det er bygget rundt virkeligheten at programvaren styrer noe som ikke stopper.</p>
<h2 id="hva-du-bør-gjøre">Hva du bør gjøre</h2>
<p>Hvis du skriver programvare som kommuniserer med industrielle systemer:</p>
<p><strong>Grasiøs degradering ser annerledes ut her.</strong> I OT betyr det at styringssystemet fortsetter å operere trygt i manuell modus mens programvaren din er nede. Utform den overgangen eksplisitt.</p>
<p><strong>Test mot de fysiske begrensningene, ikke bare de programvaremessige.</strong> Hva skjer med systemet ditt når nettverket faller ut i 30 sekunder? Hva gjør PLS-en? Hva ser operatøren?</p>
<p><strong>Forstå prosessen før du rører den.</strong> Operatørene som driver anlegget vet ting om feilmoder som ikke er i noen dokumentasjon. Snakk med dem før du skriver en linje kode.</p>
<p>SLA-tallet på kontrakten er den enkle delen. Å forstå hva det faktisk betyr for det som styres, er den vanskelige delen.</p>
<hr><p><em>Originally published at <a href="https://mariusgjerd.github.io/no/posts/bridge-builder-uptime/">mariusgjerd.github.io</a>, where I write about what happens when code touches the real world. New posts also go out by email: <a href="https://marius-newsletter-d94bcd.beehiiv.com/">subscribe here</a>.</em></p>]]></content:encoded></item><item><title>Hvorfor denne bloggen finnes</title><link>https://mariusgjerd.github.io/no/posts/welcome/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><author>Marius Gjerd</author><guid>https://mariusgjerd.github.io/no/posts/welcome/</guid><category>meta</category><category>karriere</category><category>ot</category><category>it</category><description>En introduksjon til hvem jeg er, hva jeg gjør, og hva jeg planlegger å skrive om.</description><content:encoded><![CDATA[<p>Hei, jeg er Marius Gjerd, utvikler bosatt i Bergen, og jeg jobber i krysset mellom kode og fysisk infrastruktur.</p>
<p>Jeg startet som elektriker. Så lærte jeg å skrive programvare, og de siste årene har jeg bygget IoT-løsninger i energibransjen. Til høsten starter jeg på en treårig fagskoleingeniør-utdanning i Industriell Automasjon ved siden av jobben. Studiet dekker fag som PLS, instrumentering, industrielle nettverk og OT-sikkerhet.</p>
<p>Det er et bevisst valg. Broen mellom IT og OT, mellom utvikleres skybaserte verden og industrielle styringssystemers fysiske verden, er et sted jeg synes er reelt interessant, og et sted der svært få er komfortable på begge sider.</p>
<p>Denne bloggen er der jeg skal skrive om det jeg lærer underveis. Forvent innlegg om:</p>
<ul>
<li>De rare og nyttige stedene der IT og OT møtes</li>
<li>Industriell cybersikkerhet sett med utviklerøyne</li>
<li>Praktiske eksperimenter med PLS-er, sensorer og hjemmelaber</li>
<li>Erfaringer fra å bygge IoT i stor skala i energibransjen</li>
<li>Det meste annet jeg finner verdt å dele underveis i studiet</li>
</ul>
<p>Jeg skriver når jeg har noe å si, ikke på en plan. Noen innlegg blir tekniske dypdykk; andre blir kortere refleksjoner. Alt skrives i mine egne ord, og koden bak prosjektene ligger åpent på GitHub-en min.</p>
<p>Hvis noe av dette virker interessant, så er du velkommen tilbake.</p>
<hr><p><em>Originally published at <a href="https://mariusgjerd.github.io/no/posts/welcome/">mariusgjerd.github.io</a>, where I write about what happens when code touches the real world. New posts also go out by email: <a href="https://marius-newsletter-d94bcd.beehiiv.com/">subscribe here</a>.</em></p>]]></content:encoded></item></channel></rss>