TCP/IP oder UDP mit ifm pdm 360 Steuerung.

Begonnen von Mike, 03. April 2010, 13:13:18

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Mike

Ich bin noch ein Neuling in der Steuerungstechnik. Ich will einen Netzwerkverbindung mit einem Sensor aufbauen und ich will ein ASCII-Zeichen :i senden. Emfangen werden sollen 3250 float-Werte die ich auswerten will.

Der Sensor hat eine Netzwerkadresse und eine Portnummer.

Für mich stellt sich die Frage, wie ich die Bausteine wählen sollte um das Programm zu realisieren? 

Ich würde mich über eine Antwort freuen.

peewit

hallo

die ifm pdm 360 steuerung , was ist das für eine hardware, und welche software wird benutzt
es kann leicht sein das die codesys network lib auf dieser plattform schon mal nicht geht

prinzipiell benötigst du immer den "IP_CONTROL" der stellt dir eine schnittstelle zur verfügung
dort kannst du die verbindungsart, ip , port, daten und datenlänge für lesen und schreiben vorgeben
(siehe dokumentation)

du kannst dir aber auch einfach eines der demos in der network.lib öffnen und nachschauen wie diese programmiert sind

sollen da auf einmal 3250 fload werte empfangen werden (das wären mindestens 12kb daten)

hast du von diesem ding eine dokumentation, wenn ja , dann stelle sie doch bitte online , bzw link einfügen

Mike

#2
Das System ist von der ifm und es wird als Platform Codesys 2.3 benutzt.
Die Softwareplatform der Steuerung, sowie des Sensors ist Linux.

Die network lib habe jetzt eingebunden, hat sich beschwerd das ein Teil schon vorhanden ist.
Ich hoffe das ich dieses irgendwie zu laufen kriegen.

Ich bedanke mich schon mal für die Antwort.

Die Dateien von ifm:

O3D201
O3D2xx_Programmers_Guide
CR1051

Stehen bei ifm frei zum Download.

Mike

Habe den IP_Control Baustein wie im Beispiel mit dem DWord_to_Byte verbunden. Dieses in mien Steuerung übertragen. Beim Start des Programms übergibt er die IP Adresse an den IP_Control Baustein. Leider Verbindet er sich nicht mit dem Sensor.

Habe ich noch einen Baustein vergessen ?

peewit

das einfachste ist , wenn du dein beispiel online stellst
dazu formulierst du in kurzen worten, das was du eigentlich programmieren wolltest, dann kann ich dir wahrscheinlich weiterhelfen

mfg peewit

Mike

War viel Unterwegs, aber jetzt kann ich mich wieder um meinen Versuch kümmern.

Das Programm:

In meinem Programm habe ich Versucht eine Verbindung hinzubekommen. Wenn ich den richtigen Port angebe, zeigt er mir die Zeiten im Versuch an. Aber das Senden funktioniert nicht und bei meinen HUB zeigt es keine Reaktion. Wähle ich einen frei gewählten Port an blink der Hub wie verrückt.

Ich weiß leider erst mal keinen Rat.

Bitte um Hilfe.

Ich habe den Programm_guide meines Sensors dazugelegt.



[gelöscht durch Administrator]

peewit

hallo mike

1. es kann durchaus sein das der ip_control für codesys auf deiner plattform nicht funktioniert
2. obwohl die oscat.network die SysLibSockets.lib nutzt ist das gleiche verhalten auf verschiedene systemen nicht gegeben
3. ich habe eine verbesserte version des ip_control die du austesten solltest (importiere diesen in deine oscat.network.lib)

4. so wie du das programm gemacht hast, ist es nicht wirklich korrekt.
 
die daten für den ip_control bzw. den sendeanstoss  sollten natürlich nicht zyklisch durchgeführt werden , hat ja keinen sinn
genauso sollte ip_c.TIME_RESET nur vor dem sendestarten gesetzt werden, damit die überwachungszeit einmalig neu gestartet wird.
warum beschreibst du den empfangsbuffer , du solltest diesen höchstens auslesen.

