Programm Simulation &Test

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich will niemanden davon abhalten etwas selbst zu programmieren und dabei seine Kenntnisse zu erweitern.

Aber dass was der Fragesteller hier programmieren möchte, ist in dem oben genannten SPS-VISU schon beinhaltet.
In SPS-VISU ist eine über TCP/IP ansprechbare S7-SoftSPS vorhanden, über die Bauteile in SPS-VISU kann die Anlage abstrahiert werden, damit die Fortschaltbedingungen nicht von Hand herbeigeführt werden müssen.
Ebenso kann WinCC flexible, eine Visualisierung, Touchpanel mit Ethernet usw. mit der S7-SoftSPS verbunden werden.

Bei privatem Einsatz kann die sehr kostengünstige Standardversion (59 Euro) verwendet werden.


Gruss
T. Weiss


Der versteh ich noch net so ganz....

Ich will eigentlich meine Programmierung testen und dafür möglichst wenig umschreiben im Programm. Es sind Zusammenhänge über die PLCSIM oder auch gern ein anderes Tool zu realiesieren.

Beispiel 1: Rohwasserventil AUF = Durchfluss von X m³/h an dem dazugehörigem IDM ( Analog Wert )

Beispiel 2: Pumpe an = Druck an dem dazugehörigen Drucktransmitter von X bar

Beispiel 3: FU geregelte Pumpe möglichst ist das komplette Regelverhalten zu Simulieren

Beispiel 4: Wenn die Dosierpumpe angesteuert wird = stellen sich gewisse Werte an den dazugehörigen Qualitätsmessungen ein

Undsoweiter und etc. ...........
 
Hallo,


zu Beispiel 1:
Es wird ein Schieberegler für den analogen Eingangskanal verwendet. Auf diesem wird der Eingangsbereich (0-10V, 4-20mA ...) selektiert. Damit kann der physikalische Wert innerhalb dieses Bereichs verändert werden. Der analoge Kanal wird dabei mit dem entsprechenden EW verknüpft.
Ebenso könnte das Verschieben simuliert werden, indem in SPS-VISU ein Positionsmess-Stab verwendet wird. Der Mess-Stab liefert den Bereich 0-27647 und wird dabei über ein sich bewegendes Objekt überfahren und verändert. Dass den Mess-Stab betätigende Objekt bewegt sich, sobald ein bestimmter Ausgang im SPS-Programm den Wert 1 hat.


Beispiel 2:
Ähnlich wie Beispiel 1. Druck wird über einen analogen Kanal vorgegeben oder über Mess-Stab.


Beispiel 3:
Das komplette Regelverhalten eines FU kann nicht simuliert werden. Hier sollte man unter Umständen einen anderen Modus von SPS-VISU verwenden, nämlich die Möglichkeit, dass die Eingangssignale der Anlage auf eine reale CPU geschrieben werden. In diesem Fall wird der realen CPU die virtuelle Anlage aufgeprägt. Die S7-SoftSPS in SPS-VISU ist dabei abgeschaltet.

Beispiel 4:
Qualitätsmessungen ist etwas unspezifisch. Wenn es sich um analoge Werte handelt, dann siehe oben. Bei Binärsignalen kann dies über Taster, Schalter, Endschalter, sich bewegende Objekte usw. realisiert werden.


Wenn man ein 100%iges Zeitverhalten simulieren möchte, dann ist dies meiner Meinung nach auf einem Windows-PC (ohne Hilfsmittel) nicht möglich, denn hier liegen die Reaktionszeiten in anderen Zeitkategorien.


Gruss
T. Weiss​
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist gar net so einfach, es hängt an allen ecken und Kanten :)

Kennst sich wer von euch so richtig gut in Visual basic 2008 Express Edition aus???
 
Zuletzt bearbeitet:
Hallo Dummbatz,

Wenn es "hackt", dann sollte man sich vielleicht die vielen, tausenden Video-Blogs zu "Visual Basic" im Internet ansehen.

Viel Erfolg.
 
Die helfen mir grad auch nicht denke ich, ich bin schon am googlen wie sau,... für Visual basic 6.0 oder .NET gibt es auch schon Beispiele von Siemens zur Einbindung von S7ProSim. Bei 2008 allerdings kommt er damit nicht klar. Beim Debuggen kommt ne Fehlermeldung und er benutzt des COM Objekt nicht.



 
Zuletzt bearbeitet:
Ich musste doch wieder auf C# wechseln, bei Python gibt es so ein paar Beschränkungen.

Ich habe mal eine Grundstruktur aufgebaut wie man so eine Simulationsbibliothek aufbauen könnte. Quasi als Diskussionsgrundlage.

Die Ganze Plcsim-Anbindung habe ich in eine eigene Klasse gepackt, so kann man einfach über ein Write("E0.0", true) oder Write("PEW256", 27648) Werte in die Simulation schreiben oder mit Read("A0.0") Daten lesen.
Die Verwaltung von mehreren Plcsim Instanzen geht auch. Z.B. mit Write("3:pEW256", 27648) würde der Wert 27648 in die 3. Plcsim-Instanz geschrieben.

