如何使用PHP从AspenTech IP21 Historian查询数据?

时间:2017-10-13 13:18:59

标签: php python odbc aspen

是否可以使用php从InfoPlus 21(IP21)AspenTech查询数据?

我愿意创建一个可以从AspenTech Historian访问标签和历史数据的php应用程序。

ODBC是我的答案吗?即使这样想,我也不太确定如何继续。

更新 我最终使用python和pyODBC。 这就像一个魅力! 谢谢大家的支持。

3 个答案:

答案 0 :(得分:2)

我不知道直接通过PHP访问IP21数据的方法,但是,如果您乐意通过Web服务访问数据,则有REST和SOAP选项。

这两种方法都非常快速且反应迅速。

AFW Security仍适用于访问Web服务的客户端。客户端将需要SQL Plus读取(最少)访问。

<强> SOAP

  • 需要&#34; Aspen SQL + Web服务器/服务和健康监视器&#34;要安装在IP21服务器上的组件(在安装IP21期间选择)。
  • 最新版本的IP21需要对web.config文件稍作修改才能允许远程访问。如果您无法远程执行Web服务,请尝试在本地(即与IP21服务器在同一台计算机上)执行此操作,并查看是否存在此问题。

    • 示例:http://IP21ServerHostName/SQLPlusWebService/SQLplusWebService.asmx/ExecuteSQL?command=select%20*%20from%20compquerydef;

<强> REST

  • 我的偏好(通过SOAP),因为它使用JQuery(JavaScript)非常容易访问 - 几行代码!
  • 不确定安装时需要什么IP21组件,但它似乎已经在我的大多数IP21服务器上。
  • URL中的参数可以控制返回的行数(方便)。
  • 如果在Jquery / JavaScript中使用,网页必须托管在AspenOneServerHostName计算机上,否则您将遇到跨源资源共享(CORS)问题。

    • 实施例: http://AspenOneServerHostName/ProcessData/AtProcessDataREST.dll/SQL?%3CSQL%20c=%22DRIVER={AspenTech%20SQLplus};HOST=IP21ServerHostName;Port=10014;CHARINT=N;CHARFLOAT=N;CHARTIME=N;CONVERTERRORS=N%22%20m=%22DesiredMaxNumberOfRowsReturned%22%20s=%221%22%3E%3C![CDATA[select%20*%20from%20compquerydef]]%3E%3C/SQL%3E
      • 注意:
        • AspenOneServerHostName可以与IP21ServerHostName
        • 相同
        • AspenOneServerHostName必须配置ADSA才能查看IP21ServerHostName
        • DesiredMaxNumberOfRowsReturned替换为数字

答案 1 :(得分:2)

是ODBC驱动程序应该适用于满足您的要求。我们已经开发了一个应用程序,将数据插入到使用相同协议的IP21历史数据库中。类似地,一些分析工具(例如Seeq合作)也使用ODBC从IP21历史数据库中获取数据。因此,在你的情况下也应该是可能的。

答案 2 :(得分:2)

按照@DaveTheAI的要求,我在这里分享了如何解决此问题:

我能够使用pyODBC连接器从AspenTech历史学家那里读取数据。 首先,您需要确保已安装必需的ODBC驱动程序(我正在使用Windows)。 重要的一点是要有与您的python / anaconda版本兼容的驱动程序:32/64位

之后:

import pyodbc
#---- Connect to IP21
conn = pyodbc.connect("DRIVER={AspenTech ODBC driver for Production Record Manager};HOST=hostname;PORT=port")

#---- Query string
tag = 'YOUR_TAG'
start = '2019-01-01 12:00:00'
end = '2019-01-02 12:00:00'
sql = "select TS,VALUE from HISTORY "\
        "where NAME='%s'"\
        "and PERIOD = 60*10"\
        "and REQUEST = 2"\
        "and REQUEST=2 and TS between TIMESTAMP'%s' and TIMESTAMP'%s'" % (tag, start, end)
data = pd.read_sql(sql,conn) # Pandas DataFrame with your data!