using FLY.OBJComponents.Server;
using FLY.Thick.Base.Common;
using FLY.Thick.Base.Server;
using FLY.Thick.Blowing.Server.Model;
using FlyADBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Threading;
using ERRNOs = FLY.Thick.Base.Common.ERRNOs;
using FlyADIODefine = FLY.Thick.Blowing.Common.FlyADIODefine;
namespace FLY.Thick.Blowing.Server
{
public class TDGage : FLY.Thick.Base.IService.ITDGageService
{
#region 延时推送 MARKNO
const int MARKNO_UPDATEV = 1;
const int MARKNO_INITHISTORY = 2;
const int MARKNO_PUSH_ACCESS = 3;
#endregion
#region 参数--------------------------------------------------------------------
#region 初始化------------------------------------------------------------------
///
/// 参数目录 m_path;数据文件的 根目录默认是 "Gage1", 不能有 @"\"
/// 目前也是对外的服务器目录
///
public string mParamDirectory;
#endregion
#region 数据--------------------------------------------------------------------
///
/// 当前基本简单参数
///
public DynArea DynArea => dynArea;
private DynArea dynArea;
///
/// 运行参数
///
public BlowingFixProfile profile;
///
/// AD曲线
///
public CurveCollection curve;
///
/// 报警系统
///
public WarningSystem2 warning;
#region 运行模式
///
/// AD卡
///
public FlyADBase.FlyAD7 flyAd;
public FlyAdService flyAdService;
///
/// GM管理器
///
GageModeManager gmManager;
///
/// 定点模式
///
public GM_Fix gmFix;
///
/// 吹膜测厚模式.定点
///
public GM_BlowingFix gmRenZiJiaFix;
///
/// 扫描报警系统
///
public ScanWarning scanWarning;
///
/// 设备参数
///
public InitParam initParam;
#endregion
///
/// 系统参数
///
public SysParam sysParam;
#region BULKDATA
///
/// 数据库对象
///
DbModel dbModel;
/////
///// 原始数据 数据库对象
/////
//OrgDbModel orgDbModel;
///
/// 数据库写操作
///
public HistoryDb historyDb;
//OrgHistoryDb orgHistoryDb;
///
/// 本地数据库
///
LocalDb localDb;
///
/// 数据库读操作
///
public BulkDb bulkDb;
#endregion
#endregion
#endregion
public TDGage(string nam)
{
mParamDirectory = nam;// @"D:\" + m_name;
if (!System.IO.Directory.Exists(mParamDirectory))
{
System.IO.Directory.CreateDirectory(mParamDirectory);
}
System.Environment.CurrentDirectory = mParamDirectory;
#region create
sysParam = new SysParam(null);//系统参数
initParam = new InitParam
{
DbDirPath = @"D:\blowingdata"
};
if (!initParam.Load())
initParam.Save();
profile = new BlowingFixProfile();//运行配置参数
curve = new CurveCollection(null);//AD转thick
dbModel = new DbModel();
localDb = new LocalDb();
historyDb = new HistoryDb();
bulkDb = new BulkDb();
dynArea = new DynArea();
warning = new WarningSystem2();
scanWarning = new ScanWarning();
flyAd = new FlyAD7();
flyAdService = new FlyAdService();
gmManager = new GageModeManager();
gmFix = new GM_Fix();
gmRenZiJiaFix = new GM_BlowingFix();
#endregion
}
async Task Init_db()
{
//---------------------------------------------------------------------------------------------------------------
//数据库
await Task.Factory.StartNew(() =>
{
dbModel.Init();
//删除不需要的备份数据 (yyyy-MM 文件夹)
dbModel.KeepBackupSize(12);//时间永远 12个月 initParam.DBKeepMonth
//备份上一个月之前的数据到 yyyy-MM 文件夹
dbModel.BackupBbInSize(12);//时间永远 12个月 initParam.DBKeepMonth
//当前的数据库只保存上个月与这个月的数据
dbModel.KeepDBSize(1);
});
historyDb.Init(dbModel, localDb);
bulkDb.Init(historyDb, localDb, dbModel);
}
public async Task Init()
{
#region 注入初始化
//数据库 配置----------------------------------------
//就只是数据库操作会慢而已!!!!!!
await Init_db();
//数据库备份检查
BackupDbCheckInit();
//GageModeManager 配置----------------------------------------
Misc.BindingOperations.SetBinding(
gmManager, nameof(gmManager.State),
DynArea, nameof(DynArea.ControllerState));
//FlyAd7 配置----------------------------------------
if (!flyAd.Load())
flyAd.Save();
flyAd.Connect();
flyAdService.Init(flyAd, Ad2Thk);
Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.HardwareVersion), () =>
{
FlyADIODefine.SetInstance(new FlyADIODefine());
FlyADIODefine.Instance.SerVersion(flyAd.HardwareVersion);
});
Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.IStatus), DynArea, nameof(DynArea.IStatus));
Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.OStatus), DynArea, nameof(DynArea.OStatus));
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));
flyAdService.Init(flyAd, Ad2Thk);
//WarningSystem 配置----------------------------------------
warning.Init(historyDb.ErrorBuffer);
warning.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(warning.IsRinging))
{
flyAd.SetOutputBit(FlyADIODefine.Instance.OutNo_Alarm, !warning.IsRinging);
}
};
//ScanWarning 配置----------------------------------------
scanWarning.Init(warning, historyDb);
//GM_Fix 配置----------------------------------------
gmFix.Init(flyAd, dynArea, Ad2Thk);
gmFix.IsIgnoreDataWhenIdle = false;
gmManager.AddGM(gmFix);
//GM_RenZiJiaFix 配置----------------------------------------
gmRenZiJiaFix.Init(flyAd, Ad2Thk, dynArea, profile.Param, historyDb, bulkDb);
gmManager.AddGM(gmRenZiJiaFix);
gmRenZiJiaFix.Start();
ErrNoForCheckInit();
#endregion
}
//void mGMRenZiJiaFix_EPCSampled(int ad)
//{
// CurveCollection pCurve = curve;
// dynArea.SampleAD[0] = ad;
// List list = new List();
// if (pCurve.Curves.Count == 0)
// return;
// list.Add(new CurveCollection.ExChange() { OrgAD = pCurve.Curves[0].AD, CurrAD = ad });
// pCurve.ModifyExChange(list);
// pCurve.ReviseCurve();
//}
#region 异常检测
class ErrNoForCheckItem
{
public FLY.OBJComponents.Common.ERRNO errno;
public Func conditional;
///
/// 持续时间,单位s
///
public int cnt;
int timer = -1;
public WarningSystem2 mWarning;
public void Clear()
{
if (timer == 0)
{
mWarning.Remove(errno.Code);
}
timer = -1;
}
public void OnPoll()
{
if (conditional())
{
if (timer < 0)
timer = cnt;
else
{
if (timer > 0)
timer--;
if (timer == 0)
{
mWarning.Add(
errno.Code,
errno.Descrption);
}
}
}
else
{
Clear();
}
}
}
List ErrNoForCheckItems = new List();
void ErrNoForCheckInit()
{
#region 时间触发的报警
ErrNoForCheckItems.Add(//AD值太小
new ErrNoForCheckItem()
{
errno = ERRNOs.Instance.BASE_ERRNO_AD_MIN,
cnt = 20,
conditional = delegate ()
{
return DynArea.AD < (DynArea.ADMax * 0.01);
}
});
ErrNoForCheckItems.Add(//AD值太大
new ErrNoForCheckItem()
{
errno = ERRNOs.Instance.BASE_ERRNO_AD_MAX,
cnt = 20,
conditional = delegate ()
{
return (DynArea.AD > (DynArea.ADMax * 0.98));
}
});
foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
{
item.mWarning = warning;
}
FObjBase.PollModule.Current.Poll_Config(
FObjBase.PollModule.POLL_CONFIG.ADD,
onpoll_checkErrNo, TimeSpan.FromSeconds(1));
#endregion
#region 状态触发的报警
Misc.BindingOperations.SetBinding(DynArea, nameof(DynArea.Hrs), () =>
{
if (DynArea.Hrs < 48 && DynArea.Hrs > 0)//授权限制提醒
{
warning.Add(
ERRNOs.Instance.BASE_ERRNO_LICENSE_TIP.Code,
ERRNOs.Instance.BASE_ERRNO_LICENSE_TIP.Descrption);
}
else
{
warning.Remove(ERRNOs.Instance.BASE_ERRNO_LICENSE_TIP.Code);
}
});
Misc.BindingOperations.SetBinding(DynArea, nameof(DynArea.SecuteLock), () =>
{
if (DynArea.SecuteLock)
{
warning.Add(
ERRNOs.Instance.BASE_ERRNO_LICENSE.Code,
ERRNOs.Instance.BASE_ERRNO_LICENSE.Descrption);
}
else
{
warning.Remove(ERRNOs.Instance.BASE_ERRNO_LICENSE.Code);
}
});
#endregion
}
void onpoll_checkErrNo() //1秒执行一次
{
if (!dynArea.FLYADIsConnect)
{
warning.Add(
ERRNOs.Instance.BASE_ERRNO_FLYAD7DISCONNECTED.Code,
ERRNOs.Instance.BASE_ERRNO_FLYAD7DISCONNECTED.Descrption);
foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
item.Clear();
}
else
{
warning.Remove(ERRNOs.Instance.BASE_ERRNO_FLYAD7DISCONNECTED.Code);
foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
item.OnPoll();
}
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;
public double Ad2Thk(int ad)
{
double thk = double.NaN;
if (Misc.MyBase.ISVALIDATA(ad))
{
thk = curve.AD2Value(ad, AD2ValueFlag.Revised);
thk *= profile.Param.K;
}
return thk;
}
#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)
{
}
#endregion
}
}