in deinem fall wäre primär interessant ob du einen verbindung aufbauen kannst, mit der neuen version

datensenden bzw empfangen kann man so nicht programmieren , du musst dir irgendeinen ablauf programmieren

1. verbindung einrichten, freigeben, und warten auf verbindung IPC.C_STATE auswerten
2. sendendaten und datenlänge einmalig eintragen und time_reset durchführen
3. sendenüberwachen: sendelänge muss 0 werden oder error kommt
4. daten werden empfangen: länge ist in empfangsbuffer eingetragen -> daten können verarbeitet werden.

!!! nicht vergessen neuen ip_control in deine network.lib neu einbinden !!!!

mfg peewit

[gelöscht durch Administrator]

Mike

Hallo peewit,
danke für die Hinweise, naja mit dem Sendeemfang und darauf schreiben ,blöde Idee.
Ich habe gestern wie du gesagt hast den Baustein IP_Control durch den anderen ersetzt. Nach dem Übersetzen hat er nach der SOCKET_FD_SETSIZE gefragt. Die war nicht deklariert. Die habe ich so in die globalen Variabelen eingefügt SOCKET_FD_SETSIZE: INT :=100; (Richtig ?).

Leider fehlt mir noch viel Hintergrundwissen. Deswegen würdest du dir nochmal mein Programm ansehen?

Der Taktgenerator soll im Sendepuffer ein Ascii zeichen generieren. Weil der Sensor ein i braucht um angestoßen zu werden, um mir die gewünschten Daten zu schicken.

Desweiteren sprichst du, Verbindung einrichten und freigeben. Wie muss ich das umsetzen( Sorry, Anfänger ).

Danke für deine Hilfe


Mike

[gelöscht durch Administrator]

peewit

wenn du die syslibsockets.lib einbindest sind normalerweise auch die zugehörigen globalen var mit dabei , warum das bei dir fehlt, keine ahnung

SOCKET_FD_SETSIZE :DINT :=   64;   ist 64 und nicht 100 !!


so sehen die normalerweise aus


