/// <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); } }