Can-Bus Verbindung S7 CPU 315-2 PN

Obi Wan

Member
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

mein Name ist Gregor, bin 26 Jahre alt und habt Automatisierungselektroniker gelernt. Ihr werdet euch jetzt vielleicht denken, was will der denn jetzt hier, aber ich hoffe ihr schmeißt mich nicht gleich wieder raus, weil meine Frage nix mit Arbeiten sondern mit Freizeit und Hobby zu tun hat.

Wie dem auch sei, es ist so. Ich hab hier bei mir daheim eine Modelleisenbahn, die wird hauptsächlich über dieses Gerät hier gesteuert, eine Central Station 2 der Fa. Märklin.

Der Plan ist jetzt, dass ich meinen unterirdisch gelegenen Abstellbahnhof, auch Schattenbahnhof genannt, da er eben im Schatten/Untergrund sich befindet, mit einer SPS steuern will. Sowohl die Weichen als auch die Loks.

Mein bisheriges SPS-Programm war so aufgebaut, dass die Weichen, die mit DC geschaltet werden, das sind ganz normale Magnetspulenantriebe, über Ausgangskarten angeschlossen und dann von der SPS geschaltet werden. Es sind auch noch ein paar Reedkontakte vorhanden zur Positionsbestimmung der Züge in dem Bahnhof. So der grobe Aufbau. Gedacht war das so, dass wenn der Zug im Gleis X an der Stelle angekommen ist, wo er halten soll, ein Kontakt ausgelöst wird, und die SPS daraufhin einen Ausgang nicht mehr bestromt, ein Relais abfällt und damit dann der Strom ins Gleis unterbrochen wird und der Zug stoppt. Problem hierbei ist, dass die Elektronik in den Loks das gar nicht mag, wenn sie ohne Strom dastehen, und später wieder losfahren sollen. Daher hab ichs für schlecht befunden, einfach das Gleis stromlos zu machen.

Dann hab ich gesehen, dass in dieser Central Station, im nachfolgenden nur noch kurz CS genannt, ein CAN-Bus Gateway integriert ist. Da stellt man eine IP-Adresse ein, und dann stellt die CS die Daten an dem intrgrierten Ethernetport zur Verfügung, und dann kann sowohl da was ausgelesen als auch was reingeschrieben werden.

Leider hab ich gar keine Ahnung wie ich das in der SPS programmieren muss, dass die mir Befehle im CAN-Bus-Format über die Ethernetschnittstelle an die CS schickt und auch von dort was empfängt. Was ich allerdings habe ist der Aufbau des Signals vom Hersteller, das ist hier in dem pdf http://medienpdb.maerklin.de/digital22008/files/cs2CAN-Protokoll-2_0.pdf

Ich hab schon in einem Modellbahnerforum nachgefragt, die konnten mir aber das nicht sagen, die wussten wie man die CS mit einem PC verbindet wo eine Steuersoftware drauf läuft, aber das hilft mir ja nicht weiter. Daher dachte ich, ich frag mal hier nach, ob jemand von euch da vielleicht weiß wie ich das machen muss?

Vielen Dank für eure Hilfe

Obi Wan (OB1/Gregor)

 
Zuletzt bearbeitet:
Ich bin auch der Meinung, dass du es über UDP-Verbindung hinbekommen müsstest.
Wenn es eine PC-Software gibt, dann schau dir doch mal den Datenstrom mit Wireshark (Protokoll-Analyser) an.
Danach kannst du das Protokoll mit S7 "nachbauen" und testen.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Dieter,

ich hab jetzt mal das Programm von der Siemensseite runtergeladen, das ist ja schon fertig programmiert. Ich denk auch dass das mit dem UDP funktionieren müsste, jedoch ist es so dass ich das bisher noch nie gemacht hab, folglich kenn ich mich da auch nicht aus. Was aber nicht heißen soll dass ich die Sache gleich aufgeb, ich brauch nur hier und da ein bisschen Unterstützung, aber deswegen bin ich ja hier ;)

Zum Beispiel ist das noch so eine Sache die mir nicht klar ist (oder ich habs noch nicht gefunden), wo schreibe ich denn jetzt die Daten rein die geschickt werden sollen, und wo kommen die empfangenen an? Ich denk mir dass das so funktioniert wie bei einem Touchpanel über Profibus, das hab ich schon gemacht, da gabs einen DB wo die Bits drin waren die vom Touchpanel aktiviert worden sind, wenn man da was drückt. In dem DB waren dann die Touchpaneltasten in das S7-Programm "verlinkt". Weil ich muss ja irgendwo Zahlenkombinationen speichern in dem Format wie es in dem CAN-Bus-Protokoll-PDF von Märklin drinsteht. Und dann müssten das ja auch, theoretisch jedenfalls, mehrere sein, die dann je nach Rückmeldung die vom Gleis kommt, sei es nun über Reedkontakte oder Lichtschranken, an die Central Station und damit an die Lok geschickt werden. Zum Beispiel wenn die in den Abstellbahnhof reinfährt, muss die ja runterbremsen, und wenn ich das richtig verstanden hab, hat jede Geschwindigkeitsstufe einen eigenen "Code". Ich könnte theoretisch auch einfach ein Stopkommando an die Lok schicken, denn bleibt se aber gleich stehen und fährt nicht bis zum Ende. Wenn se denn mal steht soll se kein Strom mehr brauchen, also müssen alle Zusatzfunktionen wie Beleuchtung usw. ausgeschaltet werden, und dafür gibts auch wieder einen extra Befehl.

