UDP-Daten mit CP343-1 Advanced auslesen

neibeck

Level-2
Beiträge
168
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe folgendes Problem: Bei meinem Abitur-Projekt werden Positionsdaten über Wlan auf die S7-300 geschickt, hierzu verwenden wir eine CP 343-1 Advanced. Leider kenn ich mich mit Industrial Ethernet kein bisschen aus ich weiß nur dass die Daten per UDP geschickt werden. Vom Programmierer der betreffenden Software hab ich folgendes bekommen:
Code:
class AbatecPos
{
public:
AbatecPos(){};
      unsigned int      ID;        // measured ID
      unsigned int      ReqID;  // requested ID
      long                  Time;    // timestamp (ms)
      long                  X;         // X-position (mm)
      long                  Y;         // Y-position (mm)
      long                  Z;         // Z-position (mm)
      long                  XSpeed;           // X-speed (mm/s) (Doppler data)
      long                  YSpeed;           // Y-speed (mm/s) (Doppler data)
      long                  ZSpeed;           // Z-speed (mm/s) (Doppler data)
      long                  XAccel;           // X-acceleration (mm/s) (for future use)
      long                  YAccel;           // Y-acceleration (mm/s) (for future use)
      long                  ZAccel;           // Z-acceleration (mm/s) (for future use)
      long                  iIntegrity;          // value indicating measurement quality /* in progress */
      long                  Telemetry;        // telemetry (32-bit data)
} ;

in diesem Format werden die Daten übertragen.
Wie kann ich nun diese auf der SPS auslesen und die einzelnen Positionsdaten verarbeiten?

mfg neibeck
 
Hi,
unter Step7 Netpro öffnen und die Verbindung projektieren.

Im S7 Programm die Send/Recieve Bausteine aufrufen.
(zu finden in der Bibliothek unter NET CP, weiss jetzt leider die FC nummer nicht.)
An den Send/Recieve Bausteinen ist noch die Verbindung anzugeben.
Die steht dann in Netpro unter der jeweiligen Verbindung.(Grafische Darstellung.)


Einen DB anlegen der den Vorgaben deines Partners entspricht.
Den DB am Recieve Baustein angeben.


War jetzt die Kurzform :ROFLMAO:
Hab schon ewig keine Verbindung mehr projektiert drum krieg ichs im moment nicht genauer hin und Step 7 grad nicht zur Hand...

Viel Spass
Andy
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich hab mich jetzt mal kurz beschäftigt mit der sache...

Ich brauche den Baustein AG_Recv (FC6)...
beim parametrieren muss ich jetzt einen Speicherort angeben, allerdings in einer komischen Form, zB
Code:
RECV:=P#M 0.0 BYTE 100

kann mir jemand genauer erläutern was dieser code bedeutet?
und wo kann ich die gespeicherten daten dann aufrufen?
 
Zuletzt bearbeitet:
1. Werner54 hat recht

2. in diesem Fall werden 100 Byte ab MB0 mit den empfangen Daten gefüllt, also MB 0-MB 99. Das geht auch mit einem Datenbaustein z.Bsp. DB10.DBX0.0 Byte 100. Aber dieser Datenbaustein muß auch vorhanden und lang genug sein!
 
Der wird mit dem Simaticmanager erstellt und auch die Daten weden damit angelegt. Wenn die Daten strukturiert geliefert werden, ist es auch sinnvoll, die gleiche Structur in diesem DB anzulegen, mann kann aber in dem DB auch einfach ein Array aus 100 Byte anlegen, aber dann kann man nicht so schön im Step7-Programm drauf zugreifen.
 
...Das geht auch mit einem Datenbaustein z.Bsp. DB10.DBX0.0 Byte 100...

das funktioniert so nicht... zumindest zeigt das der simatic manager an..
"Syntaxfehler bei Byte"...

wenn dann die daten in den baustein gespeichert werden... wie kann ich dann auf diese zugreifen?
mit einem normalen datenbausteinsaufruf?? ich kenne nur zB DB10.Variable...
wie wird dort der Aufruf dann lauten?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Tschuldige, natürlich P#DB10.DBX0.0 Byte 100.
Am günstigstens wäre, du legtst die Daten im DB genau so an, wie sie vom Rechner weggeschickt werden. Also eine struct mit den entsprechenden Namen und Variablentypen. Dann kannst du später genau auf diese Variablennamen zugreifen. Dem DAtenbaustein mußt di in der Symboliktabelle ebenfalls einen Namen geben, dann kannst du später z.Bsp mit

