using CompressorXN.Untils; using CompressorXN_Common; using CompressorXN_Communication.MyPlc; using CompressorXN_Log; using CompressorXN_Model; using CompressorXN_Model.Enums; using CompressorXN_Model.ViewModel; using CompressorXN_Model.ViewModel.Response; using CompressorXN_Service; using Custom.Utils.Framework; using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace CompressorXN { public partial class FrmMain : XtraForm { private static readonly MenuRoleService _menuRoleService = new MenuRoleService(); private static List menuRoleList = new List(); private CancellationTokenSource mainCts;//用于控制线程 public FrmMain() { InitializeComponent(); this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;//设置窗体在无边框和最大化时不遮挡任务栏 mainCts = new CancellationTokenSource(); lbl_UserName.Text = CurrentUser.UserName; lbl_RoleName.Text = CurrentUser.RoleName; GlobalVar.omronCipNet = OmronCIPHelper.GetOmronCipNet(GlobalVar.PlcIpAddress, GlobalVar.PlcPort); //加载PLC点位信息 GlobalVar.deviceInfo = LoadPlcAddress.LoadPlcConfigFile(); Task.Run(() => { ShowDateTime(); }); //PLC心跳监测 Task.Run(() => { HeartMonitor(); }, mainCts.Token); //读取PLC各点位值 Task.Run(() => { while (true) { ReadPlc(); Thread.Sleep(60000); } }, mainCts.Token); } private void Main_Load(object sender, EventArgs e) { OpenForm(MainanelControl, FormNameEnum.集中监控); } /// /// PLC心跳监测 /// private void HeartMonitor() { var num = 0; while (!mainCts.IsCancellationRequested) { try { if (num >= 8000) { num = 1; } num++; if (!ExtendMethod.BoolPing(GlobalVar.PlcIpAddress)) { UpdateControlContent(lbl_PlcConnectStatus, "异常", Color.Red); continue; } if (!OmronCIPHelper.IsConnected || GlobalVar.omronCipNet == null) { UpdateControlContent(lbl_PlcConnectStatus, "异常", Color.Red); //PLC重新连接 GlobalVar.omronCipNet = OmronCIPHelper.GetOmronCipNet(GlobalVar.PlcIpAddress, GlobalVar.PlcPort); continue; } //心跳点位地址 var writeResult = OmronCIPHelper.SingleWriteValToPlc("D1814", "float", num); if (writeResult.isOk) { UpdateControlContent(lbl_PlcConnectStatus, "正常", Color.FromArgb(0, 233, 255)); } else { UpdateControlContent(lbl_PlcConnectStatus, "异常", Color.Red); } } catch (Exception ex) { var errMsg = ex == null ? "未知异常" : ex.Message; CommonMethods.AddLog(2, $"HeartMonitor方法出发异常:{errMsg},请联系管理员!"); } Thread.Sleep(2000); } } /// /// 实时读取PLC值 /// private void ReadPlc() { if (mainCts.IsCancellationRequested || !OmronCIPHelper.IsConnected) { return; } if (GlobalVar.deviceInfo != null && GlobalVar.deviceInfo.CommGroupList.Count > 0) { var (isSucess, msg) = OmronCIPHelper.ReadPlcBatch(GlobalVar.deviceInfo.CommGroupList.FirstOrDefault().VariableList); if (!isSucess) { BeginInvoke(new Action(() => { CustomMessageBoxHelper.AlertShow(this, msg); })); } } } /// /// 导航点击事件 /// /// /// private void naviButton_Click(object sender, EventArgs e) { if (sender is Button naviButton) { if (Enum.IsDefined(typeof(FormNameEnum), naviButton.Text)) { var checkResult = CheckUserAuthor(naviButton.Tag?.ToString()); if (!checkResult.isOk) { new FrmDialog(checkResult.msg).ShowDialog(); return; } FormNameEnum formName = (FormNameEnum)Enum.Parse(typeof(FormNameEnum), naviButton.Text, true); OpenForm(MainanelControl, formName); SetNaviButtonSelected(topPanel, naviButton); } } } /// /// 打开窗体 /// /// 容器控件 /// 窗体枚举 private void OpenForm(PanelControl panel, FormNameEnum formName,string agreementName=null) { int total = panel.Controls.Count; int closeCount = 0; bool isFind = false; for (int i = 0; i < total; i++) { Control control = panel.Controls[i - closeCount]; if (control is Form form) { //判断是不是需要打开的窗体 if (form.Text == formName.ToString()) { form.BringToFront(); isFind = true; break; } else if ((FormNameEnum)Enum.Parse(typeof(FormNameEnum), form.Text, true) >= FormNameEnum.临界窗体) { form.Close(); closeCount++; } } } if (!isFind) { Form frm = null; switch (formName) { case FormNameEnum.集中监控: frm = new FrmHome(); break; case FormNameEnum.数据查询: frm = new FrmSearchResult(); break; case FormNameEnum.机型管理: frm = new FrmRecipe(); ((FrmRecipe)frm).sendFormNameEvent += FrmMain_sendFormNameEvent; break; case FormNameEnum.协议配置: frm = new FrmAgreement(agreementName); ((FrmAgreement)frm).sendFormNameEvent += FrmMain_sendFormNameEvent; break; case FormNameEnum.密码修改: frm = new FrmModifyPwd(); break; default: break; } if (frm != null) { frm.TopLevel = false; frm.FormBorderStyle = FormBorderStyle.None; frm.Dock = DockStyle.Fill; frm.Parent = panel; frm.BringToFront(); frm.Show(); } } } private void FrmMain_sendFormNameEvent(EventParaVM eventParaVM) { OpenForm(MainanelControl, eventParaVM.formNameEnum,eventParaVM.AgreementName); switch (eventParaVM.formNameEnum) { case FormNameEnum.集中监控: SetNaviButtonSelected(topPanel, btn_Home); break; case FormNameEnum.协议配置: SetNaviButtonSelected(topPanel, btn_AgreeMent); break; default: break; } } /// /// 设置导航按钮选中 /// /// /// private void SetNaviButtonSelected(PanelControl topPanelControl, Button naviButton) { foreach (var item in topPanelControl.Controls.OfType