Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why does my ST code only send UDP message once?

I set MainTask to execute "PLC_PRG" every 20 milliseconds.
screenshot

Code in "PLC_PRG":

PROGRAM PLC_PRG
VAR
    str: STRING := 'abc123456789';  
    UDP_Peer_1: NBS.UDP_Peer;
    UDP_Send_1: NBS.UDP_Send;
    
    
    ipAddress_PC:STRING:='192.168.1.200';
    IP_PC: NBS.IP_ADDR;
    
    ipAddress_PLC:STRING:='192.168.1.101';
    IP_PLC: NBS.IP_ADDR;
    
    Sended:BOOL;
END_VAR
IP_PC.sAddr:=ipAddress_PC;
IP_PLC.sAddr:=ipAddress_PLC;

UDP_Peer_1(
    xEnable:= TRUE, 
    xDone=> , 
    xBusy=> , 
    xError=> , 
    ipAddr:= IP_PLC, 
    uiPort:= 12000, 
    ipMultiCast:= , 
    eError=> , 
    xActive=> , 
    hPeer=> );
    
UDP_Send_1(
    xExecute:= TRUE, 
    udiTimeOut:= , 
    xDone=> Sended, 
    xBusy=> , 
    xError=> , 
    hPeer:= UDP_Peer_1.hPeer, 
    ipAddr:= IP_PC, 
    uiPort:= 60000, 
    szSize:= INT_TO_UDINT(LEN(str)), 
    pData:= ADR(str), 
    eError=> );

The behavior I’m expecting is that every 20 milliseconds, the plc device will send the message ‘abc123456789’ to my PC via udp.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

actually
The PLC only sends the message once when it starts and then no longer sends it any more.

I set a breakpoint on line 16 of the code "UDP_Send_1(", and I confirmed that it is called multiple times. However, except for the first call, no message is sent to the pc.

thank you for your help.

>Solution :

Yiu only need to look into the documentation to see:

xExecute: BOOL

Rising edge: Starts defined operation
FALSE: Resets the defined operation after ready condition was reached

In other words, xExecute is a triggered input that activates on a rising edge.

If you set the input to a constant TRUE, it is expected that the message will be sent at most once.

If you want to send messages continuously, then, as the documentation states, you should reset the sender when it’s done (when xDone becomes true) or error is encountered (when xError becomes true) by setting xExecute to False for one cycle.

Needless to say, the message won’t be sent at every cycle, the most you can hope for is every 2 cycles, but only if sending is always completed in 1 cycle, in other words, xDone becomes true on every next cycle.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading