如何读取PHD实时数据

         最近因为业务需要,研究了一下如何从霍尼韦尔的PHD实时库读取数据,这个玩意跟平常用的数据库Oracle,Sqlserver,Mysql都不太一样,网上几乎搜不到任何资料。为什么资料这么少,我也不太明白,大概是这个东西仅仅在自动化行业有应用吧。

        经过各种努力,又是百度,又是电话,终于明白一点了,读PHD实时库有三种方式,一是通过PHD的OPC服务读取数据,二是webservice方式,三是自己写程序调用PHD所提供的动态库phdapinet.dll。大家知道,通过OPC服务,读数的点不能太多,而且也不是很稳定。webservice是霍尼给定制开发,需要掏钱的。所以最好是第三种方式,自己写代码。

       既然是最好的方式,就没啥研究的了,不过写代码之前还得做一件事情,在部署采数程序的前置机上必须安装PHD的客户端软件Modtag,这个软件网上就能下载,安装也简单。

如何读取PHD实时数据_第1张图片

      如上图就算可以了,有的情况是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没有设置字符集的地方,有谁知道......

你可能感兴趣的:(技术,霍尼,霍尼韦尔,实时库,C#,PHD)