ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

三菱CNC数据采集实战:基于MC协议与C#上位机通信

三菱CNC数据采集实战:基于MC协议与C#上位机通信 简介三菱CNC数据采集Demo是一份基于C#编写的设备数据对接示例面向需要实时监控机床状态的自动化工程师和上位机开发人员重点解决从三菱数控系统中读取加工参数、设备状态和报警信息的需求。压缩包约3.52MB内含FCSB1224W000参考手册PDF与SimCNC模拟源码目录前者提供通讯协议与寄存器说明后者允许在无实机环境中模拟CNC行为便于先行验证采集流程。目前已有617人学习下载。通过阅读源码可学习C#与三菱CNC建立连接、发送指令、解析响应数据的完整思路结合手册和模拟器还能提前熟悉不同机型的地址映射有效缩短实机调试周期为构建生产监控或故障预测系统提供基础框架。1. 先搞清楚三菱CNC采集到底要采什么、怎么采1.1 刚接到需求时最容易踩的第一个坑不知道数据放在哪里大概两年前有个朋友转给我一个需求车间里十几台三菱加工中心产线要做数字化看板需要把每台机床的当前程序号、刀具号、主轴转速、进给率、坐标位置、报警信息和当日产量全部采集上来。他一开始觉得这事不难因为以前做过很多PLC采集觉得CNC应该也差不多结果翻了一周说明书连个能用的通信接口都没找到。实际接触过三菱CNC的朋友应该都有同感机床不像PLC那样把点位表直接画给你也没有现成的“采集地址清单”。CNC内部的数据分布在不同的系统区域比如系统变量区、PMC软元件区、公共变量区还要区分“宏变量”和“PLC寄存器”。很多第一次做CNC数据采集的人连从哪个口进去都不知道更别提读地址了。这个Demo存在的意义就是先把“从哪读、怎么读、数据怎么解析”这条路趟平后面再加业务逻辑就顺了。1.2 通讯通道选型以太网直连是主流串口只能用来兜底三菱CNC提供的数据读取通道大致有三条路第一条是用三菱官方SDK比如EZSocket、NC Viewer之类的开发包功能全但收费而且授权绑定机器想在自己电脑上先调通Demo难度不小。第二条是加OPC网关或者购买第三方采集盒子省事但多一层硬件单价不低项目前期验证成本高。第三条就是直接用三菱通用的MC协议通过机床以太网口或串口与NC内部软元件通信。不花钱不需要额外硬件一根网线就能把数据读出来。这套Demo选的就是第三条路也是我实测下来最省事、最容易迁移的方案。现在三菱主流机型都带以太网口你在机床侧设一个固定IP上位机用C#的Socket直连发MC协议的读取帧NC就会把对应软元件的数据回给你。整个过程不依赖厂家额外授权也不需要在机床端装任何客户端对现场实施来说是最友好的方式。有朋友可能会问老一点的三菱机器只有串口怎么办串口方案其实也能做只是波特率、数据位、停止位这些参数要按机床型号调而且串口响应速度比以太网慢不少一台上位机很难带多台设备。如果现场有条件优先走以太网串口适合应急和单机调试不建议做成产线主方案。2. MC协议读写CNC软元件帧结构和数据寻址是核心2.1 先把“软元件”这个门认清楚D区、R区、M区谁才是采集主力MC协议下三菱CNC对大部分采集者来说就是一堆软元件D区是数据寄存器M区是中间继电器R区是文件寄存器X/Y是输入输出点。做数据采集百分之七八十都是在跟D区打交道。因为梯形图程序里工程师习惯把算好的坐标、倍率、当前刀号、产量计数这些值用一个MOV指令送到D区上位机直接读D区就能拿到半成品结果。这里有一个很多教程都没讲透的关键D区只能拿到“梯形图主动往外放的数据”CNC系统内部的一些系统变量比如#5021当前机械坐标直接用MC协议去读是读不到的。现场的做法通常是在机床梯形图里加几行MOV指令把#5021、#5022这些系统变量实时映射到D200、D202这样的空白地址上位机再去读D200以后的数据。这个映射动作在正式项目里基本不可避免。我见过不少厂家开发人员上来就对着系统变量地址表想硬读结果发出去的全是错误代码。所以在Demo里我特意把“采集地址”做成了可配置项你发现哪个值读出来不对就回到梯形图侧补映射再把它配到界面上就可以了。2.2 帧结构拆解一个读取请求到底长什么样MC协议有一个常见形态叫Qna-3E帧走以太网时非常通用。一个读取请求由这几部分组成副头部、请求数据长度、定时器、命令、子命令、起始软元件编号、软元件代码、读取点数。对于批量读D区命令固定是“0101”子命令按字单位读取填“0000”。我们拿“读D200开始的10个字”举例组出来的ASCII模式请求帧大致是3E 请求数据长度 0010 0101 0000 起始地址 软元件代码 000A副头部3E告诉NC这帧是ASCII模式请求数据长度后面所有字节数的16进制表示需要组完帧再回填定时器0010通讯超时时间的监视值固定即可0101批量读取命令0000子命令按字处理起始地址D200要转成8位的16进制地址软元件代码D区对应的代码具体值不同的手册版本略有差异以机型对应的手册为准000A读取10个字真正写代码时我最头疼的是“请求数据长度”的回填。我的做法是先拼一个占位字符串等整个帧拼完再算出实际长度覆盖回去这样不会数错位数。如果你第一次做建议把这帧打印成十六进制字符串跟Wireshark抓包或者NC调试口的日志对照一次确认无再往下做。2.3 响应解析怎么从一坨字节里把真实数据抠出来NC返回的响应帧包含副头部、响应数据长度、结束码、后面跟着的数据本体。结束码为0代表请求正常非0就说明你发出去的命令或者地址有毛病常见的结束码对应“地址越界”、“软元件不存在”、“命令不被支持”之类的问题。数据本体部分是连续的16位字每个字占2个字节。这里有一个最容易搞错的点三菱协议偏爱低字节在前比如收到的两个字节是“10 27”组合起来就是0x2710也就是十进制10000。很多测试脚本读出来的数值大得离谱多半就是高低字节拼反了。我在解析代码里一般会这么处理short raw (short)(data[i] | (data[i 1] 8));这样拼出来的short值再乘上梯形图里写好的倍率就是真正的物理量。如果你读的是32位浮点数比如某些大行程坐标值那就得取4个字节再转换注意字节顺序同样是低字节在前。3. C#上位机实现时的几个关键设计3.1 通讯层设计不要每轮都new一个Socket长连接才是现场常态这是我在Demo里花时间最多的地方。很多初学者写MODBUS或MC协议时习惯每读一次数据就新建一次Socket连接读完再关掉。程序在自己电脑上跑几回可能没问题一旦放到车间网络稍微波动或者机床侧通讯模块忙不过来就会频繁握手失败、连接超时看板上数据一片飘红。正确做法是维护一条长连接程序启动时和每台CNC建立TCP连接之后一直复用这条连接。采集循环只负责发请求、读响应不需要每次都重新握手。一旦发现Socket异常再走重连逻辑。重连要加退避策略我用的比较简单第一次失败等1秒第二次等2秒最多间隔10秒避免十几台机床同时断线后疯狂重连把机床侧通讯功能拖死。长连接模式下还有一个隐藏收益三菱CNC的以太网模块对连接数有限制如果一个上位机程序短连接反复断开重连很容易把NC的通讯资源占满导致机床侧报警。保持长连接能大幅降低这种风险。3.2 采集循环与UI刷新卡顿问题后台采集和界面更新必须解耦这大概是C#上位机开发里被问得最多的一个问题也是热搜词里“c# 循环数据采集和ui刷新卡顿”背后大家普遍遇到的痛点。如果直接在UI线程里做Socket阻塞读页面会卡成PPT如果只简单开个Timer去读数据量一大拖拽窗口都会掉帧。我的处理思路是三层解耦采集线程专门跑Socket收发中间放一个Channel队列做缓冲UI层通过异步监听Channel去刷新界面。采集线程只负责把读到的数据打包扔进队列UI显示多慢都不影响采集节奏。private async Task PollAsync(CancellationToken ct) { while (!ct.IsCancellationRequested) { try { var data await _mc.ReadDWordsAsync(startAddress, readCount); _channel.Writer.TryWrite(data); } catch (Exception ex) { // 记日志通过事件通知状态栏显示通讯异常 } await Task.Delay(500, ct); } }UI侧用await foreach消费Channel更新控件前先判断一下IsHandleCreated防止窗体和采集线程同时关闭时抛异常。这样处理后界面操作非常丝滑即使采集周期降到200毫秒也不卡顿。3.3 数据落地别急着写数据库先搞定日志和断点续采Demo阶段很多人把采集到的数据直接往SQL Server或MySQL里写结果测试时发现只要网线一拔程序重连后中间的数据空缺只能靠人工补。我后来在Demo里先做了两个轻量机制一条是采集日志记录每次读取请求、响应耗时和异常信息另一条是本地CSV暂存通讯中断时数据先落在CSV里重连成功后再批量补写。这个设计在产线环境帮了我大忙。有一次车间晚上跳闸机床和上位机同时重启第二天打开程序发现凌晨空缺的数据全部从CSV补回了数据库看板上的产量曲线几乎没有断点。如果你一上来就只对着数据库表结构开发这个问题一定会被现场拷打。4. 实测中踩过的坑地址、端口和采集周期的血泪教训4.1 地址抄错导致的“读回来全是0”第一次去现场联调时我照着机床厂家给的地址表读D100发现无论怎么发请求读回来的全是0。一开始怀疑协议帧构造错了抓包看又没问题后来拿着笔记本到机床面板上打开GOT的软元件监视画面在D100处输入一个测试值上位机立刻读到了。这时候才发现厂家给的是梯形图标签名对应的物理地址不是MC协议直接寻址用的软元件地址中间差了一个偏移。这种事在CNC采集里特别常见。不同工程师的梯形图地址规划习惯不一样有人喜欢把变量放在D100以后有人从D500起步。万无一失的办法是在机床触摸屏的软元件监视里看目标地址的实时值让机床上手动触发一个信号同时观察上位机读到的数据有没有跟着变化。两边能对上说明地址没抄错。4.2 CNC端的IP和端口参数没配对GOT和NCMonitor也会占端口三菱CNC的以太网口不是随便就能连的。除了IP地址、子网掩码要在机床参数里设定还要注意目标端口能不能被占用。车间里很多机床本身接了三菱GOT触摸屏或者运维工程师装了NC Monitor监控软件这些软件也会占用通讯端口资源。如果你测试时发现连接被拒多半不是代码问题而是端口冲突。我建议调试第一步先在电脑上用简单的TCP工具测一下端口连通性不要直接上完整程序。能连通再跑采集不能连通就先排查机床端占用的软件把端口让出来。4.3 采集周期不能瞎设超过了机床侧的承受能力会报警这个是我踩得最深的一个坑。最开始测试时想追求画面刷新快把采集周期设成了100毫秒结果跑了半小时机床操作面板就开始弹“通讯错误”之类的报警。后来查资料和咨询厂家技术人员才知道CNC的以太网通讯模块也是要参与NC内部调度的过高频次的请求会干扰机床本身的控制周期。我现在给产线做配置时默认采集周期都在500毫秒到1秒之间。看板要求不是特别高的场景1秒足够需要绘制实时负载曲线的场合500毫秒是下限。低于500毫秒就把一部分数据放到本地缓存做差值而不是硬刚采集频率。5. Demo源码的使用思路拿到手先别跑按这三步走5.1 先理清项目的三个核心模块源码拿到手后不需要逐行读抓住三个核心类就够了。第一个类负责Socket通讯和断线重连所有跟IP、端口、连接池相关的逻辑都在里面。第二个类负责MC协议帧的构造和响应解析读D区、读M区、批量读、单点读这些方法都是从它派生的。第三个类是采集循环调度器负责定时启动采集任务、把数据发到Channel并对外抛出通讯状态事件。建议你先在Demo里把机床IP、端口、读取起始地址、读取点数改好模拟运行一次成功读到数据后再去看UI层和数据库层这样思路最顺。5.2 再把Demo的测试模式打开验证帧格式和地址映射三菱CNC在线联调需要机房环境不是每个人都有条件。Demo里我做了一个“模拟返回”的开关开启后程序不真正发Socket请求而是按固定规则伪造响应数据方便在家里先验证UI逻辑和数据解析代码。等到了现场把这个开关关掉再填入真实IP和地址就能无缝切换。对于刚接触MC协议的人我建议先花半天时间把“模拟返回”跑通把界面布局、数据库写入、日志记录这些业务功能都测好再去现场减少调试时间。现场最宝贵的是机床空闲时段不要拿它来验证界面逻辑。5.3 从Demo到产线还差这三个补丁多机床并发Demo默认只针对一台CNC做采集产线环境下要改成连接池并发。每台机床一条长连接各自跑一个采集循环数据按机床编号分表存放。告警联动一旦机床报警MC协议能读到报警代码上位机要把报警代码映射成中文说明并及时推送看板和消息通知。配方下发有些工艺需要上位机给CNC写刀具补偿值或者宏变量这就要用到MC协议的写指令Demo里保留了写接口的框架。建议先做只读上线稳定再开放写操作避免误操作影响加工。如果你也在做三菱CNC采集我个人的建议是第一步先拿一台机床确认以太网通讯参数和D区地址映射第二步用这个Demo跑通“读D区→解析→入库→看板”全链路第三步再去做拓展功能。磨刀不误砍柴工通讯链路这一步走稳了后面的MES对接、设备联网都会非常顺。本文还有配套的精品资源点击获取
返回列表