最近因为业务需要,研究了一下如何从霍尼韦尔的PHD实时库读取数据,这个玩意跟平常用的数据库Oracle,Sqlserver,Mysql都不太一样,网上几乎搜不到任何资料。为什么资料这么少,我也不太明白,大概是这个东西仅仅在自动化行业有应用吧。
经过各种努力,又是百度,又是电话,终于明白一点了,读PHD实时库有三种方式,一是通过PHD的OPC服务读取数据,二是webservice方式,三是自己写程序调用PHD所提供的动态库phdapinet.dll。大家知道,通过OPC服务,读数的点不能太多,而且也不是很稳定。webservice是霍尼给定制开发,需要掏钱的。所以最好是第三种方式,自己写代码。
既然是最好的方式,就没啥研究的了,不过写代码之前还得做一件事情,在部署采数程序的前置机上必须安装PHD的客户端软件Modtag,这个软件网上就能下载,安装也简单。
如上图就算可以了,有的情况是Modtag装上了,但是连不上PHD服务端,一般都是网络不通。还有,在你的开发环境下,是可以不装Modtag的,因为你的程序编译通过就可以了。
这种用动态库的方式,开发语言似乎只能用c#,但网上也有说可以用JAVA或者C++的,不过本人没实战过。有兴趣的童鞋可以去自己尝试。话不多说了,直接开整,开发环境我这里用的是VS2019。
C#语言开发,首先当然是 using,代码简单。
using System;
using System.Data;
using System.Collections.Concurrent;
using System.Text;
using Uniformance.PHD;
这里写点小学级别的代码,就一个方法,相信大家都能看懂。
public static string GatherTest()
{
PHDHistorian oPhd = new PHDHistorian();
PHDServer defaultServer = new PHDServer("127.0.0.1"); // phdAddress 地址
defaultServer.APIVersion = SERVERVERSION.RAPI200;
oPhd.DefaultServer = defaultServer;
oPhd.StartTime = "now";
oPhd.EndTime = "now";
oPhd.Sampletype = SAMPLETYPE.Snapshot;
oPhd.SampleFrequency = 300;
try
{
string[] tagArray = "abc.123;abc.002".Split(';');
Tags tags = new Tags();
foreach(string tag in tagArray)
{
tags.Add(new Tag(tag));
}
StringBuilder sb = new StringBuilder();
DataSet ds = oPhd.FetchRowData(tags);
if (ds == null || ds.Tables == null || ds.Tables.Count == 0)
{
return string.Concat("测点", "abc.123;abc.002","无数据");
}
foreach (DataRow dr in ds.Tables[0].Rows)
{
sb.Append("TagName:" + dr["TagName"]);
sb.Append("Value:" + dr["Value"]);
sb.Append("TimeStamp:" + dr["TimeStamp"]);
sb.Append("Confidence:" + dr["Confidence"]);
}
return sb.ToString();
}
catch (Exception e)
{
return "获取数据失败" + e.Message;
}
finally
{
oPhd.Dispose();
}
}
相信大家都能运行起来,简单得都不想说啥了。这个代码只是演示如何采集两个点的数据,在实际生产环境大概有2万点多,速度也是非常快,没啥毛病。核心代码如下,其实也没什么的。
Tags oTags = new Tags();
//增加测点
DataSet ds = oPhd.FetchRowData(oTags);
如果运行不正常,需要帮助,可以留言。
遇到个问题,值为中文的点读出来的是乱码,而api没有设置字符集的地方,有谁知道......