Flutter连接PLC FX5U无响应:PLC主机配置及通信问题咨询
Flutter与三菱FX5U PLC TCP/IP通信问题解决方案
一、FX5U网络设置(分两种模式)
模式1:PLC作为TCP服务器(Flutter主动连接)
这是最常用的通信场景,设置步骤如下:
- 打开GX Works3软件,连接FX5U PLC
- 进入「参数」→「网络参数」→「Ethernet」设置界面
- 在「通用」标签页,配置PLC的IP地址、子网掩码、网关,必须和你的Android设备处于同一局域网段
- 切换到「SLMP设置」标签页:
- 勾选「启用SLMP」
- 端口号保持默认
5000(或自定义,需和Flutter端一致) - 通信模式选择**「被动(服务器)」**,允许外部客户端发起连接
- 进入「防火墙设置」标签页,关闭防火墙(测试阶段)或添加SLMP端口的入站允许规则
- 保存所有参数并写入PLC,重启PLC使设置生效
模式2:PLC作为TCP主机(主动连接Flutter)
若需要PLC主动发起连接,Flutter端需作为服务器:
- 先完成PLC的基础网络参数配置(同模式1的「通用」标签页步骤)
- 在GX Works3中编写PLC程序,使用
OPEN指令指定Flutter设备的IP和监听端口,实现主动连接 - Flutter端需启动Socket服务器,监听指定端口(参考下方代码)
二、获取FX5U的IP地址
- GX Works3读取:连接PLC后,直接在「网络参数」→「通用」标签页查看已配置的IP
- PLC面板查询:部分FX5U型号可通过面板按键调出「网络信息」界面,直接查看当前IP(若面板无此功能,用其他方法)
- 路由器后台查看:登录PLC连接的路由器管理界面,在「设备列表」或「ARP映射表」中查找名称含「FX5U」「Mitsubishi」的设备,查看对应IP
三、Flutter端排查与实现
- 先验证网络连通性:在Android设备的终端模拟器执行
ping [PLC_IP],能通则网络无问题;不通则检查网段、路由器设置或PLC网络参数 - 使用原生Socket替代第三方插件:
flutter_socket_plugin可能存在兼容性问题,建议用Dart原生dart:io库实现,示例代码如下:- 作为客户端连接PLC服务器:
import 'dart:io'; Future<void> connectToPLC() async { try { // 替换为你的PLC IP和端口 Socket socket = await Socket.connect('192.168.1.100', 5000, timeout: const Duration(seconds: 5)); print('PLC连接成功'); // 发送符合SLMP协议格式的指令(示例:读取D0寄存器的值) List<int> slmpFrame = [0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x00, 0x00, 0x01]; socket.add(slmpFrame); // 监听PLC响应 socket.listen( (data) => print('收到PLC响应:${data.toList()}'), onDone: () => socket.close(), onError: (e) => print('通信错误:$e'), ); } catch (e) { print('连接失败:$e'); } }- 作为服务器等待PLC连接:
import 'dart:io'; Future<void> startPlcServer() async { try { // 监听所有网卡的8888端口 ServerSocket server = await ServerSocket.bind('0.0.0.0', 8888); print('Flutter服务器启动,监听端口8888'); await for (Socket client in server) { print('PLC已连接'); client.listen( (data) => print('收到PLC数据:${data.toList()}'), onDone: () => client.close(), ); } } catch (e) { print('服务器启动失败:$e'); } } - 确保SLMP指令格式正确:FX5U仅识别符合SLMP协议的帧结构,不能直接发送普通文本,需按照三菱SLMP规范构造指令
- 检查Android权限:在
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容的提问来源于stack exchange,提问作者Abdulrahman Conteh
相关产品推荐
相关产品推荐

