一、概述
欧姆龙NJ系列PLC支持标准的Socket通信功能,能够与各种设备进行TCP/UDP通信。本文介绍Socket通信的硬件组态、参数配置,并提供一个使用ST语言编写的简单示例。
二、硬件组态
在Sysmac Studio中配置Socket通信需要以下步骤:
1. 创建新工程并选择正确的NJ系列CPU型号
2. 在"配置和设置"中添加Ethernet端口
3. 配置IP地址、子网掩码等网络参数
4. 在"内置Ethernet端口设置"中启用Socket通信服务
三、参数配置
Socket通信需要在PLC程序中配置以下参数:
通信协议(TCP/UDP)本地端口号目标IP地址和端口号通信超时时间数据长度和格式四、Socket通信示例(ST语言)
以下是一个简单的TCP客户端通信示例,包含错误处理和状态管理:
FUNCTION_BLOCK FB_SocketCommunication
VAR_INPUT
bEnable: BOOL; // 使能通信
sRemoteIP: STRING(15); // 远程IP地址
nRemotePort: UINT; // 远程端口
sSendData: STRING(100); // 发送数据
END_VAR
VAR_OUTPUT
bConnected: BOOL; // 连接状态
sReceiveData: STRING(100); // 接收数据
nErrorID: UDINT; // 错误代码
sErrorMessage: STRING(50); // 错误信息
END_VAR
VAR
// Socket相关变量
fbSocket: MC_SocketCreate; // Socket创建功能块
fbConnect: MC_SocketConnect; // 连接功能块
fbSend: MC_SocketSend; // 发送功能块
fbReceive: MC_SocketReceive; // 接收功能块
fbClose: MC_SocketClose; // 关闭功能块
// 内部状态变量
nState: INT; // 状态机状态
nSendLength: UINT; // 发送数据长度
nReceiveLength: UINT; // 接收数据长度
tTimeout: TIME := T#5S; // 超时时间
tStartTime: TIME; // 开始时间
END_VAR
// 状态机实现
CASE nState OF
0: // 初始状态
IF bEnable THEN
nState := 10;
END_IF
10: // 创建Socket
fbSocket(
Enable := TRUE,
Protocol := MC_PROTOCOL_TCP,
Socket => ,
Busy => ,
Done => ,
Error => ,
ErrorID => );
IF fbSocket.Done THEN
nState := 20;
ELSIF fbSocket.Error THEN
nErrorID := fbSocket.ErrorID;
sErrorMessage := 'Socket创建失败';
nState := 100; // 错误状态
END_IF
20: // 连接到远程服务器
fbConnect(
Enable := TRUE,
Socket := fbSocket.Socket,
IP_Address := sRemoteIP,
Port := nRemotePort,
Timeout := tTimeout,
Busy => ,
Done => ,
Error => ,
ErrorID => );
IF fbConnect.Done THEN
bConnected := TRUE;
nState := 30;
ELSIF fbConnect.Error THEN
nErrorID := fbConnect.ErrorID;
sErrorMessage := '连接失败';
nState := 100; // 错误状态
END_IF
30: // 发送数据
nSendLength := LEN(sSendData);
fbSend(
Enable := TRUE,
Socket := fbSocket.Socket,
Data := ADR(sSendData),
Size := nSendLength,
Timeout := tTimeout,
Busy => ,
Done => ,
Error => ,
ErrorID => ,
SizeSent => );
IF fbSend.Done THEN
nState := 40;
ELSIF fbSend.Error THEN
nErrorID := fbSend.ErrorID;
sErrorMessage := '发送失败';
nState := 100; // 错误状态
END_IF
40: // 接收数据
fbReceive(
Enable := TRUE,
Socket := fbSocket.Socket,
Data := ADR(sReceiveData),
Size := SIZEOF(sReceiveData),
Timeout := tTimeout,
Busy => ,
Done => ,
Error => ,
ErrorID => ,
SizeReceived => nReceiveLength);
IF fbReceive.Done THEN
nState := 50;
ELSIF fbReceive.Error THEN
nErrorID := fbReceive.ErrorID;
sErrorMessage := '接收失败';
nState := 100; // 错误状态
END_IF
50: // 通信完成,保持连接
// 可根据需要保持连接或关闭
100: // 错误处理状态
// 关闭Socket并重置状态
fbClose(
Enable := TRUE,
Socket := fbSocket.Socket,
Busy => ,
Done => ,
Error => ,
ErrorID => );
IF fbClose.Done THEN
nState := 0; // 返回初始状态
bConnected := FALSE;
END_IF
END_CASE
// 如果禁用通信,关闭连接
IF NOT bEnable AND bConnected THEN
fbClose(Enable := TRUE, Socket := fbSocket.Socket);
bConnected := FALSE;
nState := 0;
END_IF
注意:上述示例使用了欧姆龙的多通信功能块(MC Function Blocks),需要确保Sysmac Studio中已安装相应的功能库。
五、错误处理
在Socket通信中,应处理以下常见错误:
连接超时或失败发送/接收数据超时网络断开目标设备无响应示例中通过状态机和错误ID检测实现了基本的错误处理机制。
六、状态管理
示例中使用状态机管理Socket通信的不同阶段:
1. Socket创建
2. 连接建立
3. 数据发送
4. 数据接收
5. 错误处理
总结
欧姆龙NJ系列PLC提供了强大的Socket通信功能,通过Sysmac Studio可以方便地进行配置和编程。使用ST语言结合多通信功能块可以实现稳定可靠的通信程序,包含完善的错误处理和状态管理机制。