Zum Inhalt springen

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.

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.

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 value

Weil on_write da ist, ist dieses Tag schreibbar: wer den Zoll-Wert setzt, setzt in Wahrheit die Millimeter an der Anlage.

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 pressure

Das 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.

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.

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 * INCH

Und 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.

  1. 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.
  2. Ins Ausführungsprotokoll sehen. Ihre print()-Ausgaben stehen dort unter dem Lauf.
  3. Den Reiter Probleme prüfen. Ein Import, der ins Leere zeigt, steht dort als Hinweis.