TDGage.cs 14.2 KB
Newer Older
1 2
using FLY.OBJComponents.Server;
using FLY.Thick.Base.Common;
潘栩锋's avatar
潘栩锋 committed
3
using FLY.Thick.Base.Server;
4
using FLY.Thick.Blowing.Server.Model;
5 6 7 8 9 10
using FlyADBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
11
using System.Threading.Tasks;
12 13 14
using System.Windows.Threading;
using ERRNOs = FLY.Thick.Base.Common.ERRNOs;
using FlyADIODefine = FLY.Thick.Blowing.Common.FlyADIODefine;
潘栩锋's avatar
潘栩锋 committed
15 16 17

namespace FLY.Thick.Blowing.Server
{
18
    public class TDGage : FLY.Thick.Base.IService.ITDGageService
潘栩锋's avatar
潘栩锋 committed
19 20 21 22 23 24 25 26 27 28 29 30 31
    {
        #region 延时推送 MARKNO
        const int MARKNO_UPDATEV = 1;
        const int MARKNO_INITHISTORY = 2;
        const int MARKNO_PUSH_ACCESS = 3;
        #endregion
        #region 参数--------------------------------------------------------------------
        #region 初始化------------------------------------------------------------------
        /// <summary>
        /// 参数目录 m_path;数据文件的 根目录默认是 "Gage1", 不能有 @"\"
        /// 目前也是对外的服务器目录
        /// </summary>
        public string mParamDirectory;
32

潘栩锋's avatar
潘栩锋 committed
33 34 35 36 37 38 39
        #endregion

        #region 数据--------------------------------------------------------------------

        /// <summary>
        /// 当前基本简单参数
        /// </summary>
40 41
        public DynArea DynArea => dynArea;
        private DynArea dynArea;
潘栩锋's avatar
潘栩锋 committed
42 43 44 45 46


        /// <summary>
        /// 运行参数
        /// </summary>
47
        public BlowingFixProfile profile;
潘栩锋's avatar
潘栩锋 committed
48 49 50 51

        /// <summary>
        /// AD曲线
        /// </summary>
52
        public CurveCollection curve;
潘栩锋's avatar
潘栩锋 committed
53 54 55 56

        /// <summary>
        /// 报警系统
        /// </summary>
57
        public WarningSystem2 warning;
潘栩锋's avatar
潘栩锋 committed
58 59 60 61 62 63

        #region 运行模式

        /// <summary>
        /// AD卡
        /// </summary>
64
        public FlyADBase.FlyAD7 flyAd;
65
        public FlyAdService flyAdService;
潘栩锋's avatar
潘栩锋 committed
66 67 68 69

        /// <summary>
        /// GM管理器
        /// </summary>
70
        GageModeManager gmManager;
潘栩锋's avatar
潘栩锋 committed
71 72 73 74

        /// <summary>
        /// 定点模式
        /// </summary>
75
        public GM_Fix gmFix;
潘栩锋's avatar
潘栩锋 committed
76 77 78
        /// <summary>
        /// 吹膜测厚模式.定点
        /// </summary>
79
        public GM_BlowingFix gmRenZiJiaFix;
潘栩锋's avatar
潘栩锋 committed
80

81 82 83
        /// <summary>
        /// 扫描报警系统
        /// </summary>
84
        public ScanWarning scanWarning;
85

86 87 88
        /// <summary>
        /// 设备参数
        /// </summary>
89
        public InitParam initParam;
潘栩锋's avatar
潘栩锋 committed
90
        #endregion
91

潘栩锋's avatar
潘栩锋 committed
92 93 94
        /// <summary>
        /// 系统参数
        /// </summary>
95
        public SysParam sysParam;
潘栩锋's avatar
潘栩锋 committed
96 97


98

潘栩锋's avatar
潘栩锋 committed
99
        #region BULKDATA
100

潘栩锋's avatar
潘栩锋 committed
101

潘栩锋's avatar
潘栩锋 committed
102 103 104
        /// <summary>
        /// 数据库对象
        /// </summary>
105
        DbModel dbModel;
106 107 108 109
        ///// <summary>
        ///// 原始数据 数据库对象
        ///// </summary>
        //OrgDbModel orgDbModel;
潘栩锋's avatar
潘栩锋 committed
110 111 112
        /// <summary>
        /// 数据库写操作
        /// </summary>
113
        public HistoryDb historyDb;
114
        //OrgHistoryDb orgHistoryDb;
潘栩锋's avatar
潘栩锋 committed
115 116 117
        /// <summary>
        /// 本地数据库
        /// </summary>
118
        LocalDb localDb;
潘栩锋's avatar
潘栩锋 committed
119 120 121
        /// <summary>
        /// 数据库读操作
        /// </summary>
122
        public BulkDb bulkDb;
123

潘栩锋's avatar
潘栩锋 committed
124 125 126 127 128 129
        #endregion

        #endregion

        #endregion

130

潘栩锋's avatar
潘栩锋 committed
131 132
        public TDGage(string nam)
        {
133
            mParamDirectory = nam;// @"D:\" + m_name;
潘栩锋's avatar
潘栩锋 committed
134 135 136 137 138 139 140

            if (!System.IO.Directory.Exists(mParamDirectory))
            {
                System.IO.Directory.CreateDirectory(mParamDirectory);
            }
            System.Environment.CurrentDirectory = mParamDirectory;

141 142
            #region create
            sysParam = new SysParam(null);//系统参数
143

144 145 146 147 148 149 150 151
            initParam = new InitParam
            {
                DbDirPath = @"D:\blowingdata"
            };
            if (!initParam.Load())
                initParam.Save();

            profile = new BlowingFixProfile();//运行配置参数
152 153 154 155 156 157 158 159 160 161

            curve = new CurveCollection(null);//AD转thick


            dbModel = new DbModel();
            localDb = new LocalDb();
            historyDb = new HistoryDb();
            bulkDb = new BulkDb();

            dynArea = new DynArea();
潘栩锋's avatar
潘栩锋 committed
162

163
            warning = new WarningSystem2();
164
            scanWarning = new ScanWarning();
潘栩锋's avatar
潘栩锋 committed
165

166
            flyAd = new FlyAD7();
167
            flyAdService = new FlyAdService();
168
            gmManager = new GageModeManager();
169 170
            gmFix = new GM_Fix();
            gmRenZiJiaFix = new GM_BlowingFix();
171 172

            #endregion
173
        }
174

175 176
        async Task Init_db()
        {
177 178
            //---------------------------------------------------------------------------------------------------------------
            //数据库
179 180 181
            await Task.Factory.StartNew(() =>
            {
                dbModel.Init();
182 183 184 185 186 187 188 189
                //删除不需要的备份数据 (yyyy-MM 文件夹)
                dbModel.KeepBackupSize(12);//时间永远 12个月 initParam.DBKeepMonth

                //备份上一个月之前的数据到 yyyy-MM 文件夹
                dbModel.BackupBbInSize(12);//时间永远 12个月 initParam.DBKeepMonth

                //当前的数据库只保存上个月与这个月的数据
                dbModel.KeepDBSize(1);
190
            });
191
            historyDb.Init(dbModel, localDb);
192
            bulkDb.Init(historyDb, localDb, dbModel);
193 194 195 196 197 198 199 200
        }
        public async Task Init()
        {

            #region 注入初始化
            //数据库 配置----------------------------------------
            //就只是数据库操作会慢而已!!!!!!
            await Init_db();
潘栩锋's avatar
潘栩锋 committed
201

202

203 204
            //数据库备份检查
            BackupDbCheckInit();
潘栩锋's avatar
潘栩锋 committed
205

206 207 208 209
            //GageModeManager 配置----------------------------------------
            Misc.BindingOperations.SetBinding(
                gmManager, nameof(gmManager.State),
                DynArea, nameof(DynArea.ControllerState));
潘栩锋's avatar
潘栩锋 committed
210

211 212 213
            //FlyAd7 配置----------------------------------------
            if (!flyAd.Load())
                flyAd.Save();
潘栩锋's avatar
潘栩锋 committed
214

215
            flyAd.Connect();
216
            flyAdService.Init(flyAd, Ad2Thk);
217

218 219 220 221 222
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.HardwareVersion), () =>
            {
                FlyADIODefine.SetInstance(new FlyADIODefine());
                FlyADIODefine.Instance.SerVersion(flyAd.HardwareVersion);
            });
潘栩锋's avatar
潘栩锋 committed
223

224 225
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.IStatus), DynArea, nameof(DynArea.IStatus));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.OStatus), DynArea, nameof(DynArea.OStatus));
潘栩锋's avatar
潘栩锋 committed
226

