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#
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;
|
|
}
|
|
}
|
|
}
|