In INOSIM Simulationen können benutzerdefinierte, stochastische Teilanlagen-Störungen genutzt werden, um die Realität in einer Anlage möglichst präzise abzubilden. Mit dem Add-On Statistische Analyse kann dann eine große Anzahl an Simulationen durchgeführt werden, und diese können dann stochastisch ausgewertet werden. In einem früheren Tipp & Trick (Zwei Wege, Teilanlagen-Störungen zu simulieren) wurde bereits beschrieben, wie Teilanlagen-Störungen standardmäßig in INOSIM genutzt werden. In diesem Tipp & Trick geht es darum, wie ein benutzerdefiniertes Verhalten, welches durch eine Störung aufgerufen wird, simuliert werden kann. Dazu werden hier zwei Anwendungsbeispiele aufgeführt
Beispiel 1: Aufträge im Fall einer Störung abbrechen
Verwendung einer Störungs-Steuerung und der Abbruch-Phase
Bevor wir uns das erste Beispiel anschauen, müssen wir uns einmal mit den verschiedenen Phasen (engl. Stage) in einem INOSIM Rezept beschäftigen. Es gibt vier verschiedene Phasen: Rüsten, Normal, Reinigung und Abbruch (Abbildung 1).
Die Rüstphase wird immer als erstes ausgeführt, gefolgt von der Normalphase. Zuletzt wird die Reinigungsphase ausgeführt. Die Rüstphase wird standardmäßig nur bei der ersten Charge eines Auftrags auf einer Teilanlage ausgeführt, während die Reinigungsphase nur am Ende der letzten Charge auf einer Teilanlage ausgeführt wird. Die Abbruchphase stellt hierbei einen Sonderfall dar, da sie nur aufgerufen wird, wenn ein Auftrag in VBA mit der Cancel-Methode abgebrochen wird.
Mehr Informationen dazu sind in der INOSIM Anwendungsdokumentation unter Rezepte und Rezeptmodule > Ausführung von Grundrezepten > Abarbeitung der Grundoperationen > Phasen erhältlich.
Standardmäßig werden Operationen in der Normalphase eingefügt. Um die Phase zu ändern, wählt man eine Operation mit Rechtsklick aus und kann dann die entsprechende Phase auswählen (Abbildung 2).
Im ersten Beispiel schauen wir uns einen Batch-Reaktor mit einem einfachen Rezept an (Abbildung 3). Es wird zunächst Edukt in den Reaktor gegeben, anschließend findet die Reaktion und eine Probennahme statt. Zuletzt wird das Produkt in einen Produktbehälter abgefüllt. Im Anschluss wird in der Reinigungsphase (grün) der Reaktor gereinigt. Im Falle einer Störung soll der Auftrag abgebrochen werden, das restliche Material im Tank verworfen und der Reaktor gereinigt werden. Da diese Schritte nur im Fall eines Abbruchs ausgeführt werden sollen, befinden sie sich in der Abbruchphase (blau).
Die Störungen auf dem Reaktor werden hier über die Benutzeroberfläche definiert (Abbildung 4). Die Häufigkeit der Störung wird über eine Normalverteilung mit einem Mittelwert von zwei Tagen, einer Standardabweichung von zwölf Stunden und einer unteren Grenze von null bestimmt. Die Dauer wird mit einer Gleichverteilung zwischen null und fünf Stunden beschrieben.
Im Normalfall werden die Operationen, die auf einer Teilanlage aktiv sind, während einer Störung nur um die Störungsdauer verlängert, der Auftrag wird nicht abgebrochen. Um den Auftrag zu Beginn der Störung abzubrechen und die Abbruchphase auszulösen, kann man eine Störungssteuerung nutzen. Eine Störungssteuerung wird immer zu Beginn und zum Ende einer Störung aufgerufen. Eingetragen wird die Störung in den Teilanlageneinstellungen unter der Registerkarte Störungen, wie in Abbildung 4 gezeigt. Die Steuerung für unser Beispiel sieht so aus:
Sub Reactor_Failure(u As Unit, reason As FailureControlArg)
Dim o As Order
If reason = FailureControlArg.bFailureBegin Then 'When the Failure begins
For Each o In u.ActiveOrders 'All Active Orders on Failed Unit are cancelled
o.Cancel 'Cancel-Method for the order
Next
End If
End Sub
Die beiden vordefinierten Variablen in dieser Steuerung sind u als Unit und reason als FailureControlArg, wobei u die Teilanlage ist, von der diese Steuerung aufgerufen wird, und reason angibt, ob es sich um den Aufruf der Steuerung zu Beginn oder zum Ende der Störung handelt. In der Steuerung wird dann zunächst abgefragt, ob es sich um den Beginn der Störung handelt, und dann wird durch alle aktiven Aufträge auf der Teilanlage geloopt und diese werden abgebrochen. Durch diesen Abbruch wird dann die Abbruchphase aufgerufen.
In Abbildung 5 sieht man das Gantt-Diagramm für den beschriebenen Prozess, eingefärbt nach den Phasen. Am 05.01. tritt eine Störung auf (rot hinterlegt). Im Anschluss an die Störung wird die Abbruchphase ausgeführt (orange). Am Füllstandsgraphen kann man auch erkennen, dass die Teilanlage geleert wird. Anschließen wir ein Reinigungsschritt ausgeführt (Clean Fail ).
Eine Störungssteuerung kann aber nicht nur, wie in diesem Beispiel, dazu genutzt werden, um einen Auftrag abzubrechen. Andere Anwendungsmöglichkeiten wären zum Beispiel: Den Auftrag beim Auftreten einer Störung neu starten oder eine Ersatz-Teilanlage aktivieren und dort weiter produzieren.
Beispiel 2: Kontinuierliche-Produktion-Störung ruft Ausschussprodukt hervor
Im zweiten Beispiel schauen wir uns eine kontinuierliche Produktion an. Das Rezept besteht hierbei aus dem kontinuierlichen Transfer in der Normalphase und einer anschließenden Reinigung.
In diesem Beispiel soll eine Störung dazu führen, dass ein Ausschussprodukt produziert wird. Die Anlage wird also nicht angehalten und der Transfer wird auch nicht gestoppt. In diesem Fall wird das Rezept in Abbildung 7 ausgeführt. Hier wird das Material statt in den Produkttank in einen zusätzlichen Tank für das Ausschussmaterial transferiert.
Da hier die Produktion nicht unterbrochen werden soll, kann man auch nicht mit einer klassischen Störung arbeiten, da diese immer dafür sorgt, dass der aktuelle Schritt auf der gestörten Anlage angehalten beziehungsweise verlängert wird. Deshalb wird in diesem Beispiel die Störung manuell durch einen Workaround in VBA erstellt. Dazu werden zunächst in der Initialisierung die beiden Verteilungen erstellt, die auch schon im ersten Beispiel für die Dauer und die Häufigkeit der Störung genutzt wurden, eine Gleichverteilung für die Dauer und eine Normalverteilung für die Häufigkeit.
'Initialize Off-Spec Production
norm = New Normal 'Normal Distribution
uni = New Uniform 'Uniform Distribution
'Interval of Failures
norm.Mu = 2*24*3600 ' Mean Value: 2d in seconds
norm.Sigma = 12*3600 'Standard deviation: 12h in seconds
norm.LowerBound = 0
'Duration of Failures
uni.Start = 1*3600 'Lower Bound: 1h in seconds
uni.Stop = 5*3600 'Upper Bound: 5h in seconds
Zusätzlich wurde eine Subroutine erstellt, die einen Auftrag für das Ausschussmaterial erstellt und den aktuellen Auftrag auf der Teilanlage abbricht. Die Teilanlage wird der Routine als Input übergeben (u as Unit).
Sub OffSpec_Production ( u As Unit)
Dim o As Order
count_OffSpec += 1 'counter to create unique order names
'create new order that produces Off-Spec Material
o = New Order
o.Recipe =Recipes ("Off-Spec Material (V1)")
o.Name = "Off-Spec Material " & count_OffSpec
Orders.Add o
'Cancel all other active orders on the unit
For Each o In u.ActiveOrders
o.Cancel
Next
End Sub
Im Anschluss muss man nun die Verteilungen nutzen, um die beschriebene Subroutine zu den richtigen Zeitpunkten aufzurufen. Dazu nutzen wir die ScheduleSub-Methode. Mit dieser Methode kann man Subroutinen zu beliebigen Zeitpunkten, auch unabhängig von Ereignissen in der Simulation, aufrufen. Als Input benötigt die Methode zunächst den Namen der Subroutine als Zeichenkette (String), dann einen Zeit- oder Datumswert und die Angabe, ob es sich um eine relative oder absolute Zeitangabe handelt, mit der der Zeitpunkt des Aufrufs bestimmt wird. Zuletzt können optional noch Argumente für die Subroutine übergeben werden (siehe Abbildung 8).
Für unser Beispiel wird die Methode in der Initialisierung wir folgt aufgerufen:
Simulation.ScheduleSub("Macro1.OffSpec_Production",norm.Sample,DateReferenceType.bRelative,Units("Reactor"))
In diesem Beispiel wird der Aufrufzeitpunkt als Relativwert vom aktuellen Simulationszeitpunkt angegeben. Bei dieser Zeit handelt es sich um einen Wert aus unserer Normalverteilung für das Intervall zum Auftreten von Störungen. Zusätzlich wird der Reaktor als Teilanlage, auf der die Störung laufen soll, für die Subroutine übergeben.
Die Dauer der Störung wird dann in einer Parametersteuerung in dem Rezept für das Ausschussmaterial für die Operation Off-Spec gesetzt. Dazu wird nun ein Wert aus der Verteilung für die Dauer der Störung genutzt.
Sub Off_Spec_Duration(cop As OrderOperation, mop As RecipeOperation)
'duration is a sample form the uniform distribution
cop.Duration = uni.Sample
End Sub
Als letzter Schritt wird am Ende der Störung erneut ein Auftrag mit der Produktion des Standardproduktes gestartet und mit der ScheduleSub-Methode die nächste Störung geplant.
Sub Restart_Production(cop As OrderOperation)
'at the end of the Off-Spec Production a new normal production order is started
count+=1
Dim o As New Order
o.Name = "Production Order " & count
o.Recipe = Recipes("Continuous Production (V1)")
Orders.Add o
'to call next Off-Spec production ScheduleSub is used again, using a sample form the normal distribution representing the inteval of failure
Simulation.ScheduleSub ("Macro1.OffSpec_Production",norm.Sample,DateReferenceType.bRelative,Units("Reactor"))
End Sub
In dem aus diesem Beispiel resultierenden Gantt-Diagramm (Abbildung 9) kann man nun die Zeiträume, in denen Ausschussmaterial produziert wird, deutlich erkennen (grün). Im Füllstandsgraphen ist auch zu erkennen, dass während dieser Zeiträume das Material in den Off-Spec Tank transferiert wird, während sonst der Product Tank befüllt wird.
Im Download-Bereich steht das Beispielmodell sowie ein PDF-Ausdruck dieses Tipps & Tricks zur Verfügung.
Fragen?
Möchten Sie mehr über dieses Thema erfahren oder haben weitere Fragen? Bitte kontaktieren Sie uns.
Mehr Tipps & Tricks
Benutzerdefinierte Farben im INOSIM Gantt-Diagramm
Das INOSIM Gantt-Diagramm bietet die Möglichkeit, Belegungsbalken auf Basis verschiedener vordefinierter Attribute zu färben. In der Auftragssicht ist es möglich, das Farbschema sowohl mit dem…
Laufzeitfehler vermeiden und benutzerdefiniert abfangen
Dieser Tipp & Trick beschreibt eine Vielzahl von Methoden zur Vermeidung und Behandlung von Laufzeitfehlern in Ihrem VBA-Code. Sie werden mit den FindColumn– und FindRow-Methoden…
Intervall-Auswertung des Transfer-Reports
Intervall-Auswertung des Transfer-Reports In diesem Tipp stellen wir Ihnen vor, wie Sie aus den von INOSIM erzeugten Reports automatisiert per VBA weitere Daten berechnen, um…