VAR_GLOBAL CONSTANT
   SOCKET_INVALID:DINT:=-1;

   (* AddressFamily *)
   SOCKET_AF_UNSPEC:INT:=   0;         (* unspecified *)
   SOCKET_AF_LOCAL:INT:=   1;            (* local to host (pipes, portals) *)
   SOCKET_AF_UNIX:INT:=SOCKET_AF_LOCAL;      (* backward compatibility *)
   SOCKET_AF_INET:INT:=2;               (* internetwork: UDP, TCP, etc. *)
   SOCKET_AF_IMPLINK:INT:=3;            (* arpanet imp addresses *)
   SOCKET_AF_PUP:INT:=4;               (* pup protocols: e.g. BSP *)
   SOCKET_AF_CHAOS:INT:=5;            (* mit CHAOS protocols *)
   SOCKET_AF_NS:INT:=6;               (* XEROX NS protocols *)
   SOCKET_AF_ISO:INT:=7;               (* ISO protocols *)
   SOCKET_AF_OSI:INT:=SOCKET_AF_ISO;
   SOCKET_AF_ECMA:INT:=8;            (* european computer manufacturers *)
   SOCKET_AF_DATAKIT:INT:=9;            (* datakit protocols *)
   SOCKET_AF_CCITT:INT:=10;            (* CCITT protocols, X.25 etc *)
   SOCKET_AF_SNA:INT:=11;               (* IBM SNA *)
   SOCKET_AF_DECnet:INT:=12;            (* DECnet *)
   SOCKET_AF_DLI:INT:=13;               (* DEC Direct data link interface *)
   SOCKET_AF_LAT:INT:=   14;               (* LAT *)
   SOCKET_AF_HYLINK:INT:=15;            (* NSC Hyperchannel *)
   SOCKET_AF_APPLETALK:INT:=16;      (* Apple Talk *)
   SOCKET_AF_ROUTE:INT:=17;            (* Internal Routing Protocol *)
   SOCKET_AF_LINK:INT:=18;            (* Link layer interface *)
   SOCKET_pseudo_AF_XTP:INT:=19;      (* eXpress Transfer Protocol (no AF) *)
   SOCKET_AF_COIP:INT:=20;            (* connection-oriented IP, aka ST II *)
   SOCKET_AF_CNT:INT:=21;            (* Computer Network Technology *)
   SOCKET_pseudo_AF_RTIP:INT:=22;      (* Help Identify RTIP packets *)
   SOCKET_AF_IPX:INT:=23;               (* Novell Internet Protocol *)
   SOCKET_AF_SIP:INT:=24;               (* Simple Internet Protocol *)
   SOCKET_pseudo_AF_PIP:INT:=25;      (* Help Identify PIP packets *)
   SOCKET_AF_MAX:INT:=26;
   SOCKET_AF_INET_BSD:INT:=100;      (* BSD-specific INET af *)
   SOCKET_AF_INET_STREAMS:INT:=101;   (* STREAMS-specific INET af *)

   (* Level number for (get/set)sockopt() to apply to socket itself. *)
   SOCKET_SOL:WORD:=16#ffff;

   (* Socket options *)
   SOCKET_SO_DEBUG:DINT:=16#0001;         (* turn on debugging info recording *)
   SOCKET_SO_ACCEPTCONN:DINT:=16#0002;   (* socket has had listen() *)
   SOCKET_SO_REUSEADDR:DINT:=16#0004;   (* allow local address reuse *)
   SOCKET_SO_KEEPALIVE:DINT:=16#0008;      (* keep connections alive *)
   SOCKET_SO_DONTROUTE:DINT:=16#0010;   (* just use interface addresses *)
   SOCKET_SO_BROADCAST:DINT:=16#0020;   (* permit sending of broadcast msgs *)
   SOCKET_SO_USELOOPBACK:DINT:=16#0040;   (* bypass hardware when possible *)
   SOCKET_SO_LINGER:DINT:=16#0080;         (* linger on close if data present *)
   SOCKET_SO_OOBINLINE:DINT:=16#0100;      (* leave received OOB data in line *)
   SOCKET_SO_REUSEPORT:DINT:=16#0200;   (* allow local address & port reuse *)
   SOCKET_SO_SNDBUF:DINT:=16#1001;      (* send buffer size *)
   SOCKET_SO_RCVBUF:DINT:=   16#1002;      (* receive buffer size *)
   SOCKET_SO_SNDLOWAT:DINT:=16#1003;   (* send low-water mark *)
   SOCKET_SO_RCVLOWAT:DINT:=16#1004;   (* receive low-water mark *)
   SOCKET_SO_SNDTIMEO:DINT:=16#1005;   (* send timeout *)
   SOCKET_SO_RCVTIMEO:DINT:=16#1006;   (* receive timeout *)
   SOCKET_SO_ERROR:DINT:=16#1007;      (* get error status and clear *)
   SOCKET_SO_TYPE:DINT:=16#1008;         (* get socket type *)
   SOCKET_SO_PROTOTYPE:DINT:=16#1009;   (* get/set protocol type *)
   (* TCPIP socket options *)
   SOCKET_TCP_NODELAY:DINT:=16#01;   (* don't delay send to coalesce packets *)
   SOCKET_TCP_MAXSEG:DINT:=16#02;   (* set maximum segment size *)

   (* Socket types *)
   SOCKET_STREAM:DINT:=1;         (* stream socket *)
   SOCKET_DGRAM:DINT:=2;         (* datagram socket *)
   SOCKET_RAW:DINT:=3;            (* raw-protocol interface *)
   SOCKET_RDM:DINT:=4;            (* reliably-delivered message *)
   SOCKET_SEQPACKET:DINT:=5;      (* sequenced packet stream *)

   (* Inet address definitions *)
   SOCKET_INADDR_ANY:UDINT:=16#00000000;
   SOCKET_INADDR_LOOPBACK:UDINT:=16#7f000001;
   SOCKET_INADDR_BROADCAST:UDINT:=16#ffffffff;
   SOCKET_INADDR_NONE:UDINT:=16#ffffffff;

   (* Protocols *)
   SOCKET_IPPROTO_IP:DINT:=0;         (* dummy for IP *)
   SOCKET_IPPROTO_ICMP:DINT:=1;      (* control message protocol *)
   SOCKET_IPPROTO_IGMP:DINT:=2;      (* group management protocol *)
   SOCKET_IPPROTO_GGP:DINT:=3;      (* gateway^2 (deprecated) *)
   SOCKET_IPPROTO_TCP:DINT:=6;      (* tcp *)
   SOCKET_IPPROTO_PUP:DINT:=12;      (* pup *)
   SOCKET_IPPROTO_UDP:DINT:=17;      (* user datagram protocol *)
   SOCKET_IPPROTO_IDP:DINT:=22;      (* xns idp *)
   SOCKET_IPPROTO_ND:DINT:=77;      (* UNOFFICIAL net disk proto *)
   SOCKET_IPPROTO_RAW:DINT:=255;   (* raw IP packet *)
   SOCKET_IPPROTO_MAX:DINT:=256;

   (* Flags *)
   SOCKET_MSG_OOB:DINT:=16#1;         (* process out-of-band data *)
   SOCKET_MSG_PEEK:DINT:=16#2;         (* peek at incoming message *)
   SOCKET_MSG_DONTROUTE:DINT:=16#4;   (* send without using routing tables *)

   (* Ioctl commands *)
   SOCKET_FIONREAD:DINT:=1;            (* get num chars available to read *)
   SOCKET_FIONBIO:DINT:=2;               (* set to non-blocking *)

   (* For SysSockSelect() descriptors *)
   SOCKET_FD_SETSIZE :DINT :=   64;
   MAX_SOCKET_FD_SETSIZE : DINT := 63;
