Titan
工业设备的数据链路:从一根 RTU 到一份诊断报告。
工业现场最贵的问题不是没有数据,而是数据进来之后没人能证明它对。报文结构配错、标签不在报文里、坏点被静默丢弃——这些故障都不会让界面报错,只会让曲线不动。Titan 把这些环节做成可核对的东西:每条报文有解析结论,每次预警有算法与窗口,每份报告有图谱与标注。
面向工业现场的设备数据处理平台,一条链路走完采集、存储、预警、分析与运维:采集侧支持 S7 / OPC UA / MQTT 网关,报文级监视能说清每条报文为什么入库、为什么被跳过;写入经 NATS JetStream 解耦后进 TimescaleDB 分区压缩。判定侧有四类预警算法(固定阈值 / 自适应阈值 / 趋势增幅 / 趋势增速),参数按设备可覆盖;分析侧有七张专业图谱(趋势 / 多波形 / 频谱 / 多频谱 / 瀑布 / 倒谱 / 转速)。结果落在诊断任务、诊断报告、知识库与隐患工单上,权限细到 21 个权限点、4 种角色。设备健康评分与故障预测仍在推进,不作为已交付能力。
- 4 类预警算法
- 7 张专业分析图谱
- 182 个 HTTP 端点
读 68 / 写 114,按角色与权限点裁剪
固定 / 自适应 / 增幅 / 增速,参数可按设备覆盖
趋势 / 多波形 / 频谱 / 多频谱 / 瀑布 / 倒谱 / 转速
4 种角色(admin / engineer / operator / user)
数据接入:把「连不上」和「连上了没数据」分开
接入页最容易骗人的两个状态是「已连接」和「最后一次采集时间在跳」。前者只说明 TCP 通了,后者可能只是上游在重推同一份镜像。Titan 把采集做成报文级可观测:每条报文一行,写清它为什么入库、为什么被跳过。
西门子 PLC 与 828D 数控系统:按点位读取 DB 块,坏点带质量戳返回,不静默丢。
批量 Read 一次取多点;一个 Endpoint 可挂多台设备,节点 ID 配在数据源里。
第三方网关整包推送:报文集字段可配,也能上传自定义报文集做联调。
- 01
- 命中:取到数值(含上游质量戳非 0 的真样本,单独计)
- 02
- 标签未命中:报文里没有该点位(变化推送,属正常)
- 03
- 值非数值:命中元素但值不是数字
- 04
- batch_key 缺失或不是数组
- 05
- 报文不是 JSON 对象
- 06
- 非 batch 路径取不到值
- 07
- 未赋值:任何漏判的路径都归到这里,不会被当成有效样本
七种结论最后只归三桶:入库 / 部分入库 / 丢弃。12 个点位里 3 个字段错 → 记「3/12 个元素字段错,其余已入库」(部分入库),不是整条扔掉。
- 自动发现:报文里自带设备编码与点位名时,采集器按报文建数据源与点位。现场一条自动发现源就能带 7 台设备、116 个点位,不用先手工录台账。
- 测量定义与波形触发支持批量下发与批量开关:一台设备的配置可以复制到同型号的一批设备上,改一处不用点 N 次。
- 波形触发默认值:触发前保留 1024 点、触发后 4096 点、采样 25,600 Hz、同设备冷却 60 秒;用来抓冲击、启停这类瞬时事件,而不是等它们出现在分钟级趋势里。
- 模拟器与报文集:内置第三方网关报文集,也可以上传自定义 JSON 报文集(16 MB 上限)做联调;断线按 2→4→…→30 秒指数退避自动重连。
时序存储与容量:瓶颈在哪,能不能加机器
工业时序的写入不是「能存」就够了:设备点位是 kHz 级采样、秒级上报,长期留存还要按时间窗查得快。Titan 的做法是消息总线解耦 + CopyFrom 批量写 + TimescaleDB 分区压缩,并且把瓶颈实测出来写在文档里。
- 采集器发布 telemetry.raw(异步,不等 ack)
- 写库 worker 攒批,CopyFrom 每 200 行 / 500 毫秒落一次
- TimescaleDB hypertable 按时间切 chunk,旧 chunk 列式压缩
- 预警是独立消费者:按设备节流 + time_bucket 降采样窗口查询
安全持续承载约 15,000 点/秒(同构容器实测 14,280/s 仍 100% 入库、零积压);真机 x86 硬件预计更高。
压测口径:本地同构容器(TimescaleDB pg16 + NATS 2.10 + 完整 server 管道),amd64 镜像跑在 arm64 模拟层——绝对数值偏低,档位之间的相对对比有效。
v0.6.6 的问题:三个预警消费者每条消息都做窗口 SQL(自适应阈值还要调算法服务),跟着跟着就落后;JetStream 要所有消费者 ack 才清消息,于是总线无限堆积直到磁盘满。
v0.6.7 的改法:窗口查询改 time_bucket 降采样 + 按设备节流 + 时间窗去重 + 可关开关;30K/s 档从丢 31.6 万条变成 157 万条全入库,三消费者积压归零。
写库通道从来不是瓶颈:单 writer CopyFrom 在 14K 点/秒时零积压,真实上限更高。
预警:四条判定路径,参数都是可改的
「阈值告警」四个字背后是四种完全不同的判断:超没超一个数、跟自己的历史比算不算异常、涨得快不快、涨得急不急。四种混成一条会让人不敢信预警,所以 Titan 把它们拆开,每条都带窗口、倍数与去重。
- 固定阈值
- 判定式 · 值 > 该设备该点位的阈值
- 窗口 · 按点位配置
- 升级 · 超阈值 1.5 倍升「严重」
- 去重 · 由配置窗口与分级决定
- 自适应阈值
- 判定式 · 按历史分位 P95 判定,至少 20 个桶才拟合
- 窗口 · 默认 60 分钟窗口 / 60 秒桶
- 升级 · 超阈值 1.5 倍升「严重」
- 去重 · 窗口内按设备节流
- 趋势增幅
- 判定式 · 线性回归斜率 / 均值 > 20%/小时
- 窗口 · 默认 1 小时
- 升级 · 超 2.5 倍升「严重」
- 去重 · 同设备同类型 30 分钟内只报一次
- 趋势增速
- 判定式 · 斜率绝对值 > 5 单位/小时
- 窗口 · 默认 2 小时
- 升级 · 超 3 倍升「严重」
- 去重 · 按设备节流
- 每条遥测都去算一次窗口查询会把数据库和算法服务吃满——所以判定前先按设备节流,再用 time_bucket 把窗口降采样成分钟级桶。这是 v0.6.7 能撑住 30K 点/秒的原因。
- 预警不是终点:命中后自动生成隐患(同一设备 6 小时内只建一条,避免刷屏),人工也可以补录。隐患进处置流程,处置方式决定它变成工单、检修项目,还是被关闭。
- 级别本身也可管理:严重 / 警告 / 提示三档,code 创建后不可改(预警生成依赖它),名称、颜色、排序与启停都能在系统设置里改。
分析工作台:七张图谱,各看一件事
振动类故障的定位靠的从来不是一张图:时域看冲击,频谱看特征频率,瀑布看频率怎么迁移,倒谱把边频带压成一根线。工作台把七张图放在同一份数据上,切换不换数据源。
- 01趋势图
- 看一段时间的走向与突变点,可叠加多个测点
- 遥测直出
- 02多波形
- 同一时段的多个测点摆在一起,比相位与幅值
- 遥测原始样本
- 03波形频谱
- 定位特征频率,带 1× / 2× / 3× 转频标线
- /signal/fft(rfft)
- 04多波形频谱
- 多测点频谱叠在一张图上,看同一频率谁先起
- /signal/fft 逐通道
- 05瀑布图
- 看频率成分随时间怎么迁移,2D 热力图与 3D 柱阵可切换
- /signal/spectrogram(STFT)
- 06倒谱图
- 把边频带压成一根谱线,识别调制与齿轮箱类故障
- /signal/cepstrum
- 07转速图
- 看转速波动与升降速过程,优先取转速类传感器
- 遥测(speed / rpm 传感器)
- 算法服务是独立的 Python 进程:FFT、短时傅里叶(窗 256 / 重叠 128)、倒谱、阈值分布拟合、趋势回归各一个端点
- FFT 的 1× / 2× / 3× 标线由转速均值 / 60 推得,转速传感器缺失时退化为 50 Hz 基准——图上标出来,不假装知道真实转频
- 没指定时间范围时按 24 小时 → 7 天 → 30 天 → 90 天依次回退,全部为空才报「该时间段内无遥测数据」,并把实际查过的时间段写进提示里。
- 图上可以打点标注(存在 analysis_annotations,可编辑可删),诊断报告与运行参数页引用同一份标注,不用在两个界面各标一遍。
诊断:任务在看板上走,报告带图谱
诊断不是「看一眼曲线」,而是一条有申请、有执行人、有报告、能被确认的任务线。Titan 把它做成看板:谁申请的、谁在做、出没出报告,一眼能看到。
申请
现场或点检提出诊断需求,挂到具体设备上,写清现象与时间范围。
分配
指派诊断工程师;同一台设备的历史任务与报告都可回看。
执行
在工作台选设备与时间窗做图谱分析,执行过程与状态变更都留日志。
出报告
运行报告或故障诊断报告:结论 + 正文 + 图谱快照,可继续编辑。
确认归档
报告确认后进知识库的故障案例,下次同类问题直接检索。
- 报告存的是结论与图谱快照(chart_data),不是一张截图:设备名、时间窗、图谱与标注一起留档,事后能复现当时的判断依据。
- 知识库分六类:规章制度、技术资料、运维标准、维修方案、基础资料(轴承库 / 齿轮库 / 厂商库)、故障案例库;表单字段可配,附件可上传。
- 基础资料是三个独立库:轴承库(型号与参数)、齿轮库、厂商库——查备件与查参数不用翻纸质台账。
- 算法基线可运维:/algo/train 训练阈值模型,/algo/reset-baseline 支持单设备与批量重置(换型、检修后基线要重置,否则自适应阈值会一直报)。
运维:隐患处置不走丢
隐患最怕的不是多,而是派出去之后没人知道它去哪了。Titan 的隐患只有几种确定的去处:变成四类单据之一,或者被关闭、转派、撤销——每一种都留处理人、时间与原因。
维修工单日常维修 / 大中修
能立刻处理的隐患直接转维修工单,派到人;也可并入检修项目,等停机窗口一起做。
润滑工单润滑路线
缺油、油温异常这类隐患转润滑工单,落到具体润滑路线与执行班组。
点检工单巡检路线
需要人到现场确认的,转巡检工单,按路线与区域派下去。
检修项目检修计划
确认是隐患但要停机才能处理的,纳入检修项目,由检修计划统一排期。
转派换处理人
判断不了或不是本班组的,转派给能判断的人,转派原因留痕。
关闭 / 撤销两个不同结论
关闭 = 确认不是隐患或已处理完;撤销 = 误上报。两者分开记,统计口径才干净。
点巡检:路线(区域 + 设备 + 标准)、巡检标准、巡检工单与班组四件套;路线可启停,停用后不再产生工单但不删历史。
润滑:润滑路线、润滑标准、润滑工单;标准与路线分开维护,同一条路线可以挂多套标准。
维修:日常维修工单与大中修工单、检修项目、检修计划、检修标准;检修项目可一键转工单执行,执行记录回到设备履历。
权限、授权与部署:能进厂,也能交给厂里自己管
工业软件交付的最后一公里是:现场没有外网、账号由甲方管、升级要能在一个下午做完。Titan 把这三件事都做成了可执行的东西,而不是写在方案里。
21 个权限点、4 种角色
权限码按「模块.动作」授予角色(admin / engineer / operator / user),写操作逐个挂角色校验,越权返回 403 而不是静默失败。
License 授权与机器指纹
离线激活:按机器指纹生成授权,到期与状态在界面可见;无授权时中间件拦在业务入口之前。
Spark 单点登录
从 Spark 打开 Titan 不需要二次登录(RSA 公钥验签),账号与角色仍在底座统一管理。
采集器可分离部署
采集可以内嵌在 server 里,也可以作为独立进程部署;一台采集器对多台设备,按设备或网段加机器扩展。
Windows 离线升级包
面向现场工程师的一键升级包:双击执行、断网可用、迁移与回滚都有提示——重庆科技大学等现场按这套走。
报文级排障界面
现场出问题时不要求工程师连数据库:登录就能看报文、解析结论与丢弃原因,清空缓冲才需要工程师权限。
- 部署形态
- 现场服务器私有化;Docker Compose / Windows 服务两种交付
- 后端
- Go + chi + pgx;采集器可独立进程(TITAN_COLLECTOR_EMBEDDED=false 时只跑 server)
- 时序存储
- TimescaleDB(PostgreSQL 扩展):hypertable 分区 + 列式压缩,迁移带版本追踪表与 down 回滚
- 消息总线
- NATS JetStream:消息保留 7 天,写库与三路预警各自独立消费者
- 采集协议
- S7 / OPC UA / MQTT 网关(自定义报文集可上传联调)
- 算法服务
- 独立 Python 服务(FastAPI):阈值拟合、趋势回归、FFT、STFT、倒谱
- 授权
- 离线 License + 机器指纹;可选 Spark 单点登录
- 预测性维护仍在做:设备健康评分与故障预测基于已积累的时序数据推进,不当作已交付能力对外承诺。
- 同一数据源只能由一个采集进程订阅:两个采集同时跑会重复写遥测(去重是进程内状态,跨进程无效)。双机负载均衡时要把 /api/data-sources* 固定到采集归属节点。
- 双机部署必须同版本:备机跑旧版会出现「同一操作时好时坏」——备机的数据源列表报 500、测试接口 404。
- 预警链路是唯一瓶颈:它每条消息都要查窗口,超载时写库还正常、预警消费者永久落后、总线开始堆积,所以必须保持按设备节流。
- 算法服务不可用时自适应阈值退化为固定兜底值,并在预警标题里写明是兜底值,不静默当成正常。
- 瀑布图的 3D 视图依赖浏览器 WebGL:现场瘦客户端只支持 2D 热力图时功能不受影响。
申请 Titan 试用
官网不提供安装包下载,也没有自助注册或系统登录入口。所有产品一律邮件申请试用:说明使用场景,我们回复开通演示环境或安排演示。