에뮬레이터 개발 전.

This commit is contained in:
backuppc
2025-12-12 14:29:06 +09:00
parent ee2a6f04bb
commit 07ddc0425f
35 changed files with 952 additions and 1242 deletions

View File

@@ -49,82 +49,48 @@ namespace Project
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);
var agv_err = PUB.AGV.error.Value;
var agv_emg = PUB.AGV.error.Emergency;
var agv_chg = PUB.AGV.system1.Battery_charging;
var agv_stp = PUB.AGV.system1.agv_stop;
var agv_run = PUB.AGV.system1.agv_run;
var agv_mrk = PUB.AGV.signal.mark_sensor;
//if (chg_run && PUB.AGV.system1.agv_run) PUB.Speak("이동을 시작 합니다");
VAR.BOOL[eVarBool.AGVDIR_UP] = PUB.AGV.data.Direction == 'B';
VAR.BOOL[eVarBool.AGV_ERROR] = PUB.AGV.error.Value > 0;
VAR.BOOL[eVarBool.EMERGENCY] = PUB.AGV.error.Emergency;
VAR.BOOL[eVarBool.AGVDIR_BACK] = PUB.AGV.data.Direction == 'B';
////모터방향 입력
//if (PUB.AGV.data.Direction == 'B')
// PUB.mapctl.Manager.agv.Current_Motor_Direction = AGVControl.AgvDir.Backward;
//else
// PUB.mapctl.Manager.agv.Current_Motor_Direction = AGVControl.AgvDir.Forward;
////현재 속도
//if (PUB.AGV.data.Speed == 'H')
// PUB.mapctl.Manager.agv.CurrentSpeed = AGVControl.AgvSpeed.High;
//else if (PUB.AGV.data.Speed == 'M')
// PUB.mapctl.Manager.agv.CurrentSpeed = AGVControl.AgvSpeed.Middle;
//else if (PUB.AGV.data.Speed == 'L')
// PUB.mapctl.Manager.agv.CurrentSpeed = AGVControl.AgvSpeed.Low;
//else if (PUB.AGV.data.Speed == 'S')
// PUB.mapctl.Manager.agv.CurrentSpeed = AGVControl.AgvSpeed.MarkStop;
////이동방향
//if (PUB.AGV.data.Sts == 'S')
// PUB.mapctl.Manager.agv.CurrentSTS = AGVControl.AgvSts.Straight;
//else if (PUB.AGV.data.Sts == 'L')
// PUB.mapctl.Manager.agv.CurrentSTS = AGVControl.AgvSts.Left;
//else if (PUB.AGV.data.Sts == 'R')
// PUB.mapctl.Manager.agv.CurrentSTS = AGVControl.AgvSts.Right;
//PUB.mapctl.Manager.agv.IsMoving = PUB.AGV.system1.agv_run;
//PUB.mapctl.Manager.agv.IsMarkCheck = PUB.AGV.system1.Mark1_check || PUB.AGV.system1.Mark2_check;
if (PUB.AGV.signal.mark_sensor == false)
if (VAR.BOOL[eVarBool.AGV_ERROR] != (agv_err > 0))
{
if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == false)
{
VAR.BOOL[eVarBool.MARK_SENSOROFF] = true;
VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now;
PUB.log.Add($"마크센서off를 설정");
}
VAR.BOOL[eVarBool.AGV_ERROR] = (agv_err > 0);
PUB.logagv.Add($"new AGV_ERROR ({PUB.AGV.error.Value})");
}
else
if (VAR.BOOL[eVarBool.EMERGENCY] != agv_emg)
{
if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == true)
{
VAR.BOOL[eVarBool.MARK_SENSOROFF] = false;
VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now;
PUB.log.Add($"마크센서off를 해제");
}
VAR.BOOL[eVarBool.EMERGENCY] = agv_emg;
PUB.logagv.Add($"new EMERGENCY ({VAR.BOOL[eVarBool.EMERGENCY]})");
}
//차징상태변경
if (_charging != PUB.AGV.system1.Battery_charging)
if (_charging != agv_chg)
{
if (PUB.AGV.system1.Battery_charging)
if (agv_chg)
{
VAR.TIME[eVarTime.ChargeStart] = DateTime.Now;
PUB.logagv.Add($"충전시작:{VAR.TIME[eVarTime.ChargeStart]}");
}
_charging = PUB.AGV.system1.Battery_charging;
_charging = agv_chg;
}
//배터리충전상태
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] != PUB.AGV.system1.Battery_charging)
if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] != agv_chg)
{
PUB.log.Add($"충전상태전환 {PUB.AGV.system1.Battery_charging}");
VAR.BOOL[eVarBool.FLAG_CHARGEONA] = PUB.AGV.system1.Battery_charging;
PUB.log.Add($"충전상태전환 {agv_chg}");
VAR.BOOL[eVarBool.FLAG_CHARGEONA] = agv_chg;
}
//자동충전해제시 곧바로 수동 충전되는 경우가 있어 자동 상태를 BMS에 넣는다 230118
PUB.BMS.AutoCharge = PUB.AGV.system1.Battery_charging;
PUB.BMS.AutoCharge = agv_chg;
if (PUB.AGV.error.Charger_pos_error != VAR.BOOL[eVarBool.CHG_POSERR])
{
@@ -135,41 +101,41 @@ namespace Project
VAR.BOOL[eVarBool.CHG_POSERR] = PUB.AGV.error.Charger_pos_error;
}
if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == true && PUB.AGV.signal.mark_sensor == false)
//나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다
if (agv_stp)
{
//현재 활성화된 위치를 꺼준다
if (this.ctlPos1.GetPositionActive(PUB.Result.CurrentPos))
if (VAR.BOOL[eVarBool.NEXTSTOP_MARK])
{
var ts = VAR.TIME.RUN(eVarTime.MarkSensorOff);
if (ts.TotalSeconds >= 2)
{
ctlPos1.SetPositionDeActive();
PUB.log.Add($"현재 활성위치를 해제 함");
}
VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false;
PUB.logagv.Add($"NEXTSTOP_MARK 변경({VAR.BOOL[eVarBool.NEXTSTOP_MARK]})");
}
}
//나르미가 멈췄다면 다음 마크 이동 기능이 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();
}
}
PUB.logagv.Add($"MARK_SENSOR 변경({PUB.AGV.signal.mark_sensor})");
VAR.BOOL[eVarBool.MARK_SENSOR] = PUB.AGV.signal.mark_sensor;
//AGV가 멈췄고 마크센서가 ON되었다면 마지막 RFID 위치가 확정된경우이다
if (agv_stp && VAR.BOOL[eVarBool.MARK_SENSOR])
{
PUB.log.Add("마크스탑이 확인되어 최종위치를 PASS 처리 합니다");
var curnode = PUB._virtualAGV.SetCurrentNodeMarkStop();
if (curnode == true)
{
PUB.log.Add($"마크스탑으로 해당노드의 이동을 확정합니다");
}
else PUB.log.AddAT($"마크스탑이 확인되었으나 현재 노드가없어 PASS를 설정하지 못함");
}
}
if (VAR.BOOL[eVarBool.MARK_SENSOROFF] != VAR.BOOL[eVarBool.MARK_SENSOR])
{
VAR.BOOL[eVarBool.MARK_SENSOROFF] = !VAR.BOOL[eVarBool.MARK_SENSOR];
VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now;
PUB.log.Add($"MARK_SENSOROFF 변경({VAR.BOOL[eVarBool.MARK_SENSOROFF]})");
}
}
break;
case arDev.Narumi.DataType.TAG:
@@ -197,7 +163,7 @@ namespace Project
NodeId = newNodeId,
RfidId = PUB.Result.LastTAG,
Name = $"자동추가_{PUB.Result.LastTAG}",
Type = NodeType.Normal,
Type = NodeType.Normal,
Position = new Point(100, 100), // 기본 위치
IsActive = true,
DisplayColor = Color.Orange, // 자동 추가된 노드는 오렌지색으로 표시
@@ -239,8 +205,23 @@ namespace Project
}
//이 후 상황을 예측한다
var command = PUB._virtualAGV.Predict();
var preditMSG = $"Motor:{command.Motor},Magnet:{command.Magnet},Speed:{command.Speed} : {command.Reason}";
if (PUB._mapCanvas != null)
{
var nextAction = PUB._virtualAGV.Predict();
var message = $"[다음 행동 예측]\n\n" +
$"모터: {nextAction.Motor}\n" +
$"마그넷: {nextAction.Magnet}\n" +
$"속도: {nextAction.Speed}\n" +
$"이유: {nextAction.Message}\n\n" +
$"---\n" +
$"현재 상태: {PUB._virtualAGV.CurrentState}\n" +
$"현재 방향: {PUB._virtualAGV.CurrentDirection}\n" +
$"위치 확정: {PUB._virtualAGV.IsPositionConfirmed} (RFID {PUB._virtualAGV.DetectedRfidCount}개)\n" +
$"현재 노드: {PUB._virtualAGV.CurrentNodeId ?? ""}";
PUB._mapCanvas.PredictMessage = message;
}
}
catch (Exception ex)
{