//开始计算 private void bt_calcu_Click(object sender, EventArgs e) { //提取数据 double x = 0; double y = 0; double output = 0;; try { if (this.tb_input1.Enabled) { x = double.Parse(this.tb_input1.Text); } if (this.tb_input2.Enabled) { y = double.Parse(this.tb_input2.Text); } output = double.Parse(this.tb_output.Text); } catch (Exception ex) { MessageBox.Show("输入有误请检查!"); return; } //注明计算模块名 this.lb_modulename.Text = "当前计算组件:" + this.modulename; //注明找到的曲线的有效时间 Curve1D curve1d; Curve2D curve2d; if (!this.tb_input2.Enabled) { //this.tb_input2.Enabled=false,说明是一维期望曲线 curve1d = CurveConfig.GetOPXCurve(this.SelectCurveIndex, this.startDatetime); this.lb_vailddate.Text = "选定曲线有效时间:" + curve1d.validDate.ToString(); } else { //this.tb_input2.Enabled=true,说明是二维期望曲线 curve2d = CurveConfig.GetOPXCurve2D(this.SelectCurveIndex, this.startDatetime); this.lb_vailddate.Text = "选定曲线有效时间:" + curve2d.validDate.ToString(); } //准备参数 string calcupara = "S;" + this.SelectCurveIndex.ToString() + ";" + this.SelectCurveIndex.ToString(); //计算 //1、准备数据 List <PValue>[] inputs; if (this.tb_input2.Enabled) { inputs = new List <PValue> [3]; inputs[0] = new List <PValue>(); inputs[0].Add(new PValue(output, this.startDatetime, this.startDatetime.AddMinutes(1), 0)); inputs[0].Add(new PValue(output, this.startDatetime.AddMinutes(1), this.startDatetime.AddMinutes(1), 0)); inputs[1] = new List <PValue>(); inputs[1].Add(new PValue(x, this.startDatetime, this.startDatetime.AddMinutes(1), 0)); inputs[1].Add(new PValue(x, this.startDatetime.AddMinutes(1), this.startDatetime.AddMinutes(1), 0)); inputs[2] = new List <PValue>(); inputs[2].Add(new PValue(y, this.startDatetime, this.startDatetime.AddMinutes(1), 0)); inputs[2].Add(new PValue(y, this.startDatetime.AddMinutes(1), this.startDatetime.AddMinutes(1), 0)); } else { inputs = new List <PValue> [3]; inputs[0] = new List <PValue>(); inputs[0].Add(new PValue(output, this.startDatetime, this.startDatetime.AddMinutes(1), 0)); inputs[0].Add(new PValue(output, this.startDatetime.AddMinutes(1), this.startDatetime.AddMinutes(1), 0)); inputs[1] = new List <PValue>(); inputs[1].Add(new PValue(x, this.startDatetime, this.startDatetime.AddMinutes(1), 0)); inputs[1].Add(new PValue(x, this.startDatetime.AddMinutes(1), this.startDatetime.AddMinutes(1), 0)); inputs = inputs.Take(2).ToArray(); } //2、计算 var swTimer = Stopwatch.StartNew(); //开始计算计时 //2.1 计算:获取计算对象(反射法) Assembly assembly = Assembly.LoadFrom(APPConfig.DLLNAME_CALCUMODULE); //获得PSLCalcu.exe Type calcuclass = assembly.GetType(APPConfig.NAMESPACE_CALCUMODULE + "." + this.modulename); //获得当前计算指定的算法类.注意,这里必须是“命名空间.类名” PropertyInfo inputData = calcuclass.GetProperty("inputData"); //获得算法类的静态参数inputData PropertyInfo calcuInfo = calcuclass.GetProperty("calcuInfo"); //获得算法类的静态参数calcuInfo MethodInfo Calcu = calcuclass.GetMethod("Calcu", new Type[] { }); //获得算法类的Calcu()方法。注意,Calcu方法有重载,这里需要指明获得哪个具体对象,否则会报错 PropertyInfo ErrorFlag = calcuclass.GetProperty("errorFlag"); //获得算法类的静态参数ErrorFlag,bool类型 PropertyInfo ErrorInfo = calcuclass.GetProperty("errorInfo"); //2.3 计算:主算法 //1、这里需要判断Calcu是否为空,如果为空,要写log inputData.SetValue(null, inputs); //将输入数据给入算法 System.UInt32[] tagids = new System.UInt32[] { (System.UInt32)(APPConfig.rdbtable_constmaxnumber + 1), (System.UInt32)(APPConfig.rdbtable_constmaxnumber + 2) }; string tagnames = ""; bool[] tagflags = new bool[inputs.Length]; for (int i = 0; i < tagflags.Length; i++) { tagflags[i] = true; } calcuInfo.SetValue(null, new CalcuInfo(tagnames, tagids, tagflags, this.modulename, calcupara, this.startDatetime, this.startDatetime.AddMinutes(1), 0, 100)); //将当前计算信息给入算法 Results Results = (Results)Calcu.Invoke(null, null); string realSpan = swTimer.Elapsed.ToString(); //计算计时结束 if (Results.warningFlag) { MessageBox.Show("计算警告:" + Results.warningInfo); return; } if (Results.errorFlag) { MessageBox.Show("计算错误:" + Results.errorInfo); return; } //展示计算结果 this.tb_sp.Text = Results.results[0][0].Value.ToString(); this.tb_spstatus.Text = Results.results[0][0].Status.ToString(); this.tb_error.Text = Results.results[1][0].Value.ToString(); this.tb_errorstatus.Text = Results.results[1][0].Status.ToString(); this.tb_score.Text = Results.results[3][0].Value.ToString(); this.tb_scorestatus.Text = Results.results[3][0].Status.ToString(); }