Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
ich betreibe erfolgreich eine UDP-Verbindung von der ControlWin SPS zu einer Siemens Cpu mit Hilfe der NetVarUDP-Bibliothek und folgendem Code:
PROGRAMUDP_PRGVAR  HandleSND:SysTypes.RTS_IEC_HANDLE;END_VAR________________________________________________________________________IFHandleSND=0THEN  HandleSND:=NetVarUdp.UdpOpenSendSocket(iPort:=3334);END_IFUdpReceiveData(  hSocket:=HandleSND,  iPort:=3333,  pbyData:=ADR(Global_Variables.bufrcv),  diDataSize:=200);UdpSendData(  hSocket:=HandleSND,  iPort:=3334,  stIPAddress:='192.168.72.247',  pbyData:=ADR(Global_Variables.bufsend),  diDataSize:=200);
Das Programm läuft in einer eigenen Task mit 10ms Zykluszeit und funktioniert eigentlich ganz gut. Probleme gibt es wenn der Partner, aus welchen Gründen auch immer, aufhört zu senden. Dann hängt der Task endlos bei UdpReceiveData fest und bei STOP meldet die PLC schließlich Ausnahmefehler weil "Task does not react within timeout switchting to stop! An application reset is neccesary!" (Screenshot)
In den Code von UdpReceiveData kann man offensichtlich nicht reinschauen und die vorhandene Dokumentation dazu lässt sehr zu wünschen übrig (Screenshot). (Grundsätzlich wären Code-Beispiele für die Verwendung solcher Bausteine sehr hilfreich.)
Irgendwelche Vorschläge wie ich das abfangen oder grundsätzlich besser programmieren kann, um diesen Fehler in Zukunft zu vermeiden? Die verwendete CODESYS Version ist 3.5SP11 x64
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2017-09-04
Originally created by: Codesys>>Twincat
Das Problem ist, dass ich hier die falschen Bausteine verwende.
Die Bausteine aus der NetVarUDP-Bibliothek werden, wie der Name schon sagt bei Verwendung von globalen Netzwerkvariablen im Hintergrund benutzt. Das ist, nach meinem Verständnis allerdings nur sinnvoll wenn zwei CODESYS-CPUs miteinander kommunizieren sollen.
Um eine generische UDP-Kommunikation von einer Netzwerkschnittstelle zu einer anderen einzurichten sollte man die Bibliothek "CAA Net Base Services" verwenden. Dort geht es dann auf gewohnte Weise mit Sockel aufmachen und Handle an Receive und Sendebaustein übergeben.
Also z.B. so:
PROGRAMUDP_PRG_2VAR
 Â
  Sockel: NBS.UDP_Peer;
  handle:CAA.HANDLE;
  Send: NBS.UDP_Send;
  xsend: BOOL;
  Receive: NBS.UDP_Receive;
  remIP:NBS.IP_ADDR :=(sAddr :='192.168.72.247');
  localip: nbs.ip_addr :=(sAddr :='192.168.72.41');END_VAR__________________________________________________________________________________--------------------------------------------------------------------------------------------------------------Sockel(
  xEnable:=TRUE,
  xDone=> ,
  xBusy=> ,
  xError=> ,
  ipAddr:=localip,
  uiPort:=3333,
  ipMultiCast:= ,
  eError=> ,
  xActive=> ,
  hPeer=>handle);
 Â
IFNOTSockel.xActiveTHEN
  RETURN;END_IFReceive(
  xEnable:=TRUE,
  xDone=> ,
  xBusy=> ,
  xError=> ,
  hPeer:=handle ,
  szSize:=200,
  pData:=ADR(global_variables.BufRcv),
  eError=> ,
  xReady=> ,
  ipFrom=> ,
  uiPortFrom=> ,
  szCount=>);Send(
  xExecute:=xsend,
  udiTimeOut:=1000,
  xDone=> ,
  xBusy=> ,
  xError=> ,
  hPeer:=handle,
  ipAddr:=remip,
  uiPort:=3334,
  szSize:=200,
  pData:=ADR(Global_Variables.BufSend),
  eError=>);
 Â
  IFsend.xdoneORsend.xerrorTHEN
    xsend:=FALSE;
    BufSend.Cnt:=BufSend.Cnt+1;
    RETURN;
  END_IF
  xsend:=TRUE;
Hier wird allerdings nur jede zweite Ausführung des Tasks gesendet, da der Sendebaustein zurückgesetzt werden muss. (Kann man bestimmt noch besser machen.) Außerdem komplett ohne Errorhandling wie man sieht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Originally created by: Codesys>>Twincat
Hallo,
ich betreibe erfolgreich eine UDP-Verbindung von der ControlWin SPS zu einer Siemens Cpu mit Hilfe der NetVarUDP-Bibliothek und folgendem Code:
Das Programm läuft in einer eigenen Task mit 10ms Zykluszeit und funktioniert eigentlich ganz gut. Probleme gibt es wenn der Partner, aus welchen Gründen auch immer, aufhört zu senden. Dann hängt der Task endlos bei UdpReceiveData fest und bei STOP meldet die PLC schließlich Ausnahmefehler weil "Task does not react within timeout switchting to stop! An application reset is neccesary!" (Screenshot)
In den Code von UdpReceiveData kann man offensichtlich nicht reinschauen und die vorhandene Dokumentation dazu lässt sehr zu wünschen übrig (Screenshot). (Grundsätzlich wären Code-Beispiele für die Verwendung solcher Bausteine sehr hilfreich.)
Irgendwelche Vorschläge wie ich das abfangen oder grundsätzlich besser programmieren kann, um diesen Fehler in Zukunft zu vermeiden? Die verwendete CODESYS Version ist 3.5SP11 x64
Originally created by: Codesys>>Twincat
Das Problem ist, dass ich hier die falschen Bausteine verwende.
Die Bausteine aus der NetVarUDP-Bibliothek werden, wie der Name schon sagt bei Verwendung von globalen Netzwerkvariablen im Hintergrund benutzt. Das ist, nach meinem Verständnis allerdings nur sinnvoll wenn zwei CODESYS-CPUs miteinander kommunizieren sollen.
Um eine generische UDP-Kommunikation von einer Netzwerkschnittstelle zu einer anderen einzurichten sollte man die Bibliothek "CAA Net Base Services" verwenden. Dort geht es dann auf gewohnte Weise mit Sockel aufmachen und Handle an Receive und Sendebaustein übergeben.
Also z.B. so:
Hier wird allerdings nur jede zweite Ausführung des Tasks gesendet, da der Sendebaustein zurückgesetzt werden muss. (Kann man bestimmt noch besser machen.) Außerdem komplett ohne Errorhandling wie man sieht.