TIA CPU Datenweitergabe

Wolfgang14

Level-1
Beiträge
175
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich stehe vor dem Problem das ich einen Analogwert der an einer CPU einlesen will und an einer anderen CPU wieder ausgeben möchte. Bei den CPU´s handelt es sich um eine 315-DP V2.0. mit CP343-1 Lean und einer CPU 314 V1.0. mit CP343-1 . Verbunden sind die 2 CPU´s über Ethernet. Leider habe ich diesbezüglich noch nicht all zu viel Erfahrung und stehe nun vor dem Problem wie die Kommunikation stattfinden soll ob über PUT/GET ,BSEND/BRCV oder I-Device bzw. ist dies mit einer CPU314 überhaupt noch möglich.

Die CPU315 soll quasi meine "Master" Station werden aktuell ist es noch ein Werkstatt Aufbau soll dann aber später via VDSL Modem umgesetzt werden.


Danke schon einmal im voraus.
 
Was möglich ist liegt kaum an Deiner CPU sondern hauptsächlich an Deinen CPs.
PUT/GET fällt schon mal flach, weil der CP343-1 Lean S7-Kommunikation nur als Server kann.
Ich empfehle eine ISO-on-TCP-Verbindung.
Profinet-IO (Controller + I-Device) geht vermutlich auch, würde ich allerdings nicht über eine Modem-Verbindung machen.

Was alles geht und wie: schau mal in den Link in meiner Signatur und da zuerst in das "Kompendium" Kapitel 21.4.2

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort und für den Link

Wenn ich nun eine ISO-on-TCP Verbindung auf die Beine stellen will. Mit welchen Bausteinen muss ich arbeiten damit der Analogwert ausgetauscht wird ?
 
Habe mir jetzt einmal die Siemens Datei heruntergeladen und versucht anzupassen jedoch kann ich sie nicht auf meine CPU314 schieben ich bekomme die Fehlermeldung Ungültige Bausteinnummer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe mir jetzt einmal die Siemens Datei heruntergeladen und versucht anzupassen jedoch kann ich sie nicht auf meine CPU314 schieben ich bekomme die Fehlermeldung Ungültige Bausteinnummer
Dann sind wohl die Bausteinnummern 200 zu hoch für Deine (alte?) CPU. Du kannst FB200, DB200, DB201 einfach umbennen zu FB100, DB100, DB101 und die Verwendungsstellen anpassen - ich habe das mal für Dich gemacht, siehe Dateianhang.

Im OB1 wird ein AG_Send/AG_Recv Baustein Programmiert leider finde ich diesen nirgends oder muss die Programmierung über AWL erfolgen ?
Die Bausteine FC5 AG_SEND und FC6 AG_RECV sind in dem Beispielprojekt enthalten - Du kannst die einfach in Dein Projekt kopieren, oder Du nimmst sie neu aus der Bibliothek "SIMATIC_NET_CP / CP 300"

PS: Achso, der "AG_SEND/AG_RECV" Baustein - das ist der FB200 bzw. jetzt FB100. Wieso findest Du den nirgends, der ist doch auch im Bausteine-Ordner genau wie der OB1?

Harald
 

Anhänge

  • 17853532_S7-300_SendRcv_100.zip
    57,3 KB · Aufrufe: 9
Zuletzt bearbeitet:
Vielen Dank erst einmal. Ich werde es nächste Woche einmal testen.

Ich muss meine Werte die ich weitergeben will dann in den DB schreiben oder und an der gegen stelle wieder heraus holen habe ich das richtig verstanden ?

Das Problem mit dem AG_Send/AG_Recv Baustein trat nur auf weil ich da noch nicht mit dem Siemens Beispiel gearbeitet hatte.
 
Hallo Harald,

Ich habe heute mal die Bausteine überspielt dies lief problemlos auch auf der 314er.

Jetzt habe ich noch 2 wahrscheinlich total doofe Fragen und zwar.

Ich muss doch nur noch meine spezielle ID im FB beim Baustein Send und beim Baustein Recieve eintragen dann sollte es doch funktionieren oder ? Muss der aktive Verbindungsaufbau bei beiden CPU´s aktiviert werden oder nur bei einer ?

Wo kann ich festlegen das zum Beispiel mein DI 4.0 auf der 314er auf der 315er am DO 8.0 ausgegeben wird ? Im DB101 ?

Meine CPU 315 hat die ID Adresse 1
CPU314 hat die ID Adresse 2