Ich habe mal ganz einfache zwei Simulationsobjekte erstellt.
- eine Pumpe mit Einschaltbefehl von der SPS und einer Betriebsrückmeldung
- ein Pumpendurchfluss mit einem analogen Eingang

Die Simulationsobjekte werden so angelegt:
Code:
P1 = new Pumpe("Pumpe 1", "A1.0", "E1.0");
P2 = new Pumpe("Pumpe 2", "A1.1", "E1.1");
P1_Durchfl = new PumpenDurchfluss("Pumpe 1 Durchfluss", "PEW512", P1.IsOn);
P2_Durchfl = new PumpenDurchfluss("Pumpe 2 Durchfluss", "PEW514", P2.IsOn);

Über den Callback P1.IsOn wird der Pumpendurchfluss mit der Betriebsmeldung der Pumpe verknüpft.

Die Simulationsobjekte werden einer Liste hinzugefügt und dann in einem Timer-Event nacheinander abgeklappert, womit man aber letztendlich nicht mehr viel zu tun hat.
Das Erstellen und Verknüpfen der Simulationsobjekte beschränkt sich also letztendlich auf den Code oben.

Meinungen?
 

Anhänge

  • Prozesssimulation.zip
    101,5 KB · Aufrufe: 164
Welche Beschränkungen gibt es denn dabei?

Die Beschränkung liegt nicht direkt bei Python, sondern in der pywin32 Bibliothek mit der man überhaupt erst Zugriff von Python auf das Prosim-COM-Objekt bekommt.
Der Zugriff funktioniert generell zwar, aber man kann nur einzelne Bits oder 4 Byte Typen auf mal schreiben. Also einzelne Bytes oder Int/Word, kann ich nicht schreiben. Das hat was mit dem Variant-Datentyp zu tun, denn an dem Typfeld des Variant entscheidet Plcsim wie viele Bytes geschrieben werden sollen. Das Lesen geht aber, weil man da die Zugriffsbreite über einen Parameter einstellt.
 
Alles im Griff

So Jungs bis jetzt sieht es gut aus...

Jetzt nur noch erweitern.

Ich kann BITS, BYTES, Worte oder Doppelworte lesen und schreiben...

Kann die PLC Sim beeinflussen wie ich mag... die COM Schnittstelle zur PLCSIM über das PROSIM geht super...

'Get MB10 cyclic by Visual Basic Timer
PrivateSub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
' Initialiesierung und Definition der Werte
Dim Value AsUShort
Dim Pumpe AsBoolean
Dim Druck As Int16
Dim Druck2 As Int16
Dim Ausgang_Pumpenbyte As Int16
Dim Ausgang_Pumpenbit As Int16
Dim Rueck_Pumpenbyte As Int16
Dim Rueck_Pumpenbit As Int16
Dim Druck_eingabe As Int16
Dim Druck_PEW As Int16
Dim Druck_eingabe2 As Int16
Dim Druck_PEW2 As Int16


'Anlagenwort lesen der Dezimalzahl
MyProSim.ReadFlagValue(10, 0, S7PROSIMLib.PointDataTypeConstants.S7_Byte, Value)
txtValue.Text = Value
'Anlagenwort lesen der einzelnen Bits
MyProSim.ReadFlagValue(10, 7, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit7.Checked)
MyProSim.ReadFlagValue(10, 6, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit6.Checked)
MyProSim.ReadFlagValue(10, 5, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit5.Checked)
MyProSim.ReadFlagValue(10, 4, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit4.Checked)
MyProSim.ReadFlagValue(10, 3, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit3.Checked)
MyProSim.ReadFlagValue(10, 2, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit2.Checked)
MyProSim.ReadFlagValue(10, 1, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit1.Checked)
MyProSim.ReadFlagValue(10, 0, S7PROSIMLib.PointDataTypeConstants.S7_Bit, chkbBit0.Checked)
'Pumpe1 lesen des Ausgangs
Ausgang_Pumpenbyte = NumericUpDown1.Value
Ausgang_Pumpenbit = NumericUpDown2.Value

