Files
ENIG/Cs_HMI/Project/StateMachine/_AGV.cs
2025-05-26 17:19:36 +09:00

260 lines
13 KiB
C#

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($"RFID값에서 위치정보를 추출할 수 있도록 해야한다");
PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString();
var curpos = ParsePosition(PUB.AGV.data.TagNo, out string dirForward);
if (curpos != PUB.Result.CurrentPos)
{
PUB.log.Add($"현재위치변경 {PUB.Result.CurrentPos} -> {curpos}");
PUB.Result.CurrentPos = curpos;
}
PUB.Result.CurrentPosCW = dirForward;
ctlPos1.SetPositionDeActive();
ctlPos1.SetPosition(PUB.Result.CurrentPos);
ctlPos1.SetDirection(dirForward);
ctlPos1.Invalidate();
//pot not를 보면 일단 바로 멈추게한다
if (PUB.Result.CurrentPos == ePosition.POT || PUB.Result.CurrentPos == ePosition.NOT)
{
PUB.AGV.AGVMoveStop("TAG:pot/not 발견으로 즉시 멈춤");
}
//자동, 상하차 모드일때 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;
}
}
}
}