Danke schonmal
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt in NetPro die Verbindung projektieren. Die Nummer der Verbindung kann bei beiden Teilnehmern die gleiche Nummer sein, muß aber nicht.
Im FB im Netzwerk 3 gibst Du die Nummer der Verbindung am MOVE zu #ID an und die in HW Konfig projektierte E-Adresse des CP343-1 am MOVE zu #LADDR. Die E-Adresse wird normalerweise hexadezimal angegeben, z.B. W#16#100 für 256, seit irgendeiner Version prüft Step7 aber nicht mehr den Datentyp an der MOVE-Box, so daß Du da die Adresse auch dezimal angeben kannst.

Der aktive Verbindungsaufbau geht nur bei einem Teilnehmer. Ich würde den aktiven Verbindungsaufbau beim "Slave" (Client) aktivieren.

Was Du zum jeweils anderen Teilnehmer senden willst mußt Du in den Sendebereich kopieren und beim Empfänger aus dem Empfangsbereich in die gewünschte Zieladresse kopieren, z.B.:
E4.0 --> DB101.DBX0.0 ----> AG_SEND ==========> AG_RECV --> DB101.DBX0.0 ----> A8.0
A4.0 <-- DB101.DBX100.0 <-- AR_RECV <========== AG_SEND <-- DB101.DBX100.0 <-- E8.0

Die Längenangabe im ANY-Pointer an AG_SEND.SEND und AG_SEND.LEN sowie AG_RECV.RECV ist an die eigenen Erfordernisse anzupassen und muß beim Empfänger die selbe Länge haben wie beim Sender. Für bessere Verständlichkeit und Tippfehlervermeidung stellt man bei Sender und Empfänger üblicherweise die Sende- und Empfangsbereiche so ein, daß sie in beiden CPU die gleiche Adresse haben (also die DBX... den gleichen Offset haben, die DB-Nummer kann unterschiedlich sein). Am besten bei einem Teilnehmer Sendebereich und Empfangsbereich schön strukturiert deklarieren und diese Deklaration in den DB des anderen Teilnehmers kopieren - Sendebereich und Empfangsbereich jeweils "über Kreuz" gleich.

Im übrigen kann man die Bausteine AG_SEND und AG_RECV auch markieren und F1 drücken - da erhält man eine detaillierte Bausteinhilfe.

Harald
 
So also Übertragung funktioniert einmalig dann setzt sich das Signal nicht zurück wenn ich am Eingang kein Signal hab bleibt der Ausgang trotzdem gesetzt.
Als Taktmerker ist in der S7 M10 hinterlegt.

Wie kann ich jetzt noch mehr Ein und Ausgänge anlegen muss ich nur neue DB‘s erstellen oder wie soll das ablaufen?

Danke schon mal
 
Also habe mich heute nochmal den ganzen Nachmittag mit dem Projekt beschäftigt und versucht die beiden CP´s(CPU´s) miteinander reden zu lassen jedoch funktioniert Irgendwas nicht ich habe es mit einem Digital-und Analogwert versucht bin jedoch "kläglich" daran gescheitert.
Ich bin in meiner CPU314 in den FB100 gegangen und habe im Netzwerk 5 beim AG_Send Baustein bei "EN" meinen Eingang E4.0 angegeben und als DB Bereich DB101.DBX101.0. Gehe ich nun in den DB101 und beobachte ihn passiert aber nichts.
In meiner CPU315 habe ich im FB100 -->Netzwerk 9 -->ENO und habe dort meinen A8.0.
Jedoch habe ich bei meinen AG_RECV Bausteinen generell das Problem das der Ausgang ständig gesetzt ist.

Ich vermute stark das es sich hier um eine Fehlbedienung (Fehlprogrammierung) meinerseits handelt.

Hatte jetzt gedacht ich könnte mir z.B. einen FC Programmieren und dort einfach Deklarieren E4.1=DB101.DBX102.0
und das gleiche an der Empfänger CPU dort z.B wieder einen FC nehmen mit DB101.DBX102=A8.1

Wie funktioniert es wenn ich mehr als einen Eingang übertragen will ?

Anbei habe ich nochmal das Programm mit den Verbindungen
 

Anhänge

  • Iso-tc_1.zip
    799 KB · Aufrufe: 1
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Am AG_SEND sollte nichts am EN verschaltet werden. Er muß immer aufgerufen werden. Ob ein neuer Sendeauftrag ausgelöst wird, wird am Eingang ACT gesteuert.
Am AG_RECV sollte der EN auch unbeschaltet sein - AG_RECV muß immer empfangen können, das #RCV_DISABLE im Siemens-Beispiel von 2016 ist unsinniger Spielkram.
Bitte lies mal die Bausteinhilfen zum AG_SEND und AG_RECV.

