Files
ENIG/Cs_HMI/StateMachine/_TMDisplay.cs
2025-01-07 16:08:02 +09:00

354 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using static Project.StateMachine;
namespace Project
{
public partial class fMain
{
private void ColorChangeMotionST(arCtl.arLabel ctl, Color c, Boolean isvalue)
{
if (isvalue)
{
int r = c.R + 100;
int g = c.G + 100;
int b = c.B + 100;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
ctl.BackColor = Color.FromArgb(r, g, b);
ctl.BackColor2 = c;
}
else
{
ctl.BackColor = Color.FromArgb(100, 100, 100);
ctl.BackColor2 = Color.FromArgb(90, 90, 90);
}
}
private void BCDHWStatus(Boolean enable, arCtl.arLabel ctl, bool isReady)
{
if (enable == false)
{
ctl.BackColor2 = Color.Gray;
}
else
{
if (isReady)
{
ctl.BackColor2 = Color.SeaGreen;
}
else
{
if (ctl.BackColor2 == Color.Tomato)
{
ctl.BackColor2 = Color.Gray;
}
else
{
ctl.BackColor2 = Color.Tomato;
}
}
}
}
void BlinkHwstatus(int row, int col, int value1, int value2)
{
var curValue = HWState.getValue(row, col);
HWState.setValue(row, col, (byte)(curValue == value1 ? value2 : value1)); //
}
Boolean displayOn = false;
private void tmDisplay_Tick(object sender, EventArgs e)
{
if (displayOn == false) displayOn = true;
else
{
Pub.log.AddAT("Display Timer Overlab");// Console.WriteLine("display overlab");
return;
}
if (Pub.sm.Step > eSMStep.INIT &&
panTopMenu.Enabled == false) panTopMenu.Enabled = true;
//쓰레드로인해서 메인에서 진행하게한다. SPS는 메인쓰레드에서 진행 됨
//팝을 제거 혹은 표시하는 기능
if (Pub.popup.needShow) Pub.popup.showMessage();
else if (Pub.popup.needClose) Pub.popup.Visible = false; // .setVision(false)();
lbTime.Text = Pub.sm.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss");
//상태 표시
Update_SSStatus();
//H/W 상태표시
Update_HWStatus();
//IO상태(상단줄) 표시
Update_IOStatus();
//display mesasge
UpdateResultMessage();
//메세지창이 깜박거려야하는 상황 체크
if (lbMsg.Tag != null)
{
var bg1 = lbMsg.BackColor;
var bg2 = lbMsg.BackColor2;
lbMsg.BackColor = bg2;
lbMsg.BackColor2 = bg1;
lbMsg.Invalidate();
}
HWState.Invalidate();
SSInfo.Invalidate();
IOState.Invalidate();
#region retgion"1분 time 루틴"
var ts = DateTime.Now - tm1minute;
if (ts.TotalMinutes >= 1)
{
//리셋카운트
_AutoResetCount();
tm1minute = DateTime.Now;
}
#endregion
#region retgion"5분 time 루틴"
ts = DateTime.Now - tm5minute;
if (ts.TotalMinutes >= 5)
{
//남은디스크확인
CheckFreeSpace();
tm5minute = DateTime.Now;
}
#endregion
//wat.Stop();
//Console.WriteLine("disp time : " + wat.ElapsedMilliseconds.ToString() + "ms");
displayOn = false;
}
void Update_IOStatus()
{
int inputrow = 1;
int inputcol = 0;
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_READY) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_OK) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_ERR) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_COMPLETE) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_LOTEND) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
var numver_mz = Pub.plc1.getValue<UInt16>(7902);
var numver_sn = Pub.plc1.getValue<UInt16>(7903);
var bin_mz = Convert.ToString(numver_mz, 2).PadLeft(16,'0');
var bin_sn = Convert.ToString(numver_sn, 2).PadLeft(16, '0');
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
inputrow = 0;
inputcol = 0;
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.MC_START) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.MC_CONFIRM) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.MC_LOTEND) ? 1 : 0));
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0);
//IOState.setTitle(0, inputcol, "DOOR"); IOState.setValue(0, inputcol++, (ushort)(Util_DO.CheckDoorSafty() ? 1 : 2));
//IOState.setTitle(0, inputcol, "SAFTY"); IOState.setValue(0, inputcol++, (ushort)(Pub.flag.get(eFlag.MGZSafty1) && Pub.flag.get(eFlag.MGZSafty2) ? 1 : 2));
//IOState.setTitle(0, inputcol, "FULL"); IOState.setValue(0, inputcol++, (ushort)(Util_DO.GetIOInput(eDIName.UD_FULL) ? 2 : 0));
//IOState.setTitle(0, inputcol, "A/B\nDETECT"); IOState.setValue(0, inputcol++, (ushort)(Util_DO.GetIOInput(eDIName.AB_DETECT) ? 1 : 0));
}
void Update_SSStatus()
{
SSInfo.setTitle(0, 0, Pub.sm.Step.ToString());
SSInfo.setTitle(1, 0, Pub.sm.runStep.ToString());
if (Pub.sm.Step == eSMStep.RUN)
SSInfo.setTitle(1, 1, string.Format("{0:N1} sec", Pub.sm.getRunSteptime.TotalSeconds));
else
SSInfo.setTitle(1, 1, "--");
}
void Update_HWStatus()
{
var rownum = 1;
var colIdx = 0;
//if (Pub.light.IsInit == false) BlinkHwstatus(rownum, colIdx++, 3, 4);
//else HWState.setValue(rownum, colIdx++, (byte)(Pub.light.IsInit ? 2 : 3)); //
if (Pub.plc1.IsValid == false) BlinkHwstatus(rownum, colIdx++, 3, 4);
else HWState.setValue(rownum, colIdx++, (byte)(Pub.plc1.IsValid ? 2 : 3)); //PLC
if (Pub.Xbee.IsInit == false) BlinkHwstatus(rownum, colIdx++, 3, 4);
else HWState.setValue(rownum, colIdx++, (byte)(Pub.Xbee.IsInit ? 2 : 3)); //
//if (Pub.camera.IsInit == false) BlinkHwstatus(rownum, colIdx++, 3, 4);
//else HWState.setValue(rownum, colIdx++, (byte)(Pub.camera.IsInit ? 2 : 3)); //
//if (Pub.bVisionLicense == false) BlinkHwstatus(rownum, colIdx++, 3, 4);
//else HWState.setValue(rownum, colIdx++, (byte)(Pub.bVisionLicense ? 2 : 3)); //
}
/// <summary>
/// 환경설정에따른 카운트를 리셋처리한다. 171128
/// </summary>
void _AutoResetCount()
{
if (Pub.setting.datetime_Check_1 && Pub.setting.datetime_Reset_1 != "") //오전
{
try
{
DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + Pub.setting.datetime_Reset_1 + ":00");
DateTime LastClearTime = Pub.counter.CountReset;
//현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함
if (DateTime.Now > SetTime && LastClearTime < SetTime)
{
Pub.log.AddI("Count Reset #1");
Pub.counter.CountClear();
}
}
catch { }
}
if (Pub.setting.datetime_Check_2 && Pub.setting.datetime_Reset_2 != "") //오후
{
try
{
DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + Pub.setting.datetime_Reset_2 + ":00");
DateTime LastClearTime = Pub.counter.CountReset;
//현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함
if (DateTime.Now > SetTime && LastClearTime < SetTime)
{
Pub.log.AddI("Count Reset #2");
Pub.counter.CountClear();
}
}
catch { }
}
}
DateTime tm1minute = DateTime.Now.AddDays(-1);
DateTime tm5minute = DateTime.Now;
void UpdateProgressStatus(string title, double value, double max)
{
UpdateProgressStatus((float)value, (float)max, title);
}
void UpdateProgressStatus(float value, float max, string title)
{
if (lbMsg.ProgressEnable == false) lbMsg.ProgressEnable = true;
if (lbMsg.ProgressMax != max) lbMsg.ProgressMax = max;
if (lbMsg.ProgressValue != value) lbMsg.ProgressValue = value;
if (lbMsg.ProgressForeColor != Color.FromArgb(40, 40, 40))
lbMsg.ProgressForeColor = Color.FromArgb(40, 40, 40);
if (lbMsg.Text != title) lbMsg.Text = title;
}
void UpdateStatusMessage(string dispmsg, Color fcolor, Color shadow)
{
UpdateStatusMessage(dispmsg, Color.DimGray, Color.Gray, fcolor, shadow);
}
void UpdateStatusMessage(string dispmsg, Color bColor, Color bColor2, Color fcolor, Color shadow, Boolean blank = false)
{
//if (lbMsg.ProgressEnable == true) lbMsg.ProgressEnable = false;
if (dispmsg != lbMsg.Text || lbMsg.ForeColor != fcolor || lbMsg.ShadowColor != shadow || (lbMsg.BackColor != bColor && lbMsg.BackColor2 != bColor))
{
lbMsg.BackColor = bColor;
lbMsg.BackColor2 = bColor2;
lbMsg.ForeColor = fcolor;
lbMsg.ShadowColor = shadow;
lbMsg.Text = dispmsg;
if (blank) lbMsg.Tag = "BLANK";
else lbMsg.Tag = null;
}
}
void UpdateResultMessage()
{
//모션을 사용한다면 홈 검색여부를 확인한다.
//var inspresult = "";
//if (Pub.Result == null || Pub.Result.Result == CResult.eInspectResult.NOTSET)
// inspresult = "--";
//else if (Pub.Result.Result == CResult.eInspectResult.OK)
// inspresult = "MATCH";
//else if (Pub.Result.Result == CResult.eInspectResult.NG)
// inspresult = "MISMATCH";
//최우선 점검 사항 표시
if (Pub.sm.Step > eSMStep.INIT)
{
if (Pub.flag.get(eFlag.DemoRun))
{
UpdateStatusMessage("DEMO RUN", Color.Gold, Color.Yellow, Color.Black, Color.WhiteSmoke, true);
}
else if (Pub.flag.get(eFlag.START) == true)
{
UpdateStatusMessage("매거진투입구 안전센서 감지", Color.Tomato, Color.Black);
}
else if (Pub.Result.Model.Title == "")
{
UpdateStatusMessage("비젼모델 선택이 필요함", Color.Tomato, Color.Black);
}
if (Pub.sm.Step == eSMStep.IDLE)
{
UpdateStatusMessage("준비완료", Color.Lime, Color.Black);
}
else if (Pub.sm.Step == eSMStep.ERROR)
{
UpdateStatusMessage("오류 발생", Color.Red, Color.Black);
}
else if (Pub.sm.Step == eSMStep.PAUSE)
{
UpdateStatusMessage("정지 됨", Color.Tomato, Color.Black);
}
else if (Pub.sm.Step == eSMStep.FINISH)
UpdateStatusMessage("작업 완료", Color.Lime, Color.Black);
else if (Pub.sm.bPause == true)
{
UpdateStatusMessage("[START]를 누르면 시작 됩니다", Color.Yellow, Color.Black);
}
else if (Pub.flag.get(eFlag.TestRun))
{
UpdateStatusMessage("TEST RUN", Color.DeepSkyBlue, Color.LightSkyBlue, Color.Blue, Color.WhiteSmoke, true);
}
else
{
string msg = "진행중";
UpdateStatusMessage(msg, Color.Lime, Color.Black);
}
}
}
}
}