Date: Thu, 28 Mar 2024 13:40:18 +0000 (UTC) Message-ID: <653854218.115.1711633218402@6bf000190eb4> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_114_1369467934.1711633218401" ------=_Part_114_1369467934.1711633218401 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
Declaration<= /span>
VAR_GLO= BAL CONSTANT =09gc_wMaxTelegram=09: INT :=3D 15; =09gc_uiPort=09=09: UINT :=3D 50001; END_VAR VAR_GLOBAL =09gc_stIpAddr=09=09: String(19) :=3D '192.168.99.109'; END_VAR
Declaration
VAR CON= STANT =09c_wMaxTelegram=09: INT :=3D 15; END_VAR VAR =09ipAddress=09=09: NBS.IPv4Address; =09fbTcpConnection=09: NBS.TCP_Connection; =09fbTcpServer=09=09: NBS.TCP_Server; =09fbTcpRead=09=09: NBS.TCP_Read; =09fbTcpWrite=09=09: NBS.TCP_Write; =09 =09 =09abyRx=09=09=09: ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; =09abyTx=09=09=09: ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; =09 =09iIndex=09=09=09: INT; =09xRead=09=09=09: BOOL :=3D TRUE; =09xWrite=09=09=09: BOOL :=3D TRUE; =09xAckTelegram=09: BOOL; =09xBlockAck=09=09: BOOL; =09udiRead=09=09=09: DINT; END_VAR
Implementation
IF fbTc= pRead.xReady THEN =09IF (fbTcpRead.udiCount =3D (gvlSetting.gc_wMaxTelegram + 1)) THEN=09 =09=09IF ((abyRx[0] =3D 87) AND (abyRx[1] =3D 68) AND (abyRx[2] =3D 58) AN= D (abyRx[3] =3D 32)) THEN // 'WD: ' =3D Watchdog-Telegram =09=09=09FOR iIndex :=3D 0 TO c_wMaxTelegram DO =09=09=09=09abyTx[iIndex] :=3D 0;=09=20 =09=09=09END_FOR =09=09=09// 'ACK: ' =3D Acknowledge-Telegram =09=09=09abyTx[0] :=3D 65; =09=09=09abyTx[1] :=3D 67; =09=09=09abyTx[2] :=3D 75; =09=09=09abyTx[3] :=3D 58; =09=09=09abyTx[4] :=3D 32; =09=09=09// Receive-Counter =09=09=09abyTx[5] :=3D abyRx[4]; =09=09=09abyTx[6] :=3D abyRx[5]; =09=09=09abyTx[7] :=3D abyRx[6]; =09=09=09abyTx[8] :=3D abyRx[7];=20 =09=09=09xWrite :=3D TRUE; =09=09END_IF =09=09xWrite :=3D TRUE; =09END_IF ELSIF fbTcpRead.xError THEN =09xRead :=3D FALSE; END_IF fbTcpWrite(xExecute :=3D xWrite AND NOT xBlockAck, itfConnection :=3D fbTcp= Connection, udiSize :=3D SIZEOF(abyTx), pData :=3D ADR(abyTx), udiTimeOut = :=3D 0); IF fbTcpWrite.xDone OR fbTcpWrite.xError THEN =09xWrite :=3D FALSE; END_IF
Declaration
VAR CON= STANT =09c_tInterval=09=09: TIME :=3D T#1S; =09c_udiInterval=09: UDINT :=3D 3 * TIME_TO_UDINT(c_tInterval)/1000; END_VAR VAR =09ipAddress=09=09: NBS.IPv4Address; =09fbTcpClient=09=09: NBS.TCP_Client; =09fbTcpRead=09=09: NBS.TCP_Read; =09fbTcpWrite=09=09: NBS.TCP_Write; =09 =09abyTx=09=09=09: ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; =09abyRx=09=09=09: ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; =09 =09fbBlink=09=09=09: BLINK :=3D (TIMELOW :=3D c_tInterval, TIMEHIGH :=3D c_= tInterval);=09=09 =09xBlink=09=09=09: BOOL; // Memory of the last state of PLC_PRG.fbBlink =09 =09udiVal=09=09=09: UDINT; =09pudiVal=09=09=09: POINTER TO BYTE; =09iIndex=09=09=09: INT; =09xConnect=09=09: BOOL; =09 =09xRead=09=09=09: BOOL; =09xMissingAck=09=09: BOOL; =09udiResult =09=09: UDINT; =09udiLastAck=09=09: UDINT; =09udiNow=09=09=09: UDINT; =09udiRead=09=09=09: UDINT; =09eRErrorID =09=09: NBS.ERROR; =09eWErrorID =09=09: NBS.ERROR; END_VAR
Implementation
IF NOT = fbTcpClient.xActive THEN =09ipAddress.SetInitialValue(ipAddress :=3D gvlSetting.gc_stIpAddr); END_IF fbTcpClient(xEnable :=3D xConnect, itfIPAddress :=3D ipAddress, uiPort :=3D= gvlSetting.gc_uiPort, udiTimeOut :=3D 0); fbBlink(ENABLE :=3D TRUE); IF (fbBlink.OUT AND (xBlink <> fbBlink.OUT) ) THEN =09udiVal :=3D udiVal + 1; =09FOR iIndex :=3D 0 TO gvlSetting.gc_wMaxTelegram DO =09=09abyTx[iIndex] :=3D 0; =09END_FOR =09// 'WD: ' =3D Watchdog-Telegram =09abyTx[0] :=3D 87; =09abyTx[1] :=3D 68; =09abyTx[2] :=3D 58; =09abyTx[3] :=3D 32; =09// Counter =09pudiVal :=3D ADR(udiVal); =09abyTx[4] :=3D pudiVal^; =09pudiVal :=3D pudiVal + 1; =09abyTx[5] :=3D pudiVal^; =09pudiVal :=3D pudiVal + 1; =09abyTx[6] :=3D pudiVal^; =09pudiVal :=3D pudiVal + 1; =09abyTx[7] :=3D pudiVal^; =09fbTcpWrite(xExecute :=3D xConnect,itfConnection :=3D fbTcpClient.itfConn= ection, udiTimeOut :=3D 0, udiSize :=3D SIZEOF(abyTx), pData :=3D ADR(abyTx= )); ELSE =09fbTcpWrite(xExecute :=3D FALSE); END_IF xBlink :=3D fbBlink.OUT; fbTcpRead(xEnable :=3D xRead AND xConnect, itfConnection :=3D fbTcpClient.i= tfConnection, udiSize :=3D SIZEOF(abyRx), pData :=3D ADR(abyRx), udiCount = =3D> udiRead); IF fbTcpRead.xReady THEN =09IF (fbTcpRead.udiCount =3D (gvlSetting.gc_wMaxTelegram + 1)) THEN =09=09IF ((abyRx[0] =3D 65) AND (abyRx[1] =3D 67) AND (abyRx[2] =3D 75) AN= D (abyRx[3] =3D 58) AND (abyRx[4] =3D 32)) THEN // 'WD: ' =3D Watchdog-Tele= gram =09=09=09udiLastAck :=3D SysTimeRtc.SysTimeRtcGet(udiResult); =09=09END_IF =09END_IF ELSIF fbTcpRead.xError THEN =09fbTcpRead(xEnable :=3D FALSE); END_IF IF NOT fbTcpClient.xActive AND NOT fbTcpClient.xBusy AND NOT fbTcpClient.xD= one THEN =09xConnect :=3D TRUE; ELSIF fbTcpClient.xDone THEN =09xConnect :=3D FALSE; END_IF udiNow :=3D SysTimeRtc.SysTimeRtcGet(udiResult); IF (udiNow > (udiLastAck + c_udiInterval)) THEN =20 =09xMissingAck :=3D TRUE; ELSE =09xMissingAck :=3D FALSE; END_IF
Implementation
TcpServ= er(); TcpClient();
Adap=
t gvlSetting=
as follows:
Declaration<= /span>
{attrib= ute 'qualified_only'} VAR_GLOBAL CONSTANT gc_uiPort : UINT :=3D 50001; gc_stIpAddr : NBS.IP_ADDR :=3D (sAddr :=3D '192.168.99.74'); =20 gc_wMaxTelegram : INT :=3D 15; // Length o the telegram END_VAR
Adapt the IP address and the port to your system.
Create a new POU named TcpServer and adap=
t it as follows:
Declaration<= /span>
VAR CON= STANT c_wMaxTelegram : INT :=3D 15; END_VAR VAR fbTcpConnection : NBS.TCP_Connection; fbTcpServer : NBS.TCP_Server; fbTcpRead : NBS.TCP_Read; fbTcpWrite : NBS.TCP_Write; abyRx : ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; abyTx : ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; iIndex : INT; xRead : BOOL :=3D TRUE; xWrite : BOOL :=3D TRUE; xAckTelegram : BOOL; xBlockAck : BOOL; udiRead : UDINT; END_VAR
Implementati= on
fbTcpSe= rver(xEnable :=3D TRUE, ipAddr :=3D gvlSetting.gc_stIpAddr, uiPort :=3D gvl= Setting.gc_uiPort); fbTcpConnection(xEnable :=3D fbTcpServer.xBusy, hServer :=3D fbTcpServer.hS= erver); fbTcpRead(xEnable :=3D fbTcpConnection.xActive, hConnection :=3D fbTcpConne= ction.hConnection, szSize :=3D SIZEOF(abyRx), pData :=3D ADR(abyRx), szCoun= t =3D> udiRead); =20 IF fbTcpRead.xReady THEN IF (fbTcpRead.szCount =3D (gvlSetting.gc_wMaxTelegram + 1)) THEN =20 IF ((abyRx[0] =3D 87) AND (abyRx[1] =3D 68) AND (abyRx[2] =3D 58) = AND (abyRx[3] =3D 32)) THEN // 'WD: ' =3D Watchdog-Telegram FOR iIndex :=3D 0 TO c_wMaxTelegram DO abyTx[iIndex] :=3D 0; =20 END_FOR // 'ACK: ' =3D Acknowledge-Telegram abyTx[0] :=3D 65; abyTx[1] :=3D 67; abyTx[2] :=3D 75; abyTx[3] :=3D 58; abyTx[4] :=3D 32; // Receive-Counter abyTx[5] :=3D abyRx[4]; abyTx[6] :=3D abyRx[5]; abyTx[7] :=3D abyRx[6]; abyTx[8] :=3D abyRx[7];=20 xWrite :=3D TRUE; END_IF xWrite :=3D TRUE; END_IF ELSIF fbTcpRead.xError THEN xRead :=3D FALSE; END_IF fbTcpWrite(xExecute :=3D xWrite AND NOT xBlockAck, hConnection :=3D fbTcpCo= nnection.hConnection, szSize :=3D SIZEOF(abyTx), pData :=3D ADR(abyTx), ud= iTimeOut :=3D 0); IF fbTcpWrite.xDone OR fbTcpWrite.xError THEN xWrite :=3D FALSE; END_IF
Create a =
new POU named TcpClient and adapt it as follows:
Declaration<= /span>
VAR CON= STANT c_tInterval : TIME :=3D T#1S; c_udiInterval : UDINT :=3D 3 * TIME_TO_UDINT(c_tInterval)/1000; END_VAR VAR fbTcpClient : NBS.TCP_Client; fbTcpRead : NBS.TCP_Read; fbTcpWrite : NBS.TCP_Write; abyTx : ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; abyRx : ARRAY [0..gvlSetting.gc_wMaxTelegram] OF BYTE; fbBlink : BLINK :=3D (TIMELOW :=3D c_tInterval, TIMEHIGH :=3D c_t= Interval); =20 xBlink : BOOL; // Memory of the last state of PLC_PRG.fbBlink udiVal : UDINT; pudiVal : POINTER TO BYTE; iIndex : INT; xConnect : BOOL; xRead : BOOL :=3D TRUE; xMissingAck : BOOL; udiResult : UDINT; udiLastAck : UDINT; udiNow : UDINT; udiRead : UDINT; END_VAR
Implementati= on
fbTcpCl= ient(xEnable :=3D xConnect, ipAddr :=3D gvlSetting.gc_stIpAddr, uiPort :=3D= gvlSetting.gc_uiPort, udiTimeOut :=3D 0); fbBlink(ENABLE :=3D TRUE); IF (fbBlink.OUT AND (xBlink <> fbBlink.OUT) ) THEN udiVal :=3D udiVal + 1; FOR iIndex :=3D 0 TO gvlSetting.gc_wMaxTelegram DO abyTx[iIndex] :=3D 0; END_FOR // 'WD: ' =3D Watchdog-Telegram abyTx[0] :=3D 87; abyTx[1] :=3D 68; abyTx[2] :=3D 58; abyTx[3] :=3D 32; // Counter pudiVal :=3D ADR(udiVal); abyTx[4] :=3D pudiVal^; pudiVal :=3D pudiVal + 1; abyTx[5] :=3D pudiVal^; pudiVal :=3D pudiVal + 1; abyTx[6] :=3D pudiVal^; pudiVal :=3D pudiVal + 1; abyTx[7] :=3D pudiVal^; fbTcpWrite(xExecute :=3D xConnect,hConnection :=3D fbTcpClient.hConnect= ion, udiTimeOut :=3D 0, szSize :=3D SIZEOF(abyTx), pData :=3D ADR(abyTx)); ELSE fbTcpWrite(xExecute :=3D FALSE); END_IF xBlink :=3D fbBlink.OUT; fbTcpRead(xEnable :=3D xRead AND xConnect, hConnection :=3D fbTcpClient.hCo= nnection, szSize :=3D SIZEOF(abyRx), pData :=3D ADR(abyRx), szCount =3D>= udiRead); IF fbTcpRead.xReady THEN IF (fbTcpRead.szCount =3D (gvlSetting.gc_wMaxTelegram + 1)) THEN IF ((abyRx[0] =3D 65) AND (abyRx[1] =3D 67) AND (abyRx[2] =3D 75) = AND (abyRx[3] =3D 58) AND (abyRx[4] =3D 32)) THEN // 'WD: ' =3D Watchdog-Te= legram udiLastAck :=3D SysTimeRtc.SysTimeRtcGet(udiResult); END_IF END_IF ELSIF fbTcpRead.xError THEN fbTcpRead(xEnable :=3D FALSE); END_IF IF NOT fbTcpClient.xActive AND NOT fbTcpClient.xBusy AND NOT fbTcpClient.xD= one THEN xConnect :=3D TRUE; ELSIF fbTcpClient.xDone THEN xConnect :=3D FALSE; END_IF udiNow :=3D SysTimeRtc.SysTimeRtcGet(udiResult); IF (udiNow > (udiLastAck + c_udiInterval)) THEN =20 xMissingAck :=3D TRUE; ELSE xMissingAck :=3D FALSE; END_IF
Adapt the POU PLC_PRG as=
follows:
Implementati= on
TcpServ= er(); TcpClient();