using StandardLibrary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MainForm.FaForm
{
public partial class Form_PLCDB : Form
{
#region 变量
///
/// 日志
///
public event AlarmMessageHandler MessageEvent;
// string stationName = "[S1]壳体上料";
// [S2]上盖上料
// [S3]点胶
// [S4]胶线检测
// [S5]ADD板上料
// [S6]上盖组装
// [S7]锁螺丝
// [S8]NG下料
// [S9]OK下料
// 192, 255, 192绿色
#endregion 变量
public Form_PLCDB()
{
InitializeComponent();
}
private void Form_PLCDB_Load(object sender, EventArgs e)
{
try
{
#region 页面样式
cmb_SimpleStationName.SelectedIndex = 0;
// dgv_S0
dgv_S0.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S0.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S0.RectColor = Color.Gainsboro;
dgv_S0.GridColor = Color.Gainsboro;
dgv_S0.BackgroundColor = Color.White;
// dgv_S1
dgv_S1.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S1.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S1.RectColor = Color.Gainsboro;
dgv_S1.GridColor = Color.Gainsboro;
dgv_S1.BackgroundColor = Color.White;
// dgv_S2
dgv_S2.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S2.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S2.RectColor = Color.Gainsboro;
dgv_S2.GridColor = Color.Gainsboro;
dgv_S2.BackgroundColor = Color.White;
// dgv_S3
dgv_S3.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S3.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S3.RectColor = Color.Gainsboro;
dgv_S3.GridColor = Color.Gainsboro;
dgv_S3.BackgroundColor = Color.White;
// dgv_S4
dgv_S4.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S4.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S4.RectColor = Color.Gainsboro;
dgv_S4.GridColor = Color.Gainsboro;
dgv_S4.BackgroundColor = Color.White;
// dgv_S5
dgv_S5.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S5.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S5.RectColor = Color.Gainsboro;
dgv_S5.GridColor = Color.Gainsboro;
dgv_S5.BackgroundColor = Color.White;
// dgv_S6
dgv_S6.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S6.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S6.RectColor = Color.Gainsboro;
dgv_S6.GridColor = Color.Gainsboro;
dgv_S6.BackgroundColor = Color.White;
// dgv_S7
dgv_S7.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S7.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S7.RectColor = Color.Gainsboro;
dgv_S7.GridColor = Color.Gainsboro;
dgv_S7.BackgroundColor = Color.White;
// dgv_S8
dgv_S8.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
dgv_S8.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
dgv_S8.RectColor = Color.Gainsboro;
dgv_S8.GridColor = Color.Gainsboro;
dgv_S8.BackgroundColor = Color.White;
#endregion 页面样式
}
catch (Exception ex)
{
string str = ex.StackTrace;
MessageBox.Show("PLC交互页面初始化出错!异常信息:" + ex.Message);
AddMessage(LogType.Error, "PLC交互页面初始化出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
}
}
#region 单工位操作
///
/// 连接
///
private void Btn_SimpleStationConnect_Click(object sender, EventArgs e)
{
string plcControl = cmb_SimpleStationName.Text.Trim();
switch (plcControl)
{
case "[S1]壳体上料":
GlobalContext._IsCon_Funs1 = true;
break;
case "[S2]上盖上料":
GlobalContext._IsCon_Funs2 = true;
break;
case "[S3]点胶":
GlobalContext._IsCon_Funs3 = true;
break;
case "[S4]胶线检测":
GlobalContext._IsCon_Funs4 = true;
break;
case "[S5]ADD板上料":
GlobalContext._IsCon_Funs5 = true;
break;
case "[S6]上盖组装":
GlobalContext._IsCon_Funs6 = true;
break;
case "[S7]锁螺丝":
GlobalContext._IsCon_Funs7 = true;
break;
case "[S8]NG下料":
GlobalContext._IsCon_Funs8 = true;
break;
case "[S9]OK下料":
GlobalContext._IsCon_Funs9 = true;
break;
case "独立线程-上位机心跳":
GlobalContext._IsCon_plc1Heat = true;
break;
case "独立线程-采集设备状态与报警":
GlobalContext._IsCon_plc1Alarm = true;
break;
default:
break;
}
AddMessage(LogType.Info, $"用户【{currentRole}】启用了工位【{plcControl}】的运行!本次有效!");
}
///
/// 断开连接
///
private void Btn_SimpleStationDisconnect_Click(object sender, EventArgs e)
{
string plcControl = cmb_SimpleStationName.Text.Trim();
switch (plcControl)
{
case "[S1]壳体上料":
GlobalContext._IsCon_Funs1 = false;
break;
case "[S2]上盖上料":
GlobalContext._IsCon_Funs2 = false;
break;
case "[S3]点胶":
GlobalContext._IsCon_Funs3 = false;
break;
case "[S4]胶线检测":
GlobalContext._IsCon_Funs4 = false;
break;
case "[S5]ADD板上料":
GlobalContext._IsCon_Funs5 = false;
break;
case "[S6]上盖组装":
GlobalContext._IsCon_Funs6 = false;
break;
case "[S7]锁螺丝":
GlobalContext._IsCon_Funs7 = false;
break;
case "[S8]NG下料":
GlobalContext._IsCon_Funs8 = false;
break;
case "[S9]OK下料":
GlobalContext._IsCon_Funs9 = false;
break;
case "独立线程-上位机心跳":
GlobalContext._IsCon_plc1Heat = false;
break;
case "独立线程-采集设备状态与报警":
GlobalContext._IsCon_plc1Alarm = false;
break;
default:
break;
}
AddMessage(LogType.Info, $"用户【{currentRole}】屏蔽了工位【{plcControl}】的运行!本次有效!");
}
///
/// 查看实时数据
///
private void Btn_SimpleStationDBView_Click(object sender, EventArgs e)
{
try
{
string stationName = cmb_SimpleStationName.Text.Trim();
Form_PLCDB_ShowInfo plcDB_ShowInfo = Form_PLCDB_ShowInfo.Singleton(stationName,this);
AddMessage(LogType.Info, $"用户【{currentRole}】查看了各工位的实时数据!");
plcDB_ShowInfo.ShowDialog();
}
catch (Exception ex)
{
string str = ex.StackTrace;
MessageBox.Show("PLC交互页面初始化出错!异常信息:" + ex.Message);
AddMessage(LogType.Error, "PLC交互页面初始化出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
}
}
#endregion 单工位操作
#region 整线工位操作
///
/// 连接
///
private void Btn_WholeLineConnect_Click(object sender, EventArgs e)
{
GlobalContext._IsCon_Funs1 = true;
GlobalContext._IsCon_Funs2 = true;
GlobalContext._IsCon_Funs3 = true;
GlobalContext._IsCon_Funs4 = true;
GlobalContext._IsCon_Funs5 = true;
GlobalContext._IsCon_Funs6 = true;
GlobalContext._IsCon_Funs7 = true;
GlobalContext._IsCon_Funs8 = true;
GlobalContext._IsCon_Funs9 = true;
GlobalContext._IsCon_plc1Heat = true;
GlobalContext._IsCon_plc1Alarm = true;
AddMessage(LogType.Info, $"用户【{currentRole}】启用了所有工位的运行!本次有效!");
}
///
/// 断开连接
///
private void Btn_WholeLineDisconnect_Click(object sender, EventArgs e)
{
GlobalContext._IsCon_Funs1 = false;
GlobalContext._IsCon_Funs2 = false;
GlobalContext._IsCon_Funs3 = false;
GlobalContext._IsCon_Funs4 = false;
GlobalContext._IsCon_Funs5 = false;
GlobalContext._IsCon_Funs6 = false;
GlobalContext._IsCon_Funs7 = false;
GlobalContext._IsCon_Funs8 = false;
GlobalContext._IsCon_Funs9 = false;
GlobalContext._IsCon_plc1Heat = false;
GlobalContext._IsCon_plc1Alarm = false;
AddMessage(LogType.Info, $"用户【{currentRole}】屏蔽了所有工位的运行!本次有效!");
}
///
/// 重新连接
///
private void Btn_WholeLineRConnect_Click(object sender, EventArgs e)
{
GlobalContext._IsCon_Funs1 = true;
GlobalContext._IsCon_Funs2 = true;
GlobalContext._IsCon_Funs3 = true;
GlobalContext._IsCon_Funs4 = true;
GlobalContext._IsCon_Funs5 = true;
GlobalContext._IsCon_Funs6 = true;
GlobalContext._IsCon_Funs7 = true;
GlobalContext._IsCon_Funs8 = true;
GlobalContext._IsCon_Funs9 = true;
GlobalContext._IsCon_plc1Heat = true;
GlobalContext._IsCon_plc1Alarm = true;
AddMessage(LogType.Info, $"用户【{currentRole}】重新启用了所有工位的运行!本次有效!");
}
#endregion 整线工位操作
///
/// 更新PLC方法运行状态的UI
///
/// PLC编号
/// 状态
public void UpdatePLCFunMonitor(int no, int status)
{
try
{
if (this.InvokeRequired) // 当前线程不是控件UI线程时为true
{
this.Invoke(new Action(UpdatePLCFunMonitor), no, status);
return;
}
// 255, 192, 192红色
// 192, 255, 192绿色
switch (no)
{
case -1: // plc1Heat 独立线程-上位机心跳
LedB_Heat.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case -2: // plc1Alarm 独立线程-采集设备状态与报警
LedB_Alarm.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 1: // [S0]壳体清洁上料
LedB_S0.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 2: // [S1]顶盖上料
LedB_S1.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 3: // [S2]点胶设备
LedB_S2.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 4: // [S3]OP40 胶线检测设备
LedB_S3.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 5: // [S4]OP50 ADD PCB板上料设备
LedB_S4.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 6: // [S5]OP60 顶盖组装
LedB_S5.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 7: // [S6]OP70 锁螺丝设备
LedB_S6.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 8: // [S7]OP80 3D螺丝高度检测,NG出料设备
LedB_S7.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
case 9: // [S8]OP90 下料设备
LedB_S8.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
break;
default:
break;
}
}
catch (Exception ex)
{
string str = ex.StackTrace;
AddMessage(LogType.Error, "更新PLC交互页_PLC运行状态UI出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
}
}
///
/// 测试“展示事件记录”
///
private void button1_Click(object sender, EventArgs e)
{
UpdateMessage(new PLCDBFormMessage()
{
StationName= "[S1]壳体上料",
SnNumber="SN01",
Message= "[S1]壳体上料-测试信息",
CreateTime=DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S2]上盖上料",
SnNumber = "SN02",
Message = "[S2]上盖上料-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S3]点胶",
SnNumber = "SN03",
Message = "[S3]点胶-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S4]胶线检测",
SnNumber = "SN04",
Message = "[S4]胶线检测-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S5]ADD板上料",
SnNumber = "SN05",
Message = "[S5]ADD板上料-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S6]上盖组装",
SnNumber = "SN06",
Message = "[S6]上盖组装-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S7]锁螺丝",
SnNumber = "SN07",
Message = "[S7]锁螺丝-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S8]NG下料",
SnNumber = "SN08",
Message = "[S8]NG下料-测试信息",
CreateTime = DateTime.Now
});
UpdateMessage(new PLCDBFormMessage()
{
StationName = "[S9]NG下料",
SnNumber = "SN09",
Message = "[S9]NG下料-测试信息",
CreateTime = DateTime.Now
});
}
///
/// 展示事件记录
///
/// 工站
/// 产品数字SN
///
public void UpdateMessage(PLCDBFormMessage plCMessage)
{
try
{
if (this.InvokeRequired) // 当前线程不是控件UI线程时为true
{
this.Invoke(new Action(UpdateMessage), plCMessage);
return;
}
switch (plCMessage.StationName)
{
/// [S1]壳体上料
/// [S2]上盖上料
/// [S3]点胶
/// [S4]胶线检测
/// [S5]ADD板上料
/// [S6]上盖组装
/// [S7]锁螺丝
/// [S8]NG下料
/// [S9]OK下料
/// 上位机心跳
/// 获取设备报警数据与状态信息
case "[S1]壳体上料":
dgv_S0.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S0.Rows.Count >= 100)
dgv_S0.Rows.RemoveAt(dgv_S0.Rows.Count - 1);
break;
case "[S2]上盖上料":
dgv_S1.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S1.Rows.Count >= 100)
dgv_S1.Rows.RemoveAt(dgv_S1.Rows.Count - 1);
break;
case "[S3]点胶":
dgv_S2.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S2.Rows.Count >= 100)
dgv_S2.Rows.RemoveAt(dgv_S2.Rows.Count - 1);
break;
case "[S4]胶线检测":
dgv_S3.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S3.Rows.Count >= 100)
dgv_S3.Rows.RemoveAt(dgv_S3.Rows.Count - 1);
break;
case "[S5]ADD板上料":
dgv_S4.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S4.Rows.Count >= 100)
dgv_S4.Rows.RemoveAt(dgv_S4.Rows.Count - 1);
break;
case "[S6]上盖组装":
dgv_S5.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S5.Rows.Count >= 100)
dgv_S5.Rows.RemoveAt(dgv_S5.Rows.Count - 1);
break;
case "[S7]锁螺丝":
dgv_S6.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S6.Rows.Count >= 100)
dgv_S6.Rows.RemoveAt(dgv_S6.Rows.Count - 1);
break;
case "[S8]NG下料":
dgv_S7.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S7.Rows.Count >= 100)
dgv_S7.Rows.RemoveAt(dgv_S7.Rows.Count - 1);
break;
case "[S9]OK下料":
dgv_S8.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
if (dgv_S8.Rows.Count >= 100)
dgv_S8.Rows.RemoveAt(dgv_S8.Rows.Count - 1);
break;
//case "上位机心跳":
// dgv_S0.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
// if (dgv_S0.Rows.Count >= 100)
// dgv_S0.Rows.RemoveAt(dgv_S0.Rows.Count - 1);
// break;
//case "获取设备报警数据与状态信息":
// dgv_S0.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
// if (dgv_S0.Rows.Count >= 100)
// dgv_S0.Rows.RemoveAt(dgv_S0.Rows.Count - 1);
// break;
default:
break;
}
}
catch (Exception ex)
{
string str = ex.StackTrace;
AddMessage(LogType.Error, "更新PLC交互页_事件记录UI出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
}
}
#region 记录
public void AddMessage(LogType logType, string msg)
{
MessageEvent?.Invoke(logType, msg);
}
///
/// 当前用户的角色
///
public string currentRole = "";
///
/// 改变用户时更新页面
///
/// 用户信息
public void ForUserChangeToUpdate(User user)
{
currentRole = user.ToString();
}
#endregion 记录
}
///
/// PLC交互页-事件记录展示实体
///
public class PLCDBFormMessage
{
///
/// 工位名称
/// [S1]壳体上料
/// [S2]上盖上料
/// [S3]点胶
/// [S4]胶线检测
/// [S5]ADD板上料
/// [S6]上盖组装
/// [S7]锁螺丝
/// [S8]NG下料
/// [S9]OK下料
/// 上位机心跳
/// 获取设备报警数据与状态信息
///
public string StationName{get;set;}
///
/// 产品数字SN
///
public string SnNumber { get; set; }
///
/// 信息
///
public string Message { get; set; }
///
/// 发生时间
///
public DateTime CreateTime { get; set; }
}
}