Skriptentwicklung

Dieses Dokument gibt eine grobe Übersicht über das Zusammenspiel der einzelnen Teile von KalibriWare und den generellen Ansatz um Skripte zu erstellen/anzupassen.

Hier soll zuallererst verdeutlicht werden, wie die einzelnen Teile des KalibriWare Systems zusammenspielen, insbesondere im Hinblick auf die Skriptentwicklung.

  1. Systemübersicht und beteiligte Komponenten / Softwares
  2. Skriptumgebung - Software und Linksammlung
  3. Skriptverwaltung - Wo sind Skripte gespeichert und wie werden Sie einem Prüfling zugeordnet

Systemübersicht / beteiligte Software

Die Skriptausführung benötigt insgesamt mindestens 4 Komponenten:

  • Skriptumgebung, zuständig für die Ausführung der Skripte
    • Basissoftware der Skriptumgebung ist node.js und TypeScript
    • Dazu kommt ein von uns programmiertes Framework um gemeinsam genutzte Funktionen der Skripte sauber zu kapseln
  • Skriptverwaltung, zuständig für das zentrale Vorhalten aller bekannten Skripte, Treiber, Hilfsfunktionen.
    • Basissoftware hier ist gitea, ein webbasierter git-repository-Server.
  • Backend-API / Stammdatenverwaltung, zuständig für die Zuordnung der Kalibrierskripte zum Prüfling, Zuweisung der Standards zu Messplätzen, Verwaltung der Hardwareschnittstellen.
    • Diese Komponente wurde vollständig von uns ebenfalls in node.js und TypeScript entwickelt.
  • Benutzeroberfläche, dort wird die Bedienung der Skriptumgebung vorgenommen.
    • Diese Komponente wurde vollständig von uns entwickelt, hier kommen React und TypeScript zum einsatz.

Das folgende Bild zeigt die Kommunikation und den Ablauf zwischen den einzelnen Komponenten:

Übersicht über die Komponenten beim Kalibriervorgang aus Sicht des Skriptentwicklers

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.

Skriptumgebung / Software & Linksammlung

Skriptverwaltung / Speicherort und Zuordnung

Zugang zu den Skripten

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.

Git-Zugang

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.

Git-Repository Liste

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.

Skriptdateien - Konventionen

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.

Kalibrierskript - Basisaufbau

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:

  1. Wrapper zum sauberen Beenden der Skriptumgebung
  2. Backend-API zum Abholen der Job-Informationen
  3. Skriptumgebung - laden der grundlegenden Funktionen (ScriptUI, Protokoll, etc)
  4. Messplatz & Hardwareschnittstellen (Objekte vom Typ GPIB, RS232 und GPIO, siehe auch HardwareByAlias.createOrGet())
  5. Standards (siehe auch CalibratorByAlias.createOrGet())
  6. Skript - laden des eigentlichen Kalibrierskripts
  7. UI-Server - Kommunikation mit der Oberfläche

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.

Kalibrierskript - Zuordnung Skript zu Prüfling

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:

OLP-5501J Prüfling

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.

Nächste Schritte


Anatomie eines Kalibrierskripts

In diesem Abschnitt wird der grundlegende Aufbau eines Kalibrierskripts beschrieben.

Diagramme im Protokoll und der Kalibrierumgebung

In diesem Abschnitt wird beschrieben, wie man mittels Skripten Diagramme auf der Kalibrierumgebung erstellt und diese ins Protokoll schreibt.

Hardwareschnittstellen benutzen

In diesem Abschnitt wird beschrieben, wie aus einem Skript oder aus einer Treiberdatei auf verschiedene Hardwareschnittstellen zugegriffen werden kann.

Einbinden eines Standards in ein Skript

In diesem Abschnitt wird beschrieben, wie ein Standard mit dem Kalibrierskript verbunden wird und man damit interagieren kann.

Messreihen und Tabellen

In diesem Abschnitt wird beschrieben, wir mit dem Benutzer interagiert werden kann und wie Messreihen ins Protokoll geschrieben werden.

Persistente Daten

In diesem Abschnitt wird beschrieben, wie man Daten über mehrere Skriptdurchläufe persistent abspeichert.

Kombinationsskripte für Gerätefamilien entwickeln

Hier ist beschrieben, wie man ein Prüf-/Kalibrierskript für verschiedene Prüflinge entwickeln kann.

Treiberentwicklung

Dieses Dokument gibt eine grobe Übersicht über die effiziente Entwicklung von Treibern für Standards