# Kommunikation Siemens S7-200 mit JAVA



## raptorrs (22 Juli 2008)

Moin Zusammen! 

Ich habe hier ein echtes Problem, bei dem ich überhaupt nicht weiss, wie ich die Lösung angehen soll.  

Die Situation: 

Es gibt einen zentralen Rechner mit einer SAP-Datenbank.  
Aus dieser Datenbank holt sich ein Java-Programm in bestimmten Zeitabständen Produktionsaufträge.  
Diese Produktionsaufträge werden in einer JTable zeilenweise dargestellt. 
Ein Mitarbeiter soll nun durch Anklicken einer Zeile einen dieser Aufträge auswählen.  
Bei Klick auf einen "START-Button sollen einige dieser Daten in die Steuerung einer Produktionsmaschine  
übertragen werden. Die Siemens-Steuerung ist im Moment durch eine einfache Klasse simuliert,  
die die Daten entgegennimmt und nach einer gewissen Zeit eine Fertigmeldung zurückgibt.  
Das Java-Programm funktioniert soweit tadellos. 

Die Maschinensteuerung ist wie gesagt, eine Siemens S7-200, CPU 222.  
Sie ist ausgerüstet mit einem Kommunikationsmodul CP243-1.  
Die Vebindung geschieht über ein Crossover-Ethernet-Kabel. 

Es gibt ja die legendären S7-Get und -Put Applets, die als Stand Alone Application direkt im CP243-1 ablaufen.  
Mit diesen Applets lassen sich via Ethernet die Schaltzustände durchaus anzeigen und auch ändern.  
Diese Applets sind aber im Moment auch witzlos für mich, da ich nach wie vor die Informationen nicht in mein Java-Programm bekomme. 

Meine Frage ist nun: 

Wie bekomme ich meine Daten aus dem Java-Programm in den Datenbaustein der S7-Steuerung?  
Ich lese überall von WinCC, Libnodave, OPC etc., aber all das hat mir bisher nicht wirklich weitergeholfen.


Danke schon mal im Voraus!!


----------



## Rainer Hönle (22 Juli 2008)

Wie erfolgt der Zugriff von Java aus auf eine normale Win32-DLL? Wenn dies geklärt ist, kommen eine Vielzahl von Bibliotheken wie libnodave, AGLink etc. in Frage. Oder ist dies bereits das Problem?


----------



## johnij (22 Juli 2008)

Hallo,

