You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:34:52