using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Text; using arCtl; using Project.StateMachine; using COMM; using AR; namespace Project { public partial class fMain { private void AGV_Message(object sender, arDev.Narumi.MessageEventArgs e) { if (e.MsgType == arDev.arRS232.MessageType.Normal) PUB.logagv.AddE(e.Message); else if (e.MsgType == arDev.arRS232.MessageType.Normal) PUB.logagv.Add(e.Message); else if (e.MsgType == arDev.arRS232.MessageType.Recv) { if (e.Message.Substring(1).StartsWith("STS") == false) PUB.logagv.Add("AGV-RX", e.Message); } else if (e.MsgType == arDev.arRS232.MessageType.Send) PUB.logagv.Add("AGV-TX", e.Message); else { PUB.logagv.Add(e.MsgType.ToString(), e.Message); } } //ePosition ParsePosition(uint tag, out string dirBW) //{ // var tagstr = tag.ToString(); // var tagno = tagstr.Substring(0, tagstr.Length - 1); // if (tag == PUB.setting.TAGNOT) { dirBW = "0"; return ePosition.NOT; } // else if (tag == PUB.setting.TAG_QA_QC) { dirBW = "0"; return ePosition.QA_QC; } // else if (tag == PUB.setting.TAG_QC_F1) { dirBW = "0"; return ePosition.QC_F1; } // else if (tag == PUB.setting.TAG_F1_F2) { dirBW = "0"; return ePosition.F1_F2; } // else if (tag == PUB.setting.TAG_F2_F3) { dirBW = "0"; return ePosition.F2_F3; } // else if (tag == PUB.setting.TAG_F3_F4) { dirBW = "0"; return ePosition.F3_F4; } // else if (tag == PUB.setting.TAG_F4_F5) { dirBW = "0"; return ePosition.F4_F5; } // else if (tag == PUB.setting.TAGQAB) { dirBW = "0"; return ePosition.QA; } // else if (tag == PUB.setting.TAGQCB) { dirBW = "0"; return ePosition.QC; } // else if (tag == PUB.setting.TAGF1B) { dirBW = "0"; return ePosition.F1; } // else if (tag == PUB.setting.TAGF2B) { dirBW = "0"; return ePosition.F2; } // else if (tag == PUB.setting.TAGF3B) { dirBW = "0"; return ePosition.F3; } // else if (tag == PUB.setting.TAGF4B) { dirBW = "0"; return ePosition.F4; } // else if (tag == PUB.setting.TAGF5B) { dirBW = "0"; return ePosition.F5; } // //else if (tag == PUB.setting.TAGQAA) { dirBW = "1"; return ePosition.QA; } // //else if (tag == PUB.setting.TAGCHA) { dirBW = "1"; return ePosition.CHARGE; } // else if (tag == PUB.setting.TAGQAA) { dirBW = "1"; return ePosition.QA; } // else if (tag == PUB.setting.TAGQCA) { dirBW = "1"; return ePosition.QC; } // else if (tag == PUB.setting.TAGF1A) { dirBW = "1"; return ePosition.F1; } // else if (tag == PUB.setting.TAGF2A) { dirBW = "1"; return ePosition.F2; } // else if (tag == PUB.setting.TAGF3A) { dirBW = "1"; return ePosition.F3; } // else if (tag == PUB.setting.TAGF4A) { dirBW = "1"; return ePosition.F4; } // else if (tag == PUB.setting.TAGF5A) { dirBW = "1"; return ePosition.F5; } // else if (tag == PUB.setting.TAGPOT) { dirBW = "0"; return ePosition.POT; } // else // { // if (tag > 9350 && tag < 9400) // { // dirBW = "0"; return ePosition.QC_F1; // } // else if (tag > 9250 && tag < 9300) // { // dirBW = "0"; return ePosition.QA_QC; // } // else if (tag > 9000 && tag < 9100) // { // dirBW = "0"; return ePosition.NOT; // } // else // { // dirBW = "0"; return ePosition.NONE; // } // } //} bool _charging = false; private void AGV_DataReceive(object sender, arDev.Narumi.DataEventArgs e) { switch (e.DataType) { case arDev.Narumi.DataType.STS: { //마크센서 확인 var chg_mark1 = PUB.AGV.signal.GetChanged(arDev.Narumi.Signal.eflag.mark_sensor_1); var chg_mark2 = PUB.AGV.signal.GetChanged(arDev.Narumi.Signal.eflag.mark_sensor_1); var chg_run = PUB.AGV.system1.GetChanged(arDev.Narumi.SystemFlag1.eflag.agv_run); var chg_stop = PUB.AGV.system1.GetChanged(arDev.Narumi.SystemFlag1.eflag.agv_stop); //if (chg_run && PUB.AGV.system1.agv_run) PUB.Speak("이동을 시작 합니다"); VAR.BOOL[eVarBool.AGVDIR_UP] = PUB.AGV.data.Direction == 'B'; // PUB.AGV.signal.mark_sensor = PUB.AGV.signal.mark_sensor; VAR.BOOL[eVarBool.AGV_ERROR] = PUB.AGV.error.Value > 0; VAR.BOOL[eVarBool.EMERGENCY] = PUB.AGV.error.Emergency; if (PUB.AGV.signal.mark_sensor == false) { if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == false) { VAR.BOOL[eVarBool.MARK_SENSOROFF] = true; VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now; PUB.log.Add($"마크센서off를 설정"); } } else { if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == true) { VAR.BOOL[eVarBool.MARK_SENSOROFF] = false; VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now; PUB.log.Add($"마크센서off를 해제"); } } //차징상태변경 if (_charging != PUB.AGV.system1.Battery_charging) { if (PUB.AGV.system1.Battery_charging) { VAR.TIME[eVarTime.ChargeStart] = DateTime.Now; PUB.logagv.Add($"충전시작:{VAR.TIME[eVarTime.ChargeStart]}"); } _charging = PUB.AGV.system1.Battery_charging; } //배터리충전상태 if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] != PUB.AGV.system1.Battery_charging) { PUB.log.Add($"충전상태전환 {PUB.AGV.system1.Battery_charging}"); VAR.BOOL[eVarBool.FLAG_CHARGEONA] = PUB.AGV.system1.Battery_charging; } //자동충전해제시 곧바로 수동 충전되는 경우가 있어 자동 상태를 BMS에 넣는다 230118 PUB.BMS.AutoCharge = PUB.AGV.system1.Battery_charging; if (PUB.AGV.error.Charger_pos_error != VAR.BOOL[eVarBool.CHG_POSERR]) { if (PUB.AGV.error.Charger_pos_error) { PUB.Speak(Lang.충전기위치오류); } VAR.BOOL[eVarBool.CHG_POSERR] = PUB.AGV.error.Charger_pos_error; } if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == true && PUB.AGV.signal.mark_sensor == false) { //현재 활성화된 위치를 꺼준다 if (this.ctlPos1.GetPositionActive(PUB.Result.CurrentPos)) { var ts = VAR.TIME.RUN(eVarTime.MarkSensorOff); if (ts.TotalSeconds >= 2) { ctlPos1.SetPositionDeActive(); PUB.log.Add($"현재 활성위치를 해제 함"); } } } //나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다 if (PUB.AGV.system1.agv_stop) VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false; if (VAR.BOOL[eVarBool.MARK_SENSOR] != PUB.AGV.signal.mark_sensor) { if (PUB.AGV.signal.mark_sensor) { //현재위치를 확정한다 var curact = ctlPos1.GetPositionActive(PUB.Result.CurrentPos); if (curact == false) { PUB.log.Add($"마크센서로인해 현재위치 설정완료:{PUB.Result.CurrentPos}"); ctlPos1.SetPositionActive(PUB.Result.CurrentPos); ctlPos1.SetDirection(""); ctlPos1.Invalidate(); } } VAR.BOOL[eVarBool.MARK_SENSOR] = PUB.AGV.signal.mark_sensor; } } break; case arDev.Narumi.DataType.TAG: { //자동 실행 중이다. PUB.log.Add($"AGV 태그수신 : {PUB.AGV.data.TagNo}"); PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString(); //POT/NOT 보면 일단 바로 멈추게한다 if (PUB.Result.CurrentPos == ePosition.POT || PUB.Result.CurrentPos == ePosition.NOT) { var logEMsg = $"Stop by [POT/NOT]"; PUB.AGV.AGVMoveStop(logEMsg); PUB.log.AddE(logEMsg); } //맵데이터에서 현재 위치를 찾는다 if (PUB.mapctl.SetCurrentPosition(PUB.AGV.data.TagNo) == false) { if (VAR.BOOL[eVarBool.FLAG_AUTORUN] && PUB.AGV.system1.agv_run) PUB.AGV.AGVMoveStop("unknown tag no"); //존재하지 않는 태그가 읽히면 관련 오류를 표시한다. } else { //위치는 찾았다 해당 위치가 내 목적지라면 mark stop기능으로 전환한다 } ////자동, 상하차 모드일때 RFID 가 타겟위치에 올때는 - 멈춤을 설정해준다 //if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true && // PUB.Result.CurrentPos == PUB.Result.TargetPos && // PUB.Result.TargetPos != ePosition.NONE && // (PUB.sm.RunStep == ERunStep.GODOWN || // PUB.sm.RunStep == ERunStep.GOUP || // PUB.sm.RunStep == ERunStep.GOHOME || // PUB.sm.RunStep == ERunStep.GOCHARGE)) //{ // if (PUB.AGV.data.Sts == 'F' && dirForward == "0") //아래로 내려오고있음 // { // PUB.AGV.AGVMoveStop("AGV_DataReceive", arDev.Narumi.eStopOpt.MarkStop); // PUB.Speak( Lang.다음마크위치에서정지합니다); // } // else if (PUB.AGV.data.Sts == 'B' && dirForward == "1") // { // //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = true; // PUB.AGV.AGVMoveStop("AGV_DataReceive", arDev.Narumi.eStopOpt.MarkStop); // PUB.Speak(Lang.다음마크위치에서정지합니다); // } //} } break; case arDev.Narumi.DataType.ACK: PUB.logagv.Add($"AGV_[ACK]Receive : {PUB.AGV.ACKData}"); break; default: PUB.logagv.Add($"AGV_DataReceive : {e.DataType}"); break; } } } }