Beispiele zum Abschreiben
Sechs Skripte, die so laufen. Jedes nennt seine Eingänge und seinen Auslöser, damit Sie es nicht nur kopieren, sondern auch anschließen können.
1. Zwei Werte zusammenzählen
Abschnitt betitelt „1. Zwei Werte zusammenzählen“Eingänge: good → Press1.GoodParts, scrap → Press1.ScrapParts
Auslöser: Tag-Änderung auf beide Eingänge
return inputs["good"] + inputs["scrap"]Das ist ein vollständiges Skript. Der Rückgabewert ist der Wert des Tags.
2. Einheit umrechnen, in beide Richtungen
Abschnitt betitelt „2. Einheit umrechnen, in beide Richtungen“Eingänge: length_mm → Press1.Length_mm
Auslöser: Tag-Änderung
INCH = 25.4
def on_read(): return round(inputs["length_mm"] / INCH, 3)
def on_write(value): system.tag.write("Press1.Length_mm", value * INCH) return valueWeil on_write da ist, ist dieses Tag schreibbar: wer den Zoll-Wert setzt, setzt in
Wahrheit die Millimeter an der Anlage.
3. Grenzwert überwachen und einen Alarm setzen
Abschnitt betitelt „3. Grenzwert überwachen und einen Alarm setzen“Eingänge: pressure → Press1.Setpoint_bar
Auslöser: Tag-Änderung, mit Beruhigungszeit 2 s, damit ein Zappeln um die Grenze
nicht dutzendweise Alarme erzeugt
LIMIT = 180.0
pressure = inputs["pressure"]alarm = pressure > LIMIT
if alarm: print("over limit:", pressure)
system.tag.write("Press1.Alarm_Pressure", alarm)return pressureDas Tag liefert weiterhin den Druck; der Alarm ist eine Nebenwirkung in einem anderen Tag. Trennen Sie das bewusst: ein Tag, das mal den Druck und mal einen Wahrheitswert liefert, ist auf jedem Dashboard eine Falle.
4. Schichtstunde bestimmen, auf der Uhr der Anlage
Abschnitt betitelt „4. Schichtstunde bestimmen, auf der Uhr der Anlage“Eingänge: keine Auslöser: Zyklisch, alle 60 s
now = system.time.plant_now()
if 6 <= now.hour < 14: return "F"if 14 <= now.hour < 22: return "S"return "N"system.time.plant_now() und nicht datetime.now(): datetime.now() liefert die Zeitzone der
Maschine, auf der das Skript ausgeführt wird — auf einer betriebenen Instanz zuverlässig UTC.
Der Zeitplan dagegen löst nach der Uhr aus, nach der die Anlage läuft. Ein Skript, das die
Schicht selbst bestimmt, muss dieselbe Uhr lesen wie sein Auslöser, sonst verrutscht die
Schichtgrenze um den Zeitversatz — und zur Sommerzeit zusätzlich um eine Stunde.
Die Zone der Anlage ist einmal an der Instanz hinterlegt. Im Skript steht sie nicht, und genau deshalb muss sie auch beim Umzug in eine andere Zeitzone nirgends nachgezogen werden.
5. Einen Pfad erst zur Laufzeit zusammensetzen
Abschnitt betitelt „5. Einen Pfad erst zur Laufzeit zusammensetzen“Parameter: line
Auslöser: Von Hand oder Zeitplan
line = params["line"]
parts = system.tag.read("Plant." + line + ".PartCount")target = system.tag.read("Plant." + line + ".Target")
if target == 0: return 0.0
return round(100.0 * parts / target, 1)Nur so, wenn der Pfad wirklich erst beim Laufen feststeht. Steht er vorher fest, binden Sie ihn als Eingang — dann weiß TrakState von der Abhängigkeit und warnt Sie beim Umbenennen.
6. Eine eigene Bibliothek benutzen
Abschnitt betitelt „6. Eine eigene Bibliothek benutzen“Ein Skript unter dem Pfad Line1.Tools.Conversion mit dem Auslöser Bibliothek:
INCH = 25.4
def mm_to_inch(mm): return mm / INCH
def inch_to_mm(inch): return inch * INCHUnd ein Skript, das sie verwendet:
from Line1.Tools.Conversion import mm_to_inch
return round(mm_to_inch(inputs["length_mm"]), 3)Der Pfad ist der Modulname. Eine Bibliothek hat keinen eigenen Wert und wird nie von selbst ausgeführt; sie wird importiert.
Was Sie vor dem Scharfschalten tun sollten
Abschnitt betitelt „Was Sie vor dem Scharfschalten tun sollten“- Probelauf (Dry run). Er rechnet alles, führt aber keine Schreibung aus — Sie sehen das Ergebnis und die beantragten Schreibungen, ohne dass etwas an der Anlage passiert.
- Ins Ausführungsprotokoll sehen. Ihre
print()-Ausgaben stehen dort unter dem Lauf. - Den Reiter Probleme prüfen. Ein Import, der ins Leere zeigt, steht dort als Hinweis.