L "MyDaten".MyIntVar_001 darauf zugreifen.

Dein DB10 also den Namen MyDaten in der Symboliktabelle, die Variable im DB als MyIntVar_001 vom Typ INTEGER deklarieren.

PS: Nicht wundern wenn deine Struct (z.Bsp. MyStruct) im DB genau mit dem Pointer zusammenpaßt, wird aus dem Aufruf P#DB10.DBX0.0 Byte 100 z.Bsp.
"MyDaten".MyStruct.

Versuchs mal und melde dich wieder. :ROFLMAO:
 
ok... ich verstehe es zwar immer noch nicht ganz... aber is jetzt egal...
ich hab erst am mittwoch wieder zeit es zu probieren, weil die sps in der schule steht... dann sehe ich was passiert..

werd mich dann wieder melden, wenn ich weitere fragen habe
danke erstmal..

mfg neibeck
 
Will dich mal nicht im Regen stehen lassen :ROFLMAO:.

Der DB könnte in etwa so aussehen:

Code:
DATA_BLOCK DB 10
TITLE =
VERSION : 0.1


  STRUCT     
   AbtecPos : STRUCT     
    ID : INT ;    //measured ID
    Req_ID : INT ;    //requested ID
    Timestamp : TIME_OF_DAY ;    //timestamp (ms) (IEC-Datum)    32    IEC-Uhrzeit in Schritten von 1 ms
    X : REAL ;    //X-Position (mm)
    Y : REAL ;    //Y-Position (mm)
    Z : REAL ;    //Z-Position (mm)
    XSpeed : REAL ;    //X-Speed (mm/s) (Doppler data)
    YSpeed : REAL ;    //Y-Speed (mm/s) (Doppler data)
    ZSpeed : REAL ;    //Z-Speed (mm/s) (Doppler data)
    XAccel : REAL ;    //X-Acceleration (mm/s^2) (for future use)
    YAccel : REAL ;    //Y-Acceleration (mm/s^2) (for future use)
    ZAccel : REAL ;    //Z-Acceleration (mm/s^2) (for future use)
    iIntegrity : REAL ;    //value indicating measurement quality /* in progress */
    Telemetry : REAL ;    //telemetry (32-bit data)
   END_STRUCT ;    
  END_STRUCT ;    
BEGIN
   AbtecPos.ID := 0; 
   AbtecPos.Req_ID := 0; 
   AbtecPos.Timestamp := TOD#0:0:0.0; 
   AbtecPos.X := 0.000000e+000; 
   AbtecPos.Y := 0.000000e+000; 
   AbtecPos.Z := 0.000000e+000; 
   AbtecPos.XSpeed := 0.000000e+000; 
   AbtecPos.YSpeed := 0.000000e+000; 
   AbtecPos.ZSpeed := 0.000000e+000; 
   AbtecPos.XAccel := 0.000000e+000; 
   AbtecPos.YAccel := 0.000000e+000; 
   AbtecPos.ZAccel := 0.000000e+000; 
   AbtecPos.iIntegrity := 0.000000e+000; 
   AbtecPos.Telemetry := 0.000000e+000; 
END_DATA_BLOCK
1. Füge den Code in eine leere Quelle ein und übersetze sie, dann hast du einen DB10.

2. Dann ziehst du den FC 6 in deinen FC 10 und beschriftest ihn wie im Bild 1.

3. Gib dem DB 10 im Symbolik-Editor den Namen "DB_Abatec_Pos" und speichere die Symbolik.

4. Wenn du jetzt den FC 10 aufrufts, sieht der FC6 wie im Bild 2 aus. Das ist dasselbe wie im Bild 1, nur symbolisch. Auch mit Wegschalten der Symbolik wird das nicht mehr als P#DB10.DBX0.0 Byte 52 angezeigt, nur durch löschen des Namens für den DB10 in der Symbolik, deshalb sagte ich, nicht wundern :-D. Ist etwas unglücklich von Siemens, na ja.

