Exemplo n.º 1
0
        /// <summary>
        /// 写入单个标签点的历史数据
        /// 这个方法主要用于从csv文件导入历史数据到golden数据库中。从csv读取的数据是字符串型二维数组,因此这里的历史数据入参是字符串型二维数组,而不是List<PValue>
        /// </summary>
        /// <param name="tagname"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public int PutArchivedValues(string tagname, string[][] data)
        {
            //注意,只能向数据库第一个有效数据的时间之后,插入历史数据。
            //——如果插入的值得历史时刻在第一个有效值前,则插入不返回错误,但是数据写不进去。
            //准备数据
            PISDK.PIValues pivalues = new PISDK.PIValues(); //新建PIValues,ReadOnly属性为true
            pivalues.ReadOnly = false;                      //只有将PIValues的readonly属性置为false,才能写入。

            //数据点的描述,是一个NamedValues类型。该类型是一个集合。可以添加不同的描述项,并给项设定值
            NamedValues nvatts = new NamedValues();

            nvatts.Add("questionable", true);

            //将数据写入pivalues
            //——只使用第1个值即实时值,第2个值时间。
            int i = 0;

            //try
            //{
            for (i = 0; i < data.Length; i++)
            {
                try
                {
                    //在PI导出的数据中,value有可能是字符串。有时候表示服务器启停,有时候表示“IO timeout”等,这些值都无法转换成数值型,必须跳过。
                    if (data[i] != null && data[i].Length != 0)
                    {
                        pivalues.Add(Convert.ToDateTime(data[i][2]), Convert.ToDouble(data[i][1]), nvatts);
                    }
                }
                catch
                {
                    continue;
                }
            }
            //}
            //catch (Exception ex)
            //{
            //    //将pi的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
            //    this._exception = "写历史数据时,转换数据格式错误!错误行数"+i.ToString();
            //    throw ex;     //将pgim的异常继续向外传递。
            //}

            //使用piPoint.Data.UpdateValues更新点历史数据
            //this._piPoint = new PISDK.PIPoint();
            try
            {
                this._piPoint = this._piServer.PIPoints[tagname];
                PISDKCommon.PIErrors pierror = this._piPoint.Data.UpdateValues(pivalues);
                //处理写入结果
                return(pierror.Count);
            }
            catch (Exception ex)
            {
                //将pi的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
                this._exception = "PI其他未知错误。通常是服务器故障、标签中对应的服务器名称不正确导致!";
                throw ex;     //将pgim的异常继续向外传递。
                return(-1);
            }
        }