This commit is contained in:
chi
2025-06-30 13:48:19 +09:00
parent 02e71d7446
commit 00dd50192b
29 changed files with 2397 additions and 1136 deletions

View File

@@ -26,16 +26,11 @@ namespace Project
return;
}
//사용자 스텝처리가 아닌경우에만 검사
//if (Pub.flag.get(eFlag.UserStepCheck) == false)
//가동불가 조건 확인
if (CheckStopCondition() == false)
{
//가동불가 조건 확인
if (CheckStopCondition() == false)
{
PUB.sm.SetNewStep(eSMStep.PAUSE);
return;
}
PUB.sm.SetNewStep(eSMStep.PAUSE);
return;
}
//이머전시상태라면 stop 처리한다.
@@ -46,13 +41,6 @@ namespace Project
PUB.sm.SetNewStep(eSMStep.IDLE);
}
//실행스텝보정
//if (Pub.sm.runStep == eRunStep.NOTSET && Pub.sm.runStepNew == eRunStep.NOTSET)
//{
// Pub.sm.setNewRunStep(eRunStep.IDLE);
// Pub.log.Add("RUnStep Initialize");
//}
//스텝이 변경되었다면?
if (PUB.sm.RunStep != PUB.sm.RunStepNew)
{
@@ -88,7 +76,7 @@ namespace Project
//if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
PUB.Speak(Lang.) ;
PUB.Speak(Lang.);
PUB.sm.SetNewRunStep(ERunStep.CHARGECHECK);
return;
}
@@ -143,8 +131,8 @@ namespace Project
PUB.Speak(Lang.);
//230601
// if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
// if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
//QA를 제외한 경우에는 기본 QC로 이동한다
if (PUB.Result.NextPos == ePosition.QA)
@@ -184,7 +172,7 @@ namespace Project
PUB.sm.ClearRunStep();
PUB.Result.TargetPos = ePosition.QC;
PUB.sm.SetNewRunStep(ERunStep.GOHOME);
PUB.Speak( Lang.);
PUB.Speak(Lang.);
}
return;
}
@@ -198,7 +186,7 @@ namespace Project
else if (_SM_RUN_GOHOME(runStepisFirst, PUB.sm.GetRunSteptime))
{
//230601
// if (PUB.Result != null && PUB.sm != null)
// if (PUB.Result != null && PUB.sm != null)
// EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString());
PUB.Speak(Lang.);
@@ -215,7 +203,7 @@ namespace Project
return true;
}
void CheckAGVMoveTo(eGoDir dir)
{
//계속내려간다
@@ -545,7 +533,7 @@ namespace Project
return false;
}
}//cvass
}

View File

