Anatomie eines Kalibrierskripts
In diesem Abschnitt wird der grundlegende Aufbau eines Kalibrierskripts beschrieben.
Hier soll zuallererst verdeutlicht werden, wie die einzelnen Teile des KalibriWare Systems zusammenspielen, insbesondere im Hinblick auf die Skriptentwicklung.
Die Skriptausführung benötigt insgesamt mindestens 4 Komponenten:
Das folgende Bild zeigt die Kommunikation und den Ablauf zwischen den einzelnen Komponenten:

Zur Vorbereitung wird vom Techniker wie in Skriptverwaltung beschrieben ein Kalibrierskript angelegt und zugeordnet. Danach wird vom Kalibrierer ein Auftrag gestartet, welcher dieses Skript benutzt. Die Backend-API erzeugt eine Instanz der Skriptumgebung auf dem passenden Messplatz. Dort wird zuerst die neuste freigegebene Version der Messskripte heruntergeladen bzw. aktualisiert. Anschließend wird das Messskript, welches dem aktuellen Auftrag über den Prüfling zugeordnet ist, geladen, die abhängigen Treiberdateien geladen und initialisiert sowie die Messung gestartet. Schlussendlich kommuniziert die Skriptumgebung über Netzwerk mit dem Benutzerinterface, über das der Kalibrier Eingaben vornehmen kann/muss.
Die Gitea-Instanz zur Skriptverwaltung ist i.d.R. unter https://git.{KALIBRI_BASE} erreichbar. Zum Anmelden bitte zuerst oben rechts “Sign In” klicken, dann auf Sign in with OpenID. Man wird auf den Single-Sign-On weitergeleitet und kann sich mit dem normalen KalibriWare Zugang anmelden.

In der rechten Bildschirmhälfte findet sich die Liste der Repositories, dort sollte genau ein Repository kalibri/calibration-scripts angelegt und zugänglich sein. In diesem Repository sind alle Kalibrierskripte, Treiber für Standards und Hilfsfunktionen hinterlegt.