MyProSim.ReadOutputPoint(Ausgang_Pumpenbyte, Ausgang_Pumpenbit, S7PROSIMLib.PointDataTypeConstants.S7_Bit, Pumpe)
'Abfrage auf den Zustand der Pumpe und eingebaren Wert f�r das PEW sowie R�ckmeldung
Rueck_Pumpenbyte = NumericUpDown4.Value
Rueck_Pumpenbit = NumericUpDown3.Value
'Lesen aus Eingabefelder
Druck_eingabe = NumericUpDown5.Value
Druck_PEW = Int(NumericUpDown6.Value)
Druck_eingabe2 = NumericUpDown8.Value
Druck_PEW2 = Int(NumericUpDown7.Value)
'Abfrage
If Pumpe = TrueThen Druck = Druck_eingabe Else Druck = 0
If Pumpe = TrueThen Druck2 = Druck_eingabe2 Else Druck2 = 0
'Schreiben der R�ckmeldung
MyProSim.WriteInputPoint(Rueck_Pumpenbyte, Rueck_Pumpenbit, Pumpe)
'Schreiben der PEWs wenn checkBox gesetzt
If CheckBox1.Checked = TrueThen
MyProSim.WriteInputPoint(Druck_PEW, 0, Druck)
MyProSim.WriteInputPoint(Druck_PEW2, 0, Druck2)
EndIf
EndSub


__________________________________________________________

Nen Teil an Code hab ich weggelassen, weil es das Siemens Beispiel Projekt ist. Wichtig ist das Format INT16 weil in der "hochsprache" das INT 32 Bits hat. Das hat ne menge Zeit beim Debuggen gefressen, weil man das Nachbar PEW mit überbügelt hat.
 

Anhänge

  • VB_Beispiel.jpg
    VB_Beispiel.jpg
    49,2 KB · Aufrufe: 41
Zuletzt bearbeitet:
@dummbatz
Ist das nur ein Testprogramm, oder willst du deine Simulation wirklich in diesem Stil programmieren?
Ich meine wenn du jedes Objekt so ausprogrammieren willst, ist erstens nichts wiederverwendbar und zweitens ist das doch total aufwändig.
Diese Verquickung von GUI und Programmlogik ist bei VB-Programmen symptomatisch, das kann man wohl nicht ändern.

Hast du dir meinen Ansatz mal angesehen? Auch wenn es in C# geschrieben ist, in VB.net kann man genauso objektorientiert programmieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@dummbatz
Ist das nur ein Testprogramm, oder willst du deine Simulation wirklich in diesem Stil programmieren?
Ich meine wenn du jedes Objekt so ausprogrammieren willst, ist erstens nichts wiederverwendbar und zweitens ist das doch total aufwändig.
Diese Verquickung von GUI und Programmlogik ist bei VB-Programmen symptomatisch, das kann man wohl nicht ändern.

Hast du dir meinen Ansatz mal angesehen? Auch wenn es in C# geschrieben ist, in VB.net kann man genauso objektorientiert programmieren.

Das auf den Windows Forms ist grad nur ein Versuch, des wird noch anders aufgebaut. Dann arbeite ich auch als Objekt eine Windoof Form als Ventil, wo ich die Daten schreibe und das zig mal Aufrufe je nach dem wieviele Ventile ich habe. Bei Pumpen genauso.

Ich wollte euch hiermit eigentlich nur die Problematik mit dem Integer Format in Visual_Basic und S7 nahe bringen. Damit nicht weitere über diese steine stolpern.

Int16 ist hierfür der Schlüssel zum Erfolg.

Auf jedenfall ist das mit den Dropdown Menüs eine gute sache.
So möchste ich später am Objekt auch die Adressen zuweisen.

:cool:ROFLMAO::-D
 
Ich wollte euch hiermit eigentlich nur die Problematik mit dem Integer Format in Visual_Basic und S7 nahe bringen. Damit nicht weitere über diese steine stolpern.

Int16 ist hierfür der Schlüssel zum Erfolg.
Das ist nicht nur bei VB so, sondern auch bei allen anderen Sprachen in denen das COM-Objekt verwendet wird. Bei C# sind die Datentypen ebenfalls Int16 und Int32. Wie das Prosim-Objekt mit dem Variant Typ umgeht, habe ich direkt einen Post über die (bzw. Seite vorher) geschrieben.

Auf jedenfall ist das mit den Dropdown Menüs eine gute sache.
So möchste ich später am Objekt auch die Adressen zuweisen.
Warum willst du die Adressen denn über die GUI einstellbar machen, wenn der eigentliche "Prozess" nur im Code ausprogrammiert werden kann? Das könnte man nur gebrauchen, wenn du immer das gleiche Programm hast, sich aber nur die Adressen verändern. Und das ist doch eher unwahrscheinlich.

Aber wenn das nur ein Anfang ist, wirst du irgendwann selber dahinterkommen dass du mit diesem Ansatz ab einer gewissen Komplexität in einer Sackgasse landest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Thomas_v2.1

Ich hab leider kein C hier auf meinem Rechner, konnte mir des leider nicht so anschauen. Und mit dem Editor bekomm ich es nicht auf.

Mein ziel ist es so auszuprogrammieren, das ich die Adressen über die Menüs in eine Art Liste schiebe....

Bezeichnung / Ausgang / Rückmeldung / Analogwert1 / Analogwert2
Eintrag1
Eintrag2
.
.
.
Eintrag 150

dieses für Ventile und für Pumpen

Je nach Anzal der Einträge wird der Code bearbeitet.
 
Zurück
Oben