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