227 228 229
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.Position2), DynArea, nameof(DynArea.Position2));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.Surplus), DynArea, nameof(DynArea.Hrs));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.IsConnected), DynArea, nameof(DynArea.FLYADIsConnect));
230

231
            flyAdService.Init(flyAd, Ad2Thk);
232

233 234 235
            //WarningSystem 配置----------------------------------------
            warning.Init(historyDb.ErrorBuffer);
            warning.PropertyChanged += (s, e) =>
236
            {
237
                if (e.PropertyName == nameof(warning.IsRinging))
238
                {
239
                    flyAd.SetOutputBit(FlyADIODefine.Instance.OutNo_Alarm, !warning.IsRinging);
240
                }
241
            };
242

243

244
            //ScanWarning 配置----------------------------------------
245
            scanWarning.Init(warning, historyDb);
246 247


248 249
            //GM_Fix 配置----------------------------------------
            gmFix.Init(flyAd, dynArea, Ad2Thk);
250 251
            gmFix.IsIgnoreDataWhenIdle = false;
            gmManager.AddGM(gmFix);
252

潘栩锋's avatar
潘栩锋 committed
253

254 255
            //GM_RenZiJiaFix 配置----------------------------------------
            gmRenZiJiaFix.Init(flyAd, Ad2Thk, dynArea, profile.Param, historyDb, bulkDb);
