孙呈祥 2020-07-19 10:38 采纳率: 0%
浏览 197
已结题

C# 通过位移量计算位移速度

C#通过研华的PCIE 1812采集卡采集模拟量的位移信号,0-150mm,现在采集时写在单独线程里面,然后再做一个线程取采集的值通过和前一次取得值只差计算位移速度,现在位移速度计算的线程时间很固定打印出来一只是0.5000286S,但是采集部分不固定每次需要20ms左右才能采集出来,关键是采集的时间偶尔会有几十ms的延时,所以计算的速度偶尔会有波动,请教怎么来解决这个延时去掉波动。

/*这是采集的部分,单独线程,一共采集6个通道的数据,设定采集卡的采样频率150000,然后每次取2000个做平均值滤波,然后再一阶平滑滤波*/
 private void CAIJI2()//object sender, ElapsedEventArgs e
        {
            while (true)
            {
                instantAoCtrl.Write(0, 0.0f);
                Thread.Sleep(1);

                List<double> cai0 = new List<double>();
                List<double> cai1 = new List<double>();
                List<double> cai2 = new List<double>();
                List<double> cai3 = new List<double>();
                List<double> cai4 = new List<double>();
                List<double> cai5 = new List<double>();
                ctrl.Prepare();

                int chStart = 0;
                int chCount = 6;
                int samples = 2000;
                try
                {
                    ctrl.ScanChannel.ChannelStart = chStart;
                    ctrl.ScanChannel.ChannelCount = chCount;
                    ctrl.ScanChannel.Samples = samples;
                    ctrl.ScanChannel.IntervalCount = samples;

                    double clkRate = 150000;
                    ctrl.ConvertClock.Rate = clkRate;

                    ctrl.Streaming = false;
                }
                catch (Exception ex)
                {
                    return;
                }

                ctrl.RunOnce();

                double[] values = new double[samples * chCount];
                ErrorCode ret = ctrl.GetData(samples * chCount, values);


                if (ret == ErrorCode.Success)
                {
                    // Add your data process code here...
                }


                for (int i = 500; i < values.Length / 6 - 500; i++)
                {
                    var diyi = 6 * i;
                    cai0.Add(values[diyi]);
                    cai1.Add(values[diyi + 1]);
                    cai2.Add(values[diyi + 2]);
                    cai3.Add(values[diyi + 3]);
                    cai4.Add(values[diyi + 4]);
                    cai5.Add(values[diyi + 5]);

                }
                var romvat = 998;
                //0通道法向力 1000KN
                cai0.Sort();
                cai0.RemoveAt(0);
                cai0.RemoveAt(romvat);
                double suma0 = cai0.Sum();
                var arga0 = (float)suma0 / cai0.Count;
                //Console.WriteLine(arga0);
                fvalue[0] = arga0 * 100f;

                //1通道处理 切向力 2000KN
                cai1.Sort();
                cai1.RemoveAt(0);
                cai1.RemoveAt(romvat);
                double suma1 = cai1.Sum();
                var arga1 = (float)suma1 / cai1.Count;
                //Console.WriteLine(arga1);
                fvalue[1] = arga1 * 200f;


                //2通道处理 法向位移 175mm
                cai2.Sort();
                cai2.RemoveAt(0);
                cai2.RemoveAt(romvat);
                double suma2 = cai2.Sum();
                var arga2 = (float)suma2 / cai2.Count;
                //Console.WriteLine(arga2);
                fvalue[2] = (float)arga2 * 17.5f;

                //3通道处理  切向位移 200mm
                cai3.Sort();
                cai3.RemoveAt(0);
                cai3.RemoveAt(romvat);
                double suma3 = cai3.Sum();
                var arga3 = (float)suma3 / cai3.Count;
                //Console.WriteLine(arga3);
                fvalue[3] = arga3 * 20f;


                //4通道处理 法向阀反馈 -10-10V
                cai4.Sort();
                cai4.RemoveAt(0);
                cai4.RemoveAt(romvat);
                double suma4 = cai4.Sum();
                var arga4 = (float)suma4 / cai4.Count;
                //Console.WriteLine(arga4);
                GlobalVariable.FBYAO = arga4 * 10f;
                //5通道处理 切向阀反馈 -10-10V
                cai5.Sort();
                cai5.RemoveAt(0);
                cai5.RemoveAt(romvat);
                double suma5 = cai5.Sum();
                var arga5 = (float)suma5 / cai5.Count;
                //Console.WriteLine(arga5);
                GlobalVariable.FBXAO = arga5 * 10f;

                instantAoCtrl.Write(0, (GlobalVariable.YAO - 0.015F) * 10);

                filter0.K = 64;
                filter1.K = 64;
                filter2.K = 64;
                filter3.K = 64;
                filter0.Input = fvalue[0];
                filter1.Input = fvalue[1];
                filter2.Input = fvalue[2];
                filter3.Input = fvalue[3];
                average0.Input = filter0.Output();
                average1.Input = filter1.Output();
                average2.Input = filter2.Output();
                average3.Input = filter3.Output();
                GlobalVariable.YForce = filter0.Output();
                GlobalVariable.XForce = filter1.Output();
                GlobalVariable.YDisplacement = filter2.Output();
                GlobalVariable.XDisplacement = filter3.Output();


                pp();
                Thread.Sleep(100);

下面是计算位移速度等,部分代码

//线程运行
        private void TaskRun()
        {
            while (true)
            {


                //采集计算
                if (boolFrist2 == true)
                {
                    boolFrist2 = false;
                    foldValue[0] = GlobalVariable.TYDisplacement;
                    foldValue[1] = GlobalVariable.TYForce;
                    foldValue[2] = GlobalVariable.TXDisplacement;
                    foldValue[3] = GlobalVariable.TXForce;
                }
                if (DateTimeYX == null)
                {
                    DateTimeYX = DateTime.Now;
                }
                difTimeYX = DateTime.Now.Subtract(DateTimeYX);
                DateTimeYX = DateTime.Now;
                float TotalSecondsYX = (float)difTimeYX.TotalSeconds;


                if (boolFrist2 == false)
                {
                    //Y变形mm/S
                    GlobalVariable.TestYDeformation = Math.Abs(GlobalVariable.TYDisplacement - foldValue[0]) / TotalSecondsYX;
                    //Y位移mm/min
                    GlobalVariable.TestYDisplacement = (Math.Abs(GlobalVariable.TYDisplacement - foldValue[0]) / TotalSecondsYX) * 60.0f;
                    //Y法向变化KN/S
                    GlobalVariable.TYForceS = Math.Abs(GlobalVariable.TYForce - foldValue[1]) / TotalSecondsYX;
                    //Y常刚量kN/mm
                    GlobalVariable.TYForceMM = Math.Abs(GlobalVariable.TYForce - foldValue[1]) / Math.Abs(GlobalVariable.TYDisplacement - foldValue[0]);
                    //filter6.K = 4;
                    //GlobalVariable.TestYDisplacement = filter6.Output();
                    Console.WriteLine("当前位置-" + GlobalVariable.TYDisplacement);
                    Console.WriteLine("上次位置-" + foldValue[0]);
                    Console.WriteLine("时间差-" + TotalSecondsYX);
                    Console.WriteLine("计算速度-        " + GlobalVariable.TestYDisplacement);
                    foldValue[0] = GlobalVariable.TYDisplacement;
                    foldValue[1] = GlobalVariable.TYForce;

                    //X变形mm/S
                    GlobalVariable.TestXDeformation = Math.Abs(GlobalVariable.TXDisplacement - foldValue[2]) / TotalSecondsYX;
                    //X位移mm/min
                    GlobalVariable.TestXDisplacement = (Math.Abs(GlobalVariable.TXDisplacement - foldValue[2]) / TotalSecondsYX) * 60.0f;
                    //X法向变化KN/S
                    GlobalVariable.TXForceS = Math.Abs(GlobalVariable.TXForce - foldValue[3]) / TotalSecondsYX;
                    //X常刚量kN/mm
                    GlobalVariable.TXForceMM = Math.Abs(GlobalVariable.TXForce - foldValue[3]) / Math.Abs(GlobalVariable.TXDisplacement - foldValue[2]);
                    foldValue[2] = GlobalVariable.TXDisplacement;
                    foldValue[3] = GlobalVariable.TXForce;

                                         //定时500ms  
                Thread.Sleep(500);

下面是打印的一段时间

当前位置-5.336647
上次位置-5.234484
时间差-0.5020287
计算速度- 12.21006
采集的位置-28.4403
采集时间差 -0.017001
采集的位置-28.44381
采集时间差 -0.019001
采集的位置-28.44729
采集时间差 -0.016001
采集的位置-28.4508
采集时间差 -0.018001
采集的位置-28.45433
采集时间差 -0.017001
采集的位置-28.45788
采集时间差 -0.0160009
采集的位置-28.46132
采集时间差 -0.0170009
采集的位置-28.4648
采集时间差 -0.0200012
采集的位置-28.46827
采集时间差 -0.017001
采集的位置-28.47178
采集时间差 -0.0170009
采集的位置-28.47522
采集时间差 -0.017001
采集的位置-28.4787
采集时间差 -0.0160009
采集的位置-28.48226
采集时间差 -0.018001
采集的位置-28.48567
采集时间差 -0.017001
采集的位置-28.48904
采集时间差 -0.017001
采集的位置-28.49252
采集时间差 -0.018001
采集的位置-28.49586
采集时间差 -0.017001
采集的位置-28.4993
采集时间差 -0.017001
采集的位置-28.50267
采集时间差 -0.0170009
采集的位置-28.50615
采集时间差 -0.017001
采集的位置-28.50961
采集时间差 -0.017001
采集的位置-28.51299
采集时间差 -0.017001
采集的位置-28.51627
采集时间差 -0.0160009
采集的位置-28.51982
采集时间差 -0.018001
采集的位置-28.52338
采集时间差 -0.017001
采集的位置-28.52693
采集时间差 -0.0170009
采集的位置-28.53041
采集时间差 -0.017001
采集的位置-28.53389
采集时间差 -0.017001
线程 0x7f8 已退出,返回值为 0 (0x0)。
采集的位置-28.53736
采集时间差 -0.0380022
当前位置-5.436941
上次位置-5.336647
时间差-0.508029
计算速度- 11.84509
采集的位置-28.54092
采集时间差 -0.0190011
采集的位置-28.54456
采集时间差 -0.018001
采集的位置-28.54833
采集时间差 -0.018001
采集的位置-28.55194
采集时间差 -0.017001
采集的位置-28.55556
采集时间差 -0.017001
采集的位置-28.5593
采集时间差 -0.0170009
采集的位置-28.56291
采集时间差 -0.017001
采集的位置-28.56644
采集时间差 -0.017001
采集的位置-28.57
采集时间差 -0.0170009
采集的位置-28.57359
采集时间差 -0.017001
采集的位置-28.57717
采集时间差 -0.017001
采集的位置-28.58088
采集时间差 -0.0190011
采集的位置-28.58442
采集时间差 -0.017001
采集的位置-28.58794
采集时间差 -0.0170009
采集的位置-28.59142
采集时间差 -0.017001
采集的位置-28.59491
采集时间差 -0.017001
采集的位置-28.59849
采集时间差 -0.0160009
采集的位置-28.60213
采集时间差 -0.017001
采集的位置-28.60569
采集时间差 -0.018001
采集的位置-28.60923
采集时间差 -0.017001
采集的位置-28.61268
采集时间差 -0.0170009
采集的位置-28.61607
采集时间差 -0.017001
采集的位置-28.61953
采集时间差 -0.017001
采集的位置-28.62304
采集时间差 -0.0170009
采集的位置-28.6266
采集时间差 -0.017001
采集的位置-28.63012
采集时间差 -0.017001
采集的位置-28.63369
采集时间差 -0.017001
采集的位置-28.63716
采集时间差 -0.0170009
采集的位置-28.64067
采集时间差 -0.017001
当前位置-5.537361
上次位置-5.436941
时间差-0.5000286
计算速度- 12.04971
采集的位置-28.64419
采集时间差 -0.017001
采集的位置-28.64783
采集时间差 -0.0190011
采集的位置-28.65139
采集时间差 -0.0170009
采集的位置-28.65503
采集时间差 -0.017001
采集的位置-28.65859
采集时间差 -0.017001
采集的位置-28.66221
采集时间差 -0.017001
采集的位置-28.66584
采集时间差 -0.0170009
采集的位置-28.66943
采集时间差 -0.017001
采集的位置-28.67305
采集时间差 -0.017001
采集的位置-28.67665
采集时间差 -0.0160009
采集的位置-28.68019
采集时间差 -0.018001
采集的位置-28.6838
采集时间差 -0.017001
采集的位置-28.68741
采集时间差 -0.017001
采集的位置-28.69093
采集时间差 -0.0170009
采集的位置-28.69445
采集时间差 -0.017001
采集的位置-28.69799
采集时间差 -0.0190011
采集的位置-28.70153
采集时间差 -0.018001
采集的位置-28.70507
采集时间差 -0.017001
采集的位置-28.70877
采集时间差 -0.017001
采集的位置-28.7123
采集时间差 -0.0170009
采集的位置-28.71599
采集时间差 -0.017001
采集的位置-28.7195
采集时间差 -0.017001
采集的位置-28.72294
采集时间差 -0.017001
采集的位置-28.72645
采集时间差 -0.0170009
采集的位置-28.72967
采集时间差 -0.017001
采集的位置-28.73287
采集时间差 -0.017001
采集的位置-28.7361
采集时间差 -0.0170009
采集的位置-28.73911
采集时间差 -0.017001
采集的位置-28.74191
采集时间差 -0.017001
当前位置-5.640665
上次位置-5.537361
时间差-0.5000286
计算速度- 12.39576
采集的位置-28.74487
采集时间差 -0.017001
采集的位置-28.74763
采集时间差 -0.018001
采集的位置-28.75043
采集时间差 -0.018001
采集的位置-28.75315
采集时间差 -0.017001
采集的位置-28.75567
采集时间差 -0.017001
采集的位置-28.7581
采集时间差 -0.0170009
采集的位置-28.76038
采集时间差 -0.0180011
采集的位置-28.7626
采集时间差 -0.0170009
采集的位置-28.76485
采集时间差 -0.017001
采集的位置-28.76709
采集时间差 -0.018001
采集的位置-28.76917
采集时间差 -0.0180011
采集的位置-28.77123
采集时间差 -0.0170009
采集的位置-28.77311
采集时间差 -0.017001
采集的位置-28.77498
采集时间差 -0.017001
采集的位置-28.7768
采集时间差 -0.017001
采集的位置-28.77851
采集时间差 -0.0170009
采集的位置-28.78034
采集时间差 -0.017001
采集的位置-28.782
采集时间差 -0.017001
采集的位置-28.78349
采集时间差 -0.017001
采集的位置-28.78506
采集时间差 -0.019001
采集的位置-28.78646
采集时间差 -0.017001
采集的位置-28.78778
采集时间差 -0.017001
采集的位置-28.78914
采集时间差 -0.017001
采集的位置-28.79047
采集时间差 -0.0170009
采集的位置-28.79172
采集时间差 -0.017001
采集的位置-28.79307
采集时间差 -0.017001
采集的位置-28.79426
采集时间差 -0.0170009
采集的位置-28.79527
采集时间差 -0.017001
当前位置-5.741911
上次位置-5.640665
时间差-0.5000286
计算速度- 12.14881
采集的位置-28.7963
采集时间差 -0.1230071
采集的位置-28.7973
采集时间差 -0.018001
采集的位置-28.79826
采集时间差 -0.0160009
采集的位置-28.79915
采集时间差 -0.018001
采集的位置-28.80015
采集时间差 -0.0190011
采集的位置-28.80097
采集时间差 -0.017001
采集的位置-28.80184
采集时间差 -0.017001
采集的位置-28.80264
采集时间差 -0.0170009
采集的位置-28.80336
采集时间差 -0.017001
采集的位置-28.80409
采集时间差 -0.017001
采集的位置-28.80481
采集时间差 -0.017001
采集的位置-28.80541
采集时间差 -0.0170009
采集的位置-28.80609
采集时间差 -0.017001
采集的位置-28.80676
采集时间差 -0.018001
采集的位置-28.80743
采集时间差 -0.017001
采集的位置-28.80806
采集时间差 -0.017001
采集的位置-28.80859
采集时间差 -0.0170009
采集的位置-28.80895
采集时间差 -0.017001
采集的位置-28.80946
采集时间差 -0.017001
采集的位置-28.80997
采集时间差 -0.017001
采集的位置-28.81048
采集时间差 -0.0170009
采集的位置-28.81102
采集时间差 -0.017001
采集的位置-28.81147
采集时间差 -0.017001
采集的位置-28.81179
采集时间差 -0.017001
当前位置-5.795267
上次位置-5.741911
时间差-0.5000286
计算速度- 6.402374
采集的位置-28.81214
采集时间差 -0.019001
采集的位置-28.81245
采集时间差 -0.0190011
采集的位置-28.81282
采集时间差 -0.017001
采集的位置-28.81323
采集时间差 -0.017001
采集的位置-28.8136
采集时间差 -0.0170009
采集的位置-28.814
采集时间差 -0.0180011
采集的位置-28.81422
采集时间差 -0.0170009
采集的位置-28.8144
采集时间差 -0.017001
采集的位置-28.81461
采集时间差 -0.017001
采集的位置-28.81486
采集时间差 -0.017001
采集的位置-28.81518
采集时间差 -0.0170009
采集的位置-28.81547
采集时间差 -0.0180011
采集的位置-28.81562
采集时间差 -0.0170009
采集的位置-28.81584
采集时间差 -0.0180011
采集的位置-28.81585
采集时间差 -0.0170009
采集的位置-28.81595
采集时间差 -0.016001
采集的位置-28.8162
采集时间差 -0.018001
采集的位置-28.81637
采集时间差 -0.0160009
采集的位置-28.81649
采集时间差 -0.018001
采集的位置-28.81665
采集时间差 -0.0280016
采集的位置-28.81671
采集时间差 -0.0190011
采集的位置-28.81689
采集时间差 -0.017001
采集的位置-28.817
采集时间差 -0.017001
采集的位置-28.81708
采集时间差 -0.018001
采集的位置-28.81715
采集时间差 -0.0160009
采集的位置-28.81716
采集时间差 -0.018001
采集的位置-28.81715
采集时间差 -0.017001
采集的位置-28.81714
采集时间差 -0.017001
当前位置-5.811792
上次位置-5.795267
时间差-0.5000286
计算速度- 1.982919
采集的位置-28.81723
采集时间差 -0.017001
采集的位置-28.81731
采集时间差 -0.0200011
采集的位置-28.81742
采集时间差 -0.017001
采集的位置-28.81741
采集时间差 -0.0170009
采集的位置-28.8174
采集时间差 -0.017001
采集的位置-28.81746
采集时间差 -0.0240014
采集的位置-28.81754
采集时间差 -0.018001
采集的位置-28.81748
采集时间差 -0.0160009
采集的位置-28.81749
采集时间差 -0.0190011
采集的位置-28.81735
采集时间差 -0.017001
采集的位置-28.81728
采集时间差 -0.017001
采集的位置-28.81727
采集时间差 -0.0170009
采集的位置-28.81726
采集时间差 -0.017001
采集的位置-28.81727
采集时间差 -0.018001
采集的位置-28.81731
采集时间差 -0.0180011
采集的位置-28.81735
采集时间差 -0.0170009
采集的位置-28.81728
采集时间差 -0.0180011
采集的位置-28.81718
采集时间差 -0.018001
采集的位置-28.81712
采集时间差 -0.017001
采集的位置-28.81707
采集时间差 -0.0170009
采集的位置-28.81709
采集时间差 -0.0190011
采集的位置-28.81719
采集时间差 -0.017001
采集的位置-28.8173
采集时间差 -0.017001
采集的位置-28.81719
采集时间差 -0.0160009
采集的位置-28.81706
采集时间差 -0.018001
采集的位置-28.817
采集时间差 -0.017001
采集的位置-28.81686
采集时间差 -0.0160009
采集的位置-28.81675
采集时间差 -0.017001
当前位置-5.817141
上次位置-5.811792
时间差-0.5000286
计算速度- 0.641748
采集的位置-28.81678
采集时间差 -0.018001
采集的位置-28.81677
采集时间差 -0.018001
采集的位置-28.81651
采集时间差 -0.017001
采集的位置-28.81639
采集时间差 -0.017001
采集的位置-28.81625
采集时间差 -0.017001
采集的位置-28.81613
采集时间差 -0.018001
采集的位置-28.81606
采集时间差 -0.017001
采集的位置-28.8161
采集时间差 -0.0170009
采集的位置-28.81604
采集时间差 -0.017001
采集的位置-28.816
采集时间差 -0.017001
采集的位置-28.81576
采集时间差 -0.0200011
采集的位置-28.81574
采集时间差 -0.017001
采集的位置-28.81554
采集时间差 -0.0190011
采集的位置-28.81542
采集时间差 -0.017001
采集的位置-28.81532
采集时间差 -0.0170009
采集的位置-28.81528
采集时间差 -0.017001
采集的位置-28.81513
采集时间差 -0.017001
采集的位置-28.81499
采集时间差 -0.0170009
采集的位置-28.8148
采集时间差 -0.0200012
采集的位置-28.81467
采集时间差 -0.017001
采集的位置-28.81453
采集时间差 -0.0170009
采集的位置-28.81444
采集时间差 -0.017001
采集的位置-28.8142
采集时间差 -0.017001
采集的位置-28.81405
采集时间差 -0.0170009
采集的位置-28.81394
采集时间差 -0.017001
采集的位置-28.81372
采集时间差 -0.017001
采集的位置-28.81356
采集时间差 -0.017001
采集的位置-28.81344
采集时间差 -0.0170009
采集的位置-28.81326
采集时间差 -0.017001
当前位置-5.816751
上次位置-5.817141
时间差-0.5000286
计算速度- 0.04668922
采集的位置-28.8132
采集时间差 -0.017001
采集的位置-28.81308
采集时间差 -0.018001
采集的位置-28.81296
采集时间差 -0.017001

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-07-19 15:57
    关注

    TotalSeconds这个太粗糙了,可以使用TotalMilliseconds
    精确到0.001秒
    如果精度还不够,可以用System.Environment.TickCount

    评论

报告相同问题?

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教