MTConnect C++ Agent部署与配置实战:工业数据采集核心组件详解

news2026/4/28 23:28:22
1. 项目概述一个工业数据“翻译官”的自我修养如果你在制造业、工业自动化或者工业物联网IIoT领域摸爬滚打过肯定遇到过这样的场景车间里那几台宝贝机床一台是德国的一台是日本的还有一台是国产的每台机器吐出来的数据格式都像加密电报五花八门互不兼容。你想把它们的数据统一收集起来做个状态监控或者生产分析光是写各种协议的解析器就够你喝一壶了。这时候你就需要一个靠谱的“翻译官”——一个能把不同机器的“方言”统一翻译成标准“普通话”的中间件。MTConnect C Agent以下简称cppagent就是这样一个角色它是我在多个工业数据集成项目中反复验证过的核心组件。简单来说cppagent是一个用C实现的、符合MTConnect标准的代理程序。MTConnect本身是一个开放、免版税的制造设备数据采集与交换标准你可以把它理解为工业领域的“HTTP协议”它定义了一套通用的数据模型和通信接口。而这个cppagent就是这套协议的一个高性能、可扩展的“服务器”实现。它的核心工作流程非常清晰通过内置的适配器Adapter连接各种工业设备比如CNC数控机床、PLC、传感器接收它们原始的、非结构化的数据流然后根据你预先定义的设备结构描述文件Devices.xml将这些原始数据“翻译”并规范成结构化的MTConnect XML或JSON格式最后通过HTTP/REST API、WebSocket或MQTT等方式将这些标准化后的数据暴露给上层的制造执行系统MES、监控大屏、数据分析平台或者任何你自定义的应用程序。我选择它并深入研究主要是看中了几个硬核优势首先是性能C原生实现带来了极低的内存和CPU开销在资源受限的嵌入式工控机或需要同时处理上百台设备数据流的服务器上稳定性远超一些基于解释型语言如Python、Node.js的代理。其次是可靠性它内置了环形缓冲区Ring Buffer机制即使网络短暂中断或客户端处理不及时数据也不会丢失确保了生产数据流的连续性。最后是灵活性它支持SHDR、MQTT、原生JSON等多种输入协议输出端也支持TLS加密、WebSocket实时推送等几乎能适配从传统车间到现代“无人工厂”的所有场景。接下来的内容我会以一个资深集成工程师的视角带你从零开始彻底搞懂如何部署、配置和深度定制这个cppagent。无论你是负责工厂数字化升级的工程师还是开发工业APP的软件开发者这篇文章都能给你提供一套可直接落地的实操方案。2. 核心架构与设计哲学为什么是它在深入配置细节之前我们必须先理解cppagent的设计哲学。这决定了你能否在复杂的现场环境中用好它而不是被它复杂的配置项绕晕。它的架构核心可以概括为“单向管道、模型驱动、缓冲解耦”。2.1 单向数据流安全性的基石MTConnect标准及其代理实现遵循一个非常重要的原则只读不写。这意味着cppagent永远只是一个数据的“倾听者”和“转述者”它从设备采集数据但绝不会向设备发送任何控制指令。这个设计在工业现场至关重要。想象一下如果你部署的一个数据采集程序因为bug意外向一台高速运转的加工中心发送了“急停”指令后果将是灾难性的。cppagent的这种单向性从根本上杜绝了此类风险使得你可以放心地将其集成到任何生产网络中而无需担心干扰现有控制系统。它就像车间里的一个“非侵入式”传感器只观察不干预。2.2 模型驱动语义化的关键cppagent的强大之处在于它不是一个简单的协议转换器而是一个语义理解器。这其中的奥秘就在于Devices.xml这个文件。这个文件不是用来配置IP地址和端口的而是用来给你的机器设备“建立数字孪生模型”的。在MTConnect的世界观里一台设备Device由多个组件Component构成比如“主轴”、“进给轴”、“刀具库”、“冷却系统”等。每个组件下又定义了具体的数据项DataItem比如“主轴转速”SpindleSpeed、“X轴位置”Xact、“报警信息”Alarm等。每个数据项都有明确的类型SAMPLE,EVENT,CONDITION、子类型和单位。例如在Devices.xml中你可能会这样定义一台数控铣床的主轴Device idcnc_mill_01 name三轴立式加工中心 Components Axes idax nameaxes !-- 定义X轴 -- Linear idx nameX轴 DataItems DataItem idx_pos categorySAMPLE typePOSITION subTypeACTUAL unitsMILLIMETER nativeUnitsMILLIMETER/ /DataItems /Linear !-- 定义Y轴、Z轴... -- /Axes Controller idcont namecontroller DataItems !-- 定义主轴转速 -- DataItem idsp_speed categorySAMPLE typeROTARY_VELOCITY subTypeACTUAL unitsREVOLUTION/MINUTE/ !-- 定义程序状态 -- DataItem idexecution categoryEVENT typeEXECUTION / /DataItems /Controller /Components /Device当适配器传来一行原始的SHDR数据|Xact|100.5|时cppagent会去查找id为x_pos的DataItem发现它的类型是POSITION单位是MILLIMETER。于是它不仅把数值100.5存下来还会在输出时生成一个带有完整语义信息的XML节点Position dataItemId\x_pos\ ... units\MILLIMETER\100.5/Position。这样任何接收此数据的客户端都明确知道这个100.5代表的是X轴的实际位置单位是毫米。这种模型驱动的方式实现了数据从“数值”到“信息”的升华是后续进行数据分析、可视化、预测性维护的基础。2.3 缓冲与解耦应对工业现场的不确定性工业现场网络环境复杂数据产生频率高毫秒级而客户端如数据库、分析平台的消费能力可能不稳定。cppagent在内部设计了一个基于内存的环形缓冲区。所有从适配器接收并处理后的数据称为Observation都会先存入这个缓冲区。这个缓冲区的容量由配置参数BufferSize决定但它不是直接指定条数而是指定一个2的幂指数。例如BufferSize 17意味着缓冲区有 $2^{17} 131,072$ 个槽位。为什么这么设计因为计算机对2的幂次方数量的内存寻址和环形队列操作效率最高。当缓冲区写满后会覆盖最旧的数据先进先出。这个设计巧妙地解耦了数据生产设备和数据消费客户端的速度。客户端通过HTTP请求如/sample来拉取数据时实际上是按序列号Sequence从这个缓冲区中读取。即使客户端暂时宕机几分钟只要数据产生速度没有超过缓冲区的容量重启后依然能获取到宕机期间的历史数据保证了数据的连续性。这是cppagent能够稳定服务于生产环境的核心机制之一。3. 从零开始部署与基础配置理论讲透了我们动手把它跑起来。官方提供了预编译的二进制文件和Docker镜像对于快速验证和大多数生产环境我强烈建议直接使用预编译版本省去编译环境搭建的麻烦稳定性也更有保障。3.1 环境准备与二进制部署对于Windows环境以Windows 10/11为例下载访问项目的 GitHub Releases 页面。找到最新的稳定版本如v2.7.0下载对应的cppagent-2.7.0-win64.zip文件。解压将ZIP文件解压到你希望安装的目录例如C:\MTConnect\agent。解压后你会看到几个关键文件agent.exe主程序、Devices.xml.sample示例设备模型文件、agent.cfg.sample示例配置文件。创建基础配置在同一个目录下新建一个文本文件命名为agent.cfg。这是代理的核心配置文件。我们先写一个最简版本让它能跑起来。# 基础配置文件 agent.cfg Devices Devices.xml Port 5000 AllowPut false BufferSize 17 Adapters { MyFirstMachine { Host 192.168.1.100 # 替换为你的设备适配器IP Port 7878 # SHDR适配器默认端口 } }Devices: 指定设备模型文件路径。我们先用自带的示例文件。Port: 代理自身HTTP服务的监听端口。5000是一个常用端口确保没有被其他程序占用。AllowPut: 是否允许通过HTTP PUT请求更新设备资产如刀具信息。初期建议设为false以确保安全。BufferSize: 缓冲区大小设为17131072条数据对入门和中小规模应用足够了。Adapters: 定义数据源。这里定义了一个名为MyFirstMachine的适配器指向一台假设IP为192.168.1.100、端口为7878的设备。你需要将其替换为真实的MTConnect适配器地址。准备设备模型将Devices.xml.sample复制一份重命名为Devices.xml。这个示例文件定义了一个虚拟的数控机床模型包含了轴、主轴、控制器等组件非常适合用于测试。运行代理打开命令行CMD或PowerShell切换到代理所在目录执行命令C:\MTConnect\agent .\agent.exe run agent.cfg如果看到类似[INFO] Starting MTConnect Agent on port 5000的输出并且没有报错说明代理已经成功启动。对于Linux环境以Ubuntu 22.04为例过程类似下载对应的cppagent-2.7.0-linux-x86_64.tar.gz解压后获得可执行文件agent。# 下载并解压 wget https://github.com/mtconnect/cppagent/releases/download/v2.7.0/cppagent-2.7.0-linux-x86_64.tar.gz tar -xzf cppagent-2.7.0-linux-x86_64.tar.gz cd cppagent-2.7.0-linux-x86_64 # 创建配置文件 agent.cfg (内容同Windows) # 准备 Devices.xml cp Devices.xml.sample Devices.xml # 运行代理 (可能需要chmod x agent) ./agent run agent.cfg实操心得一首次运行的避坑点防火墙确保你的操作系统防火墙放行了代理监听端口如5000的入站连接否则从其他机器无法访问。适配器连通性如果Adapters中配置的Host和Port无法连接代理启动时通常只会输出警告[WARN] Failed to connect to adapter...而不会终止运行。但这意味着你收不到任何设备数据。务必先用telnet host port或nc -zv host port测试适配器端口是否开放。文件路径配置文件中Devices项使用的是相对路径Devices.xml这意味着它会在运行agent命令的当前工作目录下查找该文件。如果你从其他目录启动代理需要使用绝对路径如Devices /opt/mtconnect/Devices.xml。3.2 验证与初探数据接口代理启动后我们可以通过其提供的RESTful API来验证它是否工作正常。打开浏览器或使用curl命令行工具探测设备结构 (/probe) 访问http://localhost:5000/probe。这是MTConnect标准中最基础的接口返回整个代理管理的设备清单及其结构模型即Devices.xml的内容但以标准MTConnect Devices XML格式输出。curl http://localhost:5000/probe如果成功你会看到一大段XML里面描述了设备的ID、名称、包含的组件和数据项。这证明代理的HTTP服务和模型加载是正常的。获取当前数据 (/current) 访问http://localhost:5000/current。这个接口返回所有设备每个数据项最新一次的采样值或状态。curl http://localhost:5000/current由于此时适配器可能还未连接或没有数据返回的XML中很多数据项的值可能是UNAVAILABLE。这是正常现象。获取样本流 (/sample) 访问http://localhost:5000/sample。这个接口返回从缓冲区中获取的一系列历史数据样本是进行时间序列分析的主要数据源。你可以通过from和interval参数来获取特定时间段的数据。# 获取最近100个序列号之后的数据 curl http://localhost:5000/sample?from100实操心得二理解/current与/sample的区别这是初学者最容易混淆的两个接口。/current返回的是“快照”是所有数据项的最新值无论这个值是什么时候更新的。它适用于仪表盘显示实时状态。而/sample返回的是“流”是按时间顺序排列的数据变更记录。例如主轴转速从0变到1000再变到2000/sample会返回两条记录0-1000, 1000-2000而/current只返回最后一条2000。在开发监控系统时通常用WebSocket监听/current的流式推送来更新UI而用定时拉取/sample来存入数据库做历史分析。4. 核心配置详解与高级功能实战基础运行只是第一步要让cppagent在真实的生产环境中发挥威力必须深入理解其配置。配置文件agent.cfg是控制代理所有行为的核心。4.1 设备模型文件 (Devices.xml) 深度定制Devices.xml是你的设备数字孪生蓝图。官方示例只是一个起点你需要为每一台真实的设备编写对应的模型。关键元素解析Device根元素代表一台物理设备。id属性必须唯一在代理内部作为设备标识。Components设备内组件的容器。MTConnect预定义了数十种标准组件类型如Axes轴系、Controller控制器、Spindle主轴、Systems辅助系统等。DataItem数据定义的灵魂。其category属性决定数据类别SAMPLE连续变化的采样数据如位置、速度、温度。有数值和单位。EVENT离散发生的事件如程序开始(EXECUTION)、门开关(DOOR_STATE)、报警激活(ALARM)。通常为字符串或枚举值。CONDITION设备或组件的状态如NORMAL正常、WARNING警告、FAULT故障。这是MTConnect用于故障诊断的核心机制。一个贴近真实CNC的DataItem定义示例DataItem idspindle_speed_act categorySAMPLE typeROTARY_VELOCITY subTypeACTUAL unitsREVOLUTION/MINUTE nativeUnitsREVOLUTION/MINUTE significantDigits3 / DataItem idprog_execution categoryEVENT typeEXECUTION / DataItem idsys_overload categoryCONDITION typeSYSTEM subTypeOVERLOAD /significantDigits指定数值的有效位数用于控制输出精度。nativeUnits设备原始数据的单位units是输出时转换后的单位。如果两者一致则无需转换。模型与适配器数据的映射这是最关键的一步。在Devices.xml中定义的每一个DataItem都必须通过其id与适配器发送的数据流中的“键Key”对应起来。 假设适配器发送的SHDR数据行是|Sspeed|1500|和|exec|READY|。 那么在Devices.xml中你必须有一个id为Sspeed的DataItem来接收转速一个id为exec的DataItem来接收执行状态。id就是映射的桥梁。实操心得三编写Devices.xml的实用技巧从设备手册入手联系设备供应商获取其MTConnect适配器输出的数据点列表Data Point List。这份列表会明确列出每个数据项的Key如Xpos,SspeedAct和含义。这是你编写Devices.xml的唯一准确依据。使用建模工具手动编写复杂的XML容易出错。MTConnect官网和社区提供了一些图形化的设备建模工具如一些开源的编辑器可以通过拖拽组件来生成XML效率更高。分步验证不要一次性编写完所有数据项。可以先定义几个关键的数据项如一个轴位置、一个主轴转速启动代理和适配器查看/current接口是否有数据更新并符合预期。验证无误后再逐步添加。注意ID唯一性在整个Devices.xml文件中所有DataItem的id必须是全局唯一的。通常采用“设备简写_组件_数据”的命名方式如mill01_x_act_pos以避免冲突。4.2 高级网络与安全配置当你的代理需要暴露在局域网甚至广域网或者需要集成更多数据源时以下高级配置就派上用场了。多适配器配置一台cppagent可以同时连接多台设备的适配器这是它作为数据汇聚点的核心能力。Adapters { VMC_01 { Host 192.168.10.101 Port 7878 Device urn:mtconnect:cnc:vmc01 # 关联到Devices.xml中对应设备的uuid IgnoreTimestamps false } Turning_01 { Host 192.168.10.102 Port 7879 Device urn:mtconnect:cnc:lathe01 Heartbeat 5.0 # 心跳间隔秒 } Robot_Cell_01 { Host 192.168.10.201 Port 7880 Device urn:mtconnect:robot:cell01 } }Device指定此适配器连接的数据对应到Devices.xml中哪个Device。其值应为该设备的uuid属性或id如果未指定uuid。这是实现多设备支持的关键。IgnoreTimestamps如果设备时钟与代理服务器时钟不同步导致数据时间戳错乱可以设为true让代理使用自己的接收时间作为数据时间戳。但会损失原始时间精度慎用。Heartbeat适配器定期发送的空数据包间隔用于检测连接是否存活。如果超过设定时间未收到任何数据包括心跳代理会将该设备的数据项状态标记为UNAVAILABLE。启用TLS/HTTPS加密在生产环境尤其是数据需要跨网络传输时启用TLS加密是必须的。Port 5000 TlsPort 5443 # HTTPS监听端口 TlsOnly false # 设为true则只启用HTTPS禁用HTTP TlsDefaults { CertificateFile /path/to/server.crt PrivateKeyFile /path/to/server.key # DhFile /path/to/dhparams.pem # 如需增强安全性可配置DH参数 # VerifyClientCertificate false # 是否验证客户端证书双向认证 }配置完成后客户端就需要使用https://your-agent:5443/probe来访问API了。你需要使用OpenSSL等工具生成自签名或向CA购买正式的服务器证书。MQTT输入集成对于大量基于MQTT协议的物联网传感器如温度、振动传感器cppagent可以直接订阅MQTT主题来获取数据。MqttService { Host tcp://mqtt-broker.local:1883 # MQTT代理服务器地址 ClientId mtconnect-agent-floor1 Topics factory/floor1/sensor/, factory/floor1/plc/# # 订阅的主题支持通配符 # Username sensor_user # 如果MQTT代理需要认证 # Password xxxxxx Mapping mqtt_mapping.json # 可选指定MQTT消息到MTConnect数据项的映射规则文件 }MQTT集成的一个难点是消息映射。MQTT消息的Payload通常是JSON或自定义格式而cppagent需要将其转换为(key, value, timestamp)的三元组。这通常需要一个额外的映射配置文件或通过Ruby扩展脚本来实现。4.3 性能调优与运维配置对于高负载场景以下参数调整至关重要# 性能与资源相关 BufferSize 19 # 增大缓冲区至2^19 524,288条应对更高频率或更多设备的数据 CheckpointFrequency 500 # 降低检查点频率减少/current查询的延迟但会增加内存中维护的索引大小 WorkerThreads 4 # 根据CPU核心数调整工作线程数提升并发处理HTTP请求的能力 MaxAssets 2048 # 增加内存中最大资产如刀具、工件程序缓存数量 # 日志与调试 LoggerConfig { Level INFO # 日志级别: TRACE, DEBUG, INFO, WARN, ERROR # 输出到文件便于长期追踪 File /var/log/mtconnect/agent.log FileSize 10485760 # 单个日志文件最大10MB FileCount 5 # 保留5个历史文件 } # 控制台同时输出WARN以上级别的日志便于实时监控 ConsoleOutput WARN实操心得四缓冲区大小BufferSize的计算经验这个参数配置不当会导致数据丢失。你需要估算数据项总数 * 采样频率 * 需要缓冲的时间秒。 例如一台设备有100个数据项主要数据每秒采样1次你希望网络中断时能缓冲至少10分钟的数据。那么需要缓冲的条目数大约是100 * 60 * 10 60,000。 找一个大于60,000的2的幂$2^{16}65536$ 刚好够用但为了留有余量可以设置为17131072。对于多台设备或更高频率需要相应增大。但注意缓冲区越大内存占用也越多每条记录约几百字节到几KB。5. 故障排查与实战问题锦囊即使配置无误在实际部署中也会遇到各种问题。下面是我在多个项目中总结的常见故障场景及排查思路。5.1 数据类问题问题一代理运行正常但/current接口返回的数据全是UNAVAILABLE。可能原因1适配器未连接或配置错误。排查检查代理日志中是否有关于适配器连接失败的WARN或ERROR信息。使用netstat -an | grep 适配器端口Linux或telnet 适配器IP 端口测试网络连通性。解决确认agent.cfg中Adapters块的Host和Port正确无误。确保设备端的MTConnect适配器服务已启动。可能原因2Devices.xml中的DataItemid与适配器发送的key不匹配。排查这是最常见的原因。你需要获取适配器实际发送的数据流。如果适配器支持日志查看其日志。或者在测试阶段可以暂时在agent.cfg中增加一个调试适配器将数据打印到控制台某些适配器支持此功能。对比数据流中的key如|Xact|和Devices.xml中的id是否完全一致大小写敏感。解决修改Devices.xml确保id与适配器的key一一对应。可能原因3数据未到达代理的SHDR端口。排查在运行代理的服务器上使用tcpdump或Wireshark抓包过滤代理监听的适配器端口如port 7878看是否有TCP数据包到达。解决检查中间网络设备交换机、防火墙的规则确保设备到代理服务器的指定端口通信是畅通的。问题二能收到数据但时间戳是1970年或未来的时间。可能原因设备与代理服务器时钟不同步且适配器发送的时间戳格式有误或为空。排查查看一条原始SHDR数据。完整格式应为2023-10-27T08:30:25.123Z|key|value。如果时间戳部分缺失或格式错误代理无法解析。解决优先校准设备或适配器所在机器的系统时钟启用NTP同步。如果无法校准设备时间可以在agent.cfg中对应适配器配置或全局设置IgnoreTimestamps true让代理使用自己的系统时间。但需知晓这会导致所有数据的时间戳是代理的接收时间存在网络延迟。5.2 连接与接口类问题问题三无法通过浏览器或客户端访问代理的HTTP接口如/probe。可能原因1代理未成功启动或端口被占用。排查检查代理进程是否在运行ps aux | grep agent或 Windows任务管理器。查看启动日志确认是否成功绑定到端口Starting MTConnect Agent on port 5000。解决如果端口被占用修改agent.cfg中的Port为其他值如8080。可能原因2防火墙阻止访问。排查在代理服务器本地使用curl http://localhost:5000/probe测试。如果本地通外部不通就是防火墙问题。解决在服务器防火墙规则中放行代理监听端口TCP。可能原因3代理绑定到了127.0.0.1而非0.0.0.0。排查默认情况下cppagent绑定到0.0.0.0。但某些配置或旧版本可能不同。使用netstat -tlnp | grep 5000查看监听地址。如果是127.0.0.1:5000则只能本地访问。解决在agent.cfg中显式设置服务地址如ServiceHost 0.0.0.0。问题四MQTT数据订阅成功但数据未进入MTConnect流。可能原因MQTT消息格式与代理预期不符缺乏映射规则。排查查看代理日志中关于MQTT消息处理的DEBUG或INFO信息。确认MQTT消息的Payload能被正确解析。默认情况下代理期望的MQTT Payload是简单的key|value或timestamp|key|value文本格式或者是特定结构的JSON。解决如果数据格式简单尝试在MqttService配置中设置Format JSON或Format SHDR。如果格式复杂必须编写Mapping文件或Ruby扩展脚本明确指定如何从MQTT消息的topic和payload中提取出key,value,timestamp。5.3 性能与稳定性问题问题五代理运行一段时间后内存占用持续升高甚至崩溃。可能原因1数据积压。客户端消费数据的速度远低于设备生产数据的速度导致环形缓冲区持续写入但未被读取虽然旧数据会被覆盖但某些内部数据结构可能膨胀。可能原因2资产Asset累积。如果启用了资产功能如刀具管理并且资产数量超过MaxAssets限制或资产未被正确清理可能导致内存泄漏。可能原因3日志级别过低。将LoggerConfig的Level设为TRACE或DEBUG会在高负载下产生海量日志消耗I/O和内存。排查与解决监控客户端的数据拉取是否正常。检查客户端程序是否挂起或网络是否中断。适当增加BufferSize但需权衡内存使用。检查资产相关配置和客户端调用确保资产有合理的生命周期并被及时移除。生产环境将日志级别调整为INFO或WARN。使用valgrind等工具对代理进行内存泄漏检测针对从源码编译的版本。问题六在高频数据如1kHz采样下代理CPU占用率很高。可能原因默认单工作线程成为瓶颈。解决在agent.cfg中增加WorkerThreads CPU核心数或略少。例如在4核服务器上可以设置为3。这允许代理利用多核处理HTTP请求和数据流但注意线程数不是越多越好需要根据实际负载测试找到最佳值。6. 生产环境部署建议与扩展思路经过测试验证后将cppagent部署到生产环境还需要考虑以下方面1. 部署方式选择裸机运行直接运行二进制文件。最简单性能最佳。建议配合systemdLinux或NSSMWindows将其注册为系统服务实现开机自启和故障重启。容器化部署使用Docker。官方在Docker Hub提供了mtconnect/cppagent镜像。容器化便于版本管理、快速扩缩容和与Kubernetes等编排平台集成。需注意将配置文件、证书等通过Volume挂载到容器内。2. 高可用与负载均衡cppagent本身是单点。对于关键产线可以考虑以下方案被动冷备在两台服务器上部署相同的代理和配置通过虚拟IPVIP或负载均衡器对外提供服务。主节点故障时手动切换。主动-主动模式分设备让不同的cppagent实例负责不同的设备组在上层通过一个网关服务聚合数据。这样单点故障只影响部分设备。3. 监控与告警代理健康检查定期调用http://agent:port/根路径代理会返回简单的OK状态。将其纳入Zabbix、Prometheus等监控系统。数据流监控编写脚本定期调用/current接口检查关键设备数据项的timestamp是否在近期如1分钟内。如果时间戳过旧说明数据流可能中断触发告警。资源监控监控代理进程的CPU、内存占用以及所在服务器的网络、磁盘I/O。4. 扩展性探索Ruby扩展脚本这是cppagent最强大的扩展能力。你可以编写Ruby脚本在数据进入缓冲区前进行预处理。例如将原始电压值转换为温度、将多个数据项合并计算为设备综合效率OEE、或者根据规则过滤无效数据。# agent.cfg 中启用Ruby Ruby { module /path/to/custom_filters.rb }# custom_filters.rb 示例将华氏度转换为摄氏度 def filter_observation(observation) if observation.data_item_id temp_f celsius (observation.value.to_f - 32) * 5.0 / 9.0 observation.value celsius.round(2).to_s observation.data_item_id temp_c # 甚至可以改变输出的DataItem ID end observation end自定义输出虽然cppagent内置了HTTP、WebSocket、MQTT输出但你也可以通过其内部API或修改源码将数据直接推送到Kafka、时序数据库如InfluxDB或关系型数据库中更好地融入你现有的数据栈。部署cppagent不是终点而是构建统一工业数据平台的第一步。把它稳定地运行起来让数据流顺畅起来你就为后续的数据分析、可视化、预测性维护乃至数字孪生打下了最坚实的地基。这个过程中遇到的坑大部分都与网络、配置映射和性能调优有关希望上面的这些实战经验能帮你少走弯路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2554376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…