基于MTConnect.NET实现工业设备数据采集标准化实战指南

张开发
2026/5/17 0:44:37 15 分钟阅读

分享文章

基于MTConnect.NET实现工业设备数据采集标准化实战指南
1. 项目概述工业数据采集的“翻译官”如果你在制造业、自动化或者设备运维领域工作大概率听过或深受其扰的一个问题是车间里那几十台、上百台来自不同年代、不同品牌的机床、机器人、传感器它们各自说着不同的“语言”。西门子的数控系统、发那科的机器人、海德汉的测量仪还有各种老旧的PLC和新型的物联网网关它们产生的数据格式五花八门协议千差万别。想要把这些数据统一收集起来进行状态监控、效率分析或预测性维护第一步就得面对这个“巴别塔”难题。MTConnect.NET 这个开源项目就是为解决这个核心痛点而生的。它不是一个全新的协议而是对MTConnect这一在制造业领域日益重要的开放式标准的一个 .NET 实现。你可以把它理解为一个高度专业化、针对机床和工业设备的“翻译官”和“数据搬运工”。它的核心使命是将车间里各种异构设备产生的原始数据转换成一个统一的、基于XML的、可通过HTTP访问的标准格式让上层的MES制造执行系统、SCADA数据采集与监控系统或者你自己写的分析程序能够用一种通用的“普通话”来理解和处理这些数据。我最初接触这个项目是因为需要为一个汽车零部件生产线搭建一套集中监控平台。产线上混用了五六个品牌的加工中心数据接口从古老的RS-232到较新的OPC UA都有。手动为每一类设备写适配器不仅工作量巨大后期维护更是噩梦。MTConnect标准及其像 TrakHound/MTConnect.NET 这样的实现提供了一条标准化的路径。这个项目由 TrakHound 公司开源维护它不是一个简单的客户端库而是一个包含了适配器Adapter、代理Agent以及一系列工具和示例的完整解决方案框架让你能够相对快速地构建起自己的MTConnect数据采集体系。2. MTConnect 标准核心原理与架构拆解在深入代码之前必须吃透MTConnect标准的基本原理这是用好 MTConnect.NET 的前提。MTConnect 本质上是一个基于互联网技术HTTP, XML的、用于制造设备数据交换的开放式、免版税标准。它的设计哲学非常清晰将物理设备抽象为信息模型并通过标准的Web服务接口暴露这些信息。2.1 信息模型设备、组件、数据项与条件MTConnect 用一套层次化的模型来描述一台设备。理解这个模型就理解了数据的组织方式。设备Device这是最顶层的实体对应一台物理设备比如一台立式加工中心、一台机器人或一个测量站。组件Component设备由多个组件构成。这是模型中最灵活和强大的部分。标准定义了许多通用组件类型例如Axes代表设备的轴如X轴、Y轴。Controller数控控制器。Systems各种系统如液压系统、润滑系统。Path加工路径。你也可以自定义组件来描述设备特有的部分。数据项DataItem这是承载实际数据的单元附着在组件或直接附着在设备上。数据项有明确的类型category和子类型subType这定义了数据的语义。主要类别包括事件Event表示状态的变化通常是离散值。例如CONTROLLER_MODE控制器模式手动、自动、EXECUTION程序执行状态停止、就绪、运行。样本Sample表示随时间变化的测量值通常是连续值。例如POSITION轴位置、LOAD负载百分比、TEMPERATURE温度。条件Condition表示设备或组件的健康状况状态如“正常NORMAL”、“警告WARNING”、“故障FAULT”。条件Condition这是一个特殊的数据项类别专门用于故障诊断。它有一套独立的表示法可以包含Fault、Warning、Unavailable等状态并可以携带描述性的消息。这种模型化的好处是无论底层设备是法那科系统报告“ACTUAL_POSITION”还是西门子系统报告“Axis1.Pos_Act”你都可以在MTConnect适配器中将它们映射到同一个Axes/X/ACTUAL_POSITION数据项。上层应用只需关心这个标准化的路径和语义无需理解底层协议细节。2.2 代理Agent与适配器Adapter核心工作流MTConnect 架构采用经典的“适配器-代理”模式MTConnect.NET 完整实现了这两部分。适配器Adapter这是与真实设备打交道的部分。它负责与设备通信通过串口、以太网、OPC UA、厂商SDK等读取原始数据并将这些数据转换为MTConnect定义的数据项值。一个适配器通常对应一台物理设备。MTConnect.NET 提供了MTConnect.Adapters.Shdr命名空间下的类帮助你快速实现基于 SHDRSimple Hierarchical Data Representation协议的适配器这是一种简单的、行基于的文本协议易于调试和集成。当然你也可以继承基础类实现任何自定义协议的适配器。代理Agent这是对外提供标准MTConnect服务的部分。它是一个HTTP服务器持续从一个或多个适配器接收数据更新。代理对外提供以下核心接口探测ProbeGET /probe。请求返回设备的完整信息模型XML格式包括所有设备、组件、数据项的定义。客户端通过此接口了解数据结构。当前CurrentGET /current。请求返回所有数据项的最新值。这是最常用的接口用于实时监控。样本SampleGET /sample。请求返回从某个时间点或序列号之后的所有数据变化样本和事件。用于历史数据采集和同步。工作流程适配器不断从设备抓取数据并通过TCP连接、内存共享或内部队列等方式将数据“推”或“拉”到代理。代理维护着数据的最新状态并在HTTP请求到来时根据MTConnect标准规范生成XML响应。你的监控系统只需作为HTTP客户端定时调用代理的/current或/sample接口就能获取所有标准化后的数据。注意在实际部署中代理和适配器可以运行在同一台工控机上也可以分离。对于高密度采集一个代理可以连接数十个适配器成为车间的数据汇聚点。3. 使用 MTConnect.NET 构建数据采集端实战理论清晰后我们进入实战。假设我们要为一台模拟的数控机床CNC创建一个MTConnect数据采集端。我们将使用 MTConnect.NET 库来快速搭建。3.1 环境准备与项目初始化首先你需要一个 .NET 开发环境.NET 6 或 .NET Framework 4.7.2 均可项目主要支持后者但 .NET Core/6 兼容性良好。通过 NuGet 包管理器安装核心库Install-Package MTConnect.Agents Install-Package MTConnect.Adapters.Shdr Install-Package MTConnect.Http如果你需要CLI工具或更多示例也可以克隆整个 TrakHound/MTConnect.NET 仓库。但通过NuGet引用是最简洁的集成方式。接下来我们创建一个控制台应用程序CncMTConnectAdapter。整个采集端的核心是两部分定义信息模型和实现数据采集逻辑。3.2 定义设备信息模型信息模型是静态的元数据需要在代理启动前定义好。我们创建一个DeviceModelBuilder.cs类来构建它。using MTConnect.Assets; using MTConnect.Devices; using MTConnect.Devices.Components; using MTConnect.Devices.DataItems; using MTConnect.Models; public static class DeviceModelBuilder { public static IDevice CreateCncDevice() { // 1. 创建设备 var device new Device(CNC_Machine_01); device.Id CncMachine01; device.Name VMC-850; device.Manufacturer ExampleCNC; device.SerialNumber SN2024-001; // 2. 添加控制器组件 var controller new ControllerComponent(); controller.Id controller; controller.Name CNC Controller; device.Components.Add(controller); // 3. 在控制器下添加数据项执行状态、模式、程序名 var execDataItem new DataItem(DataItemCategory.EVENT, controller.Id, EXECUTION); execDataItem.Id controller_execution; execDataItem.Type EXECUTION; controller.DataItems.Add(execDataItem); var modeDataItem new DataItem(DataItemCategory.EVENT, controller.Id, CONTROLLER_MODE); modeDataItem.Id controller_mode; modeDataItem.Type CONTROLLER_MODE; controller.DataItems.Add(modeDataItem); var programDataItem new DataItem(DataItemCategory.EVENT, controller.Id, PROGRAM); programDataItem.Id controller_program; programDataItem.Type PROGRAM; programDataItems.Add(programDataItem); // 4. 添加线性轴组件X轴 var xAxis new LinearAxisComponent(); xAxis.Id axis_x; xAxis.Name X Axis; device.Components.Add(xAxis); // 5. 在X轴下添加数据项实际位置、指令位置、负载 var actualPosDataItem new DataItem(DataItemCategory.SAMPLE, xAxis.Id, ACTUAL_POSITION); actualPosDataItem.Id axis_x_actual; actualPosDataItem.Type POSITION; actualPosDataItem.Units MILLIMETER; actualPosDataItem.SubType ACTUAL; xAxis.DataItems.Add(actualPosDataItem); var loadDataItem new DataItem(DataItemCategory.SAMPLE, xAxis.Id, LOAD); loadDataItem.Id axis_x_load; loadDataItem.Type LOAD; loadDataItem.Units PERCENT; xAxis.DataItems.Add(loadDataItem); // 6. 添加主轴组件 var spindle new RotatingSpindleComponent(); spindle.Id spindle; spindle.Name Main Spindle; device.Components.Add(spindle); // 7. 在主轴下添加数据项实际转速 var spindleSpeedDataItem new DataItem(DataItemCategory.SAMPLE, spindle.Id, SPINDLE_SPEED); spindleSpeedDataItem.Id spindle_speed; spindleSpeedDataItem.Type ROTARY_VELOCITY; spindleSpeedDataItem.Units REVOLUTION/MINUTE; spindleSpeedDataItem.SubType ACTUAL; spindle.DataItems.Add(spindleSpeedDataItem); return device; } }这段代码构建了一个包含控制器、X轴和主轴的简易CNC设备模型。每个数据项都有唯一的ID、类型、单位等属性这些属性将在生成的XML探测响应中体现供客户端解析。3.3 实现SHDR适配器与模拟数据注入MTConnect.NET 提供了ShdrAdapter类它实现了SHDR协议可以通过TCP或HTTP接收数据行。我们创建一个适配器服务来模拟设备数据。using MTConnect.Adapters.Shdr; using System.Threading; using System.Threading.Tasks; public class CncSimulatorAdapter { private readonly ShdrAdapter _adapter; private readonly CancellationTokenSource _cancellationTokenSource; public CncSimulatorAdapter(string deviceName, int port 7878) { // 初始化SHDR适配器指定设备名和监听端口 _adapter new ShdrAdapter(deviceName, port); _cancellationTokenSource new CancellationTokenSource(); } public void Start() { // 启动适配器开始监听来自代理的连接或主动连接代理 _adapter.Start(); Console.WriteLine($SHDR Adapter for device started on port {_adapter.Port}); // 启动一个后台任务模拟数据更新 Task.Run(async () await SimulateDataAsync(_cancellationTokenSource.Token)); } public void Stop() { _cancellationTokenSource.Cancel(); _adapter.Stop(); } private async Task SimulateDataAsync(CancellationToken cancellationToken) { var random new Random(); string[] executionStates { READY, ACTIVE, INTERRUPTED, STOPPED }; string[] controllerModes { MANUAL, AUTOMATIC }; string currentProgram O1001; double xPosition 0.0; double xLoad 0.0; double spindleSpeed 0.0; while (!cancellationToken.IsCancellationRequested) { try { // 1. 模拟事件数据离散变化 if (random.Next(0, 100) 70) // 30%概率改变状态 { var newState executionStates[random.Next(executionStates.Length)]; _adapter.AddDataItem(controller_execution, newState); } if (random.Next(0, 100) 80) // 20%概率改变模式 { var newMode controllerModes[random.Next(controllerModes.Length)]; _adapter.AddDataItem(controller_mode, newMode); } // 2. 模拟样本数据连续变化 // X轴位置在0-500mm之间随机游走 xPosition (random.NextDouble() - 0.5) * 10; xPosition Math.Max(0, Math.Min(500, xPosition)); _adapter.AddDataItem(axis_x_actual, xPosition.ToString(F3)); // X轴负载在0%-100%之间随机 xLoad random.NextDouble() * 100; _adapter.AddDataItem(axis_x_load, xLoad.ToString(F1)); // 主轴转速在0-8000 RPM之间随机但更常处于工作区间 spindleSpeed random.Next(0, 100) 30 ? random.Next(3000, 8000) : random.Next(0, 1000); _adapter.AddDataItem(spindle_speed, spindleSpeed.ToString(F0)); // 3. 将缓冲的数据一次性发送出去 _adapter.Send(); // 4. 等待一段时间模拟数据采集周期例如200ms await Task.Delay(200, cancellationToken); } catch (TaskCanceledException) { break; } catch (Exception ex) { Console.WriteLine($Simulator error: {ex.Message}); await Task.Delay(1000, cancellationToken); } } } }关键点解析ShdrAdapter内部维护了一个数据项字典。AddDataItem方法更新字典中的值。Send方法至关重要它会将自上次发送以来所有变更的数据项格式化成SHDR协议文本行例如|controller_execution|ACTIVE||axis_x_actual|125.436|并通过网络发送给已连接的代理。如果不调用Send代理将收不到任何数据。模拟循环中的Task.Delay模拟了实际的数据采集频率。这个频率需要根据设备通信能力和业务需求谨慎设置过高的频率可能导致网络和代理处理压力过低则丢失细节。3.4 配置与启动MTConnect代理代理是HTTP服务端。我们使用MTConnect.Agents和MTConnect.Http库来创建和运行它。using MTConnect.Agents; using MTConnect.Configurations; using MTConnect.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; public class Program { public static async Task Main(string[] args) { // 1. 使用.NET通用主机构建服务 var hostBuilder Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) { // 2. 从配置文件读取代理设置可选 var agentConfiguration new AgentConfiguration { Port 5000, // 代理HTTP服务端口 DeviceModels new ListIDevice { DeviceModelBuilder.CreateCncDevice() } // 添加设备模型 }; // 3. 注册MTConnect代理服务 services.AddMTConnectAgent((provider, configuration) { configuration.DeviceModels agentConfiguration.DeviceModels; configuration.Port agentConfiguration.Port; configuration.ListenerInterval 100; // 代理内部处理间隔(ms) }); // 4. 注册我们自定义的模拟适配器为后台服务 services.AddHostedServiceCncSimulatorService(); }); // 5. 构建并运行主机 var host hostBuilder.Build(); await host.RunAsync(); } } // 将适配器包装为后台服务 public class CncSimulatorService : BackgroundService { private CncSimulatorAdapter _adapter; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _adapter new CncSimulatorAdapter(CNC_Machine_01, 7878); _adapter.Start(); // 保持服务运行直到收到停止信号 while (!stoppingToken.IsCancellationRequested) { await Task.Delay(1000, stoppingToken); } _adapter.Stop(); } }配置要点Port代理的HTTP服务端口客户端将通过http://agent-ip:5000来访问探测、当前值等接口。DeviceModels必须包含所有要通过此代理暴露的设备模型。代理启动时会基于这些模型生成静态的探测响应XML。ListenerInterval代理内部检查数据更新并准备HTTP响应的周期。对于高频率数据适当调低此值可以减少延迟但会增加CPU开销。现在运行这个控制台程序。你将启动两个服务MTConnect代理在端口5000上提供HTTP服务。模拟适配器在端口7878上启动SHDR服务并开始向代理发送模拟数据。3.5 测试与验证打开浏览器或使用Postman、curl等工具进行测试探测请求访问http://localhost:5000/probe。你将收到一个详细的XML文档描述了CNC_Machine_01设备的所有组件和数据项定义。这是客户端了解数据结构的入口。当前值请求访问http://localhost:5000/current。你将收到一个XML包含所有数据项的最新值例如控制器模式、X轴位置、主轴转速等。刷新页面可以看到数值在变化。样本请求访问http://localhost:5000/sample?count10。这将返回最近10个数据项的变化记录样本和事件。这对于获取历史数据流非常有用。至此一个完整的、基于 MTConnect.NET 的单设备数据采集与标准化服务就搭建完成了。上层应用只需解析这些标准的XML接口即可获取统一的设备数据。4. 高级配置、性能优化与生产环境考量在原型验证之后要将系统投入生产环境还需要考虑更多因素。MTConnect.NET 提供了相应的配置点和扩展接口。4.1 适配器通信模式与缓冲区管理上述示例中适配器通过AddDataItem和Send组合来发送数据。这是手动缓冲模式。对于数据产生频率不固定或需要批量发送的场景这很灵活。但如果你有稳定高频的数据流可以使用自动发送模式。// 在初始化ShdrAdapter时设置 _adapter new ShdrAdapter(deviceName, port) { SendInterval 100, // 每100ms自动调用一次Send() AutoSend true // 启用自动发送 }; // 之后只需调用 AddDataItem适配器会按间隔自动发送缓冲区的数据。缓冲区管理注意事项数据丢失风险如果数据产生速度远高于Send调用频率或SendInterval缓冲区可能被新数据覆盖导致旧数据丢失。SHDR协议每个数据项只保留最新值。网络延迟Send是同步网络操作。如果网络阻塞可能会拖慢数据采集线程。在生产环境中建议将Send操作放入独立的生产者-消费者队列或使用异步方法避免阻塞数据采集。4.2 代理的持久化与历史数据存储默认情况下MTConnect代理只保存在内存中的数据。重启代理后历史数据样本流会丢失。对于需要历史分析的应用必须配置持久化。MTConnect.NET 代理支持通过IDataStore接口注入自定义的存储后端。你可以实现一个存储到数据库如SQL Server, PostgreSQL, InfluxDB, TimescaleDB的IDataStore。services.AddMTConnectAgent((provider, configuration) { configuration.DeviceModels ...; configuration.Port ...; // 替换默认的内存存储 configuration.DataStore new MyCustomDatabaseDataStore(connectionString); });在MyCustomDatabaseDataStore中你需要实现AddObservation等方法将收到的数据项观察结果写入数据库。查询历史数据时代理会调用你的实现来获取数据并依然通过标准的/sample接口返回XML。存储设计建议由于MTConnect数据是时间序列数据建议使用时序数据库TSDB它们在存储效率和查询性能上更有优势。存储时除了数据值和时间戳务必关联存储数据项的ID如axis_x_actual这是查询时关联元数据单位、类型的关键。4.3 安全性、认证与授权默认的MTConnect代理HTTP接口是没有身份验证的。在生产环境尤其是代理部署在车间网络且可被外部访问时这存在安全风险。MTConnect标准本身没有定义安全协议但你可以通过以下方式加固网络隔离将代理部署在车间防火墙后只允许特定的MES/SCADA服务器访问其端口。反向代理使用Nginx或IIS作为反向代理在反向代理层配置HTTPS和HTTP基本认证、API密钥或更复杂的OAuth。自定义中间件如果你使用MTConnect.Http库的中间件模式可以在管道中添加自定义的认证授权中间件。一个简单的做法是在Kestrel.NET内置服务器前使用Nginx# Nginx 配置示例 server { listen 443 ssl; server_name mtconnect.yourfactory.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { # 反向代理到本地运行的MTConnect代理 proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 添加HTTP基本认证 auth_basic Restricted MTConnect Agent; auth_basic_user_file /etc/nginx/.htpasswd; } }4.4 多设备管理与扩展性一个代理可以管理多个设备。只需在AgentConfiguration.DeviceModels列表中添加多个IDevice实例即可。每个设备需要有唯一的Id和Uuid。对于大规模部署数百台设备需要考虑代理的横向扩展按区域/产线划分每条产线或每个车间区域部署一个代理负责本区域设备的适配器连接。上层系统再聚合多个代理的数据。代理集群与负载均衡对于设备数量极多或数据量巨大的场景可以部署多个代理实例使用负载均衡器如HAProxy将/probe和/current请求分发到不同的代理。但这需要仔细设计设备到代理的映射关系并确保状态同步的复杂性。适配器连接管理ShdrAdapter支持代理主动连接适配器也支持适配器主动连接代理。在生产中通常由部署在设备侧的适配器主动连接到中心代理的指定端口这样可以简化车间网络的防火墙配置只需代理服务器开放一个入站端口供所有适配器连接。5. 常见问题排查与调试技巧实录在实际部署和开发过程中你肯定会遇到各种问题。以下是我踩过的一些坑和总结的排查思路。5.1 数据不更新或代理收不到数据这是最常见的问题。请按以下步骤排查现象可能原因排查方法访问/current看不到数据或数据一直是初始值。1. 适配器未启动或崩溃。2. 适配器与代理网络不通。3. 适配器未正确调用Send()。4. 数据项ID不匹配。1. 检查适配器进程是否运行查看日志。2. 使用telnet agent-ip adapter-port测试适配器端口是否监听。使用netstat查看代理端口是否建立连接。3. 在适配器代码中Send()前后添加日志确认其被定期调用。4. 核对适配器发送的数据项ID如axis_x_actual是否与设备模型中定义的ID完全一致大小写敏感。数据偶尔更新但频率远低于预期。1. 网络延迟或丢包。2. 代理ListenerInterval设置过大。3. 适配器SendInterval设置过大或手动模式下Send()调用频率低。4. 系统资源CPU/内存不足。1. 检查网络状况尝试在本地回环地址测试以排除网络问题。2. 将代理的ListenerInterval调小如改为50ms。3. 检查适配器的发送逻辑确保数据产生后能及时发送。4. 监控代理和适配器所在机器的资源使用情况。调试利器日志与Wireshark启用日志MTConnect.NET 库使用Microsoft.Extensions.Logging。在开发环境在主机构建时调用.ConfigureLogging(logging logging.AddConsole().SetMinimumLevel(LogLevel.Debug))可以在控制台看到详细的连接、数据接收和HTTP请求日志。使用Wireshark如果怀疑网络问题用Wireshark抓包。过滤tcp.port 7878适配器端口查看是否有TCP数据包传输以及SHDR协议文本内容是否正确。过滤http and tcp.port 5000查看HTTP请求与响应。5.2 探测响应XML格式错误或客户端解析失败客户端如MTConnect浏览器、自定义应用在解析/probe响应时报错。原因1设备模型定义有误。例如数据项ID包含空格或非法字符组件结构嵌套错误。MTConnect标准对XML Schema有严格要求。解决将你的/probe响应XML复制出来使用在线的XML Schema验证工具或MTConnect官网提供的Schema进行验证。确保所有必填属性如id,type,category都已设置且值有效。原因2编码问题。如果设备名称、制造商等信息包含非ASCII字符如中文可能导致XML编码错误。解决确保代理生成的XML声明是?xml version1.0 encodingUTF-8?并且字符串在输出前已正确编码。5.3 高并发下的性能瓶颈当有大量客户端如几十个监控界面同时轮询/current或设备数据项非常多上千个时代理可能出现响应变慢或CPU占用过高。优化1调整HTTP缓存头。MTConnect代理可以在HTTP响应中设置缓存头。对于变化不频繁的/probe请求可以设置较长的缓存时间减少重复请求对代理的压力。这通常需要在反向代理如Nginx层面配置或者自定义MTConnect.Http中间件来添加Cache-Control头。优化2使用sample接口替代频繁的current轮询。/sample接口支持from参数基于序列号或时间戳。客户端可以记录上次获取的序列号下次请求时带上from参数这样代理只返回新的数据减少了数据传输量和处理量。这是MTConnect标准推荐的高效采集方式。优化3代理水平扩展。如前所述将设备分组到多个代理实例上。优化4审视数据模型。是否定义了过多不必要的数据项每个数据项都会在每次Send()时被序列化到XML中。精简数据模型能直接提升性能。5.4 与真实设备集成时的协议转换问题MTConnect.NET 的ShdrAdapter只是一个“终点”。真正的挑战在于如何从真实的设备协议如Fanuc FOCAS, Siemens 840D SL, Mitsubishi Meldas, OPC UA, Modbus TCP中读取数据并转换成SHDR格式的字符串。策略建议使用厂商SDK或库对于主流数控系统厂商通常提供C/C或.NET的SDK。你可以用P/Invoke调用C库或者寻找社区维护的.NET封装。这部分代码是协议转换的核心通常需要仔细阅读设备通讯手册。OPC UA作为中间层越来越多的新设备支持OPC UA。你可以先写一个OPC UA客户端订阅所需的节点。当节点值变化时将其映射为MTConnect数据项并调用ShdrAdapter.AddDataItem()。MTConnect.NET 仓库中可能有OPC UA的示例。遗留串口设备对于老旧的RS-232/422设备你需要根据其通讯协议通常是自定义的文本或二进制协议编写串口读写代码解析报文再转换为SHDR。独立进程架构建议将“协议转换”模块与“SHDR适配器”模块分离。协议转换模块作为独立的Windows服务或守护进程运行通过进程间通信如命名管道、gRPC、Redis Pub/Sub将数据发送给适配器模块。这样提高了系统的模块化和容错性一个协议模块崩溃不会影响其他设备。最后一个关键的实操心得是从最简单的数据项开始逐步增加。不要试图一次性对接设备的所有成百上千个数据点。先从最关键的几个状态如运行、报警、主轴转速、进给速度开始让整个数据流先跑通。验证代理能收到数据客户端能正确显示。然后再逐步扩展其他数据项如各轴位置、负载、温度、刀具寿命等。这种迭代方式能帮你快速定位问题建立信心。

更多文章