Kommunikation Siemens S7-200 mit JAVA

raptorrs

Level-1
Beiträge
29
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
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!!
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

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


johnij
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@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.
 
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?
 
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!
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ....:confused:

 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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!!!
 
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 :rolleyes:
Gruss
tobias
 
@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!!
 
Zurück
Oben