@@ -13,12 +13,12 @@ namespace Project
{
public Boolean _SM_RUN_READY(bool isFirst, TimeSpan stepTime)
{
//이동 불가 조건이 걸려있다면 충전을 하지 못하게 한다.
Boolean bAutoChageOn = true;
if (PUB.AGV.system1.stop_by_front_detect) bAutoChageOn = false;
else if (PUB.AGV.error.Emergency) bAutoChageOn = false;
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) bAutoChageOn = false;
else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) bAutoChageOn = false;
////이동 불가 조건이 걸려있다면 충전을 하지 못하게 한다.
//Boolean bAutoChageOn = true;
//if (PUB.AGV.system1.stop_by_front_detect) bAutoChageOn = false;
//else if (PUB.AGV.error.Emergency) bAutoChageOn = false;
//else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) bAutoChageOn = false;
//else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) bAutoChageOn = false;
//자동 충전 중이라면 최대 충전시간과 레벨을 체크한다
@@ -73,58 +73,58 @@ namespace Project
}
VAR.STR[eVarString.ChargeCheckMsg] = "현재 위치 모름";
}
else if (PUB.setting.Enable_AutoCharge == true )
{
if(bAutoChageOn)
{
VAR.BOOL[eVarBool.CHARGE_READY] = true;
if (PUB.BMS.Current_Level < PUB.setting.ChargeStartLevel)
{
//레벨에 의한 자동 충전간격은
var ts = VAR.TIME.RUN(eVarTime.ChargeTry);
if (ts.TotalSeconds >= PUB.setting.ChargeRetryTerm)
{
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
PUB.log.Add($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
PUB.sm.ClearRunStep();
PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
PUB.sm.SetNewStep(eSMStep.RUN);
PUB.AddEEDB($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
}
else
{
VAR.I32[eVarInt32.ChargeWaitSec] = (int)(PUB.setting.ChargeRetryTerm - ts.TotalSeconds);
VAR.BOOL[eVarBool.CHARGE_WAIT] = true;
}
VAR.STR[eVarString.ChargeCheckMsg] = "배터리 충전 레벨 필요";
}
else
{
//아직 레벨이 높다
VAR.BOOL[eVarBool.CHARGE_READY] = false;
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
VAR.STR[eVarString.ChargeCheckMsg] = "배터리 레벨상 충전 불필요";
}
}
else
{
VAR.BOOL[eVarBool.CHARGE_READY] = false;
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
VAR.STR[eVarString.ChargeCheckMsg] = "충전 불가 조건";
//충전조건이 맞지 않는다
}
}
else
{
VAR.BOOL[eVarBool.CHARGE_READY] = false;
VAR.I32[eVarInt32.ChargeWaitSec] = 0;
VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
//자동충전이 해제된 상태이므로 처리하지 않는다
VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 해제 됨";
}
//else if (PUB.setting.Enable_AutoCharge == true )
//{
// if(bAutoChageOn)
// {
// VAR.BOOL[eVarBool.CHARGE_READY] = true;
// if (PUB.BMS.Current_Level < PUB.setting.ChargeStartLevel)
// {
// //레벨에 의한 자동 충전간격은
// var ts = VAR.TIME.RUN(eVarTime.ChargeTry);
// if (ts.TotalSeconds >= PUB.setting.ChargeRetryTerm)
// {
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// PUB.log.Add($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
// PUB.sm.ClearRunStep();
// PUB.sm.SetNewRunStep(ERunStep.GOCHARGE);
// PUB.sm.SetNewStep(eSMStep.RUN);
// PUB.AddEEDB($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}");
// }
// else
// {
// VAR.I32[eVarInt32.ChargeWaitSec] = (int)(PUB.setting.ChargeRetryTerm - ts.TotalSeconds);
// VAR.BOOL[eVarBool.CHARGE_WAIT] = true;
// }
// VAR.STR[eVarString.ChargeCheckMsg] = "배터리 충전 레벨 필요";
// }
// else
// {
// //아직 레벨이 높다
// VAR.BOOL[eVarBool.CHARGE_READY] = false;
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// VAR.STR[eVarString.ChargeCheckMsg] = "배터리 레벨상 충전 불필요";
// }
// }
// else
// {
// VAR.BOOL[eVarBool.CHARGE_READY] = false;
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// VAR.STR[eVarString.ChargeCheckMsg] = "충전 불가 조건";
// //충전조건이 맞지 않는다
// }
//}
//else
//{
// VAR.BOOL[eVarBool.CHARGE_READY] = false;
// VAR.I32[eVarInt32.ChargeWaitSec] = 0;
// VAR.BOOL[eVarBool.CHARGE_WAIT] = false;
// //자동충전이 해제된 상태이므로 처리하지 않는다
// VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 해제 됨";
//}
//대기모드에서는 움직이지 않게 한다
if(PUB.AGV.system1.agv_run)

View File

@@ -41,31 +41,7 @@ namespace Project
{
try
{
if (PUB.mapctl != null)
{
var rlt = AGVControl.MapControlManager.PredictNextAction();
if (rlt.ReasonCode == AGVControl.AGVActionReasonCode.busy)
{
//var premsg = $"이전 예측작업이 완료되지 않았습니다";
//PUB.log.AddE(premsg);
//PUB.log.AddE(premsg);
//Console.WriteLine(premsg);
//predicterr += 1;
//if (predicterr > 10)
//{
// var premsg = $"행동예측 오류카운트 초과";
// PUB.AGV.AGVMoveStop(premsg);
// PUB.log.AddE(premsg);
// PUB.logagv.AddE(premsg);
// Console.WriteLine(premsg);
//}
}
}
//데이터 파싱
switch (e.DataType)
{
case arDev.Narumi.DataType.STS:
@@ -83,12 +59,12 @@ namespace Project
//모터방향 입력
if (PUB.AGV.data.Direction == 'B')
AGVControl.MapControlManager.agv.CurrentMOTDirection = AGVControl.Models.Direction.Backward;
PUB.mapctl.Manager.agv.CurrentMOTDirection = AGVControl.Direction.Backward;
else
AGVControl.MapControlManager.agv.CurrentMOTDirection = AGVControl.Models.Direction.Forward;
PUB.mapctl.Manager.agv.CurrentMOTDirection = AGVControl.Direction.Forward;
AGVControl.MapControlManager.agv.IsMoving = PUB.AGV.system1.agv_run;
AGVControl.MapControlManager.agv.IsMarkCheck = PUB.AGV.system1.Mark1_check || PUB.AGV.system1.Mark2_check;
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)
{
@@ -201,10 +177,8 @@ namespace Project
else
{
//위치는 찾았다 해당 위치가 내 목적지라면 mark stop기능으로 전환한다
}
////자동, 상하차 모드일때 RFID 가 타겟위치에 올때는 - 멈춤을 설정해준다
//if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true &&
// PUB.Result.CurrentPos == PUB.Result.TargetPos &&
@@ -237,12 +211,19 @@ namespace Project
break;
}
//이 후 상황을 예측한다
if (PUB.mapctl != null)
{
var rlt = PUB.mapctl.Manager.PredictNextAction();
if (rlt.Changed)
Console.WriteLine($"[new] predict idx:{rlt.Idx}");
}
}
catch (Exception ex)
{
Console.WriteLine($"[AGV_DataReceive] {ex.Message}");
}
}
}
}