Um direkt aus der Kalibriware-UI in die Entwicklungsumgebung zu kommen, zuerst auf die Seite mit den “Prüflingen” gehen, dort dann auf die Schaltfläche “Skriptentwicklung” klicken. Im Hintergrund wird dann eine komplette VS-Code Instanz gestartet, und der Benutzer wird auf diese Instanz weitergeleitet. Im VSCode wird direkt das Kalibrierskript für den Standard geöffnet, sodass direkt angefangen werden kann zu arbeiten.
KalibriWare bietet eine deutlich stärkere Modularisierbarkeit als das alte KalibriScript-Programm, schon allein durch den Einsatz einer vollständigen Programmiersprache. Dabei stellt sich notwendigerweise die Frage nach einer Strukturierung der Dateien innerhalb des Git-Repositories sowie der Strukturierung der Zusatzfunktionen.
Folgende Ordnerstruktur halten wir für sinnvoll:
calibration-scripts
|-> drivers # Gerätetreiber für Standards
| |-> interfaces # Schnittstellendefinitionen für Gerätetreiber
| | \-> oms200.interface.ts # Schnittstelle für OMS-200
| \-> oms200 # Treiberdateien für den OMS-200 Standard
| |-> dummy.ts # Virtueller Hardwaretreiber
| \-> driver.ts # Echter Hardwaretreiber
|-> scripts # Hauptverzeichnis für Kalibrierskripte
| \-> OMS # Messplatz / Skriptkategorie
| \-> OLP5501J # Skriptverzeichnis für OLP5501J
| |-> script.ts # Kalibrierskript für OLP5501J
| \-> messaufbau01.jpg # Hilfsdateien für Kalibrierskript
\-> utils # gemeinsamgenutzte Funktionalitäten mehrerer Skripte
\-> file.ts # geteilte Zusatzfunktionen
Hinweis: Die o.g. Ordnerstruktur ist nur als Idee zu verstehen und kann jederzeit neu festgelegt werden.
Grundlegend sollte ein Kalibrierskript in einer Datei abgelegt sein. Der Basisaufbau / Das Skelett einer Skriptdatei sieht wie folgt aus:
// Zusatzfunktion der Abhängigkeitsauflösung importieren
import { Injectable } from 'injection-js';
// Basisklasse für alle Skripte, jedes Skript muss von `Script` erben.
import { Script } from '@script';
// Klasse als erzeugbar markieren
@Injectable()
export class SkriptName extends Script {
// Im Konstruktor können zusätzliche Parameter angefordert werden
constructor() {
}
// Run enthält das eigentliche Kalibrierskript.
public Run(): void {
}
}
Kalibriware bedient sich ‘Dependency-Injection’ (kurz DI) - dabei werden Abhängigkeiten von Code automatisch erzeugt und deren Abhängigkeiten rekursiv aufgelöst. Dabei können mit DI verschiedene ‘Scopes’ abgebildet werden, um z.B. Abhängigkeiten in verschiedenen Codeteilen anders aufzulösen. Die DI in Kalibriscript stellt alle relevanten Objekte in einer zwiebelartigen Anordnung bereit:
Objekte können jeweils ausschließlich auf Objekte in niedrigeren Klassen zugreifen, um eine saubere Kapselung zu benutzen.
Im Beispiel oben wird implizit bereits das Konzept der DI benutzt. Dabei werden, während das Kalibrierskript geladen wird, sämtliche Abhängigkeiten analysiert und ebenfalls erzeugt und initialisiert. Wir benutzen dieses Konzept in der Kalibrierumgebung sehr extensiv, da es eine mächtige Abstraktion der Funktionen untereinander ermöglicht.
Beispielsweise können die Gerätetreiber wie OMS-200 im Konstruktor angefragt werden, dabei wird dieser Treiber im Hintergrund geladen, der Standard für den Skriptdurchlauf als verwendet markiert und am Ende ins Protokoll aufgenommen, alles völlig transparent für den Benutzer.
Weitergehende Informationen finden sich hier, hier und hier.
Die Zuordnung von Kalibrierskript zu Prüfling kann folgendermaßen vorgenommen werden. In der Benutzeroberfläche unter Administration -> Prüflinge muss für jeden Prüfling ein Kalibrierskript zugeordnet werden.
Als Beispiel sei hier das OLP-55 (01J) genannt, wobei der Eintrag im folgenden Bild dargestellt ist:

Relevant für die Zuordnung sind die letzten beiden Felder “Kalibrierskript-Datei” und Kalibrierskript-Klasse. Die Kalibrierskript-Datei bezeichnet den Dateinamen ohne .ts Endung des Kalibrierskripts, relativ zum Hauptverzeichnis des Git-Repositories.
Das zweite Feld, “Kalibrierskript-Klasse” enthält den Namen der Klasse, welche das Kalibrierskript enthält, hier OLP5501J.
Hinweis: Ein Kalibrierskript kann hierbei mehreren Prüflingen zugeordnet werden, z.B. um verschiedene Varianten des gleichen Geräts mit einem Skript abzubilden. Dabei kann im Skriptverlauf der Prüfling unterschieden werden und je nach Prüfling verschiedene Aktionen durchgeführt werden.
In diesem Abschnitt wird der grundlegende Aufbau eines Kalibrierskripts beschrieben.
In diesem Abschnitt wird beschrieben, wie man mittels Skripten Diagramme auf der Kalibrierumgebung erstellt und diese ins Protokoll schreibt.
In diesem Abschnitt wird beschrieben, wie aus einem Skript oder aus einer Treiberdatei auf verschiedene Hardwareschnittstellen zugegriffen werden kann.
In diesem Abschnitt wird beschrieben, wie ein Standard mit dem Kalibrierskript verbunden wird und man damit interagieren kann.
In diesem Abschnitt wird beschrieben, wir mit dem Benutzer interagiert werden kann und wie Messreihen ins Protokoll geschrieben werden.
In diesem Abschnitt wird beschrieben, wie man Daten über mehrere Skriptdurchläufe persistent abspeichert.
Hier ist beschrieben, wie man ein Prüf-/Kalibrierskript für verschiedene Prüflinge entwickeln kann.
Dieses Dokument gibt eine grobe Übersicht über die effiziente Entwicklung von Treibern für Standards