Exemplo n.º 1
0
        //开始计算
        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();
        }