# 3D Anlagensimulation



## Thomas_v2.1 (4 Februar 2012)

Ich starte diesen Thread mal als Fortsetzung dieses Threads
http://www.sps-forum.de/showthread.php/38954-Simulation-mittels-PLCSIM
da ich das Blender Paket mittlerweile schon das ein oder andere Mal per Email verschicken musste.

Ich habe es extra nicht unter "Simatic" gepostet, da man eigentlich relativ einfach durch Austausch der SPS-Anbindungsschnittstelle die Simulation auf andere Steuerungen anpassen kann. Die Beispiele von mir sind momentan aber auf eine S7-Steuerung mit Plcsim zugeschnitten.

Als erstes werde ich die in dem Dokument aus dem anderen Thread beschriebenen Blender Beispiele posten.

Als Alternative zu Blender habe ich auch schon ein paar Tests mit dem UDK (Unreal Development Kit) gemacht, aber dazu evtl. im weiteren Verlauf mehr.


----------



## Thomas_v2.1 (4 Februar 2012)

Simulation mit Blender

Blender ist eine freie 3D-Grafiksoftware. http://de.wikipedia.org/wiki/Blender_(Software)
Unter anderem besitzt diese auch eine Game-Engine mit der man Spiele programmieren kann, oder in diesem Falle auch eine Anlagensimulation.

Blender Grundinstallation

Meine Demodateien habe ich Ende 2010 erstellt.
Momentan gibt es eine neue Blender Version. An der Blender API gab es einige Änderungen, und es wird eine nicht abwärtskompatible neue Python
Version 3 verwendet.
Ich habe zwar die Beispiele auf meinem Rechner schon für die neuen Versionen hochgezogen, aber gibt noch ein paar Probleme. Eine richtige Neuerung in Blender sehe ich momentan noch nicht. Darum würde ich zum Testen die Versionen verwenden die in der Dokumentation angegeben sind. Diese wären:

Blender:
Blender Version 2.49b (blender-2.49b-windows.exe) from
http://download.blender.org/release/Blender2.49b/

Python Version 2.6.6
http://www.python.org/download/releases/2.6.6/

Python for Windows extensions:
pywin32-216.win32-py2.6.exe from
http://sourceforge.net/projects/pywin32/files/pywin32/Build216/

Die weiteren Installationsschritte sind in dem pdf aus dem anderen Thread beschrieben.


----------



## Thomas_v2.1 (4 Februar 2012)

Python Klasse zur Anbindung an Plcsim

Um die Blender-Laufzeit an Plcsim anzukoppeln, habe ich eine kleine Python-Klasse geschrieben welche die Funktionen um Daten aus Plcsim zu lesen / zu schreiben beinhaltet.
Die python Klasse ist Python Version 3 kompatibel.

Die zip-Datei im Anhang beinhaltet folgende Dateien:
- plcsim.py:		Klasse für die Plcsim Anbindung
- use_plcsim.py:	Testfunktionen um die plcsim.py zu testen

Die *.py Dateien enthalten direkt den Python-Quellcode, können also mit einem Texteditor eingesehen und bearbeitet werden.

Momentan gibt es aber noch folgendes Problem:
Die Plcsim-Schnittstelle ist ein COM-Objekt (S7ProSim) welches vom Variant-Datentyp gebrauch macht.
Da in Python der kleinste Datentyp immer 4 Bytes hat, lassen sich keine 2-Byte oder 1-Byte Variablen in einem Rutsch schreiben, sondern müssen über einzelne Bits geschrieben werden.
Da nicht sichergestellt ist dass dieses in einem SPS-Zyklus geschieht, kann das SPS-Programm währenddessen evtl. falsche Variablenwerte lesen.
Das Problem besteht aber _nur_ beim Schreiben von Variablen, und nicht beim Lesen.


----------



## Thomas_v2.1 (5 Februar 2012)

Blender - Würfel bewegen

Sozusagen das "Hallo Welt" Programm der Blender-Plcsim Anbindung.

In der Szenerie ist ein Würfel (Cube) und ein Objekt PlcConnection zu finden.
Ist PLCSIM gestartet kann dieses Beispiel direkt gestartet werden. Das Starten der GameEngine
geschieht über die Taste "P" oder alternativ über den Menüpunkt Game->Start Game.
Beendet wird es über die ESC-Taste.
Ist die Gameengine gestartet kann der Würfel mit den Variablen MW100 und MW102 in der X- und
Y-Richtung positioniert werden.
Beim Start der Gameengine wird das Programm PlcConnectionInit aufgerufen. Wenn dies der erste
Aufruf war, wird das modul plcsim (also die Klasse plcsim aus der Daten plcsim.py welche sich im
gleichen Verzeichnis wie die .blend Datei befinden muss) geladen und eine Verbindung zu PLCSIM
hergestellt.
Zusätzlich wird hier ein Abfangen der ESC-Taste eingebaut, damit die Verbindung zu PLCSIM
korrekt getrennt wird.

