298 lines
13 KiB
C#
298 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using arDev;
|
|
using COMM;
|
|
|
|
namespace Project
|
|
{
|
|
public partial class fMain
|
|
{
|
|
|
|
private void PLC_DioChanged(object sender, arDev.FakePLC.IOValueEventArgs e)
|
|
{
|
|
if (e.Direction == arDev.Arduino.IODirection.Input)
|
|
{
|
|
var diName = (arDev.FakePLC.DIName)e.ArrIDX;
|
|
Console.WriteLine(string.Format("[DI:{1}]{0}=>{2}", diName, e.ArrIDX, e.NewValue));
|
|
|
|
if (diName == arDev.FakePLC.DIName.PINI_BTN_1) //reset
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림(AGV_RESET)");
|
|
PUB.AGV.AGVErrorReset();
|
|
|
|
//241203
|
|
if(PUB.AGV.system1.agv_run || PUB.AGV.system1.agv_run_manual)
|
|
{
|
|
PUB.AGV.AGVMoveStop("button1");
|
|
}
|
|
//PUB.XBE.NewMsgEvent('0', '1');
|
|
}
|
|
}
|
|
else if (diName == arDev.FakePLC.DIName.PINI_BTN_2) //auto -> QC //230424
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true)
|
|
{
|
|
if (PUB.sm.RunStep == StateMachine.ERunStep.GOUP)
|
|
{
|
|
//zup을 자동으로 해준다
|
|
if (VAR.BOOL[eVarBool.WAIT_COVER_UP])
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
PUB.PLC.ZMot(FakePLC.ZMotDirection.Up);
|
|
PUB.Result.NextPos = ePosition.QC;
|
|
}
|
|
else PUB.Speak(Lang.커버업대기상태가아닙니다);
|
|
}
|
|
else if (PUB.sm.RunStep == StateMachine.ERunStep.GODOWN)
|
|
{
|
|
//이미 하차진행중에 누른 경우이다
|
|
PUB.Result.NextPos = ePosition.QC;
|
|
PUB.Result.TargetPos = ePosition.QC;
|
|
}
|
|
else
|
|
{
|
|
PUB.log.Add(Lang.QC이동버튼은상하차에서만사용가능합니다);
|
|
PUB.Speak(Lang.하차상태에서만사용가능합니다);
|
|
}
|
|
}
|
|
else PUB.Speak(Lang.자동운전상태가아닙니다);
|
|
|
|
//if (VAR.BOOL[eVarBool.FLAG_AUTORUN]==false)
|
|
//{
|
|
// PUB.sm.ClearRunStep();
|
|
// PUB.sm.SetNewRunStep(StateMachine.ERunStep.READY);
|
|
// PUB.sm.SetNewStep(StateMachine.eSMStep.RUN);
|
|
// PUB.Speak("자동 상태로 전환 합니다");
|
|
//}
|
|
//else
|
|
//{
|
|
// PUB.Speak("현재 자동 상태 입니다");
|
|
//}
|
|
}
|
|
}
|
|
else if (diName == arDev.FakePLC.DIName.PINI_BTN_3) //z-down -> QA //230424
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
//Z-dn기능으로 업데이트 230119
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true)
|
|
{
|
|
if (PUB.sm.RunStep == StateMachine.ERunStep.GOUP)
|
|
{
|
|
//zup.을 자동으로 해준다
|
|
if (VAR.BOOL[eVarBool.WAIT_COVER_UP])
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
PUB.PLC.ZMot(FakePLC.ZMotDirection.Up);
|
|
PUB.Result.NextPos = ePosition.QA;
|
|
}
|
|
else PUB.Speak(Lang.커버업대기상태가아닙니다);
|
|
}
|
|
else if (PUB.sm.RunStep == StateMachine.ERunStep.GODOWN)
|
|
{
|
|
//이미 하차진행중에 누른 경우이다
|
|
PUB.Result.NextPos = ePosition.QA;
|
|
PUB.Result.TargetPos = ePosition.QA;
|
|
}
|
|
else
|
|
{
|
|
PUB.log.Add($"QA이동 버튼은 상/하차에서만 사용 가능합니다");
|
|
PUB.Speak(Lang.하차상태에서만사용가능합니다);
|
|
}
|
|
}
|
|
else PUB.Speak(Lang.자동운전상태가아닙니다);
|
|
|
|
//PUB.PLC.ZMot(FakePLC.ZMotDirection.Down);
|
|
}
|
|
}
|
|
else if (diName == arDev.FakePLC.DIName.PINI_BTN_4) //z-up
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
//Z-up기능으로 업데이트 230119
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
PUB.PLC.ZMot(FakePLC.ZMotDirection.Up);
|
|
}
|
|
}
|
|
else if (diName == arDev.FakePLC.DIName.PINI_EMG)
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
PUB.Speak(Lang.비상정지);
|
|
}
|
|
//else Pub.Speak("비상 정지 해제");
|
|
}
|
|
else if (diName == arDev.FakePLC.DIName.PINI_OVERLOADL)
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
PUB.Speak(Lang.오버로드감지);
|
|
}
|
|
VAR.BOOL[eVarBool.OVERLOADL] = e.NewValue;
|
|
}
|
|
else if (diName == arDev.FakePLC.DIName.PINI_OVERLOADR)
|
|
{
|
|
if (e.NewValue == true)
|
|
{
|
|
PUB.log.Add($"버튼({diName}) 눌림");
|
|
PUB.Speak(Lang.오버로드감지);
|
|
}
|
|
VAR.BOOL[eVarBool.OVERLOADR] = e.NewValue;
|
|
}
|
|
//else if (diName == FakePLC.DIName.PINI_LIMIT_LU)
|
|
//{
|
|
// PUB.flag.set(EFlag.FLAG_LIMITHIGHL, e.NewValue);
|
|
//}
|
|
//else if (diName == FakePLC.DIName.PINI_LIMIT_RU)
|
|
//{
|
|
// PUB.flag.set(EFlag.FLAG_LIMITHIGHR, e.NewValue);
|
|
//}
|
|
//else if (diName == FakePLC.DIName.PINI_LIMIT_LD)
|
|
//{
|
|
// PUB.flag.set(EFlag.FLAG_LIMITLOWL, e.NewValue);
|
|
//}
|
|
//else if (diName == FakePLC.DIName.PINI_LIMIT_RD)
|
|
//{
|
|
// PUB.flag.set(EFlag.FLAG_LIMITLOWR, e.NewValue);
|
|
//}
|
|
//else
|
|
//{
|
|
// //처리하지 않음
|
|
//}
|
|
//PUB.flag.set(EFlag.FLAG_LIMITHIGH, (PUB.flag.get(EFlag.FLAG_LIMITHIGHL) && PUB.flag.get(EFlag.FLAG_LIMITHIGHR)));
|
|
//PUB.flag.set(EFlag.FLAG_LIMITLOW, (PUB.flag.get(EFlag.FLAG_LIMITLOWL) && PUB.flag.get(EFlag.FLAG_LIMITLOWR)));
|
|
VAR.BOOL[eVarBool.FLAG_LIMITHIGH] = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) || PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU);
|
|
VAR.BOOL[eVarBool.FLAG_LIMITLOW] = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LD) || PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RD);
|
|
VAR.BOOL[eVarBool.OVERLOAD] = (VAR.BOOL[eVarBool.OVERLOADL] || VAR.BOOL[eVarBool.OVERLOADR]);
|
|
}
|
|
else
|
|
{
|
|
//출력포트값 변경
|
|
var doName = (arDev.FakePLC.DOName)e.ArrIDX;
|
|
PUB.logplc.Add($"출력({doName}) {(e.NewValue ? "O" : "X")}");
|
|
}
|
|
}
|
|
|
|
//string oldflagmessage = string.Empty;
|
|
string lastplclogmessage = "";
|
|
DateTime lastplclogtime = DateTime.Now;
|
|
string logmessage = "";
|
|
bool logerror = false;
|
|
void PLC_Message(object sender, FakePLC.MessageEventArgs e)
|
|
{
|
|
if (e.MsgType == arRS232.MessageType.Error)
|
|
{
|
|
PUB.logplc.Add("ERROR-MAIN", e.Message);
|
|
}
|
|
else if (e.MsgType == arRS232.MessageType.Normal)
|
|
{
|
|
//내부클래스에서 발생한 메세지(이 프로그램)
|
|
if (e.Message.StartsWith("@STP:") && e.Message.Length > 5)
|
|
{
|
|
PUB.Result.StopMessageSWR = e.Message.Substring(5);
|
|
PUB.Result.StopMessageTimeSWR = DateTime.Now;
|
|
}
|
|
PUB.logplc.Add("MOT", "[Inner Msg]" + e.Message);
|
|
}
|
|
else
|
|
{
|
|
//PLC에서 수신된 메세지
|
|
if (e.Message.StartsWith("@STP|") && e.Message.Length > 5)
|
|
{
|
|
PUB.Result.StopMessagePLC = e.Message.Substring(5);
|
|
PUB.Result.StopMessageTimePLC = DateTime.Now;
|
|
PUB.logplc.Add("PLC", "[" + e.MsgType.ToString() + "]" + e.Message);
|
|
}
|
|
else if (e.Message.StartsWith("@FLAG|") && e.Message.Length > 6)
|
|
{
|
|
var flagData = e.Message.Split('|')[1].Split(',');
|
|
var flag = (COMM.eVarBool)(byte.Parse(flagData[0]));
|
|
|
|
var flagmsg = "[" + flag.ToString() + "] = " + flagData[1];
|
|
|
|
|
|
//플래그값이 바뀌면 로깅한다
|
|
var fValueTrue = flagData[1] == "1";
|
|
if (PUB.PLC.GetFlag(flag) != fValueTrue)
|
|
{
|
|
PUB.logplc.Add("MFLAG", flagmsg);
|
|
}
|
|
}
|
|
else if (e.Message.StartsWith("@SET|") && e.Message.Length > 5)
|
|
{
|
|
//셋팅관련 정보이다
|
|
var flagData = e.Message.Split('|')[1];
|
|
var splBuf = flagData.Split(':');
|
|
if (splBuf[0] == "SAVE") PUB.PLC.SaveTime = DateTime.Now;
|
|
PUB.logplc.Add("SETUP", "[SETTING] " + flagData);
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
if (e.Message.StartsWith("ERR"))
|
|
{
|
|
logmessage = e.Message;
|
|
logerror = true;
|
|
}
|
|
else if (e.Message.StartsWith("@@") & e.Data.Length == 16)
|
|
{
|
|
//표시하지 말자
|
|
logerror = false;
|
|
var hexstr = e.Data.GetHexString();
|
|
logmessage = "[" + e.MsgType.ToString() + "]" + hexstr;
|
|
}
|
|
else
|
|
{
|
|
logmessage = "[" + e.MsgType.ToString() + "]" + e.Message;
|
|
logerror = false;
|
|
}
|
|
|
|
bool addlog = false;
|
|
if (lastplclogmessage.StartsWith("[Recv] 40 40"))
|
|
{
|
|
if (lastplclogmessage.Length > 40)
|
|
{
|
|
var st = lastplclogmessage.Substring(0, 40);
|
|
var cr = logmessage.Substring(0, 40);
|
|
addlog = st.Equals(cr) == false;
|
|
if (addlog == false)
|
|
{
|
|
var ts = DateTime.Now - lastplclogtime;
|
|
if (ts.TotalSeconds > 5) addlog = true;
|
|
}
|
|
}
|
|
else addlog = true;
|
|
}
|
|
else if (logmessage.Equals(lastplclogmessage) == false) addlog = true;
|
|
else
|
|
{
|
|
var ts = DateTime.Now - lastplclogtime;
|
|
if (ts.TotalSeconds > 30) addlog = true;
|
|
}
|
|
if (addlog)
|
|
{
|
|
if (logerror) PUB.logplc.AddE(logmessage);
|
|
else PUB.logplc.Add("PLC", logmessage);
|
|
lastplclogmessage = logmessage;
|
|
lastplclogtime = DateTime.Now;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|