在Codesys中如何实现Tcp协议通讯
一、环境和所需功能库
1. codesys X64 环境下

2. 所需TCP通讯功能库的安装
进入库管理器中,点击添加库后搜索“CAA NET Base Services”关键字,点击安装后


安装完之后,就有所需的TCP功能块(Tcp_Client&Tcp_Server&Tcp_Read&Tcp_Write等)

3.tcp测试软件选择“NetAssistant”
下载链接网页地址:https://netassistant.trydo.top/en/

二、codesys作为Tcp Client
1.代码展示
点击查看代码
`PROGRAM POU_TCP_Client
VAR
(*客户端功能块实例化*)
fbTcpClient : NBS.TCP_Client; //tcp客户端实例化
fbTcpClientRead : NBS.TCP_Read; //tcp客户端数据读取
fbTcpClientWrite : NBS.TCP_Write; //tcp客户端数据发送
(*连接参数*)
ipAddress : NBS.IP_ADDR ; //服务器ip
ip : STRING(20):= '127.0.0.1';
iPort : UINT := 5000; //服务器端口号
bConnectEn : BOOL ; //客户端通讯连接触发
bConnectDone : BOOL; //客户端通讯连接完成
bTcpReadEn : BOOL; //客户端数据读取触发
bTcpReadDone : BOOL; //客户端数据读取完成
bTcpReadErrID : INT; //客户端数据读取错误ID
sTcpReadBuffer :STRING ; //tcp读取数据缓存区
bTcpWriteEn : BOOL; //客户端数据写入触发
bTcpWriteDone : BOOL; //客户端数据写入完成
bTcpWriteErrID : INT; //客户端数据写入错误ID
sTcpWriteBuffer :STRING; //tcp写入数据缓存区
END_VAR`
点击查看代码
`//IP等于“127.0.0.1”
ipAddress.sAddr := ip;
//客户端连接
fbTcpClient(
xEnable:= bConnectEn,
xDone=> bConnectDone,
xBusy=> ,
xError=> ,
udiTimeOut:= 3000,
ipAddr:= ipAddress,
uiPort:= iPort,
eError=> ,
xActive=> ,
hConnection=> );
//客户端数据读取
fbTcpClientRead(
xEnable:= bTcpReadEn AND fbTcpClient.xActive, //客户端真是连接正常下
xDone=> bTcpReadDone,
xBusy=> ,
xError=> ,
hConnection:= fbTcpClient.hConnection,
szSize:= SIZEOF(sTcpReadBuffer),
pData:= ADR(sTcpReadBuffer),
eError=> bTcpReadErrID,
xReady=> ,
szCount=> );
//读取完成将触发信号复位
IF bTcpReadDone THEN
bTcpReadEn := FALSE;
END_IF
//客户端数据发送
fbTcpClientWrite(
xExecute:= bTcpWriteEn AND fbTcpClient.xActive, //客户端真是连接正常下
udiTimeOut:= 3000,
xDone=> bTcpWriteDone,
xBusy=> ,
xError=> ,
hConnection:= fbTcpClient.hConnection,
szSize:= SIZEOF(sTcpWriteBuffer),
pData:= ADR(sTcpWriteBuffer),
eError=> bTcpWriteErrID);
//发送完成将触发信号复位
IF bTcpWriteDone THEN
bTcpWriteEn := FALSE;
END_IF
`
2. NetAssistant服务器建立
ip为本地环网'127.0.0.1',端口与codesys中'5000'保持一致

3. 发送数据测试效果
codesys侧发送数据'HELLO'

“NetAssistant”侧接受到的数据

4. 读取数据测试效果
在“NetAssistant”发送数据'HELLO'

codesys侧接受到的数据

三、codesys作为Tcp Server
- 代码展示
点击查看代码
`
PROGRAM POU_TCP_Server
VAR
(*服务器功能块实例化*)
fbTcpConnection : NBS.TCP_Connection; //tcp客户端连接检测
fbTcpServer : NBS.TCP_Server; //tcp服务器建立
fbTcpRead : NBS.TCP_READ; //tcp服务器数据读取
fbTcpWrite : NBS.TCP_Write; //tcp服务器数据发送
(*连接参数*)
ip : STRING(20) := '127.0.0.1'; //客户端ip
ipAddress : NBS.IP_ADDR;
uiPort : UINT := 5001; //服务器端口为5001
bTcpServerEn : BOOL; //tcp服务器开启触发
bTcpServerDone : BOOL; //tcp服务器开启完成
iTcpServerErrorID : INT; //tcp服务器错误ID
bTcpServerWriteEn : BOOL; //tcp服务器发送触发
sTcpServerReadBuffer : STRING; //tcp服务器读取缓存区
sTcpServerWriteBuffer : STRING; //tcp服务器发送缓存区
END_VAR
`
点击查看代码
`
//客户端ip为127.0.0.1
ipAddress.sAddr := ip;
//tcp服务器建立开启
fbTcpServer(
xEnable:= bTcpServerEn,
xDone=> bTcpServerDone,
xBusy=> ,
xError=> ,
ipAddr:= ipAddress,
uiPort:= uiPort,
eError=> iTcpServerErrorID,
hServer=> );
//检测是否有客户端连接
fbTcpConnection(
xEnable:= fbTcpServer.xBusy,
xDone=> ,
xBusy=> ,
xError=> ,
hServer:= fbTcpServer.hServer,
eError=> ,
xActive=> ,
hConnection=> );
//服务器数据读取
fbTcpRead(
xEnable:= fbTcpConnection.xActive,
xDone=> ,
xBusy=> ,
xError=> ,
hConnection:= fbTcpConnection.hConnection,
szSize:= SIZEOF(sTcpServerReadBuffer),
pData:= ADR(sTcpServerReadBuffer),
eError=> ,
xReady=> ,
szCount=> );
//服务器数据发送
fbTcpWrite(
xExecute:= bTcpServerWriteEn AND fbTcpConnection.xActive,
udiTimeOut:= 3000,
xDone=> ,
xBusy=> ,
xError=> ,
hConnection:= fbTcpConnection.hConnection,
szSize:= SIZEOF(sTcpServerWriteBuffer),
pData:= ADR(sTcpServerWriteBuffer),
eError=> );
//发送完成后服务触发信号
IF fbTcpWrite.xDone THEN
bTcpServerWriteEn := FALSE;
END_IF
`
2. NetAssistant客户端建立
ip为本地环网'127.0.0.1',端口与codesys中'5001'保持一致

3. 发送数据测试效果
codesys侧发送数据'HELLO'

“NetAssistant”侧接受到的数据

4. 读取数据测试效果
NetAssistant”侧发送数据'HELLO'

codesys侧接受到的数据


浙公网安备 33010602011771号