Deklariere mal Deinen DB101 "SEND_RECV_DATA" etwa so:
Code:
SendData : STRUCT
  Wert_1 : INT
  Wert_2 : INT
  Wert_3 : INT
  Wert_4 : INT
  Wert_5 : INT
  Wert_6 : INT
  Wert_7 : INT
  Wert_8 : INT
  Bit_00 : BOOL
  Bit_01 : BOOL
  Bit_02 : BOOL
  Bit_03 : BOOL
  Bit_04 : BOOL
  Bit_05 : BOOL
  Bit_06 : BOOL
  Bit_07 : BOOL
  Bit_10 : BOOL
  Bit_11 : BOOL
  Bit_12 : BOOL
  Bit_13 : BOOL
  Bit_14 : BOOL
  Bit_15 : BOOL
  Bit_16 : BOOL
  LifeBit : BOOL //Lebensbit
END_STRUCT
Reserve : Array[18..49] OF BYTE
RecvData : STRUCT
  Wert_1 : INT
...
END_STRUCT

Dann kopierst Du die Daten, die Du an die andere SPS senden willst, in den Sendedaten-Bereich:
Code:
PEW288 --| MOVE |-- "SEND_RECV_DATA".SendData.Wert_1 (DB101.DBW0)

PEW290 --| MOVE |-- "SEND_RECV_DATA".SendData.Wert_2 (DB101.DBW2)

...

E4.0 --| & |---| = | "SEND_RECV_DATA".SendData.Bit_00

E4.1 --| & |---| = | "SEND_RECV_DATA".SendData.Bit_01

...

"CPU_Taktmerker_2Hz" --| & |----| = | "SEND_RECV_DATA".SendData.LifeBit

An den AG_SEND gibst Du die Sendedaten-Struktur:
Code:
                                                     |  AG_SEND  |
(P#DB101.DBX0.0 BYTE 18) "SEND_RECV_DATA".SendData --|SEND       |
                                                18 --|LEN        |

In der anderen Empfangs-SPS deklarierst Du den DB101 genau wie in der Sende-SPS, nur nennst Du dort die beiden STRUCT vertauscht "RecvData" und "SendData", gibts den RecvData-Bereich an den AG_RECV-Eingang RECV und kopierst die empfangenen Daten aus dem DB101 in Deine Zielvariablen und -Ausgänge. Dann überwachst Du noch das "SEND_RECV_DATA".RecvData.LifeBit ob es sich spätestens alle 500ms ändert, und wenn nicht, dann löschst/überschreibst Du die RecvData-Struktur mit alles 0 (Werte auf 0 setzen bei Kommunikationsausfall).


PS: Habt Ihr in der Firma jemanden, der ein bisschen programmieren kann? Nur mit Deinen Kenntnissen wird es vermutlich noch ziemlich lange dauern bis da was gescheites funktioniert... Oder irgendjemand hier schreibt Dir das komplette Programm.

Harald
 
PS: Damit der neu strukturierte DB101 zum Siemens-Beispiel passt, kannst Du ihn auch so deklarieren und jeweils 100 Byte senden und empfangen:
Code:
SendData : STRUCT
  Wert_1 : INT
  Wert_2 : INT
  Wert_3 : INT
  Wert_4 : INT
  Wert_5 : INT
  Wert_6 : INT
  Wert_7 : INT
  Wert_8 : INT
  Bit_00 : BOOL
  Bit_01 : BOOL
  Bit_02 : BOOL
  Bit_03 : BOOL
  Bit_04 : BOOL
  Bit_05 : BOOL
  Bit_06 : BOOL
  Bit_07 : BOOL
  Bit_10 : BOOL
  Bit_11 : BOOL
  Bit_12 : BOOL
  Bit_13 : BOOL
  Bit_14 : BOOL
  Bit_15 : BOOL
  Bit_16 : BOOL
  LifeBit : BOOL //Lebensbit
  Reserve : Array[18..99] OF BYTE
END_STRUCT
RecvData : STRUCT
  Wert_1 : INT
  Reserve : Array[102..199] OF BYTE
END_STRUCT

Harald
 
Also hatte es mal rein mit Digitalen Ein-und Ausgängen probiert das funktionierte einwandfrei muss jetzt nur noch den gemischten DB101 anlegen für Digital-und Analogwerte und dieses noch testen
 
Zurück
Oben