Läuft die Gameengine so wird zyklisch das Programm PlcReadPosition aufgerufen welches an das
Objekt Cube gekoppelt ist.
Das Programm liest aus der SPS den Wert der Variablen MW100 und MW102, und setzt die
Objektposition des Cube auf diesen Wert. Die Division durch 100.0 findet nur statt damit sich das
Objekt feiner bewegen lässt. Die Werte von MW100, MW102 können z.B. Über eine
Variablentabelle geschrieben werden.


----------



## Thomas_v2.1 (20 Juni 2015)

Ich habe mal ein kleines Übungsmodell für Programmiereinsteiger gebaut.
Es ist eine Art Prägemaschine wie es in der Art auch in einem SPS-Buch von Zastrow zu finden ist. Es dient zur Übung von Schrittketten. Wer Interesse hat daran rumzuspielen, kann mir eine PN schicken und bekommt dann die Blender-Dateien.

Kleines Video:
https://www.youtube.com/watch?v=PQjKD0V3lkM

Ich habe das außerdem Konzept etwas überarbeitet:
Es läuft im Hintergrund eine Art Datenserver, der bestimmte Objekteigenschaften automatisch mit SPS-Variablen versorgt, und Rückmeldungen wieder in die SPS schreibt. So lässt sich in Blender das meiste über die dort vorhandenen Logic-Bricks erledigen, und es muss für einfache Dinge nicht mehr unbedingt aus Python zurückgegriffen werden. Das Beispiel ist komplett mit Logic-Bricks erstellt.

Außerdem ist es so relativ einfach um eine Ankopplung an andere SPS Steuerungen über das Schreiben eines Treibers in Python erweiterbar. Zur Zeit ist ein Treiber für S7-Plcsim (Step7 5.x) und Beckhoff ADS vorhanden.
Ein Treiber für Codesys auf dem Raspi wäre was, da weiß ich aber nicht was dort für eine Kopplung möglich ist, und vor allem wie schnell. Das Lesen/Schreiben eines Datensatzes sollte auf jeden Fall unter 10ms liegen.


----------



## Thomas_v2.1 (9 April 2022)

Ich grabe das mal wieder aus...

Mit der Version 2.8 von Blender wurde die Gameengine aus dem Hauptprogramm entfernt. Es gibt jetzt aber schon seit einiger Zeit ein Projekt namens "UPBGE" welche die Gameengine weiterpflegen und immer in die aktuelle Blenderversion einbauen (aktuell 3.1). Die verwenden sozusagen den Haupt-Quellcode von Blender, und bauen da den bisherigen Gameengine Code wieder ein, somit wird die Gameengine aktuell unabhängig von Blender selber weiterentwickelt.

Ich habe mir darum UPBGE mal angesehen. Das Programm muss man sich nicht einmal mehr installieren, Archiv entpacken und die exe starten und los gehts. In Blender selber hat sich einiges getan, an der Gameengine und der Api nichts grundlegendes verändert. Zumindest lassen sich auch die Beispielprojekte von damals noch öffnen. Es fehlen nur einige Texturen, da muss ich mal sehen warum die auf der Strecke bleiben.

Nur die Anbindung an Plcsim über S7ProSim ist schwierig, da die aktuelle UPBGE nur als 64 Bit Anwendung läuft, und demnach auch ein 64 Bit Python-Interpreter läuft. Das hat zur Folge, dass sich die 32-Bit S7ProSim-Schnittstelle aus 64 Bit Anwendungen nicht mehr ansprechen lässt. Da diese als In-Process Server ausgelegt ist, lässt sich das auch nicht so einfach beheben. Mit einer kleinen TCP Client/Server Schnittstelle lässt sich das aber beheben.

Über Python-snap7 lässt sich das auch direkt an eine echte SPS koppeln, aber die Schnittstelle müsste schon einigermaßen schnell sein. Mit Nettoplcsim+Plcsim im LAN ist das aber auch möglich.

Es gibt zumindest 1-2 Leute von denen ich weiß, dass die das noch verwenden. Darum wollte ich das einfach mal wieder beleben. Wenn Interesse besteht könnte ich eine aktuelle Basisversion z.B. mal bei github als Projekt starten.


----------