Jetzt kannst du folgendermaßen auf die Variablen im DB zugreifen:
Code:
//    L     DB10.DBW    0
      L     "DB_AbatecPos".AbtecPos.ID

//    L     DB10.DBD    4
      L     "DB_AbatecPos".AbtecPos.Timestamp

//    L     DB10.DBD    8
      L     "DB_AbatecPos".AbtecPos.X
 

Anhänge

  • FC6_001.jpg
    FC6_001.jpg
    23,8 KB · Aufrufe: 28
  • FC6_002.jpg
    FC6_002.jpg
    24,2 KB · Aufrufe: 17
Zuviel Werbung?
-> Hier kostenlos registrieren
@Ralle: Danke, Danke, Danke!! :)

hab das jetzt mal ins Programm geschrieben, werde es morgn testen..
melde mich dann wieder!

mfg neibeck

EDIT: Eine Frage hätte ich da noch, es hat zwar jetzt nichts mit dem thema zu tun aber vl weiss ja jemand was...
Es gibt ja bei den Siemens SPSen einige, bei denen man SD-Karten als Speicher benutzt...
Würde es funktionieren wenn man das Programm bei einer SPS runterlädt, dann die Karte rausnimmt und bei einer anderen baugleichen SPS wieder einlegt und dort dann laufen lässt?
 
Zuletzt bearbeitet:
Haben die Sache heute ausprobiert...
Leider kommt noch nix an der SPS an, es liegt aber unserer Meinung noch an der Software des Positionsmesssystems weil wir keine Netzwerk-Aktivität feststellen konnten...

werden das noch klären...
 
Hi,
zu deinem Verbindungsproblem:

Wenn du Step7 öffnest hast in dem Baum die CPU und drunter normal die CP343.
Mach nen Rechtsklick auf die CP343-> Objekteigenschaften.
Dann ganz rechts im Reiter Diagnose die Spezialdiagnose ausführen.
Hier siehst dann ob Verbindungen aufgebaut werden bzw. ob überhaupt Daten über eine Verbindung gingen.

Wenn ihr keine Verbindung zustande bringt, mal mit aktivem und passiven Partner "Spielen".D.h. einer macht aktiven und der andere passiven Verbindungsaufbau.
Beide Partner GLeich geht normalerweise nicht.

Gruss Andy
 
Achso, in der Spezialdiagnose sollten dann deine Projektierten Verbindungen zu sehen sein.

Wenn nicht iss was faul :D

Gruss Andy
 
hab das ganze jetzt mal getestet... die Baugruppe empfängt zwar Daten, allerdings ändern sich die Werte im Datenbaustein nicht....
Ich habe auch probiert den Wert aus dem Datenbaustein zu verarbeiten, auch hier keine Änderung...

Die Statistik der CP zeigt die richtige Anzahl fehlerfrei empfangener Daten...
Ich glaube allerdings dass alle Werte in einem String gesendet werden...
Unser Programmierer hat uns kurzfristig nur ein Testprogramm geschrieben, welches 1000mal die Daten sendet, und die Anzahl der empfangenen Daten ändert sich auch jedes mal um 1000...

Was kann hier noch nicht passen?
Muss ich den Datenbaustein irgendwie verändern?

mfg neibeck
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Selbst wenn der Datenbaustein nicht stimmt, ankommen müßte ja etwas, u.U. steht halt Murks drin. Was sagt denn der Status von AG_RECV MW102 und was steht im MW104 drin?
 
ich bin mir nicht mehr sicher... kann jetzt gerade auch nicht nachschaun..

ich weiss nur dass das Error-Bit immer 0 war...
 
Hab jetzt nochmal mit dem Programmierer geredet...
Die einzelnen Variablen werden nicht in einzelnen Paketen geschickt, wie angenommen, sondern in einem zusammengesetzten 56 Byte-Paket...
Ich muss die einzelnen Werte dann wieder herausfiltern und dann im Datenbaustein den jeweiligen Variablen zuordnen...
zB. Variable 1: Byte 0 bis 3; Variable 2: Byte 4 bis 7, usw...



datenpaketpositionsmess5rq.jpg



Wie kann ich nun diesen String zerteilen??

mfg neibeck
 
Zurück
Oben