当前位置:首页 > 行业动态 > 正文

如何利用C高效读取PI数据库数据?

在C#中读取PI数据库可通过OSIsoft提供的AF SDK或PI Web API实现,首先配置连接参数,使用PIServer对象或HTTP请求建立链接,通过点标识符查询实时/历史数据,利用AFAttribute及相关类库解析返回结果,需处理异常确保数据稳定性,适用于工业数据监控与分析场景。

在工业自动化和数据管理领域,PI System(Plant Information System)作为一种高性能的实时数据库,被广泛用于存储和检索传感器、设备及生产流程的时序数据,对于使用C#的开发人员而言,通过代码访问PI数据库是实现数据分析和系统集成的重要环节,以下内容将详细介绍如何通过C#连接并操作PI数据库,同时结合最佳实践和安全性建议,确保开发过程高效可靠。


前置条件与工具准备

  1. 安装PI SDK
    访问OSIsoft官方网站(现为AVEVA)下载并安装PI AF SDKPI SDK,这是与PI数据库交互的核心组件,确保安装版本与开发环境兼容。

  2. 引用必要库文件
    在Visual Studio中创建C#项目后,通过NuGet包管理器安装OSIsoft.AFSDK(用于访问PI Asset Framework)和OSIsoft.PISDK(核心PI数据库操作库)。

    Install-Package OSIsoft.AFSDK
    Install-Package OSIsoft.PISDK
  3. 权限配置
    联系PI系统管理员获取以下权限:

    如何利用C高效读取PI数据库数据?  第1张

    • PI Data Archive的读取权限
    • 服务器地址、端口号及身份验证凭据(Windows域账户或PI账户)

连接PI数据库的代码实现

步骤1:建立PIServer连接

using OSIsoft.AF;
using OSIsoft.AF.PI;
public class PIReader
{
    public PIServer ConnectToPI(string serverName, string username, string password)
    {
        PIServers piServers = new PIServers();
        PIServer piServer = piServers[serverName];
        // 使用Windows集成身份验证(或PI账户)
        piServer.Connect(); 
        // 或显式指定凭据:
        piServer.Connect(username, password);
        if (piServer.ConnectionInfo.IsConnected)
        {
            Console.WriteLine("成功连接到PI服务器");
            return piServer;
        }
        else
        {
            throw new Exception("连接失败,请检查网络或凭据");
        }
    }
}

步骤2:查询实时数据

public void ReadCurrentValue(PIServer piServer, string tagName)
{
    PIPoint piPoint = PIPoint.FindPIPoint(piServer, tagName);
    if (piPoint != null)
    {
        object value = piPoint.CurrentValue();
        Console.WriteLine($"标签 {tagName} 当前值:{value}");
    }
    else
    {
        Console.WriteLine("未找到指定标签");
    }
}

步骤3:获取历史数据

public void ReadHistoricalData(PIServer piServer, string tagName, DateTime startTime, DateTime endTime)
{
    PIPoint piPoint = PIPoint.FindPIPoint(piServer, tagName);
    if (piPoint != null)
    {
        AFTimeRange timeRange = new AFTimeRange(startTime, endTime);
        AFValues values = piPoint.RecordedValues(timeRange, AFBoundaryType.Inside, "", false, 0);
        foreach (AFValue value in values)
        {
            Console.WriteLine($"{value.Timestamp}: {value.Value}");
        }
    }
}

关键注意事项

  1. 异常处理
    所有PI操作需包裹在try-catch块中,捕获PIExceptionAFException,避免因网络中断或权限问题导致程序崩溃。

  2. 连接池管理
    频繁连接/断开服务器会降低性能,建议使用单例模式或依赖注入框架(如ASP.NET Core中的AddSingleton)管理PIServer实例。

  3. 性能优化

    • 批量查询:使用PIQuery接口一次性获取多个标签数据,减少往返次数。
    • 数据压缩:通过AFSummary获取统计结果(如平均值、最大值),减少传输数据量。
  4. 安全实践

    • 敏感信息(如密码)应存储在环境变量或Azure Key Vault中,避免硬编码。
    • 启用PI Server的SSL加密通信,防止数据泄露。

常见问题与解决方法

  • 错误:Unable to connect to PI Data Archive
    检查防火墙设置,确保客户端可访问PI Server的TCP端口(默认5450),若使用域名,需确认DNS解析正常。

  • 返回值为No Data
    确认标签名拼写正确,且时间范围内存在记录,使用piPoint.RecordedValuesByCount测试反向查询。

  • 内存泄漏问题
    PIServerPIPoint对象需显式释放(调用.Dispose()),或在using块中执行操作。


扩展应用场景

  1. 与Web API集成
    在ASP.NET Core中封装PI数据接口,为前端提供实时图表数据。
  2. 报警监控
    结合AFNotification监听标签值变化,触发邮件或短信通知。
  3. 数据归档
    将PI数据导出至SQL Server或Azure Cosmos DB,用于长期分析和机器学习。

引用说明
本文参考以下权威资料:

  • OSIsoft官方文档:PI System Developer Technologies
  • Microsoft .NET Framework安全编程指南
  • AVEVA知识库:PI SDK最佳实践
0