View File

@@ -158,9 +158,10 @@ namespace Project
private void Bms_BMSDataReceive(object sender, EventArgs e)
{
AGVControl.MapControlManager.agv.BatteryLevel = PUB.BMS.Current_Level;
AGVControl.MapControlManager.agv.BatteryTemp1 = PUB.BMS.Current_temp1;
AGVControl.MapControlManager.agv.BatteryTemp2 = PUB.BMS.Current_temp2;
PUB.mapctl.Manager.agv.BatteryLevel = PUB.BMS.Current_Level;
PUB.mapctl.Manager.agv.BatteryTemp1 = PUB.BMS.Current_temp1;
PUB.mapctl.Manager.agv.BatteryTemp2 = PUB.BMS.Current_temp2;
if (PUB.BMS.Current_Level <= PUB.setting.ChargeStartLevel)
{
//배터리 레벨이 기준보다 낮다면 경고를 활성화 한다

View File

@@ -163,10 +163,7 @@ namespace Project
{
PUB.BMS.SendQuery();
}
Update_BatteryWarnSpeak();
}
}
}

View File

@@ -25,6 +25,25 @@ namespace Project
var data = e.ReceivedPacket.Data;
var dataStr = System.Text.Encoding.Default.GetString(data);
var cmd = (ENIGProtocol.AGVCommands)e.ReceivedPacket.Command;
var TargetID = 0;
if (dataStr.Length >= 2)
{
//대상디바이스
TargetID = Convert.ToByte(dataStr.Substring(0, 2), 16);
//데이터영역을 다시 설정
if (dataStr.Length > 2) dataStr = dataStr.Substring(2);
else dataStr = string.Empty;
}
else
{
PUB.log.Add($"ACS 데이터에서 TARGET ID가 없습니다(data : first byte)");
}
if (PUB.setting.XBE_ID != TargetID)
return;
switch (cmd)
{
@@ -60,7 +79,7 @@ namespace Project
case ENIGProtocol.AGVCommands.Goto: //move to tag
if (uint.TryParse(dataStr, out uint tagno2))
{
var currPos = AGVControl.MapControlManager.agv.CurrentRFID;///.AGVMoveToRFID(;
var currPos = PUB.mapctl.Manager.agv.CurrentRFID;///.AGVMoveToRFID(;
if (PUB.mapctl.SetTargetPosition(tagno2))
PUB.log.AddI($"New Target {tagno2}");
else