UDP:服务器和客户端的示例


  • 创建标准项目并选择 CODESYS Control Win V3 作为设备。
  • 通过网络扫描连接目标系统。

图1

从 SP17 开始:

  • 打开库管理器并添加以下库: Net Base Services StringUtils

图2

  • 创建名为 gvlSettings 的全局变量列表,定义如下变量:

{attribute 'qualified_only'}
VAR_GLOBAL
    // !!!  Make sure that the firewall does not block these ports !!!
    uiPort      : UINT  := 50000; // Port for the sender => receiver will set to uiPort + 1
    sIPAddres   : STRING(19)        := '192.168.99.109';
END_VAR

  • 在项目中添加一个 POU,名称为 UdpClient。

图3

  • 修改 UdpClient 如下:

声明

VAR
    fbPeerClient    : NBS.UDP_Peer;
    ipAddress       : NBS.IPv4Address;
    xPeerActiv      : BOOL  := TRUE;

    fbSend          : NBS.UDP_Send;
    xSend           : BOOL;

    sSendMsg        : STRING(255) := 'Hello World';
END_VAR

实现

IF xPeerActiv AND NOT fbPeerClient.xBusy THEN
    ipAddress.SetInitialValue(ipAddress := gvlSettings.sIPAddres);
    fbPeerClient(xEnable := TRUE,
                itfIPAddress := ipAddress,
                uiPort := gvlSettings.uiPort + 1); 
END_IF

fbPeerClient();


fbSend(xExecute := xSend AND fbPeerClient.xBusy,
                    itfPeer := fbPeerClient,
                    itfIPAddress := ipAddress,
                    uiPort := gvlSettings.uiPort, 
                    pData := ADR(sSendMsg),
                    udiSize := DINT_TO_UDINT(Stu.StrLenA(ADR(sSendMsg)))); 

IF xSend THEN
    xSend := FALSE;
END_IF

  • 修改 PLC_PRG 如下:

声明

VAR
    fbPeerServer        : NBS.UDP_Peer;
    ipAddress           : NBS.IPv4Address;
    fbReceive           : NBS.UDP_Receive;
    xPeerActiv          : BOOL  := TRUE;

    xRead               : BOOL;
    abyReceive          : ARRAY [0..255] OF BYTE;

    sLastValidReceive   : STRING(255);
    udiIndex            : UDINT;
END_VAR

实现

IF xPeerActiv AND NOT fbPeerServer.xBusy THEN
    ipAddress.SetInitialValue(ipAddress := gvlSettings.sIPAddres);
    fbPeerServer(xEnable := TRUE,
                    itfIPAddress := ipAddress,
                    uiPort := gvlSettings.uiPort); 
END_IF

fbPeerServer();

fbReceive(xEnable := fbPeerServer.xBusy, itfPeer := fbPeerServer, pData := ADR(abyReceive), udiSize := SIZEOF(abyReceive));

IF fbReceive.udiCount > 0 THEN
    IF fbReceive.udiCount < SIZEOF(sLastValidReceive) THEN
        SysMem.SysMemCpy(pDest := ADR(sLastValidReceive), pSrc := ADR(abyReceive), udiCount := fbReceive.udiCount);
        // Set End of String
        sLastValidReceive[fbReceive.udiCount] := 0;
    END_IF
END_IF

UdpClient();

  • 启动项目并将 xSend 变量设置为 TRUE。

图4

SP16 及以前:

  • 打开库管理器并添加 Network 库。

图5

  • 在项目中添加一个全局变量列表,定义如下变量:

{attribute 'qualified_only'}
VAR_GLOBAL
    sIpAddr    :    NBS.IP_ADDR := (sAddr := '192.168.99.74'); // Change to own IP-Address
    // !!!  Make sure that the firewall does not block these ports !!!
    uiPort     :    UINT := 8181; // Port for the sender => receiver will set to uiPort + 1
END_VAR

  • 在项目中添加一个 POU,名称为 UdpClient。

图6

  • 修改 UdpClient 如下:

声明

VAR
    fbPeerClient    :    NBS.UDP_Peer;
    fbReceive       :    NBS.UDP_Receive;
    sRcvMsg         :    STRING;
END_VAR

实现


fbPeerClient(xEnable := TRUE, ipAddr:= GVL.stIpAddr, uiPort:= GVL.uiPort + 1);

fbReceive(xEnable := (fbPeerClient.hPeer <> CAA.gc_hINVALID),
            hPeer := fbPeerClient.hPeer,
            szSize := SIZEOF(sRcvMsg),
            pData := ADR(sRcvMsg));

  • 修改 PLC_PRG 如下:

声明

VAR
    fbPeerServer    :    NBS.UDP_Peer;
    fbSend          :    NBS.UDP_Send;
    xSend           :    BOOL;
    sSendMsg        :    STRING := 'Hello World';
END_VAR

实现

UdpClient();

fbPeerServer(xEnable := TRUE, ipAddr := GVL.stIpAddr, uiPort := GVL.uiPort);

IF fbPeerServer.hPeer <> CAA.gc_hINVALID THEN
    fbSend(xExecute := xSend,
            hPeer := fbPeerServer.hPeer,
            ipAddr := GVL.stIpAddr,
            uiPort := GVL.uiPort + 1,
            szSize := SIZEOF(sSendMsg),
            pData := ADR(sSendMsg));
END_IF

IF xSend THEN
    xSend := FALSE;
END_IF

  • 启动项目并将 xSend 变量设置为 TRUE。

图7