WPF + 高性能异步 MC 协议库,直连三菱 PLC(MC1E/3E/4E)

56 阅读4分钟

前言

工业自动化领域,稳定、高效地与 PLC(可编程逻辑控制器)通信是开发智能控制系统的核心环节。传统三菱 MC 协议实现往往受限于同步阻塞模型、低效的内存管理以及缺乏现代化软件架构支持,难以满足高并发、低延迟的现代工业场景需求。

本文推荐一个基于全新设计思想重构的 高性能、纯异步、现代化 C# 三菱 MC 协议通信库。它不仅大幅提升了通信效率,还深度集成 .NET 的依赖注入、结构化数据序列化等先进特性,并配套提供了一个开箱即用的 WPF 图形界面程序,帮助大家快速上手、直观调试、高效集成。

项目简介

mc-protocol-next 是对经典 MC 协议通信库的现代化重写,专为 .NET 8 及以上平台打造,面向工业 4.0 与 IIoT(工业物联网)应用场景。相比传统实现,它具备以下显著优势:

  • 2 倍性能提升:优化底层协议栈,显著降低通信延迟

  • 100% 异步支持:基于 async/await 模型,避免线程阻塞,提升系统吞吐量

  • 结构化数据支持:直接读写 C# 结构体(struct),无需手动解析字节流

  • 现代化架构:全面支持依赖注入(DI)、配置即服务(Configuration as a Service)

  • WPF GUI 示例:提供完整图形界面 Demo,开箱即用,加速开发验证

开发环境

项目要求
IDEVisual Studio 2022
语言C#
UI 框架WPF (Windows Presentation Foundation)
操作系统Windows 7 SP1 或更高版本
.NET SDK.NET 8.0

项目使用

1、项目配置

克隆仓库后,打开 .sln 解决方案文件,确保已安装 .NET 8.0 SDK。WPF 示例项目 McProtocolNextDemo 已预配置所有依赖,直接编译运行即可。

2、服务注册(依赖注入)

mc-protocol-next 采用 .NET 标准依赖注入容器管理生命周期:

using McProtocolNext;
using Microsoft.Extensions.DependencyInjection;

namespace McProtocolNext;

public static class ServiceCollectionExtensions {
    /// <summary>
    /// 注册三菱 MC 协议通信服务
    /// </summary>
    public static IServiceCollection AddMcProtocolService(this IServiceCollection services) {
        return services.AddSingleton<IMcProtocol, McProtocol>();
    }
}

在应用程序启动时注册服务:

var services = new ServiceCollection();
services.AddMcProtocolService();
var serviceProvider = services.BuildServiceProvider();

3、配置通信参数

实现 IMcCommunicationConfig 接口以提供 PLC 连接信息:

public class McProtocolConfig : IMcCommunicationConfig
{
    // 实现 IP、端口、超时等属性
}

注入配置:

_ = services.AddSingleton<IMcCommunicationConfig>(_ => AppConfig.McProtocols);

核心功能:结构化数据读写(推荐方式)

定义结构体

通过 [StructLayout] 和自定义特性 [MitsubishiString] 映射 PLC 寄存器布局:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct MixedDataStruct {
    public bool IsActive;           // D3233.0
    public bool IsAlarm;            // D3233.1
    public bool IsOperational;      // D3233.2
    public bool IsError;            // D3233.3
    public short Id;                // D3234–D3235
    public float Temperature;       // D3236–D3239
    public double Pressure;         // D3240–D3247
    public int Volume;              // D3248–D3251
    [MitsubishiString(20)]
    public string DeviceName;       // D3252–D3271
    [MitsubishiString(50)]
    public string ManufacturerName; // D3272–D3321
}

💡 [MitsubishiString(N)] 确保字符串以固定长度(N 字节)编码,兼容 PLC 存储格式。

写入结构体

private readonly IMcProtocol _mcProtocol;

var address = 3233;
MixedDataStruct writeData = new() {
    IsActive = true,
    IsAlarm = false,
    IsOperational = true,
    IsError = false,
    Id = 12345,
    Temperature = 25.5f,
    Pressure = 101.325,
    Volume = 500,
    DeviceName = "DeviceName-003",
    ManufacturerName = "ManufacturerName-XYZ"
};

await _mcProtocol.WriteStructAsync(writeData, address).ConfigureAwait(false);

读取结构体

var address = 3233;

// 方式一:通过 Type
var readResult = await _mcProtocol.ReadStructAsync(typeof(MixedDataStruct), address).ConfigureAwait(false);

// 方式二:泛型(推荐)
var readResult = await _mcProtocol.ReadStructAsync<MixedDataStruct>(address).ConfigureAwait(false);

返回结果为 object 或强类型实例,可直接用于业务逻辑或 UI 绑定。

WPF 示例应

配套的 WPF Demo 应用 不仅展示了如何初始化通信服务、绑定配置、执行读写操作,还提供了:

  • 实时寄存器监控面板

  • 结构体数据可视化编辑器

  • 通信状态与错误日志反馈

  • 配置动态加载与热更新支持

这使得开发者无需编写额外代码即可验证通信链路,极大缩短调试周期。

项目效果

91dfed1b5006564f707629d7cca8fd23_I3dcJszAA2.png

项目源码

GitHub:github.com/MAS-Copilot…

总结

项目代表了工业通信库向现代化、高性能、开发者、友好方向演进的重要一步。它通过:

  • 全异步 I/O 模型释放系统资源

  • 结构体映射简化数据交互逻辑

  • 依赖注入与配置解耦提升可测试性与可维护性

  • WPF 示例提供直观、高效的开发体验

不管是用于 CNC 控制、产线监控、设备物联还是数字孪生系统,都能作为可靠、高效的通信基石。对于 .NET 开发而言,这是拥抱工业自动化领域的不错参考。

关键词

WPF、mc-protocol-next、三菱PLC、MC协议、异步通信、.NET 8、结构体序列化、依赖注入、工业自动化、IIoT、C#、高性能通信、WPF Demo、PLC通信库、结构化数据读写

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!