Wenn ich das noch richtig im Kopf hab, muss man ja alle Befehle die man mal verwenden will, in einem DB speichern. Daraus wird dann, wenn z.B. der Kontakt X anspricht, ein Befehl geladen (z.B. Lok Nr. 13 schalte Licht ein und fahre mit Geschwindigkeit 25) und über den Bus an die CS geschickt. Wie sortier ich dann in dem DB wo alle Befehle gespeichert sind, genau den raus den ich brauch? Also damits auch nur den einen dahin schickt, dann den nächsten und nicht alle die drin gespeichert sind gleichzeitig?

Ich hab so den Eindruck, das könnte noch ganz schön kompliziert werden….

Gruß Gregor
 
Dein Eindruck täuscht dich nicht.
Wenn du dein Projekt erfolgreich umgesetzt hast, dann bist du in der SPS-Oberliga angekommen :p

Mit der Kommunikation zu einem Panel hat das ganze - ausser den Datenbausteinen - nichts zu tun. Die Panel-Kommunikation wickelt die SPS und das Panel alleine ab.
Du musst dich nicht um Sende- und Empfangsdaten kümmern.

Bei deiner Geschichte musst du mit Sende- und Empfangs-DBs arbeiten und die Daten entsprechend aufbereiten.

Schau dir mal die Funktionen des OC Wizard an:
http://support.automation.siemens.com/WW/view/de/25209116

Damit kannst du die grundlegenden Verbindungsparameter festlegen und die Kommunikationsbauteine parametrieren.

Ich würde mal behaupten, dass hier im Forum wahrscheinlich 2/3 der Mitglieder diese Aufgabe nicht bewältigen würden.

Gruß
Dieter
 
SPS-Oberliga? Champions League? Oje da wollt ich nicht zwangsweise ankommen, jedenfalls wars nicht mein erklärtes Ziel. ;)

Eben das dachte ich mir auch, dass es ja irgendwie reservierte DBs fürs Senden und Empfangen geben muss. Mir ist das allerdings noch ein bisschen schleierhaft mit den Ports, da bin ich noch nicht durchgestiegen, ebenso wie die Einstellung die man an dem TSEND_FB machen muss, mit der Anzahl der zu sendenden Bytes und der Eingabe der Länge. Ich kann ja z.B. schlecht sagen ja schick 100 Bytes, und dann machts des und wenn die 100 Bytes fertig sind, machts nicht mehr weiter?

Ok ich guck mir den Wizard mal an. Ich glaub zwar auch dass ichs nicht hinkrieg, weils ja doch nicht irgendso ne 0815 Programmierung ist, aber wenns so kompliziert ist, wärs sag ich mal auch keine allzu große Blamage wenn ichs net gebacken krieg. Das mit dem Rüberschieben der Daten in den entsprechenden DB kann ich ja mit MOVE-Funktionen machen, so wars glaub ich mal als ich einen FU gesteuert hab. Gut hat damit nix zu tun, aber wird wohl so irgendwie gehen….

Mich beschleicht so langsam das Gefühl dass ichs nicht hinkrieg^^

Gruß Gregor
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja Move ist schon mal nicht verkehrt ... in KOP / FUP.
Aber bei deinem Vorhaben bist du besser mit AWL oder SCL bedient.

Die Versorgung des TSEND ist eigentlich - soweit ich es auf die schnelle gesehen habe - nicht so schlimm.
Die Länge der Befehle ist eigentlich immer gleich (13 Byte lt. Kapitel 1.2.7 deiner Beschreibung).
D.h. wenn du eine Aktion auf dem Controller auslösen willst musst du immer 13Byte senden,
In diesen 13Byte sind dann deine Befehle zu codieren. Du schreibst also mit Move die passenden Daten in die den Sendebereich.
Wenn du damit fertig bist, dann stösst du den SendeAuftrag an. Vielleicht ist hier eine kleine Schrittkette nützlich.

Wenn möglich schau dir mit Wireshatk die Kommunikation an. Sende Befehl zuerst mit dem PC, dann mit der SPS. Sobald die 13Byte übereinstimmen hast du es richtig gemacht.

Gruß
Dieter
 
Ich hab das mit den Movern eh immer in AWL geschrieben. Geht einfacher. Mit SCL hab ich aber bisher nicht viel zu tun gehabt. Wenn das mit dem Move geht, läufts ja über mehrere DBs, so wie ichs gedacht hab oder?

Mit dem Pc senden…hm wie? Ich hab ja keine Software die Daten losschickt. Nur die SPS.

Zu dem Moven der 13 Byte hätt ich da noch ne kurze (vielleicht lächerliche?) Frage. Wenn ich so einen Move nehme, dann will der ja am Eingang von mir als größtes Maximal ein Doppelwort, also ein DWORD. Das sind ja, wenn ich das noch richtig weiß, 32 Bit. Das wird aber nicht ganz reichen für 13 Byte (104 Bit). Wenn ich das jetzt aber nacheinander in Doppelwortform move, akzeptiert die CS das ja lt. Beschreibung nicht, da alle Pakete ungleich 13 Byte ignoriert werden.

Muss ich da jetzt noch das Format wandeln oder wie genau geht das? Weil es ist mir irgendwie schleierhaft, wie soll man auf einmal 13 Byte verschieben, wenn ein Move nur maximal 4 (DWORD) kann? Steht jedenfalls so in der S7-Hilfe. Oder denk ich da grad falsch?

Gruß Gregor
 
Zuletzt bearbeitet:
Zurück
Oben