资讯动态

深度解析:从 OSIsoft PI 迁移到 TDengine IDMP 的完整实践指南

发布时间:2026/8/9 23:47:13 来源:尧图企业网站定制
摘要随着国产化替代和数字化转型的推进越来越多的工业企业考虑将历史数据从 OSIsoft PI 迁移到 TDengine IDMP。本文提供从数据模型映射、历史数据迁移到应用层适配的完整实践指南帮助企业平稳完成 historian 平台的升级。一、迁移背景与动机某大型炼化企业使用 PI 已有 15 年积累了超过 500 万测点、10 年的历史数据。随着业务扩展企业面临以下挑战性能瓶颈全厂级查询响应时间超过 30 秒影响实时监控成本压力PI 按测点收费年 License 费用超过 500 万元国产化要求信创战略要求核心系统实现自主可控云化需求集团要求数据上云PI 的封闭架构难以适配经过评估企业决定将 historian 平台从 PI 迁移到 TDengine IDMP。二、数据模型映射2.1 PI 的标签模型分析PI 的数据模型以标签Tag为核心每个标签包含Tag Name唯一标识符如 UNIT1.CDU.TI-101Point Attributes描述信息、工程单位、量程等Time-Series Data(timestamp, value, quality) 三元组2.2 TDengine IDMP 的层级模型设计将 PI 的扁平标签模型映射到 TDengine IDMP 的层级模型-- 创建 PI 标签对应的超级表CREATE STABLE pi_tag_data (ts TIMESTAMP,value DOUBLE,quality INT) TAGS (tag_name BINARY(64),unit BINARY(32),area BINARY(32),equipment BINARY(32),descriptor BINARY(128),eng_units BINARY(16));-- 标签命名空间映射示例-- PI: UNIT1.CDU.FURNACE.TI-101-- TDengine: tag_nameTI-101, unitUNIT1, areaCDU, equipmentFURNACE2.3 批量创建子表# Python 迁移脚本从 PI AF 读取标签结构批量创建 TDengine 子表import taosfrom PIconnect import PI AF# 连接 PI AFaf_server PI AF.PISystem(PI-AF-SERVER)af_database af_server.Databases[Plant Database]# 连接 TDenginetd_conn taos.connect(hosttdengine-idmp, databaseplant_data)cursor td_conn.cursor()# 遍历 PI Element 层级创建对应子表for element in af_database.Elements:unit element.Namefor child in element.Elements:area child.Namefor equip in child.Elements:equipment equip.Namefor attr in equip.Attributes:tag_name attr.Name# 创建子表cursor.execute(fCREATE TABLE IF NOT EXISTS {tag_name}USING pi_tag_dataTAGS ({tag_name}, {unit}, {area}, {equipment},{attr.Description}, {attr.DefaultUOM}))三、历史数据迁移3.1 PI 数据导出PI 提供多种数据导出方式// 使用 PI SDK 批量导出历史数据PIServer server new PIServer(PI-SERVER);PIPoint point server.PIPoints[TI-101];// 按时间范围导出AFTimeRange timeRange new AFTimeRange(*-10y, *);PIValues values point.RecordedValues(timeRange, AFBoundaryType.Inside, null, false, 1000000);// 导出为 CSVforeach (AFValue value in values){Console.WriteLine(${value.Timestamp},{value.Value},{value.IsGood});}3.2 TDengine IDMP 数据导入# Python 批量导入脚本import taosimport csvfrom datetime import datetimedef import_pi_data(csv_file, batch_size10000):conn taos.connect(hosttdengine-idmp, databaseplant_data)cursor conn.cursor()with open(csv_file, r) as f:reader csv.reader(f)batch []for row in reader:timestamp datetime.strptime(row[0], %Y-%m-%d %H:%M:%S)value float(row[1])quality 0 if row[2] True else 1batch.append(f({timestamp}, {value}, {quality}))if len(batch) batch_size:sql fINSERT INTO TI_101 VALUES {,.join(batch)}cursor.execute(sql)batch []# 导入剩余数据if batch:sql fINSERT INTO TI_101 VALUES {,.join(batch)}cursor.execute(sql)# 导入 10 年历史数据import_pi_data(TI-101_history.csv)3.3 迁移性能优化优化策略效果批量导入1万条/批次导入速度提升 10 倍多线程并行导入导入速度提升 5 倍预创建子表避免写入时建表开销调整 TDengine 缓存参数内存写入比例提升四、应用层适配4.1 PI SDK 代码迁移PI SDK 原始代码// PI SDK 读取最新值PIServer server new PIServer(PI-SERVER);PIPoint point server.PIPoints[TI-101];AFValue currentValue point.CurrentValue();Console.WriteLine($Value: {currentValue.Value}, Time: {currentValue.Timestamp});TDengine IDMP 等效代码# TDengine Python 连接器读取最新值import taosconn taos.connect(hosttdengine-idmp, databaseplant_data)cursor conn.cursor()cursor.execute(SELECT LAST(*) FROM TI_101)result cursor.fetchone()print(fValue: {result[1]}, Time: {result[0]})4.2 PI AF 结构迁移PI AF 的层级结构可以映射到 TDengine IDMP 的标签体系PI AF 概念TDengine IDMP 映射AF DatabaseDatabaseAF Element超级表 TAGS 层级AF Attribute子表测点AF Template超级表定义AF Analysis流计算 / 订阅4.3 可视化工具替换PI 工具TDengine IDMP 替代方案PI ProcessBookGrafana TDengine 数据源PI Vision自定义 Web 应用 / 帆软 BIPI DataLinkExcel ODBC 连接器PI WebParts嵌入式 Grafana 面板五、数据一致性验证5.1 数据完整性校验-- 校验 PI 与 TDengine 的数据条数是否一致-- PI 侧通过 PI OLEDBSELECT COUNT(*) FROM piarchive..picomp2 WHERE tag TI-101;-- TDengine 侧SELECT COUNT(*) FROM TI_101;5.2 数据准确性校验# Python 数据对比脚本import taosfrom PIconnect import PIServer# 读取 PI 数据pi_server PIServer(PI-SERVER)pi_point pi_server.search(TI-101)[0]pi_values pi_point.interpolated_values(2024-01-01, 2024-01-02, 1h)# 读取 TDengine 数据conn taos.connect(hosttdengine-idmp, databaseplant_data)cursor conn.cursor()cursor.execute(SELECT ts, value FROM TI_101 WHERE ts 2024-01-01 AND ts 2024-01-02)td_values cursor.fetchall()# 对比数据for pi_val, td_val in zip(pi_values, td_values):assert abs(pi_val.value - td_val[1]) 0.001, f数据不一致: PI{pi_val.value}, TD{td_val[1]}print(数据一致性校验通过)六、迁移风险与应对风险点影响应对措施历史数据丢失高双写验证 增量校验应用兼容性问题中灰度发布 回滚方案性能不达预期中预生产环境压测用户培训成本低分批培训 操作手册七、迁移后的收益该企业完成迁移后获得了以下收益性能提升全厂级查询从 30 秒降低到 280 毫秒成本降低年 License 费用从 500 万元降低到 80 万元扩展性增强支持千万级测点可水平扩展云化就绪原生支持 Kubernetes 部署八、总结从 PI 迁移到 TDengine IDMP 是一项系统工程涉及数据模型映射、历史数据迁移、应用层适配等多个环节。通过合理的迁移规划和充分的测试验证企业可以平稳完成 historian 平台的升级。对于正在考虑 historian 国产化替代的企业TDengine IDMP 提供了经过验证的迁移路径和技术支撑。在数字化转型的道路上选择一款与业务发展匹配的时序 database是企业构建数据竞争力的重要一步。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价