C#与三菱PLC以太网通讯程序上位机源码 通过3E帧SLMP /MC协议与三菱FX5U/Q系列PLC通讯 1.该程序可以与FX5U/Q系列PLC以太网通讯,根据3E帧报文写了一个类库,可以读写各种类型和区域变量。 2.支持单个变量读写和数组类型批量读写。 3.可以实时检测网络通断,断线重连功能。 4.并有实时曲线采集等功能
一、程序概述
本程序是基于C#语言开发的上位机应用,旨在通过以太网实现与三菱FX5U、Q系列PLC的通讯交互。其核心采用SLMP(Seamless Message Protocol)协议下的3E帧格式与MC协议,构建了稳定的TCP通讯链路,支持对PLC内部多种数据类型(布尔值、整数、浮点数、字符串及数组)的读写操作,并提供实时数据监控与可视化功能,适用于工业自动化场景中PLC数据采集、控制指令下发及运行状态监控等需求。

C#与三菱PLC以太网通讯程序上位机源码 通过3E帧SLMP /MC协议与三菱FX5U/Q系列PLC通讯 1.该程序可以与FX5U/Q系列PLC以太网通讯,根据3E帧报文写了一个类库,可以读写各种类型和区域变量。 2.支持单个变量读写和数组类型批量读写。 3.可以实时检测网络通断,断线重连功能。 4.并有实时曲线采集等功能