(C/c++,C#..... application: mit den entsprechenden DLL-Befehle zum RS232 Zugriff )<---> RS232<--->CPxyz<-->SPS ( get,Xrecv,Xsend.......) ...


johnij


----------



## Rainer Hönle (22 Juli 2008)

johnij schrieb:


> Hallo,
> 
> (C/c++,C#..... application: mit den entsprechenden DLL-Befehle zum RS232 Zugriff )<---> RS232<--->CPxyz<-->SPS ( get,Xrecv,Xsend.......) ...
> 
> ...



Die 232-Befehle werden bei der 243-1 scheitern.


----------



## johnij (22 Juli 2008)

Rainer Hönle schrieb:


> Die 232-Befehle werden bei der 243-1 scheitern.


 

ich habe bis jetzt nicht das Vergnügen, es bei mir auszuprobieren.

Ich glaube, man soll beim

http://entwickler-forum.de/ gucken


Gruß

johnij


----------



## raptorrs (22 Juli 2008)

@Rainer Hönle

Genau hier startet das Problem. ich habe keine Ahnung, was als erster Schritt erforderlich wäre.
ich komme ja per Ethernet rein in die CP 243-1.

Wenn ich weiss, welche .dll angesprochen werden soll, werde ich mich sofort darum kümmern.
Ich bin wirklich ein totaler Laie in diesem Bereich, sorry.


----------



## Rainer Hönle (22 Juli 2008)

Der erste Schritt ist die Einbindung einer Kommunikations-DLL in Java. Die erledigt dann den Rest. Ich weiß zwar, dass Kunden unser AGLink mit Java einsetzen, ich weiß aber nicht wie. Ich werde mich aber noch einmal schlau machen (zumindest versuchen). Das Ganze läuft nachher schon auf einem Standard-PC unter Win32?


----------



## raptorrs (22 Juli 2008)

Ja, Herr Hönle,

der Rechner, aud dem die JAVA-Applikation läuft, ist ein normaler Windows XP - Rechner.

Ich wäre Ihnen wirklich dankbar für weitere Hinweise!


----------



## Rainer Hönle (22 Juli 2008)

Ich schaue was ich tun kann. Wird aber ziemlich sicher Donnerstag, bis ich die Infos habe.


----------



## Helmut (22 Juli 2008)

Hallo,

nur mal rein informativ.

Verwendest du den CP243-1 oder den CP243-1IT?

Soweit ich weis, versteht der CP243-1 nor S7 Kommunikation via TCP/IP.

Nur der CP243-21IT kann was mit Java und Applets.

Vieleich grenzt das dein Problem ein.

gruss

helmut


----------



## raptorrs (22 Juli 2008)

Danke, Helmut. Ein Guter Hinweis.

ich habe schon versucht, den Unterschied zwischen der  CP 243-1 und der CP 243-1IT herauszufinden.

Was ist der Unterschied zwischen diesen beiden Modulen?

Gruss

raptorrs


----------



## Helmut (22 Juli 2008)

Hi,

zusätzlich zu den Funktionen des CP243-1 hat der CP243-1IT:

+ Integrierten WEB-server mit 8MB Speicher für Dateisystem
+ SMTP Client (E-Mail Client)
+ FTP Server/Client

hoffe ich hab nichts vergessen.

Gruss
helmut


----------



## tobias (22 Juli 2008)

Hallo
ein Ansatz in die Richtung welchen ich mal versuchte könnte u.a. 'XML_RPC' sein. Besonders in Java quillt das Internet dazu mit 'Frameworks' aller Coleur über. Allerdings schmiß ich nach drei durchgeackerten 'Eclipsen' oder wie das Zeug sonst noch hieß den Mist (Java) ultimativ in die Ecke und besann mich aufs C-zurück.
(http://xmlrpc-c.sourceforge.net/doc/)
Bei Java gelangs mir jedoch ziemlich schnell Verbindungen und Datenübertragung vom CP243-1 zur, in einem angehängten Linuxsystem installierten, Hardware (Analogports) herzustellen. Allerdings war das Einbinden von Protokollanpassung und Verbindungsaufbau in den RPC-Proxy nicht ganz 0815. 
Im Endeffekt fehlten dann auch noch einige Dekodierungsmechanismen um vom CP243-1 versandten 'Slang' überhaupt vollständig auswerten zu können - allerdings sind alle erforderlichen Infos dazu ja in der Libnodave enthalten und einzusehen.

Der Ablauf hingegen ist eher trivial. Der CP243 wurde bei mir als Client und die Verbindung zu dem auf Port102 auf dem Zielsystem gestarteten ( wie gesagt etwas ummodellierten !!!) RPC-Server per dessen IP-Adresse konfiguriert. Da ich auf Einbau einer vollständigen Dekodierung der abgesandten Telegramme dabei verzichtete und mich mit sporadischer Trefferquote durch zurückgesandte 'Steuerzeichen' zufrieden gab weiß ich allerdings nicht welche Feinheiten im Endeffekt bei vollständiger Kontrolle über den Verbindungsaufbau da sonst noch zu beachten wären ! Ganz easy scheints nicht aber auch dazu sind ja alle erforderlichen Infos in der Libnodave enthalten und einzusehen.
Wird ein Telegramm in der äußeren Socket des RPC-Proxys empfangen und kann (wie auch immer) ausgewertet werden übergibt die äußere Socket den auszulesenden Adressbereich (z.Bsp. 'Sätze' der Datenbank) an die innere (Client)Socket des RPC-Proxys und diese startet das Einlesen und anschliessende Versendung ( bei mir: per libnodave ISO_TCP2) in den DB der CPU. That's all - etwas einfacher gings nur per CGI (oder PearlScript) wobei das Problem der Telegrammdekodierung und der Verbindungssteuerung zum CP243 allerdings auch nicht 'einfach' zu lösen ist.
Ich wollte es mal mit XML überhaupt in der Richtung probieren - ansonsten ist die CGI-Variante bei ausreichend vorhandenen Rechten auf dem Zielsystem (das CGI läuft am Webserver gekoppelt und darf nicht in jedem Fall die 'Sandkiste dort' verlassen um durchs System zu toben ...) unterm Strich einfacher und mit erheblich weniger 'Protokolloverhead' behaftet. Jedoch ist dort die Übergabe und Auswertung des 'Enviromentsstrings' vom CP243 eher ein noch grösserer Akt als in den halbwegs vorgefertigten RPC-Proxys. Quellen etc. bei sourceforge wo's ja auch das libnodave gibt :-D
Gruss
tobias


----------



## Helmut (22 Juli 2008)

Hallo,

@Tobias,
da ich mich hier nicht auskenne versteh ich nur Bahnhof, aber das scheint nach deinen Ausführungen ja doch zu funzen.

gruss
helmut


----------



## tobias (22 Juli 2008)

Hallo Helmut
Jain, würd ich mal sagen nachdem was ich so probiere.
Es gibt zwei Probleme: 
a) der Verbindungsaufbau und dessen Steuerung
b) die besagte Decodierung des TCP_ISO Telegramms.
Mein Versuchsaufbau sieht so aus: Hier habe ich 'ne CPU226 + CP243-1 (oder manchmal auch 243-1IT) stehen und einige Strassen weiter ein Linux Embedded System wo ich ggflls. das Licht mit schalten, Daten einlesen etc. kann. Und damit funktionierts - weil da irgendwie im Laufe der Zeit alles so hingebogen wurde das es geht. Zu verallgemeinern ist es aber nicht - derselbe Aufbau dann in z.Bsp. Modbus/TCP und angehängtem WagoController vom CP243-1 angesteuert versagt kläglich. Da ist immer so einiges denn auch dem passenden Zufall überlassen ...
Was aber sicher geht ist ein ganz genereller Datenaustausch über die Ethernetschnittstelle sowohl des CP343-1 als auch des 243-1. Zum Beispiel bei mir mit positiver Flanke an E0.1 ins Internet versendeter 'String' 'Otto' wird mittlerweile vorstellungsgemäß vom Server auf dem emb. System erkannt und dann als 'Otto war hier am 21.07.2008 um 13:12:11' an vorgesehener Stelle zurück in in den DB der CPU verfrachtet. Daraus schließe ich das man es so machen könnte wenn man wüßte was genau erforderlich ist. Da lauern anscheinend die ganz großen Unterschiede - das erste 'Framework' was ich ergriff hatte 2,5GB und kam mit den knapp 2kB produzierten Programmcode auf dem embedded nicht klar weil einige PlugIns noch fehlten .... kurzum ist mir nicht so richtig klar wie es herauszufinden ist was genau dazu minimal (==maximal) erforderlich ist damits _richtig_ funzt. 
Und bisher gibts anscheinend auch noch die Einschränkung der 'Transportkapazität'. Mir gelangen bisher maximal 128Byte zu versenden - gedacht wars eigentlich den kompletten Inhalt eines DB's für ein Textdisplay (ca. 1,4 - 2,8kB) in quasi 'einem Rutsch' zu verfrachten. Ich meine das müßte gehen weil der Anwenderprogrammbaustein einer 226 z.Bsp ja auch 24kB haben kann und das sicherlich nicht in 127ByteStücken verladen wird ? 
Ich probier da jedenfalls immer mal wieder dran rum - vielleicht hat man ja mal Glück ....


----------



## Helmut (23 Juli 2008)

Hallo,

wenn alle S7-200 über LAN am gleichen Netz hängen, würde ich folgendes vorschlagen:

Kommunikation von deinem Linux über FTP zu den S7-200, die einen CP243-1IT haben. (mit FTP hast du keine Einschränkung bezüglich der Datenmenge). Die Daten werden auf dem Speicher des CP's abgelegt und können dann von der CPU per AWP gelesen werden. Die CPU kann mittels FTP Daten direkt von V-Speicher aus der CPU auf dein Linux übertragen.

Die Daten dann von dieser CPU mittels Ethernet dann auf andere Stationen übertragen. Einschränkungen hierbei: Je CP nur 8 Kanäle (Client oder Server, nicht dynamisch), je Übertragung max ~210Bytes.

Das ist aber alles mit den Standardkom-Arten der CP. Da du anscheinend schon was "selbstgestricktes" hast und das auch (teilweise?!?) funktioniert, ist dein Ansatz das zu erweitern warscheinlich besser, da flexibler. Denn mittels der Standardkomunikation  der CP's kommst du nicht auf deine Modbus/TCP.

Hoffe ichg konnte die was helfen.

Gruss

helmut


----------



## Rainer Hönle (25 Juli 2008)

@raptorrs:
So, habe mich jetzt schlau gemacht. Zu AGLink habe ich nichts fertiges im Hause. Deshalb mein Angebot: Wenn AGLink (siehe http://www.deltalogic.de/content/view/21/38/lang,de/) für die Lösung in Frage kommt, werde ich ein Java-Interface dafür erstellen (lassen). Welche Funktionalität wird überhaupt benötigt bzw. soll als erstes zur Verfügung gestellt werden?


----------



## raptorrs (26 November 2008)

Guten Morgen, Zusammen!
Ich war eine ganze Zeit lang nicht mit dem Projekt beschäftigt, bin aber seit einigen Tagen wieder dran.
In der Zwischenzeit konnte ich zumindest die Verbindung zum C243-1 herstellen, das heisst, ich kann einen erfolreichen Ping an den CP senden.
Weiterhin habe ich einen Java-Treiber S7CMX gefunden. Habe es damit hicht hinbekommen, helfen konnte man mir bei der SoftwarFactory auch nicht. Problem: Ständig fliegt die Exception: Socket ot Stream closed.
Ich habe DeltaLogic angerufen, die haben nichts in Pure Java im Hause.
Dann gibt es noch das legendäre Libnodave. Auch das habe ich probiert, leider auch ohne Erfolg. 

Meine Frage, klipp und klar:
Kann mir eine(r) von Euch Profis ein kleines S7-Programm schreiben, welches unter Zuhilfenahme von Libnodave (oder des S7CMX-Treibers) ein paar Daten in die Steuerung einliest und ein paar andere wieder ausgibt?

Ich zahle natürlich auch dafür, versteht es als offizielle Anfrage, wenn Ihr wollt. 

Danke Im Voraus!!!


----------



## tobias (26 November 2008)

Hallo
ich gehe mal davon aus dass die anfangs erwähnte Konstellation noch gilt:


> Wie bekomme ich meine Daten aus dem Java-Programm in den Datenbaustein der S7-Steuerung?
> Ich lese überall von WinCC, Libnodave, OPC etc., aber all das hat mir bisher nicht wirklich weitergeholfen.


Wenn dem so ist muss bei Verwendung von 'Code-Teilen' aus libnodave zuerst einmal klar sein dass eigentlich die libnodave genau 'andersherum' funktioniert !
Soll heissen: Die auf dem 'Gateway' (bei mir sind das z.Bsp.ARM-Hutschienenpc's) installierte LibnoDave ruft von 'Zeit zu Zeit' die Steuerung an und liest/schreibt dort Daten. Der 'Impuls' zum Datenaustausch kommt also vom Gateway !!!! Dort werden dann auch die empfangenen Daten meinetwegen als Webseite in html oder ähnlich sichtbar aufgemöbelt, andernfalls denn z.Bsp. 'unsichtbar' als Excel etc. 'formatiert'.
So ist das gedacht und funktioniert dann auch ohne Umbauten und besonders gut und schnell via CP243-1 !
----------------------------------------------------------------------------
Du wolltest aber quasi bei 'pos.Flanke an E0.0 der CPU' nun die Apperatur bewegen Daten aus der Datenbank zu fischen. Dazu muss die Mimik umgedreht werden ! 
Und das ist nicht so einfach, wohl auch alles andere als serienreif und funktioniert bei mir z.Bsp. bisher nur auf besagten Linux-Embeddeds. Und da dummerweise denn auch noch auf zwei Arten, die bei Datenmenge und Verbindungsaufbau jeweils deutliche Vor- und Nachteile aufweisen. 
a) ist das über die normale MicroWin - Programmierverbindung (wo libnodave sich vereinfacht gesagt serienmässig einklingt) - damit ist aber die Programmierschnittstelle/ Fernwartung blockiert solange die Daten-Verbindung steht - und es gibt nur eine !
b) parallel über die S7-Verbindung(en). Dabei gehen aber maximal anscheinend nur 16Bytes pro Verbindungsaufbau ???????
a&b) haben zudem den Nachteil nur in VPN-Netzen 'Netzübergreifend' zu kommunizieren - es gibt nur eine IP-Adresse und mehrere CP's lassen sich ohne VPN (bisher bei mir) nie durch'naddeln' - sprich ansprechen. 
---------------------------------------------------------------------
Wenn man damit leben kann kommt der nächste Teil. Die CPU muss von sich aus die Verbindung zum 'Gateway' (dort wo auch die Datenbank liegt) aufbauen !!! 
Und hat nichts mit libnodave etc. zu tun sondern betrifft überhaupt nur den Verbindungsaufbau ersteinmal zu 'packen'. 
Wenn man da mit einer 'irgendwie Lösung' leben kann (bspw. kleiner Proxxyserver der auf alles reagiert ...) wird die Verbindung von der CPU quasi nur angestossen - selbst wenn sie dann sofort unter lautem Geschrei zu ignorierenden Fehlermeldungen zusammenbricht: das Gateway startet dann Daten aus der Datenbank zu lesen, diese abzulegen und sobald das geschehen ist startet man libnodave diese Daten an denn vorgesehen Platz in den Datenbaustein der CPU zu schreiben. 
Das ist die einfachste Möglichkeit
----------------------------------------------------
----------------------------------------------------
Richtig kompliziert (jedenfalls wie ich bei meinen Versuchen meine herausgefunden zu haben) wirds 'libnodave' so hinzutricksen dass es auf dem Gateway in einem die Verbindung kontrollierendem Server läuft, dort auf Daten aus der CPU _wartet_ und auf Anforderung aus anderen Prozessen die richtigen Daten liest und an die CPU übergibt. (in die CPU schreibt) 
Dazu muss der gesamte Server auf dem Gateway programmiert werden und dabei ist weitgehend ungewiss ob der Verbindungsaufbau dann regelgerecht funktioniert - oder nur einmal in der ausgemessenen Konstellation. Andere MPI/PPI Adressen oder im Netz hinzugefügte CP's könnten da sicherlich in den 'Tokentabellen' einiges 'zerstreuseln' .
Ich habe so'n Ding im Versuchstatdium mal bei mir programmiert (oder solches versucht). Das läuft seit 13.Sept. 2007 -- was da zu verbessern wäre weiss ich einfach aus dem Grunde schon nicht da ich auch noch versuche herauszufinden was da warum funktioniert ...
Das ist ein aufwändiger Kram - ich denke das müsste einfacher gehen, finde da aber bisher auch keine Alternative zu. Und eine fertige Bibliothek zur 200-er, die quasi auf dem 'Gateway' als 'Soft-SPS' läuft und die Kommunikation/ Verbindungsaufbau in der S7-Kommunikation übernimmt gibts wohl auch nicht. Für die 300-er siehts anders aus, aber bei den 200-ern ????
----------------------------------------------
Geschrieben habe ichs bis hierher nur weil ich meine der Aufwand ist nicht das S7-Programm (da ist evtl. nur etwas 'Handshake' über einige Merker zur Kommunikationsablaufsteuerung (Schrittkette) erforderlich ). Der Aufwand ist der Server auf dem Zielsystem ! Die Funktion des Servers ausserhalb der TCP/IP Verbindungsaufnahme ist dann eben die 'libnodave'. Oder die dort eingebunden, oder, oder ...
In Linux (auf einem ARM9) habe ich das rausgetrickst. In Windows ging da garnichts ( es können da theoretisch auch Latenzzeiten und timeouts 'ne Rolle spielen, welche ich aussen vor liess), und wenn Java mit im Spiel ist meine ich wirds auch nur schlimmer ...
Auf meinen Dingern läuft der 'Datenbankzugriff' per CGI oder PHP - wobei die Datenbank eher einer Tabelle entspricht die max. 8MB Einträge verwaltet. 
Libno wäre deswegen auch nur _ein_ 'Baustein' zur Lösung - weiterhin fehlen täte auf diesem Weg eben der Server welche den Verbindungsaufbau steuert und die libnodave denn anstösst das richtige zu übertragen. Das ist schon etwas komplexer. Und schliesst nicht vollständig weiterentwickelt sich für Einzelanwendungen beinahe aus 
Gruss
tobias


----------



## raptorrs (26 November 2008)

@Tobias
Danke , Tobias, Du hast Dir echt Mühe gegeben. Aber ich verstehe nicht mal die Hälfte von alldem!
Unter dem Gateway verstehst Du den Rechner, auf dem in diesem Fall mein Java-Programm mit dem Libnodave läuft??
Es kann duchaus so geschehen, wie Du es im ersten Absatz beschrieben hast.
Das heisst, die Initiative geht vom Rechner aus. Wann nun was geschrieben oder gelesen wird, kann ich im Java-Programm relativ einfach programmieren.

Wenn das tatsächlich so einfach geht, wäre ich für eine Schritt für Schritt - Anleitung wirklich dankbar. 

Nochmals vielen Dank!!


----------



## tobias (26 November 2008)

Hallo
alles was jetzt kommt gilt nur wenn das 'Gateway' sagt: Hole Daten aus der CPU - oder 'Schreibe Daten in die CPU'. Die CPU ist da reiner 'Server' - kann folglich nicht von sich aus tätig werden !!! (so ist das eigentlich auch gedacht ...)




> Unter dem Gateway verstehst Du den Rechner, auf dem in diesem Fall mein Java-Programm mit dem Libnodave läuft??



Ja genau - (bei mir eben der ARM HutschienenPC). Auf dem 'Ding' (PC) braucht nichts weiter als eine Art 'Cron-Job' ( ... jetzt sollen Daten in die CPU geschrieben werden) zu laufen sowie da irgendwie 'angebunden dann libnodave. 
Ich mache das im einfachsten Fall so: 
Der cron startet ein PHP-Script welches die gesuchten Daten in eine xyz.txt -Datei zwischenspeichert. Wenn das 'fertig' ist startet der cron libnodave, welches sich die Daten mit einer einfachen Erweiterung am Anfang (Datei öffnen und in Array lesen) dann 'holt' und an die CPU an gewünschte Adresse sendet. 
Etwas 'professioneller' ist es, das in einen 'Prozess' zu verpacken (in Linux wäre das IPC oder Pipes, FiFos etc.) - nur vom Prinzip her dasselbe.
That's all. 
Wenn die 'Frequenz' zu übertragender Daten gering ist funktioniert das im Prinzip vollständig mit dem testISO.c (bei CP243) - das ist dann nichts anderes wie im Prinzip ein CGI. (Starten - machen - beenden). 
Bei höherer Frequenz ( also wenns mehr als ca.1 Telegramm/Verbindungen pro Sekunde wären) funktioniert das nicht mehr - weil der Verbindungsaufbau einige Zeit nutzlos verbraucht und sich das dann irgendwann selber überholt. Günstigenfalls liegen zwischen zwei Verbindungen dann aber garantiert immer einige Sekunden - 
Deswegen wäre der erste Schritt mit dem testISO.c (testISO.exe) eine Verbindung zum CP243-1 /CPU aufzubauen. Also nur die benötigten Dateien aus der libno erstmal zum Laufen zu bekommen. In den Ordnern befindet sich zudem ein Ordner 'simplified' (ich glaube bei Java). Dort ist eine vereinfachte Version die bei mir immer auf Knopfdruck startete. Da ich bei meinen PC's immer (noch) von Windows nach Linux umbauen muss kann ichs jetzt nicht genau nachgucken - aber ich meine da war auch was in Windows/ Java (???)
Da müsstest du mal genau schreiben welches Betriebssystem der Datenbank PC hat/hätte und welche Kompiler du hättest um die Änderungen da einzukompilieren. 
(ich habe das nur in Linux C' und versuchsweise mal in Visual C6 durchlaufen lassen - bei Visual C wars aber auch nicht immer erfolgreich, bei Linux flutscht das genial !)
gruss
tobias
(p.s.: wenn, kann ich erst morgen gegen eher spät-nachmittag mehr dazu sagen da erstmal unterwegs)


----------



## raptorrs (27 November 2008)

Tobias, ich bin natürlich an einer Weiterführung interessiert. Bin aber jetzt auch wieder bis Samstag unterwegs.


----------



## Rainer Hönle (12 Februar 2009)

Auch wenn es länger dauerte (dafür ist auch mehr drin). Java für AGLink ist jetzt in einer ersten Fassung verfügbar. Siehe auch http://www.esatex.com/SPS-Forum/showthread.php?t=25446


----------



## raptorrs (19 März 2009)

es gibt tatsächlich erste Erfolge dank DELTALOGIC!

Deltalogic ist für mich in Zukunft allererste Wahl!

Sehr freundliche, wirklich kompetente und äusserst geduldige Leute dort.


----------

