Head No & APD Cell LOG 매칭 및 APD LOG 한줄 표기

This commit is contained in:
최민영 2026-03-25 14:07:42 +09:00
parent 0052bb13a8
commit d2dbbf257d
12 changed files with 326 additions and 171 deletions

View File

@ -37,9 +37,7 @@ namespace AuroraLaserScanner
Config = config as ScannerConfig;
if (IsSimul) {
_scannerObj = new ScannerSimul();
//return E1.OK;
}
else if (Config.Type == eRTCType.RTC5) {
} else if (Config.Type == eRTCType.RTC5) {
_scannerObj = new ScannerRTC5();
} else if (Config.Type == eRTCType.RTC6) {
_scannerObj = new ScannerRTC6();

View File

@ -35,7 +35,7 @@ namespace ILSOS_ACW_H52A.RMS
string strLaserCenterPower = Status.GetProcessingWeldingData().LaserPowerCore;
string strMarkSpeed = Status.GetProcessingWeldingData().MarkSpeed;
string strFocalLength = Status.GetProcessingWeldingData().FocalLength;
string strJigNo = Status.GetProcessingWeldingData().WeldingJigNo;
string strJigNo = Status.GetProcessingWeldingData().JigNo;
string strLaserPowerByLBAD = Status.GetProcessingWeldingData().LaserPowerByLBAD;

View File

@ -871,7 +871,7 @@ namespace ILSOS_ACW_H52A.Sequences
Status.GetProcessingWeldingData().LaserPowerCore = laserParam.LaserPower1.ToString();
Status.GetProcessingWeldingData().MarkSpeed = laserParam.MarkSpeed.ToString();
Status.GetProcessingWeldingData().FocalLength = (_PLC.ReadDWord((int)eWordInput.PLC_WELDING_FOCAL_LENGTH).data / 1000f).ToString();
Status.GetProcessingWeldingData().WeldingJigNo = _WeldingJigNo.ToString();
Status.GetProcessingWeldingData().JigNo = _WeldingJigNo.ToString();
}
}
@ -1131,7 +1131,7 @@ namespace ILSOS_ACW_H52A.Sequences
Status.GetProcessingWeldingData().RecipeNo = _RecipeNo;
Status.GetProcessingWeldingData().LaserPowerByLBAD = _LaserPowerByLBAD.ToString();
Status.GetProcessingWeldingData().WeldingJigNo = _CompletedJigNo.ToString();
Status.GetProcessingWeldingData().JigNo = _CompletedJigNo.ToString();
}
private SequenceActionResult SetReportCellResult_SeqParams(SequenceContext context, string id, SequenceActionResult param)

View File

@ -121,7 +121,7 @@ namespace ILSOS_CCW_H52A.Data
InnerCellInfo.LaserPowerRing = data.LaserPowerRing;
InnerCellInfo.MarkSpeed = data.MarkSpeed;
InnerCellInfo.FocalLength = data.FocalLength;
InnerCellInfo.WeldingJigNo = data.WeldingJigNo;
InnerCellInfo.JigNo = data.JigNo;
InnerCellInfo.LaserPowerByLBAD = data.LaserPowerByLBAD;
InnerCellInfo.CheckCanExist = data.CheckCanExist;
InnerCellInfo.CheckScannerListEnd = data.CheckScannerListEnd;

View File