程序整体采用模块化设计,分为通讯核心层 、UI交互层 与数据处理层,各层职责清晰、耦合度低,既保证了通讯稳定性,又具备良好的用户操作体验与可扩展性。支持Windows操作系统,基于.NET Framework 4.0开发,依赖System.Net.Sockets实现网络通讯、System.Windows.Forms构建图形界面,可直接部署于工业控制计算机或上位机监控终端。
二、核心功能模块
2.1 网络通讯模块
网络通讯是程序与PLC交互的基础,该模块负责建立、维护TCP连接,并处理断网重连逻辑,确保通讯链路的稳定性。
2.1.1 通讯初始化
- 功能描述:在程序启动时,根据用户配置的PLC IP地址与端口号,初始化TCP Socket对象,完成通讯参数的预设。
- 关键逻辑 :
- 解析用户输入的IP地址(如默认的"192.168.1.4"),转换为IPAddress对象;
- 结合端口号(如默认的"2050"),创建IPEndPoint实例,封装通讯目标的网络标识;
- 初始化TCP Socket,指定IPv4协议、流式传输(Stream)与TCP协议类型,为后续连接做准备。
- 应用场景:程序启动时自动执行,或用户修改IP/端口后重新初始化,确保通讯参数与PLC配置一致。
2.1.2 连接管理与断网重连
- 功能描述:实时检测与PLC的通讯状态,通过Ping命令验证PLC网络可达性,实现自动连接与断网后的重试机制,避免因网络波动导致通讯中断。
- 关键逻辑 :
- 周期性发送Ping请求(超时时间50ms),检测PLC是否在线;
- 若Ping成功且当前未建立连接,自动创建新的Socket连接,并验证连接状态(通过Poll方法判断Socket是否正常);
- 若Ping失败或连接异常,立即标记通讯状态为"断开",关闭当前Socket并释放资源,避免资源泄漏;
- 异常场景(如Socket异常、Ping超时)通过try-catch捕获,确保程序不崩溃,并触发重连逻辑。
- 通讯状态反馈:通过UI界面的"状态"标签(labLink)直观展示通讯状态------绿色表示"链接正常",红色表示"链接断开",方便用户实时掌握通讯情况。
2.1.3 报文发送与接收
- 功能描述:按照SLMP协议3E帧格式,将用户的读写请求封装为十六进制报文,通过TCP Socket发送至PLC;同时监听PLC的响应报文,解析后返回数据或执行结果。
- 协议帧结构 :
通讯报文遵循固定格式,包含帧头 (如"500000FFFF0300")、数据长度 、指令代码 (如读D区为"A8"、读M区为"90")、地址信息 (起始地址与数据长度)及数据域(仅写操作需携带),确保PLC能正确识别并响应请求。 - 数据解析:接收PLC返回的报文后,根据数据类型(如16位整数、32位浮点数)提取对应字节段,通过字节序转换(如BitConverter.ToInt16、BitConverter.ToSingle)将十六进制字节转换为可读的数值或布尔值。
2.2 数据读写模块
该模块是程序的核心业务层,支持对PLC内部X、Y、M、D等常用软元件区的多种数据类型进行读写,覆盖工业场景中绝大多数数据交互需求。
2.2.1 数据类型与支持范围
程序支持的PLC数据类型、对应软元件区及功能如下表所示:
| 数据类型 | 支持软元件区 | 读写功能 | 应用场景举例 |
|---|---|---|---|
| 布尔值(Bool) | X、Y、M | 读单个布尔值、写单个布尔值 | 检测传感器状态(X区)、控制输出(Y区) |
| 16位整数(Int16) | M、D | 读单个值、读数组、写单个值、写数组 | 读取计数器值(D区)、下发短整型控制参数 |
| 32位整数(Int32) | M、D | 读单个值、读数组、写单个值、写数组 | 读取长整型累计数据(如产量) |
| 浮点数(Real) | M、D | 读单个值、读数组、写单个值、写数组 | 读取温度、压力等模拟量(D区) |
| 字符串(String) | D | 读字符串、写字符串 | 存储设备编号、运行日志等文本信息 |
2.2.2 典型读写流程(以浮点数读写为例)
- 读浮点数流程 :
- 用户在UI界面勾选"Real"类型,选择软元件区(如D区),输入起始地址(如"50");
- 程序解析地址为"D50",根据D区对应的指令代码"A8",封装3E帧报文(包含起始地址"000032"、读取长度"0200"等);
- 通过TCP Socket发送报文至PLC,等待响应(超时时间100ms);
- 接收PLC返回的15字节响应报文,提取数据段(第11-14字节),转换为浮点数;
- 将结果显示在UI的"写入值"文本框中,供用户查看。
- 写浮点数流程 :
- 用户在UI界面输入待写入的浮点数(如"25.5"),确认地址与软元件区;
- 程序将浮点数转换为4字节十六进制(通过BitConverter.GetBytes),封装包含数据域的3E帧报文;
- 发送报文后,接收PLC的响应报文(11字节),验证响应帧是否为"D0-00-00-FF-FF-03-00-02-00-00-00"(表示写入成功);
- 若验证通过,标记写入成功;若失败,提示用户检查地址或网络状态。
2.2.3 数组读写特性
针对批量数据处理场景(如多个模拟量采集、批量参数下发),程序支持数组读写功能:
- 读数组时,用户指定起始地址与数组长度(如从D100开始读5个浮点数),程序自动计算读取字节数,封装报文后一次性获取所有数据;
- 写数组时,用户预设数组数据(如
float[] writeArray = new float[4] {100.0f, 200.0f, 300.0f, 400.0f}),程序将数组转换为连续字节流,通过单条报文完成批量写入,减少通讯次数,提升效率。
2.3 UI交互与实时监控模块
UI交互层基于Windows Forms构建,提供直观的操作界面与数据可视化功能,降低用户操作门槛;实时监控模块则支持对PLC关键数据的动态采集与曲线展示,帮助用户掌握设备运行趋势。
2.3.1 界面功能分区
程序界面分为4个核心区域,各区域功能明确:
| 界面区域 | 核心组件 | 功能描述 |
|---|---|---|
| 网口设置区 | IP输入框、端口输入框、状态标签 | 配置PLC的IP地址与端口,显示当前通讯状态 |
| 报文测试区 | 发送窗口、接收窗口、发送按钮 | 手动输入十六进制报文(如调试用指令),查看PLC响应,用于协议调试 |
| 读写测试区 | 类型复选框、区域下拉框、地址/值输入框、读写按钮 | 选择数据类型与软元件区,输入地址/值,执行读写操作 |
| 实时监控区 | 实时值文本框、开始/停止按钮、折线图 | 启动/停止实时数据采集,在折线图中展示历史数据(如D50的浮点数变化) |
2.3.2 实时数据监控与可视化
- 功能描述:对PLC指定地址的数据(如模拟量输入D50)进行周期性采集,将采集到的实时值显示在文本框中,并通过折线图动态展示数据变化趋势,支持数据缓存与曲线自动刷新。
- 关键逻辑 :
- 用户点击"开始"按钮,启用数据采集标志(ThrowEn = true);
- 后台线程(threadPLCCycle)周期性(间隔80ms)读取指定地址(如D50)的浮点数;
- 采集到的数据实时更新至UI文本框(通过多线程委托避免跨线程操作异常);
- 折线图(Chart控件)动态添加数据点,当数据点数量超过60个时,自动移除最早的数据点,确保图表仅展示最新60个数据(约4.8秒的历史数据);
- 用户点击"停止"按钮,禁用采集标志,停止数据读取与曲线更新。
- 图表配置:折线图采用平滑曲线(Spline类型),X轴显示时间(HH:mm:ss),Y轴范围可配置(默认0-200),网格线为浅灰色,数据曲线为红色,确保数据趋势清晰可见。
三、程序运行流程
3.1 启动阶段
- 程序启动,执行Form1_Load方法,初始化UI控件(如下拉框添加软元件区选项:X、Y、M、D);
- 预设默认通讯参数(IP:192.168.1.4,端口:2050),调用通讯初始化方法,创建Socket对象;
- 初始化延时定时器(间隔1秒),避免界面加载时阻塞通讯线程;
- 定时器触发后,启动后台通讯线程(threadPLCCycle),开始周期性检测PLC通讯状态。
3.2 运行阶段
- 后台线程持续执行:发送Ping请求→检测PLC在线状态→更新UI通讯状态标签;
- 用户操作流程(以"读D50浮点数"为例):
- 在"读写测试区"勾选"Real"→选择"D"区→输入地址"50"→点击"读取"按钮;
- 程序封装读报文→发送至PLC→接收响应→解析数据→更新UI文本框;
- 实时监控流程:
- 点击"实时监控区"的"开始"按钮→启用数据采集→后台线程周期性读D50→更新文本框与折线图;
- 点击"停止"按钮→停止采集,折线图冻结当前状态。
3.3 异常处理阶段
- 网络异常(如PLC断电、网线断开):
- Ping请求失败→标记通讯状态为"断开"→关闭Socket并释放资源→UI状态标签变红;
- 网络恢复后,Ping成功→自动重新创建Socket连接→状态标签变绿,恢复通讯。
- 数据读写异常(如地址不存在、数据类型不匹配):
- 通过try-catch捕获异常,避免程序崩溃;
- 弹出提示框(如"请输入正确的Real变量地址"),引导用户修正操作。
四、技术特点与注意事项
4.1 技术特点
- 稳定的通讯机制:结合Ping检测与Socket状态验证,实现断网自动重连,通讯中断后可快速恢复,保障工业场景下的连续性;
- 全面的数据支持:覆盖布尔值、整数、浮点数、字符串及数组等多种数据类型,满足绝大多数PLC控制与数据采集需求;
- 多线程安全设计:通过委托(delegate)实现后台线程与UI线程的安全交互,避免跨线程操作异常,确保界面流畅无卡顿;
- 直观的可视化监控:折线图动态展示数据趋势,帮助用户快速识别设备运行状态变化(如温度骤升、压力波动);
- 调试友好:提供报文测试区,支持手动输入十六进制报文,方便用户调试协议细节或验证PLC响应。
4.2 注意事项
- 通讯参数配置:需确保程序配置的IP地址与端口号与PLC的网络配置一致(三菱PLC默认SLMP端口为2050),否则无法建立连接;
- 地址合法性:读取/写入的PLC地址需在合法范围内(如FX5U的D区地址范围为D0-D32767),否则会导致读写失败;
- 数据类型匹配:写入数据的类型需与PLC软元件区支持的类型一致(如字符串仅支持D区),避免数据解析错误;
- 权限与防火墙:运行程序的上位机需具备访问PLC网络的权限,关闭防火墙或添加程序例外,避免通讯被拦截;
- 线程资源释放:程序关闭时,需确保后台通讯线程与Socket资源正常释放,避免内存泄漏(当前程序通过IsBackground=true设置后台线程,程序退出时自动终止)。
五、应用场景扩展建议
- 多PLC管理:当前程序仅支持单PLC通讯,可扩展为"PLC列表"功能,允许用户配置多个PLC的IP/端口,实现多设备同时监控;
- 数据存储:增加数据库(如SQL Server、SQLite)接口,将采集的实时数据存储至数据库,支持历史数据查询与报表生成;
- 报警功能:基于实时数据设置阈值(如温度超过180℃),当数据超出阈值时,触发声光报警或短信通知,提升设备安全性;
- 批量配置:支持导入/导出读写参数(如地址、数据类型、采集周期),方便多台上位机快速部署相同配置;
- 远程控制:结合VPN或工业以太网,扩展远程通讯功能,实现对异地PLC的监控与控制(需确保网络安全性)。
本程序通过标准化的通讯协议、模块化的架构设计与友好的UI交互,为三菱FX5U/Q系列PLC的上位机监控提供了完整解决方案,可直接应用于中小型工业自动化项目,也可基于现有框架进行二次开发,满足更复杂的业务需求。
