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 = "[S0]壳体上料"; // [S1]装胶圈 // [S2]电性能测试 // [S3]导通性测试 // [S4]气密测试 // [S5]激光标记 // [S6]CCD检测 // 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; #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]气密测试": GlobalContext._IsCon_Funs5 = 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]气密测试": GlobalContext._IsCon_Funs5 = 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_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_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_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]导通性测试 LedB_S3.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192); break; case 5: // [S4]气密测试 LedB_S4.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192); break; case 6: // [S5]激光标记 LedB_S5.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192); break; case 7: // [S6]CCD检测 LedB_S6.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= "[S0]壳体上料", SnNumber="SN00", Message= "[S0]壳体上料-测试信息", CreateTime=DateTime.Now }); 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]激光标记", SnNumber = "SN05", Message = "[S5]激光标记-测试信息", CreateTime = DateTime.Now }); UpdateMessage(new PLCDBFormMessage() { StationName = "[S6]CCD检测", SnNumber = "SN06", Message = "[S6]CCD检测-测试信息", 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) { /// [S0]壳体上料 /// [S1]装胶圈 /// [S2]电性能测试 /// [S3]导通性测试 /// [S4]气密测试 /// [S5]激光标记 /// [S6]CCD检测 /// 上位机心跳 /// 获取设备报警数据与状态信息 case "[S0]壳体上料": 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 "[S1]装胶圈": 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 "[S2]电性能测试": 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 "[S3]导通性测试": 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 "[S4]气密测试": 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 "[S5]激光标记": 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 "[S6]CCD检测": 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 "上位机心跳": // 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 { /// /// 工位名称 /// [S0]壳体上料 /// [S1]装胶圈 /// [S2]电性能测试 /// [S3]导通性测试 /// [S4]气密测试 /// [S5]激光标记 /// [S6]CCD检测 /// 上位机心跳 /// 获取设备报警数据与状态信息 /// public string StationName{get;set;} /// /// 产品数字SN /// public string SnNumber { get; set; } /// /// 信息 /// public string Message { get; set; } /// /// 发生时间 /// public DateTime CreateTime { get; set; } } }