256
            gmManager.AddGM(gmRenZiJiaFix);
潘栩锋's avatar
潘栩锋 committed
257 258


259
            gmRenZiJiaFix.Start();
潘栩锋's avatar
潘栩锋 committed
260 261 262 263 264 265 266


            ErrNoForCheckInit();

            #endregion
        }

267 268 269
        //void mGMRenZiJiaFix_EPCSampled(int ad)
        //{
        //    CurveCollection pCurve = curve;
潘栩锋's avatar
潘栩锋 committed
270

271 272 273 274
        //    dynArea.SampleAD[0] = ad;
        //    List<CurveCollection.ExChange> list = new List<CurveCollection.ExChange>();
        //    if (pCurve.Curves.Count == 0)
        //        return;
潘栩锋's avatar
潘栩锋 committed
275 276


277 278 279 280
        //    list.Add(new CurveCollection.ExChange() { OrgAD = pCurve.Curves[0].AD, CurrAD = ad });
        //    pCurve.ModifyExChange(list);
        //    pCurve.ReviseCurve();
        //}
281
        #region 异常检测
潘栩锋's avatar
潘栩锋 committed
282 283
        class ErrNoForCheckItem
        {
284
            public FLY.OBJComponents.Common.ERRNO errno;
潘栩锋's avatar
潘栩锋 committed
285 286 287 288 289 290 291
            public Func<bool> conditional;
            /// <summary>
            /// 持续时间,单位s
            /// </summary>
            public int cnt;

            int timer = -1;
292
            public WarningSystem2 mWarning;
潘栩锋's avatar
潘栩锋 committed
293 294 295 296
            public void Clear()
            {
                if (timer == 0)
                {
297
                    mWarning.Remove(errno.Code);
潘栩锋's avatar
潘栩锋 committed
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
                }
                timer = -1;
            }
            public void OnPoll()
            {
                if (conditional())
                {
                    if (timer < 0)
                        timer = cnt;
                    else
                    {
                        if (timer > 0)
                            timer--;

                        if (timer == 0)
                        {
                            mWarning.Add(
                                errno.Code,
316
                                errno.Descrption);
潘栩锋's avatar
潘栩锋 committed
317 318 319 320 321 322 323 324 325 326 327 328 329
                        }
                    }
                }
                else
                {
                    Clear();
                }
            }
        }

        List<ErrNoForCheckItem> ErrNoForCheckItems = new List<ErrNoForCheckItem>();
        void ErrNoForCheckInit()
        {
330
            #region 时间触发的报警
潘栩锋's avatar
潘栩锋 committed
331 332 333
            ErrNoForCheckItems.Add(//AD值太小
                new ErrNoForCheckItem()
                {
334
                    errno = ERRNOs.Instance.BASE_ERRNO_AD_MIN,
潘栩锋's avatar
潘栩锋 committed
335
                    cnt = 20,
336
                    conditional = delegate ()
潘栩锋's avatar
潘栩锋 committed
337
                    {
338
                        return DynArea.AD < (DynArea.ADMax * 0.01);
潘栩锋's avatar
潘栩锋 committed
339 340 341 342 343 344
                    }
                });

            ErrNoForCheckItems.Add(//AD值太大
                new ErrNoForCheckItem()
                {
345
                    errno = ERRNOs.Instance.BASE_ERRNO_AD_MAX,
潘栩锋's avatar
潘栩锋 committed
346
                    cnt = 20,
347
                    conditional = delegate ()
潘栩锋's avatar
潘栩锋 committed
348
                    {
349
                        return (DynArea.AD > (DynArea.ADMax * 0.98));
潘栩锋's avatar
潘栩锋 committed
350 351 352 353 354
                    }
                });

            foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
            {
355
                item.mWarning = warning;
潘栩锋's avatar
潘栩锋 committed
356 357 358 359 360
            }

            FObjBase.PollModule.Current.Poll_Config(
                FObjBase.PollModule.POLL_CONFIG.ADD,
                onpoll_checkErrNo, TimeSpan.FromSeconds(1));
361

362
            #endregion
潘栩锋's avatar
潘栩锋 committed
363

364 365
            #region 状态触发的报警
            Misc.BindingOperations.SetBinding(DynArea, nameof(DynArea.Hrs), () =>
潘栩锋's avatar
潘栩锋 committed
366
            {
367
                if (DynArea.Hrs < 48 && DynArea.Hrs > 0)//授权限制提醒
潘栩锋's avatar
潘栩锋 committed
368
                {
369
                    warning.Add(
370 371
                        ERRNOs.Instance.BASE_ERRNO_LICENSE_TIP.Code,
                        ERRNOs.Instance.BASE_ERRNO_LICENSE_TIP.Descrption);
潘栩锋's avatar
潘栩锋 committed
372 373 374
                }
                else
                {
375
                    warning.Remove(ERRNOs.Instance.BASE_ERRNO_LICENSE_TIP.Code);
潘栩锋's avatar
潘栩锋 committed
376
                }
377 378 379
            });

            Misc.BindingOperations.SetBinding(DynArea, nameof(DynArea.SecuteLock), () =>
潘栩锋's avatar
潘栩锋 committed
380
            {
381
                if (DynArea.SecuteLock)
潘栩锋's avatar
潘栩锋 committed
382
                {
383
                    warning.Add(
384 385
                        ERRNOs.Instance.BASE_ERRNO_LICENSE.Code,
                        ERRNOs.Instance.BASE_ERRNO_LICENSE.Descrption);
潘栩锋's avatar
潘栩锋 committed
386 387 388
                }
                else
                {
389
                    warning.Remove(ERRNOs.Instance.BASE_ERRNO_LICENSE.Code);
潘栩锋's avatar
潘栩锋 committed
390
                }
391
            });
潘栩锋's avatar
潘栩锋 committed
392

393
            #endregion
潘栩锋's avatar
潘栩锋 committed
394 395
        }