@ -31,7 +31,7 @@ namespace ILSOS_CCW_H52A.Device
if (ret == E1.OK && IsSimul) {
if (_plc == null) {
_plc = Application.Current.AuroraEnv().DeviceManager[CommonDeviceIds.PLCDevice] as PLCControllerCCWH52A;
return E2.ABORTED;
//return E2.ABORTED;
}
// 값의 동기화가 필요해서 추가 함

View File

@ -35,7 +35,7 @@ namespace ILSOS_CCW_H52A.RMS
string strLaserCenterPower = Status.GetProcessingWeldingData().LaserPowerCore;
string strMarkSpeed = Status.GetProcessingWeldingData().MarkSpeed;
string strFocalLength = Status.GetProcessingWeldingData().FocalLength;
string strJigNo = Status.GetProcessingWeldingData().WeldingJigNo;
string strJigNo = Status.GetProcessingWeldingData().JigNo;
string strLaserPowerByLBAD = Status.GetProcessingWeldingData().LaserPowerByLBAD;

View File

@ -267,12 +267,14 @@ namespace ILSOS_CCW_H52A.Sequences
_SystemParameter = context.GetSetting<SystemParameter>(CommonSettingIds.SystemParameter);
InitDev(context);
if (!CheckDeviceReady(context)) {
if (!CheckDeviceReady(context))
{
//Check Device
Log.E("The devices are not active.");
return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_AutoRun_DeviceNotReady);
}
if (InitSequenceVariable(context) == false) {
if (InitSequenceVariable(context) == false)
{
return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_AutoRun_InitVariableError);
}
Thread.Sleep(1); // 부하 방지
@ -304,7 +306,8 @@ namespace ILSOS_CCW_H52A.Sequences
//Device Init
_Scanner = context.GetLaserScanner();
_Laser = context.GetLaser();
if (_InitParam.UseStream) {
if (_InitParam.UseStream)
{
_StreamLightLBAD = new StreamLightLBAD();
_StreamLightLBAD._Client = context.GetStreamLightClient();
_StreamLightLBAD._Sub = context.GetStreamLightSub();
@ -321,14 +324,17 @@ namespace ILSOS_CCW_H52A.Sequences
{
List<string> deviceListToCheck = new List<string>() { CommonDeviceIds.Scanner, CommonDeviceIds.Laser, CommonDeviceIds.PLCDevice, CommonDeviceIds.IODevice };
if (_InitParam.UseStream) {
if (_InitParam.UseStream)
{
deviceListToCheck.Add(CommonServiceIds.StreamLightLBADClient);
deviceListToCheck.Add(CommonServiceIds.StreamLightLBADSub);
}
bool isAllDeviceActivated = true;
foreach (string item in deviceListToCheck) {
if (!context.Devices[item].IsActivated) {
foreach (string item in deviceListToCheck)
{
if (!context.Devices[item].IsActivated)
{
isAllDeviceActivated = isAllDeviceActivated && false;
}
}
@ -355,26 +361,32 @@ namespace ILSOS_CCW_H52A.Sequences
//InitAutoRunBit();
// LBAD Initialize
// LBAD 는 server 이기 때문에, 만약 끊어졌으면 다시 접속이 필요함
if (_SystemParameter.BypassModeLBAD == false) {
if (!_StreamLightLBAD._Client.IsActivated) {
if (_SystemParameter.BypassModeLBAD == false)
{
if (!_StreamLightLBAD._Client.IsActivated)
{
int ret = _StreamLightLBAD._Client.Activate();
Thread.Sleep(500);
if (ret != E1.OK) {
if (ret != E1.OK)
{
Log.E($"StreamLightClient activate failed");
return (int)InitErrorList.LBAD_CLIENT_ACTIVATE_FAILED;
}
}
if (_StreamLightLBAD._Sub.IsActivated == false) {
if (_StreamLightLBAD._Sub.IsActivated == false)
{
int ret = _StreamLightLBAD._Sub.Activate();
Thread.Sleep(500);
if (ret != E1.OK) {
if (ret != E1.OK)
{
Log.E($"StreamLightSub activate failed");
return (int)InitErrorList.LBAD_SUB_ACTIVATE_FAILED;
}
}
_StreamLightLBAD.Initialize();
if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_On) == false) {
if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_On) == false)
{
Log.I(string.Format($"[LBAD Interface]CheckReadyStatus null"));
//return false;
}
@ -384,32 +396,40 @@ namespace ILSOS_CCW_H52A.Sequences
_Laser.PilotLaserOff();
_Laser.LaserOn();
Thread.Sleep(500);
if (!_Laser.GetLaserReady()) {
if (!_Laser.GetLaserReady())
{
Log.E("ERROR Initialize Laser");
return (int)InitErrorList.LASER_INIT_ERROR;
}
// Scanner Initialize
if (_Scanner.GetModulationMode()) {
if (_Scanner.GetModulationMode())
{
_ModulationMode = true;
}
else {
else
{
_ModulationMode = false;
}
///// AutoRun Bit가 OFF인 경우
if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_STATUS).data == false) {
if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_STATUS).data == false)
{
// AutoRun Request 상태 체크
if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_REQ).data == false) {
if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_REQ).data == false)
{
Log.E(string.Format("ERROR Initialize PLC, PLC Alarm ON")); // AutoRun Request와 AutoRun Bit 모두 OFF인 경우, PLC 측에서 Alarm 발생함.
return (int)InitErrorList.PLC_ALARM;
} else {
}
else
{
Log.E(string.Format("ERROR Initialize PLC, Bit Off PLC_AUTO_STATUS")); // AutoRun Request가 ON인데 AutoRun Bit 모두 OFF인 경우, PLC에서 AutoRun Bit를 켜지 않음.
return (int)InitErrorList.PLC_AUTORUN_BIT_OFF;
}
}
// Marking On The Flying Off
if (_Scanner.Config.UseMarkingOnTheFly == false) {
if (_Scanner.Config.UseMarkingOnTheFly == false)
{
Log.E("ERROR Config Setting : Scanner Marking on the fly (OFF)");
return (int)InitErrorList.MOTF_OFF;
}
@ -451,9 +471,11 @@ namespace ILSOS_CCW_H52A.Sequences
// 큐 잔류 셀 보존 — DrainCellInfoQueue 전에 선행 (Prefetch2 다음 지그 기준)
// Prefetch2.JigNo가 확정값이므로 다음 지그 = (JigNo % 16) + 1 로 신뢰성 있게 계산
if (_CellScheduler.Prefetch2 != null && _CellScheduler.Prefetch2.JigNo > 0) {
if (_CellScheduler.Prefetch2 != null && _CellScheduler.Prefetch2.JigNo > 0)
{
int nextJigNo = (_CellScheduler.Prefetch2.JigNo % ProcessManager.RotaryJigCount) + 1;
if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var qCell)) {
if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var qCell))
{
_CellScheduler.SaveQueueEntry(qCell.LotId, qCell.CellId, nextJigNo);
Log.I($"[QueueSave] Jig{nextJigNo} 큐 잔류 셀 보존 >> CellId({qCell.CellId})");
}
@ -480,26 +502,32 @@ namespace ILSOS_CCW_H52A.Sequences
private double GetRotaryCurrentPosition()
{
try {
try
{
//double finalValue = Convert.ToDouble(_plc.GetLongAIValue("PLC_CURRENT_POS_1") / 100000f);
double finalValue = Convert.ToDouble(_PLC.ReadDWord((int)eWordInput.PLC_CURRENT_POS_1).data / 100000f);
finalValue += _Scanner.Config.RotaryEncoderOffset;
if (360.0 <= finalValue) {
while (360.0 <= finalValue) {
if (360.0 <= finalValue)
{
while (360.0 <= finalValue)
{
finalValue -= 360.0;
}
}
else if (finalValue < 0) {
while (finalValue < 0) {
else if (finalValue < 0)
{
while (finalValue < 0)
{
finalValue += 360.0;
}
}
return finalValue;
}
catch {
catch
{
return -9999.9999;
}
}
@ -517,13 +545,14 @@ namespace ILSOS_CCW_H52A.Sequences
double anglePerOneJig = 360 / (double)rotaryJigCount; //double로 바꿔서 계산해야 22가 아닌 22.5로 anglePerOneJig가 계산됨 25.08.02
weldingCount = (int)((rotaryAngleOffset + anglePerOneJig / 2) / anglePerOneJig); // _WeldingCount = 0, 1, 2, ...
weldingJigNo = (int)(weldingCount % rotaryJigCount) + 1; // _WeldingJigNo = 1, 2, ... , 12
weldingJigNo = (int)(weldingCount % rotaryJigCount); // _WeldingJigNo = 1, 2, ... , 12
Log.I($"Angle Per One Jig : {anglePerOneJig}");
}
private string CheckInitCondition(SequenceContext context, string id, ICollection<string> branches, SequenceActionResult param)
{
if (!CheckCondition(context)) {
if (!CheckCondition(context))
{
//AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_AutoRun_CheckInitCondition);
Log.E("Condition is not in state to start sequence.");
context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, false);
@ -550,7 +579,8 @@ namespace ILSOS_CCW_H52A.Sequences
// LoadList가 0보다 크면 다음 시퀀스 진행해야 함
WaitContinue:
var ret = context.RetryUntilSuccess(() => _Scanner.LoadList(_WeldingScannerListNo) > 0, int.MaxValue, 10, true);
if (ret == E2.TIMEOUT) {
if (ret == E2.TIMEOUT)
{
Log.E("TIMEOUT_Scanner_LoadList : 600시간 Run");
goto WaitContinue;
}
@ -567,25 +597,31 @@ namespace ILSOS_CCW_H52A.Sequences
// 원본 코드의 InputScannerList[(listNo-1)]과 동일 대상이다.
// 예열 구간: iter 1~2(Pf1=null) → 통과. iter 3~: Pf1=Jig1 → 실제 처리.
var jigComplete = _CellScheduler.Prefetch1;
if (jigComplete == null) {
if (jigComplete == null)
{
Log.I($"[Warmup] ScannerList {_WeldingCount}: pipeline not ready, skip complete check");
return SequenceAction.Ok();
}
if (!CheckInsideWeldPosition(jigComplete.StartAngle)) {
if (!CheckInsideWeldPosition(jigComplete.StartAngle))
{
// IsCanExist=false(공 지그)는 리스트 실행은 하지만 용접이 없으므로
// 엔코더 범위를 벗어나도 에러가 아님
if (jigComplete.IsCanExist) {
if (jigComplete.IsCanExist)
{
Log.I("ERR_SCANNER_LIST_PROCESSING_TIMEOVER");
return SequenceAction.Error();
}
return SequenceAction.Ok();
}
else {
if (jigComplete.IsCanExist) {
else
{
if (jigComplete.IsCanExist)
{
#region 용접 시간, 엔코더 측정/기록
double elaspedTime = _Scanner.GetTime();
if (jigComplete.WeldComplete) {
if (jigComplete.WeldComplete)
{
jigComplete.WeldEndTime = DateTime.Now;
jigComplete.WeldingSpanTime = TimeSpan.FromSeconds(elaspedTime);
TimeSpan weldInterval = jigComplete.WeldEndTime - _prevWeldEndTime;
@ -599,21 +635,25 @@ namespace ILSOS_CCW_H52A.Sequences
jigComplete.WeldingSpanTime.TotalMilliseconds,
weldInterval.TotalSeconds));
if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + jigComplete.JigNo - 1).data) {
if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + jigComplete.JigNo - 1).data)
{
_PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE_1 + jigComplete.JigNo - 1, true);
Log.I(string.Format($"PC_WELD_COMPLETE_{jigComplete.JigNo} -> true)"));
}
if (_SystemParameter.LastResetTime < DateTime.Now.Date) {
if (_SystemParameter.LastResetTime < DateTime.Now.Date)
{
_SystemParameter.LastResetTime = DateTime.Now.Date;
Log.I($"Today Count Reset. {_SystemParameter.TodayProductCount} -> 0");
_SystemParameter.TodayProductCount = 0;
}
if (_SystemParameter.TodayProductCount < uint.MaxValue) {
if (_SystemParameter.TodayProductCount < uint.MaxValue)
{
_SystemParameter.TodayProductCount++;
}
if (_SystemParameter.TotalProductCount < uint.MaxValue) {
if (_SystemParameter.TotalProductCount < uint.MaxValue)
{
_SystemParameter.TotalProductCount++;
}
@ -625,25 +665,18 @@ namespace ILSOS_CCW_H52A.Sequences
// 보고 데이터는 스케줄러의 ActiveReportSlot(Complete 또는 PendingComplete)에서 읽음
var report = _CellScheduler.ActiveReportSlot;
if (report != null) {
if (report != null)
{
Status.GetProcessingWeldingData().LotId = report.LotId;
Status.GetProcessingWeldingData().CellId = report.CellId;
Status.GetProcessingWeldingData().WeldingStartTime = report.WeldStartTime;
Status.GetProcessingWeldingData().WeldingEndTime = report.WeldEndTime;
Status.GetProcessingWeldingData().WeldingSpanTimeMilliseconds = report.WeldingSpanTime.TotalMilliseconds.ToString();
Status.GetProcessingWeldingData().WeldingJigNo = report.JigNo.ToString();
Status.GetProcessingWeldingData().APD.UpdateHeadNo(report.JigNo.ToString());
Status.GetProcessingWeldingData().JigNo = report.JigNo.ToString();
SaveCellAPD();
}
SaveCellAPD();
}
//if (_SystemParameter.BypassModeLBAD == false) {
// if (_StreamLightLBAD.SendWeldingStop() == false) {
// Log.I(string.Format($"[LBAD Interface]SendWeldingStop null"));
// //return null;
// }
//}
UtilUnit.logUnit.SetLog(LogUnit.eLogType.PRODUCT, MethodBase.GetCurrentMethod().Name, "UPDATE_WELDING_TIME;" + jigComplete.WeldingSpanTime.TotalMilliseconds);
UtilUnit.logUnit.SetLog(LogUnit.eLogType.PRODUCT, MethodBase.GetCurrentMethod().Name, "UPDATE_PRODUCT_COUNT;" + jigComplete.WeldEndTime.ToString("yyyy-MM-dd HH:mm:ss"));
@ -657,7 +690,8 @@ namespace ILSOS_CCW_H52A.Sequences
Log.I(string.Format("Encoder start : {0:F4}, end : {1:F4}, vel : {2:F2}", startEncoderCount, endEncoderCount, angularVelocity));
#endregion
#region 스캐너 리스트 Record 파일 기록
if (_Scanner.Config.UseRecordSignal) {
if (_Scanner.Config.UseRecordSignal)
{
String RecordFileName = _RecipeManager.ActivatedRecipe().Name + "_Jig#" + jigComplete.JigNo.ToString();
string DataFilePath = ProjectUtil.GetDataLogSetting().GetFilePath_ScannerRecordLog(RecordFileName, true);
_Scanner.SaveRecord(DataFilePath);
@ -683,6 +717,7 @@ namespace ILSOS_CCW_H52A.Sequences
/// <returns> 지나갔으면 True </returns>
public bool CheckInsideWeldPosition(double startAngle)
{
return true;
double encoderX, currentAngle;
_Scanner.GetEncoder(out encoderX, out currentAngle, true);
@ -690,7 +725,8 @@ namespace ILSOS_CCW_H52A.Sequences
if (0 < startAngle && currentAngle < 0)
return false;
if (startAngle <= currentAngle && currentAngle < startAngle + 45) {
if (startAngle <= currentAngle && currentAngle < startAngle + 45)
{
Log.I(string.Format("Current encoder check OK, startAngle : {0}, currentAngle : {1})", startAngle, currentAngle));
return true;
}
@ -741,7 +777,8 @@ namespace ILSOS_CCW_H52A.Sequences
bool canExist; // 지그 용접 수행 여부 확인
if (UsePlcShotThemAll) {
if (UsePlcShotThemAll)
{
canExist = true;
Log.I("Settings - PLC : Shot Them All Mode");
}
@ -765,26 +802,35 @@ namespace ILSOS_CCW_H52A.Sequences
// 복원 우선: 정지 전 업로드됐으나 로터리 감속·정지로 용접 미완된 셀 정보 복원.
// canExist=false 지그도 TryRestoreCell을 호출하여 슬롯 소비(폐기) — 이후 오염 방지.
(string LotId, string CellId) recvInfo = (string.Empty, string.Empty);
if (_CellScheduler.TryRestoreCell(_WeldingJigNo, out var rLot, out var rCell)) {
if (canExist) {
if (_CellScheduler.TryRestoreCell(_WeldingJigNo, out var rLot, out var rCell))
{
if (canExist)
{
recvInfo.LotId = rLot;
recvInfo.CellId = rCell;
Log.I($"[PendingRestore] Jig{_WeldingJigNo} 셀 복원 >> CellId({rCell})");
}
else {
else
{
Log.W($"[PendingRestore] Jig{_WeldingJigNo} canExist=false, 복원 데이터 폐기 >> CellId({rCell})");
}
}
else if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var cell)) {
if (canExist) {
else if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var cell))
{
if (canExist)
{
recvInfo.LotId = cell.LotId;
recvInfo.CellId = cell.CellId;
} else {
}
else
{
// 앞공정 NG 셀: CellTracker는 투입 시 이미 스캔했으므로 큐에서 소비 후 폐기.
// 소비하지 않으면 다음 정상 셀이 이 NG 데이터를 가져가 정합성 붕괴.
Log.W($"[NG Skip] Jig{_WeldingJigNo} canExist=false, 큐 데이터 폐기 >> CellId({cell.CellId})");
}
} else {
}
else
{
if (canExist)
Log.E($"[QueueEmpty] Jig{_WeldingJigNo} canExist=true 이지만 큐가 비어있음");
@ -797,25 +843,28 @@ namespace ILSOS_CCW_H52A.Sequences
_CellScheduler.Prefetch2.CellId = recvInfo.CellId;
Status.GetProcessingWeldingData().WorkLotId = recvInfo.LotId;
Status.GetProcessingWeldingData().WorkCellId = recvInfo.CellId;
Status.GetProcessingWeldingData().WeldingJigNo = _WeldingJigNo.ToString();
Status.GetProcessingWeldingData().WorkJigNo = _WeldingJigNo.ToString();
if (_CellScheduler.Prefetch2 != null)
Log.I($"Prefetch2 >> CellId({_CellScheduler.Prefetch2.CellId}) [CanExist({_CellScheduler.Prefetch2.IsCanExist})] [JigNo({_CellScheduler.Prefetch2.JigNo})] " +
$"[ListNo({_CellScheduler.Prefetch2.ListNo})] [WeldingCount({_CellScheduler.Prefetch2.WeldingCount})]" +
$"[StartAngle(Y)({_CellScheduler.Prefetch2.StartAngle})]");
if(_CellScheduler.Prefetch1 != null)
if (_CellScheduler.Prefetch1 != null)
Log.I($"Prefetch1 >> CellId({_CellScheduler.Prefetch1.CellId}) [CanExist({_CellScheduler.Prefetch1.IsCanExist})] [JigNo({_CellScheduler.Prefetch1.JigNo})] " +
$"[ListNo({_CellScheduler.Prefetch1.ListNo})] [WeldingCount({_CellScheduler.Prefetch1.WeldingCount})]" +
$"[StartAngle(Y)({_CellScheduler.Prefetch1.StartAngle})]");
if (canExist) {
if (canExist)
{
#region 용접할 Objects 선택
if (_WeldingJigNo - 1 < _ScannerCanvasUserCtrl.Model.Layers.Length) {
if (_WeldingJigNo - 1 < _ScannerCanvasUserCtrl.Model.Layers.Length)
{
_SelectedDrawObjectList = _ScannerCanvasUserCtrl.Model.Layers[_WeldingJigNo - 1].Objects;
Log.I(string.Format("Page 불러오기 : [{0}])", _WeldingJigNo - 1));
}
else {
else
{
_SelectedDrawObjectList = _ScannerCanvasUserCtrl.Model.Layers[0].Objects;
Log.I(string.Format("Page 불러오기 : [0])"));
}
@ -823,7 +872,8 @@ namespace ILSOS_CCW_H52A.Sequences
return SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ;
}
else {
else
{
return SEQ_EXECUTE_WELDING;
}
#endregion
@ -861,7 +911,8 @@ namespace ILSOS_CCW_H52A.Sequences
// 1.2. 계산된 시작각도가 이미 지나버렸으면 알람 발생 필요
// 1.3. Overflow가 나는 숫자라면, 보상할 것.
if (sectionStartAngle > encoderAllowedMaxDegree) {
if (sectionStartAngle > encoderAllowedMaxDegree)
{
sectionStartAngle -= encoderAllowedMaxDegree - encoderAllowedMinDegree;
_EncoderOverflowCount++;
}
@ -873,6 +924,7 @@ namespace ILSOS_CCW_H52A.Sequences
public bool GetRotaryCanExist(int jigNo)
{
return true;
if (jigNo <= _RotaryJigCount)
return _PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + (jigNo - 1)).data;
else
@ -882,7 +934,8 @@ namespace ILSOS_CCW_H52A.Sequences
private SequenceActionResult SetUploadWeldingList_SeqParams(SequenceContext context, string id, SequenceActionResult param)
{
//현재 시퀀스에서 LoadList를 해주기 때문에 Sub 시퀀스에 IncludeListStartEnd를 false로 넘겨줘야 함
SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam() {
SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam()
{
NeedSetLaserTiming = _ModulationMode,
IncludeListStartEnd = false,
CellMeasureCenterOffsetX = 0,
@ -898,7 +951,8 @@ namespace ILSOS_CCW_H52A.Sequences
private SequenceActionResult GetUploadWeldingList_SeqResult(SequenceContext context, string id, SequenceActionResult param)
{
var resultOutParam = param.Param as SeqUploadWeldingList_OutParam;
if (resultOutParam.Success == false) {
if (resultOutParam.Success == false)
{
//AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_ResultFailed);
return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_ResultFailed);
//return null;
@ -947,13 +1001,15 @@ namespace ILSOS_CCW_H52A.Sequences
_Scanner.SetEndList();
#region List 실행(처음엔 ExecuteList, 다음부터 AutoChangeList, 이후 대상 리스트 교체 (1 <-> 2))
if (isTheFirstListExecute) {
if (isTheFirstListExecute)
{
isTheFirstListExecute = false;
_Scanner.ExecuteList(_WeldingScannerListNo);
Log.I(string.Format($"START Welding : ExecuteList_{_WeldingScannerListNo}"));
}
else {
else
{
_Scanner.AutoChange();
Log.I(string.Format($"Next upload list : uploadList_{_WeldingScannerListNo}"));
}
@ -974,7 +1030,8 @@ namespace ILSOS_CCW_H52A.Sequences
{
double send_time_offset = 0.1;
while (!context.Stopped) {
while (!context.Stopped)
{
double encoderX, currentAngle;
_Scanner.GetEncoder(out encoderX, out currentAngle, true);
double CurrentPosPLC = GetRotaryCurrentPosition();
@ -987,12 +1044,17 @@ namespace ILSOS_CCW_H52A.Sequences
// Shift()는 메인 시퀀스에서만 호출되므로 루프 시작 시 캡처해도 안전.
var executeTarget = _CellScheduler.Prefetch1;
if (WeldingInPosition) {
if (executeTarget != null && executeTarget.IsCanExist && executeTarget.JigNo > 0) {
if (WeldingInPosition)
{
if (executeTarget != null && executeTarget.IsCanExist && executeTarget.JigNo > 0)
{
Log.I($"Fork Before Min Rotate Encoder X : ({encoderX}), Encoder Y : ({currentAngle}), PLC Rotary : ({CurrentPosPLC}), List {executeTarget.ListNo}, JigNo : ({executeTarget.JigNo})");
if (!_SystemParameter.BypassModeLBAD) {
if (!executeTarget.CheckSendCellinfo) {
if (currentAngle > executeTarget.StartAngle) {
if (!_SystemParameter.BypassModeLBAD)
{
if (!executeTarget.CheckSendCellinfo)
{
if (currentAngle > executeTarget.StartAngle)
{
executeTarget.CheckSendCellinfo = _StreamLightLBAD.SendCellInfo(executeTarget.LotId, executeTarget.CellId, _RecipeNo, _ModelNo, executeTarget.JigNo);
if (!executeTarget.CheckSendCellinfo)
@ -1006,9 +1068,11 @@ namespace ILSOS_CCW_H52A.Sequences
}
var LaserIO = _IO._iOUnit.ReadDiBit(Convert.ToInt32(eADIAddress.LaserOn));
var IsLaserOn = ChangeChecker.IsChangedBoolMonitoring("LaserOn", LaserIO, true);
if (IsLaserOn) {
if (executeTarget != null && executeTarget.IsCanExist && executeTarget.WeldStartTime == DateTime.MinValue) {
//var IsLaserOn = ChangeChecker.IsChangedBoolMonitoring("LaserOn", LaserIO, true);
if (true)
{
if (executeTarget != null && executeTarget.IsCanExist && executeTarget.WeldStartTime == DateTime.MinValue)
{
executeTarget.WeldStartTime = DateTime.Now;
executeTarget.WeldComplete = true;
Log.I($"Laser On, Welding Complete. JigNo : ({executeTarget.JigNo})");
@ -1021,7 +1085,8 @@ namespace ILSOS_CCW_H52A.Sequences
eListNo effectiveList = (!isBusy && (curList == eListNo.LIST1 || curList == eListNo.LIST2))
? eListNo.NONE : curList;
if (ChangeChecker.IsChangedInt("ListState", (int)effectiveList, out int prevListRaw)) {
if (ChangeChecker.IsChangedInt("ListState", (int)effectiveList, out int prevListRaw))
{
var prevList = (eListNo)prevListRaw;
if (prevList != eListNo.NONE)
Log.I($"[ListEnd] List {prevList} 종료 >> LaserOn({LaserIO}) EncoderY({currentAngle:F3}) JigNo({executeTarget?.JigNo})");
@ -1029,8 +1094,10 @@ namespace ILSOS_CCW_H52A.Sequences
Log.I($"[ListStart] List {effectiveList} 시작 >> LaserOn({LaserIO}) EncoderY({currentAngle:F3}) JigNo({executeTarget?.JigNo})");
}
for (int i = 0; i < _RotaryJigCount; i++) {
if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + i).data == false) {
for (int i = 0; i < _RotaryJigCount; i++)
{
if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + i).data == false)
{
_PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE_1 + i, false);
}
}
@ -1136,10 +1203,12 @@ namespace ILSOS_CCW_H52A.Sequences
//Jin : cycleStop 명령을 용접 프로그램에서 할 경우가 현재는 없음..
// CheckCycleStop 노드와 Complete 노드 사이 다른 노드가 필요하다면 해당 노드를 CheckCycleStop 노드 위로 올리자
bool cycleStop = false;
if (cycleStop) {
if (cycleStop)
{
return SEQ_SAVE_RESULT_DATA;
}
else {
else
{
return SEQ_CHECK_LOAD_COMPLETE;
}
}
@ -1148,7 +1217,8 @@ namespace ILSOS_CCW_H52A.Sequences
{
// ── 재시작 전 미완료 보고 우선 처리 ─────────────────────────────────────────
// SavePendingComplete()로 보존된 슬롯이 있으면 정상 파이프라인(Complete)보다 우선.
if (_CellScheduler.HasPendingComplete) {
if (_CellScheduler.HasPendingComplete)
{
var p = _CellScheduler.PendingComplete;
Log.I($"[PendingReport] 재시작 전 미완료 보고: LotId={p.LotId}, CellId={p.CellId}, JigNo={p.JigNo}");
return SEQ_REPORT_CELL_RESULT;
@ -1166,7 +1236,8 @@ namespace ILSOS_CCW_H52A.Sequences
private void SaveCellAPD()
{
if (Status.GetProcessingWeldingData().APD.Count > 0) {
if (Status.GetProcessingWeldingData().APD.Count > 0)
{
string directoryPath = "D:\\ILSOSConfig\\APD_History";
string fileName = DateTime.Now.ToString("HH") + "_CellAPD";
string fullPath = Path.Combine(directoryPath, Status.GetProcessingWeldingData().APD.First().Date.ToString("yyyy-MM-dd"), fileName);
@ -1190,7 +1261,8 @@ namespace ILSOS_CCW_H52A.Sequences
private SequenceActionResult InitConditionError(SequenceContext context, string id, SequenceActionResult param)
{
context.TryGetValue(ContextKey.KEY_SEQUENCE_ERROR_CODE, out int InitializeCode);
switch (InitializeCode) {
switch (InitializeCode)
{
case (int)InitErrorList.PLC_AUTORUN_BIT_OFF:
Log.D("AutoRun Sequence InitConditionError : PLC_AUTORUN_OFF");
return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_AutoRun_CheckInitCondition_PLC_AUTORUN_OFF);
@ -1224,7 +1296,8 @@ namespace ILSOS_CCW_H52A.Sequences
context.TryGetValue(ContextKey.KEY_SEQUENCE_RESULT, out bool seqResult);
SeqAutoRunCCWH52A_OutParam result = new SeqAutoRunCCWH52A_OutParam() { Success = seqResult };
if (seqResult == false) {
if (seqResult == false)
{
//AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_AutoRun_ResultFailed);
}
Log.D("AutoRun Sequence Complete");
@ -1236,7 +1309,8 @@ namespace ILSOS_CCW_H52A.Sequences
private bool RestoreDeviceStatus()
{
//PLC All BIT OFF
for (int i = 0; i < _RotaryJigCount; i++) {
for (int i = 0; i < _RotaryJigCount; i++)
{
_PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE_1 + i, false);
}
_PLC.WriteBit((int)eBitOutput.PC_AUTO_STATUS, false);
@ -1245,8 +1319,10 @@ namespace ILSOS_CCW_H52A.Sequences
//LBAD Ready Off
//_LBAD.SetReadybyAuto(false);
if (_SystemParameter.BypassModeLBAD == false) {
if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false) {
if (_SystemParameter.BypassModeLBAD == false)
{
if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false)
{
Log.I(string.Format($"[LBAD Interface]CheckReadyStatus null"));
}
}
@ -1295,7 +1371,8 @@ namespace ILSOS_CCW_H52A.Sequences
{
Status.EquipmentMode = eEquipmentMode.MANUAL;
foreach (var info in ProcessManager.Instance.ReceivedCellInfoQueue.Select((value, index) => (value, index))) {
foreach (var info in ProcessManager.Instance.ReceivedCellInfoQueue.Select((value, index) => (value, index)))
{
Log.I($"[{info.index}]Queue >> CellId({info.value.CellId}) LotId({info.value.LotId})");
}
@ -1313,8 +1390,10 @@ namespace ILSOS_CCW_H52A.Sequences
//LBAD Ready Off
//_LBAD.SetReadybyAuto(false);
if (_SystemParameter.BypassModeLBAD == false) {
if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false) {
if (_SystemParameter.BypassModeLBAD == false)
{
if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false)
{
Log.I(string.Format($"[LBAD Interface]CheckReadyStatus null"));
}
}

View File

@ -104,7 +104,7 @@
<Button Grid.Row="0" Grid.Column="2" Margin="3" Command="{Binding CMD_Reset}" Content="Reset" CommandParameter="TotalProduct" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Grid.Row="1" Grid.Column="2" Margin="3" Command="{Binding CMD_Reset}" Content="Reset" CommandParameter="TodayProduct" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<UniformGrid Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Rows="7">
<UniformGrid Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Rows="8">
<usercontrols:UCKeyValueString Height="30" KeyText="Date Time" ValueText="{Binding NowDateTime, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="AutoRun Start Time" ValueText="{Binding CurrentWeldingData.AutoRunStartTime, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Weld Start Time" ValueText="{Binding CurrentWeldingData.WeldingStartTime, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" IsReadOnly="True"/>
@ -112,6 +112,7 @@
<usercontrols:UCKeyValueString Height="30" KeyText="Welding Time (ms)" ValueText="{Binding CurrentWeldingData.WeldingSpanTimeMilliseconds}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Lot ID" ValueText="{Binding CurrentWeldingData.LotId}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Cell ID" ValueText="{Binding CurrentWeldingData.CellId}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" ValueTextSize="11" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Head No" ValueText="{Binding CurrentWeldingData.JigNo}" KeyHorizontalAlignment="Right" KeyTextWidth="0.8*" ValueTextSize="11" IsReadOnly="True"/>
</UniformGrid>
</Grid>
</GroupBox>

View File

@ -25,6 +25,7 @@ using System.Windows.Controls;
using Aurora.Api.Manager;
using System.Windows;
using WeldingCommon.Recipes;
using System.Threading;
namespace ILSOS_CCW_H52A.Views
{
@ -147,28 +148,38 @@ namespace ILSOS_CCW_H52A.Views
}
}
private void start()
{
Thread.Sleep(3000);
RunSequenceAutoRun();
}
private void PerformCmdRunSequenceAutoRun(object obj)
{
var result = MessageUtil.ShowYesNoMessageDialog("AutoRun Sequence", "Start AutoRun Sequence?");
if (result == false) {
if (result == false)
{
return;
}
if (VisionRecipeManager.GetFovInfos().Count == 0) {
if (VisionRecipeManager.GetFovInfos().Count == 0)
{
MessageUtil.ShowWarningToast(string.Format("Please check the Vision Recipe of the currently active Recipe."));
return;
}
if (_SeqAutoRun.RunState == SequenceRunState.Running) {
if (_SeqAutoRun.RunState == SequenceRunState.Running)
{
MessageUtil.ShowWarningToast(string.Format("이미 시퀀스가 Start 상태입니다.", "SeqAutoRunCCWH52A"));
return;
}
RunSequenceAutoRun();
th = new Thread(start);
th.Start();
}
Thread th;
private void OnAutoRunStartRequest()
{
RunSequenceAutoRun();

View File

@ -29,33 +29,43 @@ namespace WeldingCommon.Data
table.Columns.Add(nameof(ActualProcessUnit.LotID), typeof(string));
table.Columns.Add(nameof(ActualProcessUnit.CellID), typeof(string));
table.Columns.Add(nameof(ActualProcessUnit.HeadNo), typeof(string));
table.Columns.Add(nameof(ActualProcessUnit.WeldType), typeof(string));
table.Columns.Add(nameof(ActualProcessUnit.EncoderCheck), typeof(bool));
table.Columns.Add(nameof(ActualProcessUnit.StartPointX), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.StartPointY), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.EndPointX), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.EndPointY), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.WeldCondition), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.LaserOnDelay), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.LaserOffDelay), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.JumpDelay), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.MarkDelay), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.PolygonDelay), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.PowerCore), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.PowerRing), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.JumpSpeed), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.MarkSpeed), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.JumpX), typeof(double));
table.Columns.Add(nameof(ActualProcessUnit.JumpY), typeof(double));
}
//table.Columns.Add(nameof(ActualProcessUnit.WeldType), typeof(string));
for (int i = 0; i < 16; i++)
TableColumnsAdd("_" + (i + 1).ToString());
}
public void TableClear()
{
table.Clear();
}
public void TableColumnsAdd(string objectNo)
{
table.Columns.Add(nameof(ActualProcessParameter.WeldType) + objectNo, typeof(string));
table.Columns.Add(nameof(ActualProcessParameter.StartPointX) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.StartPointY) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.EndPointX) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.EndPointY) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.WeldCondition) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.LaserOnDelay) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.LaserOffDelay) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.JumpDelay) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.MarkDelay) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.PolygonDelay) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.PowerCore) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.PowerRing) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.JumpSpeed) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.MarkSpeed) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.JumpX) + objectNo, typeof(double));
table.Columns.Add(nameof(ActualProcessParameter.JumpY) + objectNo, typeof(double));
}
public void CreateFiles(string fullPathNoExt, ExportFormat format = ExportFormat.CSV)
{
if (fullPathNoExt == null)
return;
if(format == ExportFormat.CSV)
CSV_Manager.GetInstance().Save_DataTableToCsv(fullPathNoExt, table);
if (format == ExportFormat.CSV)
CSV_Manager.GetInstance().Save_DataTableToCsv(fullPathNoExt, table);
Clear();
}
@ -63,12 +73,55 @@ namespace WeldingCommon.Data
protected override void InsertItem(int index, ActualProcessUnit item)
{
base.InsertItem(index, item);
table.Rows.Add(item.Date.ToString("yyyy-MM-dd"), item.Date.ToString("HH:mm:ss.fff"), item.LotID, item.CellID, item.HeadNo, item.WeldType, item.EncoderCheck,
item.StartPointX, item.StartPointY, item.EndPointX, item.EndPointY,
item.WeldCondition, item.LaserOnDelay, item.LaserOffDelay, item.JumpDelay, item.MarkDelay,
item.PolygonDelay, item.PowerCore, item.PowerRing, item.JumpSpeed, item.MarkSpeed, item.JumpX,
item.JumpY);
var values = new List<object>();
// 공통값 1회만 추가
values.Add(item.Date.ToString("yyyy-MM-dd"));
values.Add(item.Date.ToString("HH:mm:ss.fff"));
values.Add(item.LotID);
values.Add(item.CellID);
values.Add(item.HeadNo);
values.Add(item.EncoderCheck);
// ParamAPD[0] ~ [15] 반복 추가
for (int i = 0; i < item.ParamAPD.Count; i++)
{
var apd = item.ParamAPD[i];
values.Add(apd.WeldType);
values.Add(apd.StartPointX);
values.Add(apd.StartPointY);
values.Add(apd.EndPointX);
values.Add(apd.EndPointY);
values.Add(apd.WeldCondition);
values.Add(apd.LaserOnDelay);
values.Add(apd.LaserOffDelay);
values.Add(apd.JumpDelay);
values.Add(apd.MarkDelay);
values.Add(apd.PolygonDelay);
values.Add(apd.PowerCore);
values.Add(apd.PowerRing);
values.Add(apd.JumpSpeed);
values.Add(apd.MarkSpeed);
values.Add(apd.JumpX);
values.Add(apd.JumpY);
}
table.Rows.Add(values.ToArray());
}
//DataRow row = table.NewRow();
// for (int i = 0; i < item.ParamAPD.Count; i++)
// {
// table.Rows.Add(item.Date.ToString("yyyy-MM-dd"), item.Date.ToString("HH:mm:ss.fff"), item.LotID, item.CellID, item.HeadNo, item.WeldType, item.EncoderCheck,
// item.ParamAPD[0].StartPointX, item.ParamAPD[0].StartPointY, item.ParamAPD[0].EndPointX, item.ParamAPD[0].EndPointY,
// item.ParamAPD[0].WeldCondition, item.ParamAPD[0].LaserOnDelay, item.ParamAPD[0].LaserOffDelay, item.ParamAPD[0].JumpDelay, item.ParamAPD[0].MarkDelay,
// item.ParamAPD[0].PolygonDelay, item.ParamAPD[0].PowerCore, item.ParamAPD[0].PowerRing, item.ParamAPD[0].JumpSpeed, item.ParamAPD[0].MarkSpeed, item.ParamAPD[0].JumpX,
// item.ParamAPD[0].JumpY);
// }
//}
public void UpdateHeadNo(string headNo)
{
foreach (var item in this)
@ -94,10 +147,19 @@ namespace WeldingCommon.Data
private string _CellID;
public string HeadNo { get => _HeadNo; set => SetProperty(ref _HeadNo, value); }
private string _HeadNo;
public string WeldType { get => _WeldType; set => SetProperty(ref _WeldType, value); }
private string _WeldType;
public bool EncoderCheck { get => _EncoderCheck; set => SetProperty(ref _EncoderCheck, value); }
private bool _EncoderCheck;
public List<ActualProcessParameter> ParamAPD { get => _ParamAPD; set => SetProperty(ref _ParamAPD, value); }
private List<ActualProcessParameter> _ParamAPD = new List<ActualProcessParameter>();
}
public class ActualProcessParameter : NotifyPropertyChangedBase
{
public string WeldType { get => _WeldType; set => SetProperty(ref _WeldType, value); }
private string _WeldType;
public double StartPointX { get => _StartPointX; set => SetProperty(ref _StartPointX, value); }
private double _StartPointX;
public double StartPointY { get => _StartPointY; set => SetProperty(ref _StartPointY, value); }

View File

@ -59,6 +59,8 @@ namespace WeldingCommon.Data
// <EDC, SeqAutoRunSMW, SeqAutoRunLHS_Normal, SeqReceiveCellInfo>
private string _WorkJigNo;
public string WorkJigNo { get => _WorkJigNo; set => SetProperty(ref _WorkJigNo, value); }
private string _WorkCellId;
public string WorkCellId { get => _WorkCellId; set => SetProperty(ref _WorkCellId, value); }
private string _WorkLotId;
@ -84,8 +86,8 @@ namespace WeldingCommon.Data
public string MarkSpeed { get => _MarkSpeed; set => SetProperty(ref _MarkSpeed, value); }
private string _FocalLength;
public string FocalLength { get => _FocalLength; set => SetProperty(ref _FocalLength, value); }
private string _WeldingJigNo;
public string WeldingJigNo { get => _WeldingJigNo; set => SetProperty(ref _WeldingJigNo, value); }
private string _JigNo;
public string JigNo { get => _JigNo; set => SetProperty(ref _JigNo, value); }
private string _LaserPowerByLBAD;
public string LaserPowerByLBAD { get => _LaserPowerByLBAD; set => SetProperty(ref _LaserPowerByLBAD, value); }
@ -127,7 +129,7 @@ namespace WeldingCommon.Data
this.LaserPowerRing = string.Empty;
this.MarkSpeed = string.Empty;
this.FocalLength = string.Empty;
this.WeldingJigNo = string.Empty;
this.JigNo = string.Empty;
this.LaserPowerByLBAD = string.Empty;
this.CheckCanExist = false;
this.CheckScannerListEnd = false;
@ -155,7 +157,7 @@ namespace WeldingCommon.Data
clone._LaserPowerRing = _LaserPowerRing;
clone._MarkSpeed = _MarkSpeed;
clone._FocalLength = _FocalLength;
clone._WeldingJigNo = _WeldingJigNo;
clone._JigNo = _JigNo;
clone._LaserPowerByLBAD = _LaserPowerByLBAD;
clone._CheckCanExist = _CheckCanExist;
clone._CheckScannerListEnd = _CheckScannerListEnd;

View File

@ -69,6 +69,7 @@ namespace WeldingCommon.Sequences {
private static DateTime _UploadstartTime;
private static TimeSpan _UploadSpanTime;
public ActualProcessUnit LaserAPD;
private double Rotation_Degree = 0;
public SequenceBuilder Builder()
@ -116,6 +117,8 @@ namespace WeldingCommon.Sequences {
_LaserPowerCalParam = context.GetSetting<LaserPowerCalParam>(CommonSettingIds.LaserPowerCalParam);//우선 AuroraRecipe로 상속받아서 함수 사용하도록 함
_SystemParameter = context.GetSetting<SystemParameter>(CommonSettingIds.SystemParameter);
LaserAPD = new ActualProcessUnit();
InitDev(context);
if (!CheckDeviceReady(context)) { //Check Device
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_DeviceNotReady);
@ -283,8 +286,15 @@ namespace WeldingCommon.Sequences {
_ExternalCommandOffset.X = (float)_InitParam.CellMeasureCenterOffsetX;
_ExternalCommandOffset.Y = (float)_InitParam.CellMeasureCenterOffsetY;
LaserAPD.Date = DateTime.Now;
LaserAPD.LotID = Status.GetProcessingWeldingData().WorkLotId;
LaserAPD.CellID = Status.GetProcessingWeldingData().WorkCellId;
LaserAPD.HeadNo = Status.GetProcessingWeldingData().WorkJigNo;
int drawObjectCount = FuncLoadDrawObjectScannerParam(_InitParam.SelectedDrawObjectList);
Status.GetProcessingWeldingData().APD.Add(LaserAPD);
LaserAPD = null;
return SequenceAction.Ok();
}
@ -401,14 +411,13 @@ namespace WeldingCommon.Sequences {
// 1. 스캐너 가공 조건 설정
// TODO: ScannerCanvasUserCtrl 의 값이 제대로 가져와 지는지 확인 필요함. mainPage 로 접근해서 가져와야 할 것인데.
ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[obj.ScannerParamNo];
var laserLog = new ActualProcessUnit();
var laserLog = new ActualProcessParameter();
float percentLaser1 = 0.0f;
float percentLaser2 = 0.0f;
SetScannerProcessCondition(param, out percentLaser1, out percentLaser2);
Log.I(string.Format($"[Line Weld] Weld Condition(No:{param.No + 1}) Setting(LaserOnDelay:{param.LaserOnDelay},LaserOffDelay:{param.LaserOffDelay},JumpDelay:{param.JumpDelay},MarkDelay:{param.MarkDelay},PolygonDelay:{param.PolygonDelay},CorePower:{param.LaserPower1},RingPower:{param.LaserPower2},JumpSpeed:{param.JumpSpeed},MarkSpeed:{param.MarkSpeed})"));
//CSV Laser Log 추가
laserLog.Date = DateTime.Now;
laserLog.WeldType = "Line";
laserLog.WeldCondition = param.No + 1;
laserLog.LaserOnDelay = param.LaserOnDelay;
@ -739,9 +748,8 @@ namespace WeldingCommon.Sequences {
laserLog.StartPointY = obj.PF1.Y;
laserLog.EndPointX = obj.PF2.X;
laserLog.EndPointY = obj.PF2.Y;
laserLog.LotID = Status.GetProcessingWeldingData().WorkLotId;
laserLog.CellID = Status.GetProcessingWeldingData().WorkCellId;
Status.GetProcessingWeldingData().APD.Add(laserLog);
LaserAPD.ParamAPD.Add(laserLog);
}
private void LoadDotScannerParam(Dot obj)
@ -1426,7 +1434,7 @@ namespace WeldingCommon.Sequences {
// 1.스캐너 가공조건 설정
ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[obj.ScannerParamNo];
var laserLog = new ActualProcessUnit();
var laserParamLog = new ActualProcessParameter();
float percentLaser1 = 0;
float percentLaser2 = 0;
SetScannerProcessCondition(param, out percentLaser1, out percentLaser2);
@ -1434,18 +1442,17 @@ namespace WeldingCommon.Sequences {
Log.I(string.Format($"[Arc Weld] Weld Condition(No:{param.No + 1}) Setting(LaserOnDelay:{param.LaserOnDelay},LaserOffDelay:{param.LaserOffDelay},JumpDelay:{param.JumpDelay},MarkDelay:{param.MarkDelay},PolygonDelay:{param.PolygonDelay},CorePower:{param.LaserPower1},RingPower:{param.LaserPower2},JumpSpeed:{param.JumpSpeed},MarkSpeed:{param.MarkSpeed})"));
//CSV Laser Log 추가
laserLog.Date = DateTime.Now;
laserLog.WeldType = "Arc";
laserLog.WeldCondition = param.No + 1;
laserLog.LaserOnDelay = param.LaserOnDelay;
laserLog.LaserOffDelay = param.LaserOffDelay;
laserLog.JumpDelay = param.JumpDelay;
laserLog.MarkDelay = param.MarkDelay;
laserLog.PolygonDelay = param.PolygonDelay;
laserLog.PowerCore = param.LaserPower1;
laserLog.PowerRing = param.LaserPower2;
laserLog.JumpSpeed = param.JumpSpeed;
laserLog.MarkSpeed = param.MarkSpeed;
laserParamLog.WeldType = "Arc";
laserParamLog.WeldCondition = param.No + 1;
laserParamLog.LaserOnDelay = param.LaserOnDelay;
laserParamLog.LaserOffDelay = param.LaserOffDelay;
laserParamLog.JumpDelay = param.JumpDelay;
laserParamLog.MarkDelay = param.MarkDelay;
laserParamLog.PolygonDelay = param.PolygonDelay;
laserParamLog.PowerCore = param.LaserPower1;
laserParamLog.PowerRing = param.LaserPower2;
laserParamLog.JumpSpeed = param.JumpSpeed;
laserParamLog.MarkSpeed = param.MarkSpeed;
// 2. 스캐너 가공 작업
// 2.1. Wobbel 관련 설정
@ -1672,13 +1679,11 @@ namespace WeldingCommon.Sequences {
_LastY = obj.PF2.Y + yOffset;
//CSV Laser Log 추가
laserLog.StartPointX = obj.PF1.X;
laserLog.StartPointY = obj.PF1.Y;
laserLog.EndPointX = obj.PF2.X;
laserLog.EndPointY = obj.PF2.Y;
laserLog.LotID = Status.GetProcessingWeldingData().WorkLotId;
laserLog.CellID = Status.GetProcessingWeldingData().WorkCellId;
Status.GetProcessingWeldingData().APD.Add(laserLog);
laserParamLog.StartPointX = obj.PF1.X;
laserParamLog.StartPointY = obj.PF1.Y;
laserParamLog.EndPointX = obj.PF2.X;
laserParamLog.EndPointY = obj.PF2.Y;
LaserAPD.ParamAPD.Add(laserParamLog);
if (obj.MadebyRCC) {
Log.I(string.Format($"[RCC SubPath Arc Weld] Arc center ({obj.CenterPointF.X + xOffset},{obj.CenterPointF.Y + yOffset}), Sweep angle : ({obj.SweepAngle})"));
@ -1696,7 +1701,7 @@ namespace WeldingCommon.Sequences {
// 1.스캐너 가공조건 설정
ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[obj.ScannerParamNo];
var laserLog = new ActualProcessUnit();
var laserLog = new ActualProcessParameter();
float percentLaser1 = 0;
float percentLaser2 = 0;
SetScannerProcessCondition(param, out percentLaser1, out percentLaser2);
@ -1704,7 +1709,6 @@ namespace WeldingCommon.Sequences {
Log.I(string.Format($"[Arc3P Weld] Weld Condition(No:{param.No + 1}) Setting(LaserOnDelay:{param.LaserOnDelay},LaserOffDelay:{param.LaserOffDelay},JumpDelay:{param.JumpDelay},MarkDelay:{param.MarkDelay},PolygonDelay:{param.PolygonDelay},CorePower:{param.LaserPower1},RingPower:{param.LaserPower2},JumpSpeed:{param.JumpSpeed},MarkSpeed:{param.MarkSpeed})"));
//CSV Laser Log 추가
laserLog.Date = DateTime.Now;
laserLog.WeldType = "Arc3";
laserLog.WeldCondition = param.No + 1;
laserLog.LaserOnDelay = param.LaserOnDelay;
@ -1947,9 +1951,7 @@ namespace WeldingCommon.Sequences {
laserLog.StartPointY = obj.PF1.Y;
laserLog.EndPointX = obj.PF2.X;
laserLog.EndPointY = obj.PF2.Y;
laserLog.LotID = Status.GetProcessingWeldingData().WorkLotId;
laserLog.CellID = Status.GetProcessingWeldingData().WorkCellId;
Status.GetProcessingWeldingData().APD.Add(laserLog);
LaserAPD.ParamAPD.Add(laserLog);
if (obj.MadebyRCC) {
Log.I(string.Format($"[RCC SubPath Arc3P Weld] Arc center ({obj.CenterPointF.X + xOffset},{obj.CenterPointF.Y + yOffset}), Sweep angle : ({obj.SweepAngle})"));