欧姆龙(OMRON)PLC 与发那科(FANUC)机器人之间的通信和数据交互方法,这是工业自动化中控制器与机器人协同作业的典型需求。
欧姆龙 PLC 与发那科机器人的通信以工业以太网为核心载体,主流采用发那科专属的 Focas/EthernetIP 协议或通用 MC 协议,下面我会详细讲解最实用、最稳定的实现方案,覆盖配置、编程和异常处理全流程。
一、通信准备工作
1. 硬件与环境要求
| 设备 / 软件 | 具体要求 |
|---|---|
| 欧姆龙 PLC | 需带以太网模块 / 端口(如 NJ/NX 系列内置以太网、CP1H-ETN、CJ2M-ETN、CS1W-ETN21) |
| 发那科机器人 | R-30iB/R-30iB Plus/R-40iB 控制器(均内置以太网口,支持 Focas2/EthernetIP) |
| 网络配置 | PLC 与机器人接入同一工业交换机,配置同一网段 IP(如 PLC:192.168.1.10,机器人:192.168.1.20) |
| 软件工具 | 欧姆龙:Sysmac Studio(NJ/NX)/CX-Programmer(CJ/CP/CS);发那科:RoboGuide(离线编程)/ 示教器(在线配置) |
2. 核心通信协议选择
优先推荐以下两种协议(按工业场景适配度排序):
| 协议类型 | 适用场景 | 优势 |
|---|---|---|
| Focas2 协议(发那科专属) | 大部分场景(指令下发、状态读取、位置监控) | 功能最全,支持发那科所有机器人指令,稳定性高 |
| EtherNet/IP | 高速实时交互(如高频 IO、位置同步) | 工业标准协议,欧姆龙 PLC 原生支持,延迟 < 10ms |
二、主流方案:基于 Focas2 协议的以太网通信
这是发那科机器人与第三方 PLC 通信的标准方案,下面分「机器人端配置」「PLC 端编程」「数据交互示例」三部分讲解。
1. 发那科机器人端配置(示教器 + RoboGuide)
步骤 1:启用以太网与 Focas2 协议
步骤 2:配置机器人 I/O 信号映射(可选)
若需通过 PLC 控制机器人启停 / 报警复位,可配置数字信号映射:
2. 欧姆龙 PLC 端编程(分 NJ/NX 和 CJ/CP/CS 系列)
方案 A:NJ/NX 系列(Sysmac Studio,ST 语言)
NJ/NX 系列支持原生 TCP/IP 通信,可直接调用 Socket 指令实现 Focas2 协议交互,以下是完整示例:
st
// 欧姆龙NJ/NX系列ST语言程序(Focas2协议通信)
PROGRAM MAIN
VAR
// 通信基础参数
g_sSocket: SOCKET; // 套接字句柄
g_bConnected: BOOL := FALSE; // 连接状态
g_sRobotIP: STRING := '192.168.1.20'; // 机器人IP
g_nPort: UINT := 8193; // Focas2默认端口
g_nTimeout: UINT := 5000; // 通信超时(ms)
// 控制指令与状态
g_nRobotCmd: INT := 0; // 下发指令(1=启动,2=停止,3=复位)
g_nRobotStatus: INT := 0; // 机器人状态(0=空闲,1=运行,2=报警,3=急停)
g_rJointPos: ARRAY[0..5] OF REAL; // 关节位置数据
// Focas2协议数据缓冲区
g_sSendBuf: ARRAY[0..255] OF BYTE; // 发送缓冲区
g_sRecvBuf: ARRAY[0..255] OF BYTE; // 接收缓冲区
g_nSendLen: UINT := 0; // 发送数据长度
g_nRecvLen: UINT := 0; // 接收数据长度
// 定时器
g_tCycleTimer: TON; // 通信循环定时器(100ms)
END_VAR
// 1. 建立Focas2通信连接
IF NOT g_bConnected THEN
// 创建TCP客户端套接字
g_sSocket := SocketCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP);
IF g_sSocket <> INVALID_SOCKET THEN
// 连接发那科机器人
g_bConnected := SocketConnect(g_sSocket, g_sRobotIP, g_nPort, g_nTimeout);
IF g_bConnected THEN
SyslogWrite('成功连接发那科机器人: ' + g_sRobotIP, LOG_INFO);
SocketSetOption(g_sSocket, SO_RCVTIMEO, g_nTimeout); // 设置接收超时
ELSE
SyslogWrite('机器人连接失败,错误码: ' + INT_TO_STRING(SocketGetLastError()), LOG_ERROR);
SocketClose(g_sSocket);
END_IF;
END_IF;
END_IF;
// 2. 100ms循环通信
g_tCycleTimer(IN := g_bConnected, PT := T#100MS);
IF g_tCycleTimer.Q THEN
g_tCycleTimer.IN := FALSE; // 复位定时器方案 B:CJ/CP/CS 系列(CX-Programmer,梯形图 + Function Block)
CJ/CP/CS 系列需使用欧姆龙官方的「FINS/TCP」或「Socket FB 库」实现通信,核心步骤:
3. Focas2 协议核心指令映射
| 功能 | 欧姆龙 PLC 操作 | 发那科机器人响应 |
|---|---|---|
| 控制机器人启停 | 写入机器人 DI 信号(DI [1]=1 启动,DI [2]=1 停止) | 执行启动 / 停止程序,回传 DO [1]=1(运行中) |
| 读取机器人状态 | 发送「读取状态」Focas2 指令 | 回传运行 / 报警 / 急停状态(DO [1]/DO [2]/DO [3]) |
| 读取关节位置 | 发送「读取关节坐标」Focas2 指令 | 回传 6 轴角度(浮点数格式) |
| 复位机器人报警 | 写入机器人 DI [3]=1 | 复位报警,回传 DO [2]=0 |
三、备选方案:EtherNet/IP 通信(高实时性场景)
适用于需要高频数据交互(如 10ms 级位置同步)的场景,步骤如下:
1. 机器人端配置
2. PLC 端配置(Sysmac Studio/CX-Programmer)
st
// 示例:EtherNet/IP数据读写(NJ系列) // PLC Output(CIO 100) → 机器人Input:控制指令 CIO[100] := g_nRobotCmd; // PLC Input(CIO 200) ← 机器人Output:状态 g_nRobotStatus := CIO[200]; // PLC Input(CIO 201-206) ← 机器人Output:关节位置 FOR i := 0 TO 5 DO g_rJointPos[i] := REAL_TO_LREAL(WORD_TO_DWORD(CIO[201+i*2], CIO[202+i*2])); END_FOR;
四、通信调试与异常处理
1. 调试步骤
2. 常见异常及解决方法
| 异常现象 | 原因 | 解决方法 |
|---|---|---|
| 通信连接失败 | IP 不在同一网段 / 机器人 Focas2 未启用 | 检查 IP 配置,示教器确认 Focas2 端口 8193 已开启 |
| 数据读取乱码 | 数据格式不匹配(字节序 / 浮点数) | 统一字节序(小端序),浮点数按 4 字节解析 |
| 指令无响应 | 机器人未进入远程模式 | 示教器切换为「REMOTE」模式,启用「外部自动运行」 |
| 通信延迟大 | 网络拥堵 / 循环周期过长 | 使用工业交换机,缩短通信周期(≤100ms) |

