using BarTenderPrint;
using GeBoShi.ImageDefect;
using HZH_Controls.Forms;
using MaiMuControl.Device;
using MaiMuControl.Device.IOCardDev;
using MaiMuControl.Device.IOCardDev.Advantech;
using MaiMuControl.Device.LightDev;
using MaiMuControl.Device.LightDev.CST;
using MaiMuControl.Device.LightDev.Rsee;
using MaiMuControl.SysStatusMgr.CloudMgr;
using MaiMuControl.SysStatusMgr.StatusMgr;
using MaiMuControl.SysStatusMgr.UserMgr;
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using ToolKits.Disk;
namespace GeBoShi.SysCtrl
{
///
/// 主系统控制
///
public class SysMgr
{
#region singleton实例化
private static SysMgr _instance;
private static readonly object _lock = new object();
public static SysMgr Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new SysMgr();
}
}
}
return _instance;
}
}
#endregion
#region 私有
//系统状态
private StatusMgr statusMgr;
public StatusMgr StatusMgr { get { return statusMgr; } }
//用户管理
private UserMgr userMgr;
public UserMgr UserMgr { get { return userMgr; } }
//系统配置管理
private ConfMgr confMgr;
//图像处理
private DefectLib defectLib;
public DefectLib DefectLib { get { return defectLib; } }
#endregion
#region 公开字段
private bool _isInit;
///
/// 是否初始化完成
///
public bool IsInit { get { return _isInit; } }
private bool _isRuning;
///
/// 设备正在运行
///
public bool IsRuning { get { return _isRuning; } }
private bool _isAuto;
///
/// 设备正在自动化流程中
///
public bool IsAuto { get { return _isAuto; } }
#endregion
#region 私有流程
//主流程
private Thread _mainThread;
private CancellationTokenSource _cts;
#endregion
#region 云端
//局域网云端
private bool init_Cloud;
private CloudMgr cloudMgr;
private int DailyOutput;
#endregion
private SysMgr()
{
_isInit = false;
_isRuning = false;
_isAuto = false;
statusMgr = StatusMgr.Instance;
confMgr = ConfMgr.Instance;
userMgr = new UserMgr(statusMgr.MySqlIP);
_cts = new CancellationTokenSource();
init_Cloud = false;
cloudMgr = new CloudMgr();
DailyOutput = 0;
}
#region 本地云上传
///
/// 上传当日产量
///
private void SendDailyOutput()
{
//开启云端
if (init_Cloud)
{
try
{
if (!cloudMgr.SendTopic("device/attributes", $"{{ \"DailyOutput\": \"{DailyOutput}\"}}"))
Log("云端", $"上传失败", WarningEnum.Low);
}
catch (Exception e)
{
Log("云端", $"上传失败:{e.Message}", WarningEnum.Low);
}
}
}
///
/// 上传正常状态
///
public void SendStatus()
{
//开启云端
if (init_Cloud)
{
//上传报警状态和信息
string statusStr = "正常";
switch (StatusMgr.Status)
{
case SystemStsEnum.Manual:
statusStr = "人工操作";
break;
case SystemStsEnum.Standby:
statusStr = "正常待机";
break;
case SystemStsEnum.Initial:
statusStr = "初始化";
break;
case SystemStsEnum.Auto:
statusStr = "自动运行";
break;
case SystemStsEnum.Pause:
statusStr = "自动暂停";
break;
case SystemStsEnum.SetParams:
statusStr = "参数设置";
break;
case SystemStsEnum.Debug:
statusStr = "调试";
break;
case SystemStsEnum.Warning:
statusStr = "系统报警";
break;
case SystemStsEnum.Bootload:
statusStr = "Bootload";
break;
default:
statusStr = "未知";
break;
}
try
{
if (!cloudMgr.SendTopic("device/attributes", $"{{\"status\": \"{statusStr}\", \"alm\": \"无报警信息\", " +
$"\"name\": \"{confMgr.SysConfigParams.CloudThisName}\", \"DailyOutput\": \"{DailyOutput}\"}}"))
Log("云端", $"上传失败", WarningEnum.Low);
}
catch (Exception e)
{
Log("云端", $"上传失败:{e.Message}", WarningEnum.Low);
}
}
}
#endregion
#region 用户+登入+管理
///
/// 登入
///
///
public bool LoginSystem()
{
return userMgr.UserLoginDialog();
}
///
/// 用户权限
///
public void UserPermissiomMgr()
{
userMgr.RightManageDialog();
}
///
/// 用户管理
///
public void UserListMgr()
{
userMgr.UserManagerDialog();
}
#endregion
#region 系统初始化&&运行
///
/// 系统初始化
///
///
public bool Initial()
{
try
{
bool ret = false;
string err = "";
InitLog("系统开始初始化...");
//Thread.Sleep(200);
// 加载系统配置
InitLog("加载系统参数...");
ret = confMgr.LoadSystemConfig();
if (!ret)
{
throw new Exception("系统参数加载失败...");
}
InitLog("系统参数加载完成!");
//根据llog路径,开始记录日志
statusMgr.StartLog(confMgr.SysConfigParams.LogPath);
statusMgr.GotoInitial();
SendStatus();
//Thread.Sleep(200);
// 硬件初始化
if (!InitAllDev())
{
throw new Exception("硬件初始化失败...");
}
InitLog("硬件初始化完成!");
// 加载硬件配置
InitLog("加载硬件驱动参数...");
if (!LoadDevConfig())
{
throw new Exception("加载硬件驱动参数失败...");
}
InitLog("加载硬件驱动参数完成!");
//Thread.Sleep(200);
// 处理运行
InitLog("AI算法核心初始化...");
if (!defectLib.start())
throw new Exception("外观检测核心初始化失败...");
InitLog("AI算法核心初始化完成!");
LedReady();
//初始化成功
_isInit = true;
statusMgr.GotoNormalStandby();
SendStatus();
OnInitRuning(new InitEventArgs("系统初始化完成...", this.IsInit));
Run();
return ret;
}
catch (Exception ex)
{
InitLog(ex.Message, "初始化", WarningEnum.High);
InitLog("系统初始化失败!", "初始化", WarningEnum.High);
//statusMgr.GotoWarning(MaiMuControl.Device.WarningEnum.High, "初始化", ex.Message);
return false;
}
}
///
/// 初始化图像处理报警
///
///
public bool InitDefectEvent()
{
defectLib.WarningEvent = (warning, msg) =>
{
Log("缺陷检测", msg, warning);
};
return true;
}
public bool InitCloudConnect()
{
if (confMgr.SysConfigParams.OpenCloud)
{
if (cloudMgr.ConnectCloud(confMgr.SysConfigParams.CloudServerIP, confMgr.SysConfigParams.CloudServerPort,
confMgr.SysConfigParams.CloudUser, confMgr.SysConfigParams.CloudPassword))
{
init_Cloud = true;
Log("云端数据", "开启云端连接");
return true;
}
Log("云端数据", "云端连接失败!", WarningEnum.Low);
return false;
}
return true;
}
///
/// 运行主线程
///
private void Run()
{
_mainThread = new Thread(() =>
{
MainThreadFunction();
});
_mainThread.IsBackground = true;
_mainThread.Start();
}
#endregion
#region 后台
///
/// 中断工序运行
///
///
private bool isBreakProcessRun()
{
return statusMgr.Status == SystemStsEnum.Pause || statusMgr.Warning == WarningEnum.High;
}
///
/// 后台运行主线程
///
private void MainThreadFunction()
{
while (true)
{
try
{
if (_cts.IsCancellationRequested)
break;
if (IsRuning)
{
////暂停开始
//stopWatch.Start();
//do
//{
// CurrProcessIndex = nextProcess(CurrProductModel, CurrProcessIndex);
//} while (CurrProcessIndex >= 0 && !isBreakProcessRun());
////暂停中断
//stopWatch.Stop();
_isRuning = false;
}
Thread.Sleep(10);
}
catch (Exception e)
{
_isRuning = false;
Log("运行报警", "流程运行出错:" + e.Message + "\n", WarningEnum.High);
}
}
}
#endregion
#region IO解析
private int GetIOPortIndex(int DIDOEnum)
{
return DIDOEnum / 8;
}
private int GetIOBitIndex(int DIDOEnum)
{
return DIDOEnum % 8;
}
#endregion
#region 三色灯
///
/// 三色灯初始化
///
public void LedReady()
{
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false);
}
///
/// 运行状态三色灯
///
public void LedRun()
{
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), true);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), true);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false);
}
///
/// 暂停状态三色灯
///
public void LedPause()
{
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), true);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), true);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false);
}
//控制黄灯闪烁
private bool Blink;
private int BlinkCnt = 0;
//控制蜂鸣间隔
private int BuzzCnt = 0;
///
/// 回原状态三色灯
///
///
public void LedRset(bool val)
{
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), false);
//ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), val);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), val);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), false);
ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false);
Blink = val;
BlinkCnt = 0;
}
#endregion
#region 系统关闭
///
/// 关闭
///
public void Close()
{
_isInit = false;
_isRuning = false;
if (null != _cts)
{
_cts.Cancel();
}
if (null != _mainThread)
{
_mainThread.Join(1000);
}
//关闭相机
//关闭光源
for (int i = 0; i < LightChCount; i++)
{
lightDev.CloseLight(i + 1);
}
lightDev.CloseDev();
//关闭io
ioCardDev.ResetAllDO();
ioCardDev.CloseBoard();
}
#endregion
#region 日志报警
///
/// 初始化记录报警和显示
///
/// 标头
/// 内容
/// 报警状态
private void InitLog(string msg, string tag = "初始化", WarningEnum warning = WarningEnum.Normal)
{
OnInitRuning(new InitEventArgs(msg));
statusMgr.GotoWarning(warning, tag, msg);
}
///
/// 记录报警和显示
///
/// 标头
/// 内容
/// 报警状态
private void Log(string tag, string msg, WarningEnum warning = WarningEnum.Normal)
{
OnMainRuning(new MainEventArgs(tag, msg, warning));
statusMgr.GotoWarning(warning, tag, msg);
//开启云端
if ((init_Cloud) && (warning != WarningEnum.Normal))
{
//上传报警状态和信息
string statusStr = warning == WarningEnum.Normal ? "正常" : warning == WarningEnum.Low ? "警告" : "系统报警";
cloudMgr.SendTopic("device/attributes", $"{{\"status\": \"{statusStr}\", \"alm\": \"{tag}-{msg}\", " +
$"\"name\": \"{confMgr.SysConfigParams.CloudThisName}\", \"DailyOutput\": \"{DailyOutput}\"}}");
}
}
#endregion
#region 硬件
#region 硬件型号配置
public LightDevNameEnum SysUseLight = LightDevNameEnum.CST;
#endregion
#region 硬件字段
private IOCardDev ioCardDev;
///
/// io控制卡
///
public IOCardDev IOCardDev { get { return ioCardDev; } }
private LightDev lightDev;
///
/// 光源控制
///
public LightDev LightDev { get { return lightDev; } }
public string LightName { get { return "Light"; } }
public int LightChCount = 6;//美尚4通道,其他6通道
private PrintControl printControl;
///
/// 打印机模块
///
public PrintControl PrintControl { get { return printControl; } }
#endregion
#region 初始化和基本电机IO操作
private void InitDev()
{
ioCardDev = new AdvantechIO();
if (SysUseLight == LightDevNameEnum.CST)
lightDev = new CSTLight(LightName, LightChCount);
else
lightDev = new RseeLight(SysUseLight, LightName);
}
///
/// 初始化硬件
///
///
private bool InitAllDev()
{
bool ret = false;
InitDev();
//打印机模块初始化
InitLog("打印机模块初始化...");
try
{
printControl = new PrintControl();
InitLog("初始化打印机模块成功!");
}
catch (Exception ex)
{
printControl = null;
InitLog($"初始化打印机模块失败! {ex.Message}");
}
if (confMgr.SysConfigParams.IsPLC)
{
//PLC初始化
InitLog("PLC连接初始化...");
InitLog("PLC连接成功!");
}
else
{
//IO初始化
InitLog("IO板卡初始化...");
if (ioCardDev.InitBoard(MaiMuControl.Device.IOBordType.Advantech) < 0)
{
InitLog("IO板卡初始化失败!", "初始化", WarningEnum.High);
return ret;
}
if (ioCardDev.OpenBoard(confMgr.SysConfigParams.IODevName, confMgr.SysConfigParams.IOCfgPath) < 0)
{
InitLog("打开IO板卡失败!", "初始化", WarningEnum.High);
return ret;
}
if (ioCardDev.ResetAllDO() < 0)
{
InitLog("IO Reset失败!", "初始化", WarningEnum.High);
return ret;
}
InitLog("初始化IO板卡成功!");
}
//光源初始化
InitLog("光源控制器初始化...");
int com_num = int.Parse(confMgr.SysConfigParams.LightCom.Remove(0, 3));
if (lightDev.InitDev(com_num, confMgr.SysConfigParams.LightComBaud) < 0)
{
InitLog("光源控制器初始化失败!", "初始化", WarningEnum.High);
return ret;
}
InitLog("初始化光源控制器成功!");
//关闭光源
for (int i = 0; i < LightChCount; i++)
{
lightDev.CloseLight(i + 1);
}
ret = true;
return ret;
}
///
/// 读取硬件配置
///
private bool LoadDevConfig()
{
LightParams lightParams = new LightParams(LightName, LightChCount);
//LightChCount = 6;
//lightParams.DevName = LightName;
lightParams.ComName = confMgr.SysConfigParams.LightCom;
lightParams.Buad = confMgr.SysConfigParams.LightComBaud;
//lightParams.ChCount = LightChCount;
lightDev.WriteCfgInfo(confMgr.DevConfigPath, lightParams);
return true;
}
#endregion
#endregion
#region 硬盘检测
public static bool CheckDisk(IWin32Window owner, int max = 10)
{
string path = ConfMgr.Instance.SysConfigParams.DefectSrcImag.SavePath;
string volume = path.Substring(0, path.IndexOf(':'));
long freespace = DiskAPI.GetHardDiskSpace(volume);
if (freespace < max)
{
string tip = $"当前{volume}硬盘容量:{freespace}GB,小于{max}GB。注意清理!!";
FrmDialog.ShowDialog(owner, tip, "警告", true);
return false;
}
return true;
}
#endregion
#region 初始化事件
///
/// 初始化回调
///
///
///
public delegate void InitEventHandler(Object sender, InitEventArgs e);
public event InitEventHandler InitRuning;
protected virtual void OnInitRuning(InitEventArgs e)
{
if (null != InitRuning)
{
InitRuning(this, e);
}
}
#endregion
#region 主窗体显示事件
///
/// 主窗体回调
///
///
///
public delegate void MainEventHandler(Object sender, MainEventArgs e);
public event MainEventHandler MainRuning;
protected virtual void OnMainRuning(MainEventArgs e)
{
if (null != MainRuning)
{
MainRuning(this, e);
}
}
#endregion
}
#region 系统事件
///
/// 显图事件
///
public class ImgEventArgs : EventArgs
{
//private Bitmap[] _bmps;
//public Bitmap[] Bitmaps { get { return _bmps; } }
//private Mat[] _bmps_cut;
//public Mat[] Bmps_cut { get { return _bmps_cut; } }
//private double _x;
//public double X { get { return _x; } }
//private double _y;
//public double Y { get { return _y; } }
//private List[]>> _info;
//public List[]>> Info
//{
// get { return _info; }
//}
//public ImgEventArgs(Bitmap[] bmps, Mat[] bmps_cut, double Xmm, double Ymm, List[]>> info)
//{
// this._bmps = new Bitmap[bmps.Length];
// for (int i = 0; i < bmps.Length; i++)
// {
// this._bmps[i] = (Bitmap)bmps[i].Clone();
// }
// this._bmps_cut = new Mat[bmps_cut.Length];
// for (int i = 0; i < bmps_cut.Length; i++)
// {
// this._bmps_cut[i] = bmps_cut[i].Clone();
// }
// this._x = Xmm;
// this._y = Ymm;
// this._info = info;
//}
}
///
/// 主窗体事件
///
public class MainEventArgs : EventArgs
{
private string _tag;
public string Tag { get { return _tag; } }
private string _message;
public string Message { get { return _message; } }
private int _showIndex;
public int ShowIndex { get { return _showIndex; } }
private WarningEnum _warning;
public WarningEnum Warning { get { return _warning; } }
public MainEventArgs(int index)
{
this._showIndex = index;
}
public MainEventArgs(int index, string message)
{
this._message = message;
this._showIndex = index;
}
public MainEventArgs(string tag, string message, WarningEnum warning = WarningEnum.Normal)
{
this._tag = tag;
this._message = message;
this._showIndex = 0;
this._warning = warning;
}
}
///
/// 初始化事件
///
public class InitEventArgs : EventArgs
{
private string _message;
public string Message { get { return _message; } }
private bool _isInitialized;
public bool IsInitialized { get { return _isInitialized; } }
public InitEventArgs()
{
}
public InitEventArgs(string message, bool isInitialized = false)
{
this._message = message;
this._isInitialized = isInitialized;
}
}
#endregion
}