396
        void onpoll_checkErrNo() //1秒执行一次
潘栩锋's avatar
潘栩锋 committed
397
        {
398
            if (!dynArea.FLYADIsConnect)
399
            {
400
                warning.Add(
401 402
                    ERRNOs.Instance.BASE_ERRNO_FLYAD7DISCONNECTED.Code,
                    ERRNOs.Instance.BASE_ERRNO_FLYAD7DISCONNECTED.Descrption);
潘栩锋's avatar
潘栩锋 committed
403

404 405
                foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
                    item.Clear();
潘栩锋's avatar
潘栩锋 committed
406
            }
407 408 409
            else
            {
                warning.Remove(ERRNOs.Instance.BASE_ERRNO_FLYAD7DISCONNECTED.Code);
潘栩锋's avatar
潘栩锋 committed
410

411 412 413
                foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
                    item.OnPoll();
            }
潘栩锋's avatar
潘栩锋 committed
414 415 416
        }
        #endregion

417 418 419 420
        public event PropertyChangedEventHandler PropertyChanged;



421

422 423 424 425 426 427
        public double Ad2Thk(int ad)
        {
            double thk = double.NaN;

            if (Misc.MyBase.ISVALIDATA(ad))
            {
428
                thk = curve.AD2Value(ad, AD2ValueFlag.Revised);
潘栩锋's avatar
潘栩锋 committed
429

430
                thk *= profile.Param.K;
431 432 433
            }
            return thk;
        }
潘栩锋's avatar
潘栩锋 committed
434 435 436



437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
        #region 数据库备份检测
        DispatcherTimer backupDbTimer;
        DateTime StartupTime;
        void BackupDbCheckInit()
        {
            StartupTime = DateTime.Now;

            //定时检查提示
            backupDbTimer = new DispatcherTimer();
            backupDbTimer.Interval = TimeSpan.FromHours(1);
            backupDbTimer.Tick += BackupDbTimer_Tick;
            backupDbTimer.Start();
        }


        private void BackupDbTimer_Tick(object sender, EventArgs e)
        {
            //只有在9:00 到 21:00 才会检查,避免深夜出问题
            if (DateTime.Now.Hour < 9 || DateTime.Now.Hour > 20)
                return;

            if (DateTime.Now - StartupTime > TimeSpan.FromDays(28) && DateTime.Now.Month != StartupTime.Month)
            {
                //已经连续开机1个月,需要重新启动程序
                warning.Add(
                    ERRNOs.Instance.BASE_ERRNO_DB_BACKUP.Code,
                    ERRNOs.Instance.BASE_ERRNO_DB_BACKUP.Descrption);
            }
        }
        #endregion


        #region ITDGageService

        public void StartP1()
        {

        }

        public void StartP2(STARTP2_MODE mode)
        {

        }
        public void StartP2(STARTP2_MODE mode, int targetpos)
        {

        }
潘栩锋's avatar
潘栩锋 committed
484 485 486 487 488


        #endregion
    }
}