END_VAR

peewit

hallo mike

ich habe dir schnell einen groben ablauf herunter getippt
(habe es nicht kompiliert da sämtliche bilbiotheken im projekt ich nicht habe , es können durchaus tippfehler drinnen sein.... musst selber schaun ....)




[gelöscht durch Administrator]

Mike

#10
Hallo peewit,

habe leider noch eine Frage: Habe dein Baustein für das Programm angepasst. Habe auch festgestellt das bei mir ein paar Libs veraltet waren. Bin jetzt noch auf der Suche von wo die positive Flanke für Start herkommen soll.

Ich bitte dich leider nochmal um deine Hilfe.

Danke.

Gruß

Mike

[gelöscht durch Administrator]

peewit

das musst du doch selber wissen !

wenn du mit einem ethernet teilnehmer daten austauschen möchtest, sollte dies doch irgenwie gezielt und koordiniert durchgeführt werden
auf jeden fall kannst du mit einer positiven flanke den ablauf starten


Mike

#12
Danke für deine schnelle Antwort.

Ich würde mich mal mit dir direkt Unterhalten wenn es möglich ist und wenn du es Überhaupt willst.

Mit freundlichen Gruß ( der Anfänger )

Mike



Mike

Moin,

Gibt es eine direkte Möglichkeit die Daten von Array1 [20..40] in Array2 [0..20] zu schreiben. Hab es mit at %mb probiert. Wird leider zu Gr0ß.

Gruß Mike

peewit

der ip_control arbeitet mit einer eigenen datenstrukur und nicht mit pointer
somit kannst du nicht direkt einen teil eines datenarrays übergeben

nachdem der ip_control so entwickelt wurde das dieser auf möglichst vielen steuerungsplattformen realisiert werden kann
habe ich bewusst auf pointer zugunsten der kompatibilität verzichtet

es ist aber durchaus machbar den ip_control so zuändern das dieser mit pointer funktioniert !