You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

410 lines
14 KiB
C#

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<Sys_Menu_Role> menuRoleList = new List<Sys_Menu_Role>();
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.);
}
/// <summary>
/// PLC心跳监测
/// </summary>
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);
}
}
/// <summary>
/// 实时读取PLC值
/// </summary>
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);
}));
}
}
}
/// <summary>
/// 导航点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
}
/// <summary>
/// 打开窗体
/// </summary>
/// <param name="panel">容器控件</param>
/// <param name="formNames">窗体枚举</param>
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;
}
}
/// <summary>
/// 设置导航按钮选中
/// </summary>
/// <param name="topPanelControl"></param>
/// <param name="naviButton"></param>
private void SetNaviButtonSelected(PanelControl topPanelControl, Button naviButton)
{
foreach (var item in topPanelControl.Controls.OfType<Button>())
{
item.FlatAppearance.BorderSize = 0;
}
naviButton.FlatAppearance.BorderSize = 1;
}
/// <summary>
/// 检查用户权限
/// </summary>
/// <param name="btnTag"></param>
/// <returns></returns>
private (bool isOk, string msg) CheckUserAuthor(string btnTag)
{
//为空表示不校验权限
if (string.IsNullOrEmpty(btnTag))
{
return (true, string.Empty);
}
if (string.IsNullOrEmpty(CurrentUser.Id))
{
return (false, "用户未登录!");
}
if (CurrentUser.IsAllAuthor)
{
return (true, string.Empty);
}
else
{
if (menuRoleList == null || menuRoleList.Count <= 0)
{
return (false, "用户权限不足");
}
else
{
var model = menuRoleList.FirstOrDefault(m => m.MenuCode == btnTag);
if (model == null)
{
return (false, "用户权限不足");
}
else
{
return (true, string.Empty);
}
}
}
}
/// <summary>
/// 系统时间
/// </summary>
private void ShowDateTime()
{
while (true)
{
if (mainCts.IsCancellationRequested || lbl_NowDatetime.IsDisposed || !lbl_NowDatetime.IsHandleCreated)
{
continue;
}
this.BeginInvoke(new Action(() =>
{
lbl_NowDatetime.Text = $"{DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()} {GetNowWeek()}";
}));
Thread.Sleep(1000);
}
}
/// <summary>
/// 获取当前星期几
/// </summary>
/// <returns></returns>
private string GetNowWeek()
{
string[] weekdays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string week = weekdays[Convert.ToInt32(DateTime.Now.DayOfWeek)];
return week;
}
/// <summary>
/// 点击退出按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Exist_Click(object sender, EventArgs e)
{
SetNaviButtonSelected(topPanel, btn_ExistSystem);
if (new FrmAckDialog("确认退出系统?").ShowDialog() == DialogResult.OK)
{
mainCts.Cancel();
Environment.Exit(0);
}
}
/// <summary>
/// 异步更新控件内容
/// </summary>
/// <param name="control"></param>
/// <param name="content"></param>
private void UpdateControlContent(Control control, string content, Color? forecolor = null, Color? backColor = null)
{
if (control.InvokeRequired)
{
try
{
this.BeginInvoke(new Action(() =>
{
if (!control.IsHandleCreated || control.IsDisposed || control.Disposing)
{
return;
}
control.Text = content;
if (forecolor.HasValue)
{
control.ForeColor = forecolor.Value;
}
if (backColor.HasValue)
{
control.BackColor = backColor.Value;
}
}));
}
catch (Exception ex)
{
LogHelper.Error(ex, $"异步更新控件内容失败");
}
}
else
{
control.Text = content;
if (forecolor.HasValue)
{
control.ForeColor = forecolor.Value;
}
if (backColor.HasValue)
{
control.BackColor = backColor.Value;
}
}
}
/// <summary>
/// 最小化窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbl_LineName_DoubleClick(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
}
}
}