在AI视觉检测产线中,除了主控工控机运行完整检测算法,现场往往还需要移动巡检平板、边缘数据网关、运维监控端等多形态设备。传统方案需要为Windows、Android、Linux分别开发,维护成本高、数据一致性差。基于.NET MAUI的跨平台方案,可复用90%以上的C#业务代码,一套代码实现多系统对接国产PLC,兼顾原生性能与开发效率。
一、跨平台AI视觉上位机的架构设计
工业场景的跨平台不能只追求UI复用,必须做到业务逻辑、通信协议、异常处理全链路统一,仅将系统相关的硬件访问、权限适配下沉到平台层。
整体采用四层分层架构:
- UI展示层:MAUI原生页面,负责检测数据展示、参数配置、手动控制,各平台保留原生交互体验
- 业务服务层:视觉结果处理、PLC逻辑控制、数据统计等核心业务,全平台100%代码复用
- 通信抽象层:定义PLC通信、相机控制的统一接口,屏蔽底层协议与平台差异
- 平台适配层:各系统独有的串口驱动、网络权限、硬件保活等实现,通过依赖注入注入上层
多端分工明确:Windows端承载完整AI推理与全功能PLC控制;Android平板端用于现场巡检与手动调试;Linux边缘端负责轻量化数据采集与转发。核心业务与通信逻辑完全一致,仅UI与系统能力按需裁剪。
二、PLC通信层的跨平台核心实现
2.1 统一通信接口抽象
先定义PLC通信的标准接口,所有业务逻辑仅依赖接口,不依赖具体实现,确保切换平台与协议时上层代码零改动。
public interface IPlcCommunicator : IDisposable
{
Task<bool> ConnectAsync(string ip, int port = 502);
Task<ushort[]> ReadHoldRegistersAsync(ushort startAddr, ushort count);
Task WriteHoldRegistersAsync(ushort startAddr, ushort[] values);
bool IsConnected { get; }
event Action<bool> ConnectionStateChanged;
}
2.2 Modbus TCP全平台通用实现
国产PLC普遍支持的Modbus TCP基于标准Socket,System.Net.Sockets在MAUI全平台原生兼容,核心通信代码可完全复用,无需平台差异化处理。
沿用工业级优化方案:长连接复用、禁用Nagle算法、串行请求队列、批量寄存器读写,针对汇川、信捷、禾川等国产PLC做协议适配层,统一处理地址偏移与字节序差异。
public class ModbusTcpCommunicator : IPlcCommunicator
{
private Socket _socket;
private readonly Channel<PlcRequest> _requestQueue;
private readonly ushort _addressOffset; // 适配不同品牌地址基准
public async Task<bool> ConnectAsync(string ip, int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.NoDelay = true;
_socket.SendTimeout = 200;
_socket.ReceiveTimeout = 200;
await _socket.ConnectAsync(ip, port);
_ = ProcessRequestLoopAsync();
return true;
}
}
协议适配层独立封装,通过配置切换PLC品牌,无需修改通信核心逻辑。例如汇川H5U为0基地址,部分信捷机型为1基地址,仅需调整偏移量即可兼容。
2.3 串口RTU的平台差异化实现
对于使用串口Modbus RTU的国产PLC,各系统串口API差异较大,采用依赖注入模式,接口统一、平台分别实现。
Windows端直接使用System.IO.Ports;Android端借助USB串口库访问OTG串口设备;Linux端通过读写/dev/ttyUSB*设备文件实现。业务层无感知,启动时按平台注入对应实现。
// 平台注入示例(MauiProgram.cs)
#if WINDOWS
builder.Services.AddSingleton<IPlcCommunicator, WindowsSerialPlcCommunicator>();
#elif ANDROID
builder.Services.AddSingleton<IPlcCommunicator, AndroidUsbSerialPlcCommunicator>();
#endif
三、MVVM模式下的实时数据交互
3.1 响应式UI数据绑定
基于CommunityToolkit.Mvvm实现MVVM架构,PLC寄存器数据、检测结果、连接状态通过ObservableProperty实现双向绑定,数据变更自动同步到界面。
public partial class PlcMonitorViewModel : ObservableObject
{
private readonly IPlcCommunicator _plcService;
[ObservableProperty] private ushort _lineSpeed;
[ObservableProperty] private int _todayOutput;
[ObservableProperty] private bool _isPlcConnected;
public PlcMonitorViewModel(IPlcCommunicator plcService)
{
_plcService = plcService;
_plcService.ConnectionStateChanged += OnStateChanged;
}
}
3.2 异步轮询与UI节流
PLC数据采集运行在独立后台线程,使用PeriodicTimer实现固定间隔轮询,避免阻塞UI线程。针对高刷新率数据,采用UI节流策略,每500ms批量刷新一次界面,平衡实时性与性能消耗。
public async Task StartPollingAsync(CancellationToken token)
{
var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(100));
while (await timer.WaitForNextTickAsync(token))
{
var data = await _plcService.ReadHoldRegistersAsync(0, 10);
LineSpeed = data[0];
TodayOutput = data[1] * 65536 + data[2];
}
}
3.3 视觉结果的跨端回传
AI推理结果通过统一服务层写入PLC,Windows端本地推理回传、Android端接收云端结果回传,底层调用完全一致。批量写入连续寄存器,单次往返完成OK/NG标识、偏移量、缺陷类型等全部数据下发。
四、国产PLC多系统适配的核心踩坑
4.1 网络权限与系统限制
Android 9及以上默认禁止明文TCP通信,直接连接PLC会报错。需在平台目录下添加网络安全配置文件,放行PLC的IP地址,同时申请网络状态访问权限。
iOS端同样需要在Info.plist中禁用ATS明文限制,否则以太网/WiFi连接PLC会被系统拦截。Linux边缘端则需注意防火墙放行对应端口,避免被动断连。
4.2 连接稳定性的平台差异
Android设备息屏后WiFi会进入休眠模式,导致TCP长连接断开。工业场景需配置WiFi锁与前台服务,保持网络常亮;同时开启TCP KeepAlive,适配国产PLC的空闲断连机制。
国产PLC普遍仅支持3~8个并发TCP连接,多端同时接入时需注意连接数管控。建议视觉系统与MAUI端共用同一台数据网关,避免多端直连PLC超出连接上限。
4.3 协议兼容性统一
不同品牌国产PLC的Modbus实现存在细节差异,比如32位整数的高低字顺序、线圈与寄存器的地址映射、功能码支持范围。适配层必须统一处理这些差异,保证全平台行为一致。
适配逻辑为纯C#代码,不依赖系统API,可直接跨平台复用。一次调试完成,所有系统端均生效,无需重复适配。
4.4 串口通信的权限与驱动
Android端使用USB串口对接PLC时,需动态申请USB设备权限,首次插入要弹出授权对话框,未授权直接打开会抛出异常。
Linux端串口设备默认仅root用户可访问,需配置udev规则赋予普通用户权限,否则程序部署后无法打开串口。这些配置属于系统级操作,需在部署阶段完成。
五、工业级稳定性的跨平台落地
5.1 通道级异常隔离与自动重连
通信层内置指数退避重连逻辑,断连后自动按1s、2s、4s…间隔重试,达到最大间隔后周期重试。所有异常在通信层内部捕获,仅通过事件向外通知状态,单路通信故障不影响整体业务运行。
该逻辑为纯C#实现,全平台通用,与之前Windows端上位机的自愈能力完全对齐。
5.2 多级看门狗适配
线程级心跳看门狗为通用代码,所有平台均可直接使用,用于监控采集线程、通信线程是否卡死。
进程级保活按平台差异化适配:Windows端注册为系统服务,配置失败自动重启;Linux端通过systemd托管进程;Android端使用前台服务降低系统回收概率。极端异常下均可实现自动恢复。
5.3 移动平台内存管控
Android与Linux边缘设备内存资源有限,必须严格执行资源池化策略。通信缓冲区使用ArrayPool<byte>复用,避免大对象堆碎片化;图像与模型资源按需加载,不用时立即释放,防止内存持续上涨。
六、多端部署与实战效果
- Windows端:打包为独立exe或MSIX安装包,部署到产线工控机,承载完整AI推理与PLC实时控制,性能与WPF方案无差异。
- Android端:打包APK安装到工业平板,通过以太网或USB串口对接PLC,实现现场移动式监控、参数调试、手动控制。
- Linux端:部署到边缘网关,裁剪UI层后以服务模式运行,负责PLC数据采集、视觉结果转发,复用全部通信与业务逻辑。
实测基于汇川H5U PLC、千兆局域网环境,MAUI各平台的单包读写延迟均稳定在3~8ms,与原生Windows方案基本持平。业务代码复用率超过90%,多端维护成本降低60%以上。
总结
.NET MAUI为国产PLC多端上位机提供了高性价比的落地方案,核心价值在于打破了系统壁垒,让工业级的通信优化、异常处理、稳定性机制可以一次开发、多端复用。
实际落地中,建议优先打通Modbus TCP主链路,确保核心功能跨平台可用,再按需扩展串口、硬件交互等平台特性。生产环境部署前,请根据现场PLC型号与系统环境完成充分的联调与72小时稳定性压测。
![打卡信奥刷题(3676)用C++实现信奥题 P12271 [蓝桥杯 2024 国 Python B] 括号与字母-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261107050125-6aeeb0a5a5ade-220x150.png)