目录
1、添加库文件
2、功能块封装
3、程序变量定义
定义全局变量1
定义全局变量2
定义局部变量
4、程序代码
5、通信测试
6、接收到的消息在PLC操作系统弹窗显示
7、程序工程下载连接
1、添加库文件
2、功能块封装
3、程序变量定义
定义全局变量1
//UdpLOCAL_HOST_IP : STRING(15) := '192.168.1.100'; (*本机的IP*)LOCAL_HOST_PORT : UDINT := 1001; (*本机的Port*)REMOTE_HOST_IP : STRING(15) := '192.168.1.104'; (*对方的IP*)REMOTE_HOST_PORT : UDINT := 1001; (*对方的Port*)Keep_dg_UdpScan: UINT:=10; //1次10毫秒,10次就是100毫秒
定义全局变量2
//Udp-系统变量g_sTcIpConnSvrAddr : T_AmsNetId := '';bLogDebugMessages : BOOL := TRUE;(* Some project specific error codes *)PLCPRJ_ERROR_SENDFIFO_OVERFLOW : UDINT := 16#8103;PLCPRJ_ERROR_RECFIFO_OVERFLOW : UDINT := 16#8104;//Udpsg_Send: STRING:='@0,0#';sg_Recv: STRING:='@0,0,0#';
定义局部变量
PROGRAM Udp
VARfbSocketCloseAll : FB_SocketCloseAll;bCloseAll : BOOL := TRUE;fbPeerToPeer : FB_PeerToPeer;sendFifo : FB_Fifo;receiveFifo : FB_Fifo;sendToEntry : ST_FifoEntry;entryReceivedFrom : ST_FifoEntry;tmp : STRING;bSendOnceToItself : BOOL; //给自己发送一次bSendOnceToRemote : BOOL; //Udp目标机器发送一次times: UINT:=0; //END_VAR
4、程序代码
//设置Udp自动发送间隔时间
IF times >= Keep_dg_UdpScan THENtimes:=0;bSendOnceToRemote:=NOT bSendOnceToRemote;
END_IF
times:=times+1;//复位,关闭所有连接
IF bCloseAll THEN (*On PLC reset or program download close all old connections *)bCloseAll := FALSE;fbSocketCloseAll( sSrvNetId:= g_sTcIpConnSvrAddr, bExecute:= TRUE, tTimeout:= T#10s );
ELSEfbSocketCloseAll( bExecute:= FALSE );
END_IFIF NOT fbSocketCloseAll.bBusy AND NOT fbSocketCloseAll.bError THEN//Udp目标机器发送一次IF bSendOnceToRemote THENbSendOnceToRemote := FALSE; (* clear flag *)sendToEntry.nRemotePort := REMOTE_HOST_PORT; (* remote host port number*)sendToEntry.sRemoteHost := REMOTE_HOST_IP; (* remote host IP address *)sendToEntry.msg := sg_Send; (* message text*);sendFifo.AddTail( new := sendToEntry ); (* add new entry to the send queue*)IF NOT sendFifo.bOk THEN (* check for fifo overflow*)LogError( 'Send fifo overflow!', PLCPRJ_ERROR_SENDFIFO_OVERFLOW );END_IFEND_IF//给自己发送一次IF bSendOnceToItself THENbSendOnceToItself := FALSE; (* clear flag *)sendToEntry.nRemotePort := LOCAL_HOST_PORT; (* nRemotePort == nLocalPort => send it to itself *)sendToEntry.sRemoteHost := LOCAL_HOST_IP; (* sRemoteHost == sLocalHost =>send it to itself *)sendToEntry.msg := 'Hello itself!'; (* message text*);sendFifo.AddTail( new := sendToEntry ); (* add new entry to the send queue*)IF NOT sendFifo.bOk THEN (* check for fifo overflow*)LogError( 'Send fifo overflow!', PLCPRJ_ERROR_SENDFIFO_OVERFLOW );END_IFEND_IF(* send and receive messages *)fbPeerToPeer( sendFifo := sendFifo, receiveFifo := receiveFifo, sLocalHost := LOCAL_HOST_IP, nLocalPort := LOCAL_HOST_PORT, bEnable := TRUE );//fbPeerToPeer( sendFifo := sendFifo, receiveFifo := receiveFifo, sLocalHost := REMOTE_HOST_IP, nLocalPort := REMOTE_HOST_PORT, bEnable := TRUE );(* remove all received messages from receive queue *)REPEATreceiveFifo.RemoveHead( old => entryReceivedFrom );IF receiveFifo.bOk THEN//接收到的消息在PLC操作系统弹窗显示//tmp := CONCAT( 'RECEIVED from: ', entryReceivedFrom.sRemoteHost );//tmp := CONCAT( tmp, ', Port: ' );//tmp := CONCAT( tmp, UDINT_TO_STRING( entryReceivedFrom.nRemotePort ) );//tmp := CONCAT( tmp, ', msg: %s' );//ADSLOGSTR( ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_MSGBOX, tmp, entryReceivedFrom.msg );END_IFUNTIL NOT receiveFifo.bOkEND_REPEATEND_IF//获取Udp接收到的消息
(*
IF fbPeerToPeer.receiveFifo.old.msg<>'' THENsg_Recv:=entryReceivedFrom.msg;
END_IF
fbPeerToPeer.receiveFifo.old.msg:='';
*)sg_Recv:=entryReceivedFrom.msg;
5、通信测试
6、接收到的消息在PLC操作系统弹窗显示
该段代码功能为,将接收到的消息在PLC操作系统里弹框显示。
要想不弹窗显示,去掉该段代码即可不再弹窗显示
7、程序工程下载连接
https://download.csdn.net/download/panjinliang066333/90542329