Compare commits

..

No commits in common. "027a1e32565b71b27277f5313c3fc0732c409726" and "fe085cd0c1a072459ec06ab1495b1a59b499c5a1" have entirely different histories.

54 changed files with 2490 additions and 2725 deletions

View File

@ -643,7 +643,7 @@ namespace AuroraACS
return intValue; return intValue;
} }
//Log.E($"ReadVariable {VariableName} Error : " + result); // 잠시 주석 26.04.14 - 로그 많이 찍힘 - VariableName 확인 필요 Log.E($"ReadVariable {VariableName} Error : " + result);
return 0; return 0;
} }
@ -773,7 +773,7 @@ namespace AuroraACS
} }
} catch (Exception exc) { } catch (Exception exc) {
if (!IsSimul) { if (!IsSimul) {
//Log.E($"ReadVariable {VariableName} Exception : " + exc.Message); // 26.04.14 잠시 주석 - 로그가 너무 많이 찍힘 VariableName 확인 필요 Log.E($"ReadVariable {VariableName} Exception : " + exc.Message);
return null; return null;
} }
return null; return null;

View File

@ -281,9 +281,9 @@ namespace AuroraIO
Log.I(string.Format($"파일({fileName})이 존재하지 않습니다. Device Config의 File 경로를 확인하세요.")); Log.I(string.Format($"파일({fileName})이 존재하지 않습니다. Device Config의 File 경로를 확인하세요."));
return 0; return 0;
StreamWriter writer = new StreamWriter(fileName, false, System.Text.Encoding.Unicode); //StreamWriter writer = new StreamWriter(fileName, false, System.Text.Encoding.Unicode);
writer.WriteLine("Index,Address,ID,IoType,ActiveLevel,BoardNo,Description,HighNecCond,LowNecCond,HighSensor,LowSensor,WaitInterlockTimeOut,WaitSensorTimeOut,HighSufCond,LowSufCond"); //writer.WriteLine("Index,Address,ID,IoType,ActiveLevel,BoardNo,Description,HighNecCond,LowNecCond,HighSensor,LowSensor,WaitInterlockTimeOut,WaitSensorTimeOut,HighSufCond,LowSufCond");
writer.Close(); //writer.Close();
} }
StreamReader sr = new StreamReader(fileName, System.Text.Encoding.Default); StreamReader sr = new StreamReader(fileName, System.Text.Encoding.Default);

View File

@ -395,7 +395,7 @@ namespace AuroraLaser
ReadNode[nTargetCommand + 1].dRet = dData * 0.25; ReadNode[nTargetCommand + 1].dRet = dData * 0.25;
} else { } else {
//To Do : AlarmLog 수정할 것 //To Do : AlarmLog 수정할 것
Logger.E("LASER_POWER Invalid Data received " + strReceiveMsgTotal); // 04 14 Logger.E("LASER_POWER Invalid Data received " + strReceiveMsgTotal);
//UtilUnit.logUnit.SetLog(LogUnit.eLogType.DEBUG, MethodBase.GetCurrentMethod().Name, "LASER_POWER Invalid Data received " + strReceiveMsgTotal); //UtilUnit.logUnit.SetLog(LogUnit.eLogType.DEBUG, MethodBase.GetCurrentMethod().Name, "LASER_POWER Invalid Data received " + strReceiveMsgTotal);
} }

View File

@ -350,33 +350,6 @@ namespace AuroraLaserScanner
} }
_scannerObj.WaitForEncoderX(position); _scannerObj.WaitForEncoderX(position);
} }
public void WaitForEncoderY(double position)
{
if (!IsActivated)
{
return;
}
_scannerObj.WaitForEncoderY(position);
}
public void GetListPointer(out eListNo list_no, out uint list_pos)
{
list_no = eListNo.LIST1;
list_pos = 0;
if (!IsActivated)
{
return;
}
_scannerObj.GetListPointer(out list_no, out list_pos);
}
public void SetFlyY(double encoderResolution)
{
if (!IsActivated)
{
return;
}
_scannerObj.SetFlyY(encoderResolution);
}
public void WaitForEncoderRotateX(double angle) public void WaitForEncoderRotateX(double angle)
{ {

View File

@ -69,11 +69,6 @@ namespace AuroraLaserScanner
public double MarkingOntheFlyOffsetY { get; set; } public double MarkingOntheFlyOffsetY { get; set; }
public double MarkingOntheFlyParkingPositionX { get; set; } public double MarkingOntheFlyParkingPositionX { get; set; }
public double MarkingOntheFlyParkingPositionY { get; set; } public double MarkingOntheFlyParkingPositionY { get; set; }
public double MarkingStartX_1 { get; set; }
public double MarkingStartX_2 { get; set; }
public double XDiff_Page1and2 { get; set; }
public double XDiff_Page3and4 { get; set; }
public eWaitEncoderMode MarkingStartWaitMode { get; set; } public eWaitEncoderMode MarkingStartWaitMode { get; set; }
public eOntheFlyCoordinate OnTheFlyCoordinate { get; set; } public eOntheFlyCoordinate OnTheFlyCoordinate { get; set; }
public double FlySpeedInterlock { get; set; } public double FlySpeedInterlock { get; set; }

View File

@ -315,7 +315,6 @@ namespace AuroraLaserScanner
public abstract void SetConfigList(uint mem1, uint mem2); public abstract void SetConfigList(uint mem1, uint mem2);
public abstract uint GetListSpace(); public abstract uint GetListSpace();
#endregion #endregion
public abstract void GetListPointer(out eListNo list_no, out uint list_pos);
public void WaitForListTaskCompleted(int timeOut, SequenceContext context = null) //단위는 초 public void WaitForListTaskCompleted(int timeOut, SequenceContext context = null) //단위는 초
{ {
TimeSpan spanTime; TimeSpan spanTime;

View File

@ -1109,12 +1109,5 @@ namespace AuroraLaserScanner
{ {
return RTC5Wrap.get_last_error(); return RTC5Wrap.get_last_error();
} }
public override void GetListPointer(out eListNo list_no, out uint list_pos)
{
uint listNo = 0;
RTC5Wrap.get_list_pointer(out listNo, out list_pos);
list_no = (eListNo)listNo;
}
} }
} }

View File

@ -1121,12 +1121,6 @@ namespace AuroraLaserScanner
{ {
return RTC6Wrap.get_last_error(); return RTC6Wrap.get_last_error();
} }
public override void GetListPointer(out eListNo list_no, out uint list_pos)
{
uint listNo = 0;
RTC6Wrap.get_list_pointer(out listNo, out list_pos);
list_no = (eListNo)listNo;
}
#region 26.04.08 NDY - 오차 추적 메소드 OVERRIDE 추가 RTC6 (자식클래스 -실제 RTC6Wrap전달 지점) #region 26.04.08 NDY - 오차 추적 메소드 OVERRIDE 추가 RTC6 (자식클래스 -실제 RTC6Wrap전달 지점)
//public override void SetFlyLimit(uint portNo,int xMin, int xMax , int yMin,int yMax ) //public override void SetFlyLimit(uint portNo,int xMin, int xMax , int yMin,int yMax )

View File

@ -569,10 +569,5 @@ namespace AuroraLaserScanner
return 0; return 0;
} }
public override void GetListPointer(out eListNo list_no, out uint list_pos)
{
list_no = eListNo.LIST1;
list_pos = 0;
}
} }
} }

View File

@ -172,7 +172,7 @@ namespace MilUI {
public void DrawGuideLines() { public void DrawGuideLines() {
var calFovRecipe = VisionRecipeManager.GetCalFovRecipe(_FovInfo); var calFovRecipe = VisionRecipeManager.GetCalFovRecipe(_FovInfo);
var centerPos = new ImagePoint(_ImageSize.Width / 2, _ImageSize.Height / 2); var centerPos = new ImagePoint(_ImageSize.Width / 2, _ImageSize.Height / 2);
var color = MIL.M_COLOR_RED; // Orange var color = MIL.M_RGB888(255, 165, 0); // Orange
_gridGuideLine.DrawGuideLines(_ImageSize, centerPos, 1, color, calFovRecipe.ErrRotationX); _gridGuideLine.DrawGuideLines(_ImageSize, centerPos, 1, color, calFovRecipe.ErrRotationX);
//_gridGuideLine.DrawRefLine(_ImageSize, calFovRecipe.ErrRotationX); //_gridGuideLine.DrawRefLine(_ImageSize, calFovRecipe.ErrRotationX);

View File

@ -97,11 +97,11 @@ namespace MilUI {
if (gridMode == eGridMode.Narrow) { if (gridMode == eGridMode.Narrow) {
DrawGuideLines(imageSize, centerPos, 11, MIL.M_COLOR_LIGHT_GRAY, errRotation); DrawGuideLines(imageSize, centerPos, 11, MIL.M_COLOR_LIGHT_GRAY, errRotation);
DrawGuideLines(imageSize, centerPos, 1, MIL.M_COLOR_RED, errRotation); DrawGuideLines(imageSize, centerPos, 1, COLOR_ORANGE, errRotation);
} }
else { else {
DrawGuideLines(imageSize, centerPos, 5, MIL.M_COLOR_LIGHT_GRAY, errRotation); DrawGuideLines(imageSize, centerPos, 5, MIL.M_COLOR_LIGHT_GRAY, errRotation);
DrawGuideLines(imageSize, centerPos, 1, MIL.M_COLOR_RED, errRotation); DrawGuideLines(imageSize, centerPos, 1, COLOR_ORANGE, errRotation);
} }
} }

View File

@ -36,8 +36,7 @@ namespace MilUI {
_milGraphics = new MilGraphics(_displayId, _graphicListId); _milGraphics = new MilGraphics(_displayId, _graphicListId);
_tempMilGraphics = new MilGraphics(_displayId, _graphicListId); _tempMilGraphics = new MilGraphics(_displayId, _graphicListId);
_colors = new List<MIL_INT>() { _colors = new List<MIL_INT>() {
//MIL.M_COLOR_YELLOW, MIL.M_COLOR_YELLOW,
MIL.M_COLOR_GREEN,
MIL.M_COLOR_MAGENTA MIL.M_COLOR_MAGENTA
}; };
} }

View File

@ -7,8 +7,7 @@ using System.Threading.Tasks;
namespace ILSOS_PrismaticGun.Device.ACS namespace ILSOS_PrismaticGun.Device.ACS
{ {
public partial class PrismaticGunACS public partial class PrismaticGunACS
{ { const string AlarmReset = "iAlarmreset";
const string AlarmReset = "iAlarmreset";
const string HeavyAlarm = "iAlarm"; const string HeavyAlarm = "iAlarm";
const string LightAlarm = "iLightAlarm"; const string LightAlarm = "iLightAlarm";
const string AlarmCodes = "iPCAlarmNo"; // 10개 const string AlarmCodes = "iPCAlarmNo"; // 10개

View File

@ -106,10 +106,10 @@ namespace ILSOS_PrismaticGun.Device.ACS
_calibration = env.SettingEntry[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam; _calibration = env.SettingEntry[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam;
_teachingSetting = env.SettingEntry[SettingIds.TeachingPos] as TeachingPositionSetting; _teachingSetting = env.SettingEntry[SettingIds.TeachingPos] as TeachingPositionSetting;
//MotorX1 = env.DeviceManager[MotorIds.AxisX1] as ACSMotor; MotorX1 = env.DeviceManager[MotorIds.AxisX1] as ACSMotor;
MotorX2 = env.DeviceManager[MotorIds.AxisX2] as ACSMotor; MotorX2 = env.DeviceManager[MotorIds.AxisX2] as ACSMotor;
//MotorY1 = env.DeviceManager[MotorIds.AxisY1] as ACSMotor; MotorY1 = env.DeviceManager[MotorIds.AxisY1] as ACSMotor;
//MotorY2 = env.DeviceManager[MotorIds.AxisY2] as ACSMotor; MotorY2 = env.DeviceManager[MotorIds.AxisY2] as ACSMotor;
MotorZ = env.DeviceManager[MotorIds.AxisZ] as ACSMotor; MotorZ = env.DeviceManager[MotorIds.AxisZ] as ACSMotor;

View File

@ -24,7 +24,6 @@ namespace ILSOS_PrismaticScanner.Alarm
// High Alarm 은 Sequence 정지 // High Alarm 은 Sequence 정지
if (alarm.Level == AlarmLevel.H) { if (alarm.Level == AlarmLevel.H) {
StopSequence(SequenceIds.SeqAutoRun); StopSequence(SequenceIds.SeqAutoRun);
StopSequence(SequenceIds.SeqAutoRunACS); // 26.04.15 추가
} }
} }
} }

View File

@ -17,8 +17,8 @@ namespace ILSOS_PrismaticScanner
internal class MotorIds internal class MotorIds
{ {
public const string AxisX2 = "AxisX2"; public const string AxisX2 = "AxisX2";
//public const string AxisY1 = "AxisY1"; public const string AxisY1 = "AxisY1";
//public const string AxisY2 = "AxisY2"; public const string AxisY2 = "AxisY2";
public const string AxisZ = "AxisZ"; public const string AxisZ = "AxisZ";
// TODO: 이정인 선임 ACS 변수 맵 수신 후 실제 번호 검증 // TODO: 이정인 선임 ACS 변수 맵 수신 후 실제 번호 검증
@ -41,6 +41,9 @@ namespace ILSOS_PrismaticScanner
public const string SeqAlarmMonitor = "SeqAlarmMonitor"; public const string SeqAlarmMonitor = "SeqAlarmMonitor";
public const string SeqStatusMonitor = "SeqStatusMonitor"; public const string SeqStatusMonitor = "SeqStatusMonitor";
// 26.04.09 NDY - ACS MOTF AutoRun - > SeqAutoRun은 CommonSequenceIds에 존재함.
public const string SeqAutoRunACS = "SeqAutoRunACS";
} }
public class StreamMessageNames public class StreamMessageNames

View File

@ -98,17 +98,17 @@ namespace ILSOS_PrismaticScanner
await ActivateDevices(); await ActivateDevices();
} }
//AuroraEx.RegisterRmsHandler<RMSHandlerForScanner>(); AuroraEx.RegisterRmsHandler<RMSHandlerForScanner>();
//AuroraEnv.RecipeManager.RmsHandler().RegistryDeviceHandler(AuroraEnv); AuroraEnv.RecipeManager.RmsHandler().RegistryDeviceHandler(AuroraEnv);
//AuroraEnv.RecipeManager.RmsHandler().Start(); AuroraEnv.RecipeManager.RmsHandler().Start();
// [Singleton Instance] Recipe Change History // [Singleton Instance] Recipe Change History
//AuroraEnv.RecipeManager.RchHandler().RegistryDeviceHandler(AuroraEnv); AuroraEnv.RecipeManager.RchHandler().RegistryDeviceHandler(AuroraEnv);
//AlarmMonitroing Seq Start //AlarmMonitroing Seq Start
//AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Start(); AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Start();
//AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Start(); AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Start();
//AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Start(); AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Start();
base.OnStartUp(); base.OnStartUp();
@ -116,9 +116,9 @@ namespace ILSOS_PrismaticScanner
public override void OnShutDown() public override void OnShutDown()
{ {
// 모니터링 시퀀스 먼저 종료 // 모니터링 시퀀스 먼저 종료
//AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Stop(); AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Stop();
//AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Stop(); AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Stop();
//AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Stop(); AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Stop();
Thread.Sleep(200); Thread.Sleep(200);
base.OnShutDown(); base.OnShutDown();
@ -145,6 +145,24 @@ namespace ILSOS_PrismaticScanner
var isSimul = ApplicationExt.IsSimulation; var isSimul = ApplicationExt.IsSimulation;
//registry.Register(CommonDeviceIds.OCT, () => new OCT(CommonDeviceIds.OCT, isSimul), new OCTConfig(),
// device => new UCOCTDevice() { DataContext = new UCOCTDeviceViewModel(AuroraEnv, CommonDeviceIds.OCT) });
//registry.Register(CommonDeviceIds.LBAD, () => new LBAD(CommonDeviceIds.LBAD, isSimul), new LBADConfig());
//registry.Register(CommonDeviceIds.CellTracker, () => new CellTracker(CommonDeviceIds.CellTracker, eCellTrackerType.Daekhon, isSimul), new CellTrackerConfig(),
// device => new UCCellTrackerDevice() { DataContext = new UCCellTrackerDeviceViewModel(AuroraEnv, CommonDeviceIds.CellTracker) });
//IODevice는 AjinIO가 아니라 IOUnit으로 받아오는것으로 수정해야 함
registry.Register(CommonDeviceIds.IODevice, () => new PAIX_PrismaticScanner(AuroraEnv, CommonDeviceIds.IODevice, isSimul), new IOUnitConfig());
registry.Register(CommonDeviceIds.Laser, () => new Laser(CommonDeviceIds.Laser, isSimul), new LaserConfig(),
device => new UCLaserDevice() { DataContext = new UCLaserDeviceViewModel(AuroraEnv, CommonDeviceIds.Laser) });
var _plc = new PLCControllerPrismaticScanner(CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, ApplicationExt.IsSimulation, PLCMMapFileType.CSV, AuroraEnv);
registry.Register(CommonDeviceIds.PLCDevice,
() => _plc, PLCMxComponentConfig.GetDefaultConfig(),
device => new UCPLCDevice() { DataContext = new UCPLCDeviceViewModel(AuroraEnv, _plc) });
AlarmManager.Init(AuroraEnv); AlarmManager.Init(AuroraEnv);
@ -153,12 +171,22 @@ namespace ILSOS_PrismaticScanner
var ACS = new ScannerACS(isSimul); var ACS = new ScannerACS(isSimul);
registry.Register(DeviceIds.ACS, () => ACS, new ACSDeviceConfig()); registry.Register(DeviceIds.ACS, () => ACS, new ACSDeviceConfig());
// TODO: 스테이지 X는 2 스테이지 Z는 4 확인완료 Y 사용 안함 // TODO: 축 번호는 이정인 선임 변수 맵 수신 후 검증
var motorX2 = new ACSMotor(MotorIds.AxisX2, ACS, 2, (int)MotorIds.eMotorIdx.AxisX2); var motorX2 = new ACSMotor(MotorIds.AxisX2, ACS, 2, (int)MotorIds.eMotorIdx.AxisX2);
registry.Register(MotorIds.AxisX2, () => motorX2, registry.Register(MotorIds.AxisX2, () => motorX2,
new ACSMotorConfig(MotorIds.AxisX2), new ACSMotorConfig(MotorIds.AxisX2),
motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId)); motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId));
//var motorY1 = new ACSMotor(MotorIds.AxisY1, ACS, 3, (int)MotorIds.eMotorIdx.AxisY1);
//registry.Register(MotorIds.AxisY1, () => motorY1,
// new ACSMotorConfig(MotorIds.AxisY1),
// motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId));
//var motorY2 = new ACSMotor(MotorIds.AxisY2, ACS, 4, (int)MotorIds.eMotorIdx.AxisY2);
//registry.Register(MotorIds.AxisY2, () => motorY2,
// new ACSMotorConfig(MotorIds.AxisY2),
// motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId));
var motorZ = new ACSMotor(MotorIds.AxisZ, ACS, 4, (int)MotorIds.eMotorIdx.AxisZ); var motorZ = new ACSMotor(MotorIds.AxisZ, ACS, 4, (int)MotorIds.eMotorIdx.AxisZ);
registry.Register(MotorIds.AxisZ, () => motorZ, registry.Register(MotorIds.AxisZ, () => motorZ,
new ACSMotorConfig(MotorIds.AxisZ), new ACSMotorConfig(MotorIds.AxisZ),
@ -169,8 +197,8 @@ namespace ILSOS_PrismaticScanner
{ {
if (device.DeviceId == DeviceIds.ACS || if (device.DeviceId == DeviceIds.ACS ||
device.DeviceId == MotorIds.AxisX2 || device.DeviceId == MotorIds.AxisX2 ||
//device.DeviceId == MotorIds.AxisY1 || device.DeviceId == MotorIds.AxisY1 ||
//device.DeviceId == MotorIds.AxisY2 || device.DeviceId == MotorIds.AxisY2 ||
device.DeviceId == MotorIds.AxisZ) device.DeviceId == MotorIds.AxisZ)
{ {
device.DevGroup = "ACS"; device.DevGroup = "ACS";
@ -178,12 +206,47 @@ namespace ILSOS_PrismaticScanner
} }
// ────────────────────────────────────────────────────────────────── // ──────────────────────────────────────────────────────────────────
// ── 26.04.06 NDY 추가: 인터락 ─────────────────────────────────────
// TODO: PLCControllerPrismaticScanner에 IsDoorOpen, IsEMO 있는지 확인 필요 - 없는 것 확인 완료
//PLC_DOOR_INTERLOCK = 6, // ← 도어 인터락
//PLC_EMO_STATUS = 7, // ← EMO
AddMotionInterlockCheck(_plc);
// ──────────────────────────────────────────────────────────────────
#endregion #endregion
} }
// 인터락 // 인터락
private void AddMotionInterlockCheck(PLCControllerPrismaticScanner plc)
{
var motorIds = new[] {
MotorIds.AxisX2,
MotorIds.AxisY1,
MotorIds.AxisY2,
MotorIds.AxisZ
};
foreach (var motorId in motorIds)
{
try
{
var motor = AuroraEnv.DeviceManager[motorId] as ACSMotor;
if (motor == null) continue;
//motor.AddInterlockCheck(("MotorInPos",
// () => !motor.ReadInposition()));
//motor.AddInterlockCheck(("IsDoorOpen",
// () => plc.ReadBit(PLCControllerPrismaticScanner.eBitInput.PLC_DOOR_INTERLOCK).data));
//motor.AddInterlockCheck(("IsEMO",
// () => plc.ReadBit(PLCControllerPrismaticScanner.eBitInput.PLC_EMO_STATUS).data));
//*** 인터락은 이정인 선임께 ACSMotor에 AddInterlockCheck가 있는지 확인 후 진행
}
catch (Exception ex)
{
Log.W($"AddMotionInterlockCheck [{motorId}] 실패: {ex.Message}");
}
}
}
public override void RegisterRecipes(RecipeRegister register) public override void RegisterRecipes(RecipeRegister register)
{ {
register(CommonRecipeIds.ScannerObjectTeaching, new ScannerObjectTeachingRecipe(), register(CommonRecipeIds.ScannerObjectTeaching, new ScannerObjectTeachingRecipe(),
@ -228,7 +291,7 @@ namespace ILSOS_PrismaticScanner
// ACS MOTF 전용 시퀀스를 별도 Builder로 등록 // ACS MOTF 전용 시퀀스를 별도 Builder로 등록
var seqAutoRunPrismaticScannerACS = new SeqAutoRunPrismaticScannerACS(); var seqAutoRunPrismaticScannerACS = new SeqAutoRunPrismaticScannerACS();
_SeqAutoRunPrismaticScannerACS_Builder = seqAutoRunPrismaticScannerACS.Builder(); _SeqAutoRunPrismaticScannerACS_Builder = seqAutoRunPrismaticScannerACS.Builder();
register(CommonSequenceIds.SeqAutoRunACS, _SeqAutoRunPrismaticScannerACS_Builder); register(SequenceIds.SeqAutoRunACS, _SeqAutoRunPrismaticScannerACS_Builder);
#endregion #endregion
} }
@ -269,10 +332,10 @@ namespace ILSOS_PrismaticScanner
base.RegisterViews(manager); base.RegisterViews(manager);
// Auto Run // Auto Run
// 26.04.06 NDY: Manual 서브로 이동 - 26.04.14 주석이였으나 - 주석 해제 // 26.04.06 NDY: Manual 서브로 이동
var MainAutoRun = new MainMenu(CommonViewIds.AutoRun, MenuIcon.GetMenuIcon(eMenuIcon.HOME), PermissionLevel.NONE, false); //var MainAutoRun = new MainMenu(CommonViewIds.AutoRun, MenuIcon.GetMenuIcon(eMenuIcon.HOME), PermissionLevel.NONE, false);
MainAutoRun.AddSubMenu(CommonViewIds.AutoRun, new UCMainAutoRun(new UCMainAutoRunViewModel(AuroraEnv, SequenceIds.SeqAutoRun))); //MainAutoRun.AddSubMenu(CommonViewIds.AutoRun, new UCMainAutoRun(new UCMainAutoRunViewModel(AuroraEnv, SequenceIds.SeqAutoRun)));
manager.RegisterMainMenu(MainAutoRun); //manager.RegisterMainMenu(MainAutoRun);
// Recipe // Recipe
MainMenu recipe = new MainMenu(CommonViewIds.Recipe, MenuIcon.GetMenuIcon(eMenuIcon.RECIPE), PermissionLevel.NONE, true); MainMenu recipe = new MainMenu(CommonViewIds.Recipe, MenuIcon.GetMenuIcon(eMenuIcon.RECIPE), PermissionLevel.NONE, true);

View File

@ -51,29 +51,25 @@ namespace ILSOS_PrismaticScanner.Sequences
{ {
static readonly Logger Log = new Logger("SeqComponentTeachingRun"); static readonly Logger Log = new Logger("SeqComponentTeachingRun");
const string SEQ_ENTER = "[SeqComponentTeachingRun] SEQ_ENTER"; // inputParam 으로 받자. const string SEQ_ENTER = "SEQ_ENTER"; // inputParam 으로 받자.
const string SEQ_CHECK_INIT_CONDITION = "[SeqComponentTeachingRun] Check Init Condition"; // Check Init Condition const string SEQ_CHECK_INIT_CONDITION = "Check Init Condition"; // Check Init Condition
const string SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ = "[SeqComponentTeachingRun] Set Sequence Param (UploadWeldingList Seq)"; const string SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ = "Set Sequence Param (UploadWeldingList Seq)";
const string SEQ_DO_ID_UPLOAD_WELDING_LIST_SEQ = "[SeqComponentTeachingRun] Process (UploadWeldingList Seq)"; const string SEQ_DO_ID_UPLOAD_WELDING_LIST_SEQ = "Process (UploadWeldingList Seq)";
const string SEQ_GET_RESULT_UPLOAD_WELDING_LIST_SEQ = "[SeqComponentTeachingRun] Get Sequence Result (UploadWeldingList Seq)"; const string SEQ_GET_RESULT_UPLOAD_WELDING_LIST_SEQ = "Get Sequence Result (UploadWeldingList Seq)";
const string SEQ_SET_BLOW_ON = "[SeqComponentTeachingRun] Set Blow On";
const string SEQ_SET_BLOW_OFF = "[SeqComponentTeachingRun] Set Blow Off";
const string SEQ_SAVE_RESULT_DATA = "[SeqComponentTeachingRun] Save Result Data"; const string SEQ_COMPLETE = "SEQ_COMPLETE"; // 완료
const string SEQ_COMPLETE = "[SeqComponentTeachingRun] SEQ_COMPLETE"; // 완료 const string SEQ_START_WELDING = "Start All Welding";
const string SEQ_DO_COMPONENT_WELDING = "Do Component Welding";
const string SEQ_UPDATE_COMPONENT_WELDING_PARAMETERS = "[SeqComponentTeachingRun] Update Component Welding Parameters"; const string SEQ_ACS_MOTION_SET = "Set ACS Motion Parameter";
const string SEQ_START_WELDING = "[SeqComponentTeachingRun] Start All Welding"; const string SEQ_ACS_MOTION_START = "ACS Motion Start";
const string SEQ_DO_COMPONENT_WELDING = "[SeqComponentTeachingRun] Do Component Welding"; const string SEQ_CHECK_MOTION_END = "Check ACS Motion Complete";
const string SEQ_CHECK_END_LIST = "[SeqComponentTeachingRun] Check End List";
const string SEQ_END_WELDING = "[SeqComponentTeachingRun] End All Welding";
#region 260408 NDY 노드 추가 #region 260408 NDY 노드 추가
// Builder()에 노드 추가 // Builder()에 노드 추가
//const string SEQ_MOVE_STAGE_ORIGIN = "[SeqComponentTeachingRun] Move Stage To Origin"; const string SEQ_STANDBY_MOTION = "Move Stage To Origin";
//const string SEQ_ENCODER_RESET = "[SeqComponentTeachingRun] Encoder Reset"; const string SEQ_STANDBY_SCANNER = "Encoder Reset";
#endregion #endregion
const int timeoutSeconds = 10; const int timeoutSeconds = 10;
@ -86,7 +82,6 @@ namespace ILSOS_PrismaticScanner.Sequences
private SeqTeachingRun_InitParam _InitParam; private SeqTeachingRun_InitParam _InitParam;
private static Scanner _Scanner; private static Scanner _Scanner;
private static PAIX_PrismaticScanner _IO;
// 필드 선언 추가 (다른 필드들 옆에) // 필드 선언 추가 (다른 필드들 옆에)
// 변경 전 // 변경 전
@ -95,13 +90,7 @@ namespace ILSOS_PrismaticScanner.Sequences
// 변경 후 // 변경 후
private IScannerACS _ACS; // 26.04.06 NDY - MOTF용 ACS Stage X 제어 private IScannerACS _ACS; // 26.04.06 NDY - MOTF용 ACS Stage X 제어
private static ACSMotor _AxisX; // 26.04.08 NDY - MOTF용 Stage X 축 private static ACSMotor _AxisX, _AxisZ; // 26.04.08 NDY - MOTF용 Stage X 축
private Laser _Laser;
private ILaser _LaserDevice;
private LaserTruFiber _LaserTruFiber;
private LaserPowerCalParam _LaserPowerCalParam;
private PLCControllerPrismaticScanner _plc;
private SystemParameter _SystemParameter; private SystemParameter _SystemParameter;
private ScannerCanvasUserCtrl _ScannerCanvasUserCtrl; //스캐너 동작관련 객체 선언 private ScannerCanvasUserCtrl _ScannerCanvasUserCtrl; //스캐너 동작관련 객체 선언
@ -112,69 +101,48 @@ namespace ILSOS_PrismaticScanner.Sequences
private List<IDrawObject> _SelectedObjectList; private List<IDrawObject> _SelectedObjectList;
private Queue<List<IDrawObject>> _DivideObjectsQueue;
private List<IDrawObject> _TargetObjects; private List<IDrawObject> _TargetObjects;
private static DateTime _SequenceCompleteTime; // 시퀸스 시간 private static DateTime _SequenceCompleteTime; // 시퀸스 시간
private static TimeSpan _MeasurementSpanTime; //측정 시간 private static TimeSpan _MeasurementSpanTime; //측정 시간
private static TimeSpan _ScannerSaveLogTime; private static TimeSpan _ScannerSaveLogTime;
private static DateTime _partialWeldingStartTime; private static DateTime _partialWeldingStartTime;
private static List<IDrawObject> _FlattenRecipes;
private static int _CountWeldingObject; // 트럼프 레시피에서 부분 용접 할 Ojbect의 개수
private static int _CurrentobjectIndex;
private static int _BeforeObjectIndex;
private static int _BeforeProgramNo; // 이전 트럼프 레이저 용접 번호
private static int _BeforeParameterNo; //
private static int _CenterBeamPower;
private static int _RingBeamPower;
private static bool _LaserPowerControlByRatio = false;
private static int _CenterRingRatio; // Center Ring의 파워 비율
private static double _LaserPowerRatio; // Laser에서 출력 파워 비율
public SequenceBuilder Builder() public SequenceBuilder Builder()
{ {
var sb = new SequenceBuilder(1000, true); var sb = new SequenceBuilder(1000, true);
////var sb = new SequenceBuilder(1000, false); // With log
sb.AddAction(SEQ_ENTER, Sequence_Enter); sb.AddAction(SEQ_ENTER, Sequence_Enter);
sb.AddAction(SEQ_CHECK_INIT_CONDITION, CheckInitCondition); //분기 sb.AddAction(SEQ_CHECK_INIT_CONDITION, CheckInitCondition); //분기
sb.AddAction(SEQ_SET_BLOW_ON, SetBlowOn);
#region 26.04.08 추가된 노드 NDY #region 26.04.08 추가된 노드 NDY
// 26.04.08 필드 좌표 0,0으로 스테이지 이동 시퀸스 + EncoderReset 호출 // 26.04.08 필드 좌표 0,0으로 스테이지 이동 시퀸스 + EncoderReset 호출
//sb.AddAction(SEQ_MOVE_STAGE_ORIGIN, MoveStageToOrigin); sb.AddAction(SEQ_STANDBY_MOTION, SetStandbyMotion);
//sb.AddAction(SEQ_ENCODER_RESET, EncoderReset); sb.AddAction(SEQ_STANDBY_SCANNER, SetStandbyScanner);
#endregion #endregion
sb.AddAction(SEQ_START_WELDING, StartWelding);
sb.AddDecision(SEQ_CHECK_END_LIST, CheckEndList);
sb.AddAction(SEQ_UPDATE_COMPONENT_WELDING_PARAMETERS, UpdateComponentWeldingParameters);
sb.AddAction(SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ, SetUploadWeldingList_SeqParams); sb.AddAction(SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ, SetUploadWeldingList_SeqParams);
sb.AddSubsequence(SEQ_DO_ID_UPLOAD_WELDING_LIST_SEQ, CommonSequenceManager.GetSeqBuilder_SeqUploadWeldingList()); sb.AddSubsequence(SEQ_DO_ID_UPLOAD_WELDING_LIST_SEQ, CommonSequenceManager.GetSeqBuilder_SeqUploadWeldingList());
sb.AddAction(SEQ_GET_RESULT_UPLOAD_WELDING_LIST_SEQ, GetUploadWeldingList_SeqResult); sb.AddAction(SEQ_GET_RESULT_UPLOAD_WELDING_LIST_SEQ, GetUploadWeldingList_SeqResult);
sb.AddAction(SEQ_DO_COMPONENT_WELDING, DoComponentWelding); sb.AddAction(SEQ_DO_COMPONENT_WELDING, DoComponentWelding);
sb.AddAction(SEQ_END_WELDING, EndWelding); sb.AddAction(SEQ_ACS_MOTION_SET, SetMotion);
sb.AddAction(SEQ_SET_BLOW_OFF, SetBlowOff); sb.AddAction(SEQ_ACS_MOTION_START, StartMotion);
sb.AddAction(SEQ_SAVE_RESULT_DATA, SaveResultData); // 해당 공정의 정보를 기록 함. sb.AddAction(SEQ_CHECK_MOTION_END, EndWelding);
sb.AddAction(SEQ_COMPLETE, Complete); sb.AddAction(SEQ_COMPLETE, Complete);
// 기존 흐름에서 SET_BLOW_ON → START_WELDING 사이에 끼워넣기 sb.Flows(sb.Init
#region 기존 흐름 26.04.08 > sb[SEQ_ENTER]
sb.Flows(sb.Init > sb[SEQ_ENTER] > sb[SEQ_CHECK_INIT_CONDITION] > sb[SEQ_SET_BLOW_ON] > sb[SEQ_CHECK_INIT_CONDITION]
> sb[SEQ_START_WELDING] > sb[SEQ_CHECK_END_LIST]); > sb[SEQ_STANDBY_MOTION]
#endregion > sb[SEQ_STANDBY_SCANNER]
#region 2개 노드 추가한 흐름 26.04.08 > sb[SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ]
//sb.Flows(sb.Init > sb[SEQ_ENTER] > sb[SEQ_CHECK_INIT_CONDITION] > sb[SEQ_SET_BLOW_ON] > sb[SEQ_DO_ID_UPLOAD_WELDING_LIST_SEQ]
// > sb[SEQ_MOVE_STAGE_ORIGIN] // ← 추가 > sb[SEQ_GET_RESULT_UPLOAD_WELDING_LIST_SEQ]
// > sb[SEQ_ENCODER_RESET] // ← 추가 > sb[SEQ_DO_COMPONENT_WELDING]
// > sb[SEQ_START_WELDING] > sb[SEQ_CHECK_END_LIST]); > sb[SEQ_ACS_MOTION_SET]
#endregion > sb[SEQ_ACS_MOTION_START]
> sb[SEQ_CHECK_MOTION_END]
// 아래 두 흐름은 기존 그대로 유지 > sb[SEQ_COMPLETE]
sb.Flows(sb[SEQ_CHECK_END_LIST] > sb[SEQ_UPDATE_COMPONENT_WELDING_PARAMETERS] > sb.Final);
> sb[SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ] > sb[SEQ_DO_ID_UPLOAD_WELDING_LIST_SEQ] > sb[SEQ_GET_RESULT_UPLOAD_WELDING_LIST_SEQ]
> sb[SEQ_DO_COMPONENT_WELDING] > sb[SEQ_CHECK_END_LIST]);
sb.Flows(sb[SEQ_CHECK_END_LIST] > sb[SEQ_END_WELDING] > sb[SEQ_SET_BLOW_OFF]
> sb[SEQ_SAVE_RESULT_DATA] > sb[SEQ_COMPLETE] > sb.Final);
sb.OnStopped(OnStopped); sb.OnStopped(OnStopped);
sb.OnForceError(OnForceError); sb.OnForceError(OnForceError);
@ -184,23 +152,123 @@ namespace ILSOS_PrismaticScanner.Sequences
return sb; return sb;
} }
#region 26.04.08 NDY
private SequenceActionResult EncoderReset(SequenceContext context, string id, SequenceActionResult param)
private SequenceActionResult Sequence_Enter(SequenceContext context, string id, SequenceActionResult param)
{ {
if (_ACS == null) Log.I("===== SeqTeachingRun Sequence_Enter 진입 ====="); // 임시 추가
Log.I("SeqTeachingRun Start");
_InitParam = param.Param as SeqTeachingRun_InitParam;
_SystemParameter = context.Settings[CommonSettingIds.SystemParameter] as SystemParameter;
_SequenceSetting = context.Settings[CommonSettingIds.Sequence] as SequenceSetting;
_Scanner = context.Devices[DeviceIds.Scanner] as Scanner;
if (_Scanner == null) { MessageUtil.ShowErrorToast("Scanner not Ready", Log); return null; }
_ACS = context.Devices[DeviceIds.ACS] as ScannerACS;
if (_ACS == null) { MessageUtil.ShowErrorToast("ACS not Ready", Log); return null; }
_AxisX = context.Devices[CommonDeviceIds.AxisX2] as ACSMotor;
if (_AxisX == null) { MessageUtil.ShowErrorToast("AxisX not Ready", Log); return null; }
_AxisZ = context.Devices[CommonDeviceIds.AxisZ] as ACSMotor;
if (_AxisZ == null) { MessageUtil.ShowErrorToast("AxisZ not Ready", Log); return null; }
//Check Device
if (!CheckDeviceReady(context)) {
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_TeachingRun_DeviceNotReady);
Log.E("The devices are not active.");
return null;
}
return SequenceAction.Ok();
}
private bool CheckDeviceReady(SequenceContext context)
{ {
Log.W("[EncoderReset] ACS null - 스킵"); List<string> deviceListToCheck = new List<string>() { DeviceIds.ACS, CommonDeviceIds.Scanner, CommonDeviceIds.AxisX2, CommonDeviceIds.AxisZ };
//List<string> deviceListToCheck = new List<string>() { CommonDeviceIds.Scanner, CommonDeviceIds.IODevice,DeviceIds.ACS }; 변수 맵 수신 후 ACS 주석 해제 위에 주석 처리
bool isAllDeviceActivated = true;
foreach (string item in deviceListToCheck) {
if (!context.Devices[item].IsActivated) {
isAllDeviceActivated = isAllDeviceActivated && false;
}
}
return isAllDeviceActivated;
}
private SequenceActionResult CheckInitCondition(SequenceContext context, string id, SequenceActionResult param)
{
bool boolian = AlarmManager.HasAlarmLevelHigh();
if (boolian) {
Log.E($"Clear Heavy Alarms For Welding!");
MessageUtil.ShowWarningToast(string.Format("Clear Heavy Alarms For Welding!"));
return null;
}
_ScannerSaveLogTime = TimeSpan.Zero;
var startTime = DateTime.Now;
context.PutValue(ContextKey.KEY_SEQUENCE_START_TIME, startTime);
Log.D("ComponentTeachingRun Sequence CheckInitCondition");
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
if (!_Scanner.Config.UseMarkingOnTheFly) #region 26.04.08 NDY
private SequenceActionResult SetStandbyMotion(SequenceContext context, string id, SequenceActionResult param)
{ {
if (_AxisX == null) {
Log.W("[MoveStageToOrigin] AxisX2 null - 스킵");
return SequenceAction.Ok();
}
Log.I("[MoveStageToOrigin] Stage X → 0 이동 시작");
// (스캐너의 0,0 && 용접 대상의 시작 위치) >> X축을 이동
_AxisX.SetTargetPos(0, TargetPosType.ABS);
_AxisX.SetMoveVelocityImm(AuroraACS.Speed.M);
_AxisX.AccelerationImm(AuroraACS.Speed.M);
_AxisX.DecelerationImm(AuroraACS.Speed.M);
_AxisX.JerkImm(AuroraACS.Speed.M);
_AxisX.Move();
// Laser FocusPosition Move
_AxisZ.SetTargetPos(0, TargetPosType.ABS);
_AxisZ.SetMoveVelocityImm(AuroraACS.Speed.M);
_AxisZ.AccelerationImm(AuroraACS.Speed.M);
_AxisZ.DecelerationImm(AuroraACS.Speed.M);
_AxisZ.JerkImm(AuroraACS.Speed.M);
_AxisZ.Move();
var res = context.RetryUntilSuccess(
() => _AxisX.IsReachedTargetPosition(0) && _AxisZ.IsReachedTargetPosition(0),
30 * 1000, 20, true);
if (res == E2.TIMEOUT) { Log.E("[MoveStageToOrigin] TIMEOUT"); return null; }
else if (res == E2.CANCELLED) { Log.E("[MoveStageToOrigin] CANCELLED"); return null; }
Log.I("[MoveStageToOrigin] Stage X = 0 도달 완료");
return SequenceAction.Ok();
}
private SequenceActionResult SetStandbyScanner(SequenceContext context, string id, SequenceActionResult param)
{
// Scanner Default Setting
var mainPage = CommonHelper.GetMainPage();
_ScannerCanvasUserCtrl = mainPage.ScannerCanvasCtrlTeaching;
_WeldingScannerListNo = eListNo.LIST1;
_SelectedObjectList = FindObjects();
//Vision Correction File 선택
_Scanner.SelectCorrectionTable(2);
if (!_Scanner.Config.UseMarkingOnTheFly) {
Log.W("[EncoderReset] MOTF 비활성화 - 스킵"); Log.W("[EncoderReset] MOTF 비활성화 - 스킵");
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
Log.I("[EncoderReset] 시작"); Log.I("[EncoderReset] 시작");
// SeqUploadWeldingList.MarkingOnTheFlyOn 패턴 // SeqUploadWeldingList.MarkingOnTheFlyOn 패턴
_Scanner.SetFlyX(_Scanner.Config.MarkingOnTheFlyEncoderResolutionX); _Scanner.SetFlyX(_Scanner.Config.MarkingOnTheFlyEncoderResolutionX);
Log.I($"[EncoderReset] SetFlyX: {_Scanner.Config.MarkingOnTheFlyEncoderResolutionX}"); Log.I($"[EncoderReset] SetFlyX: {_Scanner.Config.MarkingOnTheFlyEncoderResolutionX}");
@ -215,398 +283,35 @@ namespace ILSOS_PrismaticScanner.Sequences
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
//SeqTeachingPosMoveStageA패턴 참고 - 기존 GUN 프로젝트 시퀸스 //SeqTeachingPosMoveStageA패턴 참고 - 기존 GUN 프로젝트 시퀸스
private SequenceActionResult MoveStageToOrigin(SequenceContext context, string id, SequenceActionResult param)
{
if (_AxisX == null)
{
Log.W("[MoveStageToOrigin] AxisX2 null - 스킵");
return SequenceAction.Ok();
}
Log.I("[MoveStageToOrigin] Stage X → 0 이동 시작");
// SeqTeachingPosMoveStageA.MoveXYStage 패턴
_AxisX.SetTargetPos(0, TargetPosType.ABS);
_AxisX.SetMoveVelocityImm(AuroraACS.Speed.M);
_AxisX.AccelerationImm(AuroraACS.Speed.M);
_AxisX.DecelerationImm(AuroraACS.Speed.M);
_AxisX.JerkImm(AuroraACS.Speed.M);
_AxisX.Move();
var res = context.RetryUntilSuccess(
() => _AxisX.IsReachedTargetPosition(0),
30 * 1000, 20, true);
if (res == E2.TIMEOUT) { Log.E("[MoveStageToOrigin] TIMEOUT"); return null; }
if (res == E2.CANCELLED) { Log.E("[MoveStageToOrigin] CANCELLED"); return null; }
Log.I("[MoveStageToOrigin] Stage X = 0 도달 완료");
return SequenceAction.Ok();
}
#endregion
private SequenceActionResult Sequence_Enter(SequenceContext context, string id, SequenceActionResult param)
{
Log.I("===== SeqTeachingRun Sequence_Enter 진입 ====="); // 임시 추가
Log.I("SeqTeachingRun Start");
_InitParam = param.Param as SeqTeachingRun_InitParam;
_SystemParameter = context.GetSetting<SystemParameter>(CommonSettingIds.SystemParameter);
//_Laser = context.GetLaser();
//_Laser.GetLaserDevice(ref _LaserDevice);
//_LaserTruFiber = _LaserDevice as LaserTruFiber;
//if (_plc == null)
// _plc = context.Devices[DeviceIds.PLCDevice] as PLCControllerPrismaticScanner;
// Laser 시퀀스 Running. 안 넣어줘도 됨.
//_LaserTruFiber.SetIsSeqRunning(true);
_LaserPowerCalParam = context.GetSetting<LaserPowerCalParam>(CommonSettingIds.LaserPowerCalParam);//우선 AuroraRecipe로 상속받아서 함수 사용하도록 함
//laserPowerCalParam 초기화(CSV 파일 불러오기)
_LaserPowerCalParam.Initialize(_LaserPowerCalParam.PowerCalibrationCenterBeamCSVFile, _LaserPowerCalParam.PowerCalibrationRingBeamCSVFile);
_SequenceSetting = context.Settings[CommonSettingIds.Sequence] as SequenceSetting;
InitDev(context);
if (!CheckDeviceReady(context))
{ //Check Device
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_TeachingRun_DeviceNotReady);
Log.E("The devices are not active.");
return null;
}
if (InitSequenceVariable(context) == false)
{
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_TeachingRun_InitVariableError);
return null;
}
return SequenceAction.Ok();
}
private void InitDev(SequenceContext context)
{
//Device Init
_Scanner = context.GetLaserScanner();
//_IO = context.Devices[CommonDeviceIds.IODevice] as PAIX_PrismaticScanner;
// 26.04.06 NDY 추가: ACS 디바이스 취득 (null-safe)
// 변수 맵 수신 후 MOTFStart() 호출에 사용
// 변경 전
//try { _ACS = context.Devices[DeviceIds.ACS] as ScannerACS; }
// 변경 후
try { _ACS = context.Devices[DeviceIds.ACS] as IScannerACS; }
catch { _ACS = null; Log.W("ACS 디바이스 취득 실패 (null 처리)"); }
//26.04.08 NDY 추가 _AxisX 가져오기
try { _AxisX = context.Devices[CommonDeviceIds.AxisX2] as ACSMotor; }
catch { _AxisX = null; Log.W("AxisX2 취득 실패"); }
}
private bool CheckDeviceReady(SequenceContext context)
{
//List<string> deviceListToCheck = new List<string>() { CommonDeviceIds.Scanner, CommonDeviceIds.IODevice }; // 26.04.15 주석처리 아래 로 테스트
List<string> deviceListToCheck = new List<string>() { CommonDeviceIds.Scanner };
//List<string> deviceListToCheck = new List<string>() { CommonDeviceIds.Scanner, CommonDeviceIds.IODevice,DeviceIds.ACS }; 변수 맵 수신 후 ACS 주석 해제 위에 주석 처리
bool isAllDeviceActivated = true;
foreach (string item in deviceListToCheck)
{
if (!context.Devices[item].IsActivated)
{
isAllDeviceActivated = isAllDeviceActivated && false;
}
}
return isAllDeviceActivated;
}
private bool InitSequenceVariable(SequenceContext context)
{
var mainPage = CommonHelper.GetMainPage();
_ScannerCanvasUserCtrl = mainPage.ScannerCanvasCtrlTeaching;
_WeldingScannerListNo = eListNo.LIST1;
_SelectedObjectList = FindObjects();
return true;
}
private List<IDrawObject> FindObjects() private List<IDrawObject> FindObjects()
{ {
if (_InitParam.IsUseExternalObjects) if (_InitParam.IsUseExternalObjects) {
{
return _InitParam.ExternalObjects; return _InitParam.ExternalObjects;
} } else if (_InitParam.IsObjectSelectAll) {
else if (_InitParam.IsObjectSelectAll)
{
return _ScannerCanvasUserCtrl.Model.ActiveLayer.Objects; return _ScannerCanvasUserCtrl.Model.ActiveLayer.Objects;
} } else {
else
{
return _ScannerCanvasUserCtrl.Canvas.Model.SelectedObjects; return _ScannerCanvasUserCtrl.Canvas.Model.SelectedObjects;
} }
} }
private SequenceActionResult CheckInitCondition(SequenceContext context, string id, SequenceActionResult param) #endregion
{
if (!CheckCondition())
{
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_TeachingRun_CheckInitCondition);
Log.E("Condition is not in state to start sequence.");
context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, false);
return null;
}
_CurrentobjectIndex = 0;
_BeforeObjectIndex = 0;
_CountWeldingObject = 0;
_BeforeParameterNo = -1;
_BeforeProgramNo = -1;
_ScannerSaveLogTime = TimeSpan.Zero;
_FlattenRecipes = new List<IDrawObject>(); // 레시피 초기화
UnpackRecipes(_SelectedObjectList);
var startTime = DateTime.Now;
context.PutValue(ContextKey.KEY_SEQUENCE_START_TIME, startTime);
Log.D("ComponentTeachingRun Sequence CheckInitCondition");
return SequenceAction.Ok();
}
private bool CheckCondition()
{
if (CheckCondition_Interlock())
{
if (InitializeDeviceStatus())
{
return true;
}
}
return false;
}
private bool CheckCondition_Interlock()
{
//// PLC, Data, IO 등 Interlock checking
bool boolian = AlarmManager.HasAlarmLevelHigh();
if (boolian)
{
Log.E($"Clear Heavy Alarms For Welding!");
MessageUtil.ShowWarningToast(string.Format("Clear Heavy Alarms For Welding!"));
return false;
}
boolian = AlarmManager.IsPlcDoorOpen();
if (boolian)
{
Log.E($"PLC Door Opened!! Can't Weld Now.");
MessageUtil.ShowWarningToast(string.Format("Close Door ! Clear PLC DoorInterlock!"));
return false;
}
boolian = AlarmManager.IsPlcEmoAlarm();
if (boolian)
{
Log.E($"PLC EMO Pushed!! Can't Weld Now.");
MessageUtil.ShowWarningToast(string.Format("Clear PLC EMO Status!"));
return false;
}
return true;
}
private bool InitializeDeviceStatus()
{
//Vision Correction File 선택
_Scanner.SelectCorrectionTable(2);
return true;
}
private SequenceActionResult SetBlowOn(SequenceContext context, string id, SequenceActionResult param)
{
if (_InitParam.UseBlow == false)
{
return SequenceAction.Ok();
}
int intervalTime = _InitParam.IntervalTimeBlowOn;
//_IO._iOUnit.WriteDoBit(Convert.ToInt32(ePDOAddress.SeamWeldingN2BlowSol), true);
Thread.Sleep(intervalTime);
Log.D(string.Format($"[ComponentTeachingRun] Blow ON Complete"));
return SequenceAction.Ok();
}
private void SaveScannerRecordFileForamt()
{
if (_Scanner.Config.UseRecordSignal)
{
DateTime startTime = DateTime.Now;
_Scanner.SaveStackRecord("Normal");
_ScannerSaveLogTime += DateTime.Now.Subtract(startTime);
}
}
private SequenceActionResult StartWelding(SequenceContext context, string id, SequenceActionResult param)
{
Log.D(string.Format($"[ComponentTeachingRun] Start Component Welding"));
_SequenceCompleteTime = DateTime.Now;
// Laser 판넬 On
//_IO.WriteDoBit(PAIX_PrismaticScanner.ePrismaticDOAddress.CCCAPLaserOnLampOn, true);
_DivideObjectsQueue = SplitBySerialize(_FlattenRecipes);
Log.I($"Divided DrawObjects List Count[{_DivideObjectsQueue.Count}]");
return SequenceAction.Ok();
}
// 펼쳐진 객체(_FlattenRecipes)를 여러개의 스캔 파라미터에 따라 여러개로 나눈다
public static Queue<List<IDrawObject>> SplitBySerialize(List<IDrawObject> source)
{
var result = new Queue<List<IDrawObject>>();
if (source == null || source.Count == 0)
return result;
List<IDrawObject> current = null;
int? currentId = null;
foreach (var item in source)
{
if (current == null || currentId.Value != item.ScannerParamID)
{
current = new List<IDrawObject>();
result.Enqueue(current);
currentId = item.ScannerParamID;
}
current.Add(item);
}
return result;
}
private string CheckEndList(SequenceContext context, string id, ICollection<string> branches, SequenceActionResult param)
{
if (_DivideObjectsQueue.Count == 0)
return SEQ_END_WELDING;
// 파일 저장 변수 초기화
if (_Scanner.Config.UseRecordSignal)
{
DateTime startTime = DateTime.Now;
_Scanner.InitializeRecord();
_ScannerSaveLogTime += DateTime.Now.Subtract(startTime);
}
return SEQ_UPDATE_COMPONENT_WELDING_PARAMETERS;
}
private SequenceActionResult UpdateComponentWeldingParameters(SequenceContext context, string id, SequenceActionResult param)
{
_partialWeldingStartTime = DateTime.Now;
//var currentDivideObject = _DivideObjectsQueue.Peek();
//int paramIndex = currentDivideObject[0].ScannerParamID - 1;
//Log.I($"Remain Divided DrawObjects Count[{currentDivideObject.Count}] / ParameterNo[{paramIndex + 1}]");
//int SlotNo = _plc.ReadWord(eWordInput.PLC_CURRENT_SLOT_NO).data;
//if (SlotNo <= 0)
// SlotNo = 1;
//// 결과 Data 를 업데이트 함.
//var power = Status.GetProcessingWeldingData().UploadProcessDatas.Where(data => data.DataName == $"Power_{SlotNo}_{_SequenceSetting.LastPageNo}").FirstOrDefault();
//#region 26.04.08 NDY 캘리브레이션 노드 추가 테스트를 위해서 잠시 예외처리 코드 추가
//if (power != null)
// power.Value = ScannerCanvasUserCtrl.ScannerParams[paramIndex].LaserPower1
// + ScannerCanvasUserCtrl.ScannerParams[paramIndex].LaserPower2;
//#endregion
//// 26.04.08 NDY 주석처리 - power null 예외 방지 (위 null 체크로 대체)
////power.Value = ScannerCanvasUserCtrl.ScannerParams[paramIndex].LaserPower1 + ScannerCanvasUserCtrl.ScannerParams[paramIndex].LaserPower2;
//var velocity = Status.GetProcessingWeldingData().UploadProcessDatas.Where(data => data.DataName == $"Velocity_{SlotNo}_{_SequenceSetting.LastPageNo}").FirstOrDefault();
//#region 26.04.08 NDY velocity null에 대한 예외 처리
//if (velocity != null)
// velocity.Value = ScannerCanvasUserCtrl.ScannerParams[paramIndex].MarkSpeed;
//#endregion
//// 26.04.08 NDY 주석처리 - velocity null 예외 방지 (위 null 체크로 대체)
////velocity.Value = ScannerCanvasUserCtrl.ScannerParams[paramIndex].MarkSpeed;
//// 26.04.08 NDY - FDC 데이터 상신 -기존 코드 주석처리
////_plc.UploadReportDatas(Status.GetProcessingWeldingData().UploadProcessDatas);
//// 26.04.08 NDY - FDC 상신도 데이터 있을 때만 - 테스트 목적 예외 처리 추가
//if (Status.GetProcessingWeldingData().UploadProcessDatas.Count > 0)
// _plc.UploadReportDatas(Status.GetProcessingWeldingData().UploadProcessDatas);
//_CenterBeamPower = (int)ScannerCanvasUserCtrl.ScannerParams[paramIndex].LaserPower1;
//_RingBeamPower = (int)ScannerCanvasUserCtrl.ScannerParams[paramIndex].LaserPower2;
//_CenterRingRatio = 0;
//if (_CenterBeamPower == 0 && _RingBeamPower == 0)
// _CenterRingRatio = 100;
//else
// _CenterRingRatio = (int)Math.Round((double)(100 * _CenterBeamPower) / (double)(_CenterBeamPower + _RingBeamPower), 0); // Discrete 한 값이라서 Ring은 오차 발생
////if (_Laser.Config.TruFiberType == eTruFiberType.TruFiberP)
////{
// _CenterBeamPower = _LaserPowerCalParam.CalibrateWattToWatt(_CenterBeamPower, (uint)LaserPowerCalParam.beamMode.Center);
// _RingBeamPower = _LaserPowerCalParam.CalibrateWattToWatt(_RingBeamPower, (uint)LaserPowerCalParam.beamMode.Ring);
////}
//// Ready 상태 변경 확인(Complete 상태에서 Laser Ready로 변환되기까지 시간이 걸림)
//// 여기서는 왜 IW03과 Center를 비교하는 것인지.... 아직 값을 써주지 않았으므로 레이저 출사 가능 여부만 확인하면 되지 않을까.
//var res = context.RetryUntilSuccess(_Laser.GetLaserReady, timeoutSeconds * 1000, 1);
//if (res == E2.TIMEOUT)
//{
// Log.E(string.Format($"[Page Change Req] Laser Program Ready Timeout When LaserReady"));
// return null;
//}
//Log.D(string.Format($"[Page Change Req] Laser Program Ready OK"));
//// Laser Program Parameters 설정(Laser Ready 상태는 용접 직전에 확인)
//List<(int, int, bool)> datas = new List<(int, int, bool)>();
//datas.Add((csWriteNodeNo.IW03, _CenterBeamPower, true));
//datas.Add((csWriteNodeNo.IW04, _RingBeamPower, true));
//datas.Add((csWriteNodeNo.IW05, _CenterRingRatio, true));
//// 업데이트 될 경우, 프로그램 전환을 위한 프로그램 종료 시퀸스 진행됨.
//if (_LaserTruFiber.UpdatesDatasIfChanged(datas))
//{
// // 프로그램이 종료 될 때까지 대기.
// res = context.RetryUntilSuccess(_LaserTruFiber.GetProgramCompleted, timeoutSeconds * 1000, 10);
// if (res == E2.TIMEOUT)
// {
// Log.E(string.Format($"[Page Change Req] Laser Program Completed Timeout When Parameter Changes"));
// return null;
// }
// Log.D(string.Format($"[Page Change Req] Laser Program Completed OK When Data Updated"));
//}
return SequenceAction.Ok();
}
private SequenceActionResult SetUploadWeldingList_SeqParams(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult SetUploadWeldingList_SeqParams(SequenceContext context, string id, SequenceActionResult param)
{ {
Status.SetWorkingPosition(eWorkingPosition.UPLOADING_WELD_LIST); Status.SetWorkingPosition(eWorkingPosition.UPLOADING_WELD_LIST);
// TeachingRun에는 용접 시퀀스만 정의해서 Auto Run에서도 사용하므로 Offset 넣어줘야 함 // TeachingRun에는 용접 시퀀스만 정의해서 Auto Run에서도 사용하므로 Offset 넣어줘야 함
SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam() SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam() {
{
NeedSetLaserTiming = _InitParam.NeedSetLaserTiming, NeedSetLaserTiming = _InitParam.NeedSetLaserTiming,
IncludeListStartEnd = true, IncludeListStartEnd = true,
CellMeasureCenterOffsetX = _SystemParameter.CellPosMeasureCenterOffsetX + _InitParam.CellCenterOffsetX, CellMeasureCenterOffsetX = _SystemParameter.CellPosMeasureCenterOffsetX + _InitParam.CellCenterOffsetX,
CellMeasureCenterOffsetY = _SystemParameter.CellPosMeasureCenterOffsetY + _InitParam.CellCenterOffsetY, CellMeasureCenterOffsetY = _SystemParameter.CellPosMeasureCenterOffsetY + _InitParam.CellCenterOffsetY,
SelectedDrawObjectList = _DivideObjectsQueue.Peek(), SelectedDrawObjectList = _SelectedObjectList,
WeldingScannerListNo = _WeldingScannerListNo, WeldingScannerListNo = _WeldingScannerListNo,
}; };
var _PageNo = _SequenceSetting.LastPageNo;
Log.W($"page {_PageNo}({Status.GetProcessingWeldingData().CellId}) : Cell Offset Value Check ; X : {_SystemParameter.CellPosMeasureCenterOffsetX} + {_InitParam.CellCenterOffsetX} ; Y : {_SystemParameter.CellPosMeasureCenterOffsetY} + {_InitParam.CellCenterOffsetY}");
Log.D(string.Format($"[ComponentTeachingRun] Set UploadWelindList Seq Param")); Log.D(string.Format($"[ComponentTeachingRun] Set UploadWelindList Seq Param"));
return SequenceAction.Ok(seqParams); return SequenceAction.Ok(seqParams);
} }
@ -615,8 +320,7 @@ namespace ILSOS_PrismaticScanner.Sequences
Log.D(string.Format($"[ComponentTeachingRun] Get UploadWelindList Seq Param")); Log.D(string.Format($"[ComponentTeachingRun] Get UploadWelindList Seq Param"));
var resultOutParam = param.Param as SeqUploadWeldingList_OutParam; var resultOutParam = param.Param as SeqUploadWeldingList_OutParam;
if (resultOutParam.Success == false) if (resultOutParam.Success == false) {
{
Log.E(string.Format($"[ComponentTeachingRun] Failed UploadWeldingList Sequence")); Log.E(string.Format($"[ComponentTeachingRun] Failed UploadWeldingList Sequence"));
return null; return null;
} }
@ -627,33 +331,7 @@ namespace ILSOS_PrismaticScanner.Sequences
private SequenceActionResult DoComponentWelding(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult DoComponentWelding(SequenceContext context, string id, SequenceActionResult param)
{ {
_DivideObjectsQueue.Dequeue(); Log.I("ExecuteList Start");
Log.I("UploadWeldingList Complete");
Log.D(string.Format($"[ComponentTeachingRun] Component Welding Start idx :({_BeforeObjectIndex} ~ {_BeforeObjectIndex + _CountWeldingObject - 1})"));
#region PSTART_DYN 사용시 참고
//// PSTART_DYN에서는 레이저가 활성화되었는지 확인하여야 함. 하지만, PSTART_STATICALLY에서는 굳이 확인할 필요 없음. (이전에 확인해줄 것이므로)
// var res = context.RetryUntilSuccess(_LaserTruFiber.GetProgramActive, timeoutSeconds * 1000, 1);
//if (res == E2.TIMEOUT)
//{
// Log.E(string.Format($"[ComponentTeachingRun] Laser Program Active Timeout"));
// return null;
//}
#endregion
//Log.D(string.Format($"[ComponentTeachingRun] Check LaserReadyResponse"));
//// 만일 프로그램이 정상적으로 종료 및 변경 원할 경우, 레이저 스레드에서 Ready 상태로 만들어주고 있을 것임.
//// Ready 상태 변경 확인
//var res = context.RetryUntilSuccess(LaserReadyResponse, timeoutSeconds * 1000, 10);
//if (res == E2.TIMEOUT)
//{
// Log.E(string.Format($"[ComponentTeachingRun] Laser Program Ready Timeout When LaserReadyResponse"));
// return null;
//}
//Log.D(string.Format($"[ComponentTeachingRun] Laser Program Ready OK When ReadyResponse"));
//Status.SetWorkingPosition(eWorkingPosition.EXECUTING_WELD);
Log.I($"Welding List Space : {_Scanner.GetListSpace()}"); Log.I($"Welding List Space : {_Scanner.GetListSpace()}");
DateTime weldingTime = DateTime.Now; DateTime weldingTime = DateTime.Now;
_Scanner.ExecuteList(_WeldingScannerListNo); _Scanner.ExecuteList(_WeldingScannerListNo);
@ -668,32 +346,14 @@ namespace ILSOS_PrismaticScanner.Sequences
_Scanner.WaitForListTaskCompleted(_SystemParameter.WeldLinesTaskTimeOut);
// ── 26.04.06 NDY 추가: ACS 완료 대기 ───────────────── // ── 26.04.06 NDY 추가: ACS 완료 대기 ─────────────────
// TODO: 변수 맵 수신 후 활성화 // TODO: 변수 맵 수신 후 활성화
// while (!_ACS.CheckMOTFComp()) { Thread.Sleep(10); } // while (!_ACS.CheckMOTFComp()) { Thread.Sleep(10); }
// ──────────────────────────────────────────────────── // ────────────────────────────────────────────────────
_MeasurementSpanTime = DateTime.Now.Subtract(weldingTime);
Log.D(string.Format($"[ComponentTeachingRun] Component Welding Complete Time : {_MeasurementSpanTime.TotalMilliseconds}"));
#region PSTART_DYN 사용시 참고 if (_Scanner.Config.UseRecordSignal) {
//// 굳이 확인할 필요가 없을 듯 함.PSTAT_STATICALLY 활용시.
//res = context.RetryUntilSuccess(_LaserTruFiber.GetProgramCompleted, timeoutSeconds * 1000, 1);
//if (res == E2.TIMEOUT)
//{
// Log.E(string.Format($"[ComponentTeachingRun] Laser Program Complete Timeout"));
// return null;
//}
#endregion
Log.D(string.Format($"[ComponentTeachingRun] Laser Program Complete OK"));
if (_Scanner.Config.UseRecordSignal)
{
DateTime startTime = DateTime.Now; DateTime startTime = DateTime.Now;
_Scanner.StackRecord(); _Scanner.StackRecord();
_ScannerSaveLogTime += DateTime.Now.Subtract(startTime); _ScannerSaveLogTime += DateTime.Now.Subtract(startTime);
@ -708,17 +368,35 @@ namespace ILSOS_PrismaticScanner.Sequences
_ScannerCanvasUserCtrl.TimeLabelUpdate(_MeasurementSpanTime.TotalMilliseconds, PartialTactTime.TotalMilliseconds); _ScannerCanvasUserCtrl.TimeLabelUpdate(_MeasurementSpanTime.TotalMilliseconds, PartialTactTime.TotalMilliseconds);
//// 용접 끝난 후, 초기화 시킴
//var UploadDatas = Status.GetProcessingWeldingData().UploadProcessDatas;
//foreach (var data in UploadDatas)
// data.Clear();
//_plc.UploadReportDatas(UploadDatas);
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
private SequenceActionResult SetMotion(SequenceContext context, string id, SequenceActionResult param)
{
// 메뉴얼 화면에서 셋팅이 필요해보임
_ACS.SetMOTFParams(0, 0, 0, 0, 0);
return SequenceAction.Ok();
}
private SequenceActionResult StartMotion(SequenceContext context, string id, SequenceActionResult param)
{
_ACS.MOTFStart();
// 모션 동작시키고 바로 확인하면 그냥 빠져나올 것 같음
var res = context.Wait(1000, 100);
if (res == E2.TIMEOUT) ;
else if (res == E2.CANCELLED) { Log.E("[MOTF] Motion CANCELLED"); return null; }
res = context.RetryUntilSuccess(() => _ACS.CheckMOTFComp(), 1000 * 20, 100, true);
if (res == E2.TIMEOUT) { Log.E("[MOTF] Motion TIMEOUT"); return null; }
else if (res == E2.CANCELLED) { Log.E("[MOTF] Motion CANCELLED"); return null; }
return SequenceAction.Ok();
}
private SequenceActionResult EndWelding(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult EndWelding(SequenceContext context, string id, SequenceActionResult param)
{ {
_Scanner.WaitForListTaskCompleted(_SystemParameter.WeldLinesTaskTimeOut);
Log.I("ExecuteList Complete");
_MeasurementSpanTime = DateTime.Now.Subtract(_SequenceCompleteTime); _MeasurementSpanTime = DateTime.Now.Subtract(_SequenceCompleteTime);
Log.D(string.Format($"[TactTime] Complete All Component Weld : {_MeasurementSpanTime.TotalMilliseconds}")); Log.D(string.Format($"[TactTime] Complete All Component Weld : {_MeasurementSpanTime.TotalMilliseconds}"));
@ -728,9 +406,6 @@ namespace ILSOS_PrismaticScanner.Sequences
_Scanner.WriteDA((uint)eAnalogPortOut.DA2, 0, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, 0, eFunctionType.COMMAND);
_Scanner.JumpAbs(0, 0, eFunctionType.COMMAND); _Scanner.JumpAbs(0, 0, eFunctionType.COMMAND);
// Laser 판넬 Off
//_IO.WriteDoBit(PAIX_PrismaticScanner.ePrismaticDOAddress.CCCAPLaserOnLampOn, false);
var mesurementTime = DateTime.Now; var mesurementTime = DateTime.Now;
//용접 완료 후 CorrectionFile Vision으로 원복 //용접 완료 후 CorrectionFile Vision으로 원복
@ -742,36 +417,12 @@ namespace ILSOS_PrismaticScanner.Sequences
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
private SequenceActionResult SetBlowOff(SequenceContext context, string id, SequenceActionResult param)
{
if (_InitParam.UseBlow == false)
{
return SequenceAction.Ok();
}
int intervalTime = _InitParam.IntervalTimeBlowOff;
Thread.Sleep(intervalTime);
//_IO._iOUnit.WriteDoBit(Convert.ToInt32(ePDOAddress.SeamWeldingN2BlowSol), false);
Log.D(string.Format($"[ComponentTeachingRun] Blow OFF Complete"));
return SequenceAction.Ok();
}
private SequenceActionResult SaveResultData(SequenceContext context, string id, SequenceActionResult param)
{
context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, true);
return SequenceAction.Ok();
}
private SequenceActionResult Complete(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult Complete(SequenceContext context, string id, SequenceActionResult param)
{ {
context.TryGetValue(ContextKey.KEY_SEQUENCE_RESULT, out bool seqResult); context.TryGetValue(ContextKey.KEY_SEQUENCE_RESULT, out bool seqResult);
SeqTeachingRun_OutParam result = new SeqTeachingRun_OutParam() { Success = seqResult }; SeqTeachingRun_OutParam result = new SeqTeachingRun_OutParam() { Success = seqResult };
if (seqResult == false) if (seqResult == false) {
{
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_TeachingRun_ResultFailed); AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_TeachingRun_ResultFailed);
} }
@ -779,27 +430,14 @@ namespace ILSOS_PrismaticScanner.Sequences
return SequenceAction.Ok(result); return SequenceAction.Ok(result);
} }
private static void UnpackRecipes(List<IDrawObject> recipes) private void SaveScannerRecordFileForamt()
{ {
// Recipe를 재귀적으로 탐색해서 List로 재구성하는 함수 if (_Scanner.Config.UseRecordSignal) {
if (recipes == null) DateTime startTime = DateTime.Now;
return; _Scanner.SaveStackRecord("Normal");
_ScannerSaveLogTime += DateTime.Now.Subtract(startTime);
for (int i = 0; i < recipes.Count; i++)
{
if (recipes[i] is Group)
{
Group subGroup = recipes[i] as Group;
List<IDrawObject> subrecipes = subGroup.SubObjects as List<IDrawObject>;
UnpackRecipes(subrecipes);
}
else
{
_FlattenRecipes.Add(recipes[i]);
} }
} }
}
private void OnForceError(SequenceContext context, string arg2) private void OnForceError(SequenceContext context, string arg2)
{ {
@ -813,9 +451,6 @@ namespace ILSOS_PrismaticScanner.Sequences
_Scanner.WriteDA((uint)eAnalogPortOut.DA1, 0, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, 0, eFunctionType.COMMAND);
_Scanner.WriteDA((uint)eAnalogPortOut.DA2, 0, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, 0, eFunctionType.COMMAND);
// TruFiber레이저 Ready로 변경
ForceLaserReady();
//Scanner 원점 복귀 //Scanner 원점 복귀
// 복귀 시 Scanner Busy 상태일 수 있으므로 진행중인 작업이 끝날 때까지 대기 // 복귀 시 Scanner Busy 상태일 수 있으므로 진행중인 작업이 끝날 때까지 대기
Thread.Sleep(10); Thread.Sleep(10);
@ -837,41 +472,15 @@ namespace ILSOS_PrismaticScanner.Sequences
_Scanner.WriteDA((uint)eAnalogPortOut.DA1, 0, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, 0, eFunctionType.COMMAND);
_Scanner.WriteDA((uint)eAnalogPortOut.DA2, 0, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, 0, eFunctionType.COMMAND);
// TruFiber레이저 Ready로 변경
ForceLaserReady();
//Scanner 원점 복귀 //Scanner 원점 복귀
// 복귀 시 Scanner Busy 상태일 수 있으므로 진행중인 작업이 끝날 때까지 대기 // 복귀 시 Scanner Busy 상태일 수 있으므로 진행중인 작업이 끝날 때까지 대기
Thread.Sleep(10); Thread.Sleep(10);
_Scanner.JumpAbs(0, 0, eFunctionType.COMMAND); _Scanner.JumpAbs(0, 0, eFunctionType.COMMAND);
Thread.Sleep(10); Thread.Sleep(10);
// Laser 판넬 Off
//_IO.WriteDoBit(PAIX_PrismaticScanner.ePrismaticDOAddress.CCCAPLaserOnLampOn, false);
Log.I("SequenceAction Ok : OnStopped"); Log.I("SequenceAction Ok : OnStopped");
} }
private void ForceLaserReady()
{
// 트럼프 레이저에서 PStartDyn, Prog_Stop을 감시하여 강제로 Ready 상태로 만드는 함수
if (_Laser.IsSimul)
{
return;
}
//// PSTART_STATICAL 에서는 필요 없어보임.
//_LaserTruFiber.SetProgEnd();
// Laser 판넬 Off
//_IO.WriteDoBit(PAIX_PrismaticScanner.ePrismaticDOAddress.CCCAPLaserOnLampOn, false);
Log.I("SequenceAction Ok : Set Laser Ready");
}
} }
// TODO: UseStream 으로 TeachingRun 을 할 필요가 있을까?? 확인 필요 // TODO: UseStream 으로 TeachingRun 을 할 필요가 있을까?? 확인 필요

View File

@ -106,8 +106,7 @@ namespace WeldingCommon.Sequences
if (_SequenceSetting.ScannerActivated) if (_SequenceSetting.ScannerActivated)
_Scanner = context.GetLaserScanner(); _Scanner = context.GetLaserScanner();
if (_SequenceSetting.LaserActivated) if (_SequenceSetting.LaserActivated) {
{
_Laser = context.GetLaser(); _Laser = context.GetLaser();
_LaserTruFiber = _Laser.getCore() as LaserTruFiber; _LaserTruFiber = _Laser.getCore() as LaserTruFiber;
} }
@ -283,24 +282,16 @@ namespace WeldingCommon.Sequences
} }
} else { } else {
_LaserTruFiber = _Laser.getCore() as LaserTruFiber; _LaserTruFiber = _Laser.getCore() as LaserTruFiber;
//// Laser OPCUA로 연결한 경우 // Laser OPCUA로 연결한 경우
if (_LaserTruFiber.GetEStopOpen()) {
//#region 26.04.14 삭제 할 것
if (_LaserTruFiber == null) return SequenceAction.Ok();; // 강제 OK
//#endregion
if (_LaserTruFiber.GetEStopOpen())
{
AlarmManager.Alarm(AlarmCode_PrismaticScanner.ALARM_DEVICE_IO_LASER_EMO); AlarmManager.Alarm(AlarmCode_PrismaticScanner.ALARM_DEVICE_IO_LASER_EMO);
} }
if (_LaserTruFiber.GetFaultLaser()) if (_LaserTruFiber.GetFaultLaser()) {
{
string alarmCode = $"{Convert.ToString(_LaserTruFiber.GetLastMessageCompID(),16).ToUpper().PadLeft(2,'0')}{Convert.ToString(_LaserTruFiber.GetLastMessageCompNum(),16).ToUpper().PadLeft(2,'0')} {Convert.ToString(_LaserTruFiber.GetLastMessageMsgCode(),16).ToUpper().PadLeft(2,'0')}"; string alarmCode = $"{Convert.ToString(_LaserTruFiber.GetLastMessageCompID(),16).ToUpper().PadLeft(2,'0')}{Convert.ToString(_LaserTruFiber.GetLastMessageCompNum(),16).ToUpper().PadLeft(2,'0')} {Convert.ToString(_LaserTruFiber.GetLastMessageMsgCode(),16).ToUpper().PadLeft(2,'0')}";
string alarmDescription = $" {_LaserTruFiber.GetLastMessageShortText()}"; string alarmDescription = $" {_LaserTruFiber.GetLastMessageShortText()}";
AlarmManager.ChangeAlarmDescription(AlarmCode_PrismaticScanner.ALARM_DEVICE_LASER_ERROR_MSG, alarmCode + alarmDescription); AlarmManager.ChangeAlarmDescription(AlarmCode_PrismaticScanner.ALARM_DEVICE_LASER_ERROR_MSG, alarmCode + alarmDescription);
} } else if (_LaserTruFiber.GetMonitoring()) {
else if (_LaserTruFiber.GetMonitoring())
{
string alarmCode = $"{Convert.ToString(_LaserTruFiber.GetLastMessageCompID(), 16).ToUpper().PadLeft(2, '0')}{Convert.ToString(_LaserTruFiber.GetLastMessageCompNum(), 16).ToUpper().PadLeft(2, '0')} {Convert.ToString(_LaserTruFiber.GetLastMessageMsgCode(), 16).ToUpper().PadLeft(2, '0')}"; string alarmCode = $"{Convert.ToString(_LaserTruFiber.GetLastMessageCompID(), 16).ToUpper().PadLeft(2, '0')}{Convert.ToString(_LaserTruFiber.GetLastMessageCompNum(), 16).ToUpper().PadLeft(2, '0')} {Convert.ToString(_LaserTruFiber.GetLastMessageMsgCode(), 16).ToUpper().PadLeft(2, '0')}";
string alarmDescription = $" {_LaserTruFiber.GetLastMessageShortText()}"; string alarmDescription = $" {_LaserTruFiber.GetLastMessageShortText()}";
AlarmManager.ChangeAlarmDescription(AlarmCode_PrismaticScanner.ALARM_DEVICE_LASER_WARNING_MSG, alarmCode + alarmDescription); AlarmManager.ChangeAlarmDescription(AlarmCode_PrismaticScanner.ALARM_DEVICE_LASER_WARNING_MSG, alarmCode + alarmDescription);

View File

@ -95,7 +95,6 @@ namespace ILSOS_PrismaticScanner.Sequences
//register(CommonSequenceIds.DeviceMonitor, DeviceMonitoring.Builder()); //register(CommonSequenceIds.DeviceMonitor, DeviceMonitoring.Builder());
base.Register(aurora, register); base.Register(aurora, register);
//SeqMarkGrid 시퀸스 등록
if (_SeqMarkGrid == null) if (_SeqMarkGrid == null)
{ {
_SeqMarkGrid = new SeqMarkGrid(); _SeqMarkGrid = new SeqMarkGrid();
@ -170,7 +169,7 @@ namespace ILSOS_PrismaticScanner.Sequences
#region 26.04.09 NDY - ACS MOTF AutoRun Sequence 등록 #region 26.04.09 NDY - ACS MOTF AutoRun Sequence 등록
// 기존 SeqAutoRun(SeqAutoRunPrismaticScanner)은 건드리지 않고 // 기존 SeqAutoRun(SeqAutoRunPrismaticScanner)은 건드리지 않고
// ACS MOTF 전용 시퀀스를 별도 ID(SeqAutoRunACS)로 등록 - 이미 존재한다고 뜸 // ACS MOTF 전용 시퀀스를 별도 ID(SeqAutoRunACS)로 등록
if (_SeqAutoRunPrismaticScannerACS == null) if (_SeqAutoRunPrismaticScannerACS == null)
{ {
_SeqAutoRunPrismaticScannerACS = new SeqAutoRunPrismaticScannerACS(); _SeqAutoRunPrismaticScannerACS = new SeqAutoRunPrismaticScannerACS();

View File

@ -219,16 +219,8 @@ namespace ILSOS_PrismaticScanner.Views
// 자동으로 Activated Recipe로 변경 // 자동으로 Activated Recipe로 변경
OnUpdateCurrentActivatedRecipe(null); OnUpdateCurrentActivatedRecipe(null);
//var param = new SeqAutoRunPrismaticScanner_InitParam() { var param = new SeqAutoRunPrismaticScanner_InitParam() {
// //VisionRecipeNo = 0 // 해당 InitParam에는 없는 선언 VisionRecipeNo = 0
//};
var param = new SeqTeachingRun_InitParam()
{
IsObjectSelectAll = true,
CellCenterOffsetX = 0,
CellCenterOffsetY = 0,
}; };
Status.SetStatus(eEqpStatus.Auto); Status.SetStatus(eEqpStatus.Auto);
@ -285,21 +277,18 @@ namespace ILSOS_PrismaticScanner.Views
public override void OnAutoRunStopRequest() public override void OnAutoRunStopRequest()
{ {
base.OnAutoRunStopRequest(); base.OnAutoRunStopRequest();
//// Prewelding은 자동 운전 정지 와도 무시
//StopSequenceAutoRun();
} }
private void OnStopSequenceAutoRun(object obj = null) private void OnStopSequenceAutoRun(object obj = null)
{ {
//if (_SeqAutoRun.RunState == SequenceRunState.Idle) { if (_SeqAutoRun.RunState == SequenceRunState.Idle) {
// return; return;
//} }
_SeqAutoRun.Stop(); _SeqAutoRun.Stop();
#region 260417 확인 - 확인완료
// 26.04.17 NDY - Stop 시 장비 상태 복귀
Status.SetStatus(eEqpStatus.Manual);
#endregion
//Recipe를 기존에 선택된 Recipe로 Rollback 해 줌 //Recipe를 기존에 선택된 Recipe로 Rollback 해 줌
RecipeHelper.RollbackRecipe(); RecipeHelper.RollbackRecipe();
//AutoRun 정지 시 CorrectionFile을 Vision으로 변경 //AutoRun 정지 시 CorrectionFile을 Vision으로 변경

View File

@ -569,8 +569,7 @@ namespace CoreUnit.Common
// 다른 프로세스도 파일 읽고 쓸 수 있도록. // 다른 프로세스도 파일 읽고 쓸 수 있도록.
FileStream FileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); FileStream FileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.Unicode); // 26.04.15 기존 코드 주석처리함 StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.Unicode);
//StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.UTF8); // 26.04.15 변경 코드 UTF8로 변경 log 깨짐 현상
if (isFile) { if (isFile) {
sw.WriteLine(strItem); sw.WriteLine(strItem);

File diff suppressed because it is too large Load Diff

View File

@ -98,33 +98,33 @@ namespace CoreUnit.Scanner.UserControl.Canvas.Dialog
cbParamExt.Items.Add(i); cbParamExt.Items.Add(i);
} }
//if (editMode) { if (editMode) {
// gbLaser.Enabled = true; gbLaser.Enabled = true;
// gbRamping.Enabled = true; gbRamping.Enabled = true;
// gbScanner.Enabled = true; gbScanner.Enabled = true;
// gbWobbel.Enabled = true; gbWobbel.Enabled = true;
// btnCopyParam.Enabled = true; btnCopyParam.Enabled = true;
// btnImport.Enabled = true; btnImport.Enabled = true;
// btnImportAll.Enabled = true; btnImportAll.Enabled = true;
// btnExport.Enabled = true; btnExport.Enabled = true;
// btnExportAll.Enabled = true; btnExportAll.Enabled = true;
// btnOk.Enabled = true; btnOk.Enabled = true;
// btnCancel.Enabled = true; btnCancel.Enabled = true;
//} else { } else {
// gbLaser.Enabled = false; gbLaser.Enabled = false;
// gbRamping.Enabled = false; gbRamping.Enabled = false;
// gbScanner.Enabled = false; gbScanner.Enabled = false;
// gbWobbel.Enabled = false; gbWobbel.Enabled = false;
// btnCopyParam.Enabled = false; btnCopyParam.Enabled = false;
// btnImport.Enabled = false; btnImport.Enabled = false;
// btnImportAll.Enabled = false; btnImportAll.Enabled = false;
// btnExport.Enabled = false; btnExport.Enabled = false;
// btnExportAll.Enabled = false; btnExportAll.Enabled = false;
// btnOk.Enabled = false; btnOk.Enabled = false;
// btnCancel.Enabled = true; btnCancel.Enabled = true;
//} }
//Welding Paramter 색 지정 //Welding Paramter 색 지정
//rbParam1.ForeColor = Color.FromName(((WeldingParameterIDEditor.eWeldingColor)1).ToString()); //rbParam1.ForeColor = Color.FromName(((WeldingParameterIDEditor.eWeldingColor)1).ToString());

View File

@ -116,10 +116,6 @@ namespace CoreUnit.Scanner
double m_markingOntheFlyParkingPositionX; double m_markingOntheFlyParkingPositionX;
double m_markingOntheFlyParkingPositionY; double m_markingOntheFlyParkingPositionY;
double m_markingStartX_1;
double m_markingStartX_2;
double m_XDiff_Page1and2;
double m_XDiff_Page3and4;
double m_flySpeedInterlock; double m_flySpeedInterlock;
double m_rotaryEncoderOffset; double m_rotaryEncoderOffset;
@ -526,45 +522,6 @@ namespace CoreUnit.Scanner
get { return m_markingOntheFlyParkingPositionY; } get { return m_markingOntheFlyParkingPositionY; }
} }
[Browsable(true)]
[ReadOnly(false)]
[Category("Marking On The Fly(MOTF)")]
[DisplayName("Marking Start X 1 (mm)")]
[Description("Marking Start X 1 (mm)")]
public double MarkingStartX_1 {
set { m_markingStartX_1 = value; }
get { return m_markingStartX_1; }
}
[Browsable(true)]
[ReadOnly(false)]
[Category("Marking On The Fly(MOTF)")]
[DisplayName("Marking Start X 2 (mm)")]
[Description("Marking Start X 2 (mm)")]
public double MarkingStartX_2 {
set { m_markingStartX_2 = value; }
get { return m_markingStartX_2; }
}
[Browsable(true)]
[ReadOnly(false)]
[Category("Marking On The Fly(MOTF)")]
[DisplayName("X Diff Page 1 & 2 (mm)")]
[Description("X Diff Page 1 & 2 (mm)")]
public double XDiff_Page1and2 {
set { m_XDiff_Page1and2 = value; }
get { return m_XDiff_Page1and2; }
}
[Browsable(true)]
[ReadOnly(false)]
[Category("Marking On The Fly(MOTF)")]
[DisplayName("X Diff Page 3 & 4 (mm)")]
[Description("X Diff Page 3 & 4 (mm)")]
public double XDiff_Page3and4 {
set { m_XDiff_Page3and4 = value; }
get { return m_XDiff_Page3and4; }
}
[Browsable(true)] [Browsable(true)]
[ReadOnly(false)] [ReadOnly(false)]
[Category("Marking On The Fly(MOTF)")] [Category("Marking On The Fly(MOTF)")]

View File

@ -158,9 +158,6 @@ namespace WeldingCommon.Alarm
StopSequence(CommonSequenceIds.SeqScoutNormal); StopSequence(CommonSequenceIds.SeqScoutNormal);
StopSequence(CommonSequenceIds.SeqUploadWeldingList); StopSequence(CommonSequenceIds.SeqUploadWeldingList);
StopSequence(CommonSequenceIds.SeqTeachingRun); StopSequence(CommonSequenceIds.SeqTeachingRun);
//26.04.15 추가
StopSequence(CommonSequenceIds.SeqAutoRunACS);
} }
} }

View File

@ -46,16 +46,11 @@ namespace WeldingCommon
builder builder
.AddLanguage("en-US", "ko-KR") .AddLanguage("en-US", "ko-KR")
.AddDeviceActiveStatus(CommonDeviceIds.Scanner) .AddDeviceActiveStatus(CommonDeviceIds.Scanner)
//.AddDeviceActiveStatus(CommonDeviceIds.Laser) .AddDeviceActiveStatus(CommonDeviceIds.Laser)
//.AddDeviceActiveStatus(CommonDeviceIds.IODevice) .AddDeviceActiveStatus(CommonDeviceIds.IODevice)
//.AddDeviceActiveStatus(CommonDeviceIds.PLCDevice) .AddDeviceActiveStatus(CommonDeviceIds.PLCDevice)
.AddDeviceActiveStatus(CommonDeviceIds.Light) .AddDeviceActiveStatus(CommonDeviceIds.Light)
.AddDeviceActiveStatus(CommonDeviceIds.ACS) .AddDeviceActiveStatus(CommonDeviceIds.SmcChiller);
.AddDeviceActiveStatus(CommonDeviceIds.AxisX2)
.AddDeviceActiveStatus(CommonDeviceIds.AxisZ);
//.AddDeviceActiveStatus(CommonDeviceIds.Light)
//.AddDeviceActiveStatus(CommonDeviceIds.SmcChiller);
} }
public bool CanShutDown() public bool CanShutDown()
@ -227,14 +222,13 @@ namespace WeldingCommon
registry.Register(CommonDeviceIds.Scanner, () => new Scanner(CommonDeviceIds.Scanner, isSimul), new ScannerConfig()); registry.Register(CommonDeviceIds.Scanner, () => new Scanner(CommonDeviceIds.Scanner, isSimul), new ScannerConfig());
registry.Register(CommonDeviceIds.Laser, () => new Laser(CommonDeviceIds.Laser, isSimul), new LaserConfig()); registry.Register(CommonDeviceIds.SmcChiller, () => new SmcChiller(CommonDeviceIds.SmcChiller, 0, isSimul), new SmcChiller.Config(),
//registry.Register(CommonDeviceIds.SmcChiller, () => new SmcChiller(CommonDeviceIds.SmcChiller, 0, isSimul), new SmcChiller.Config(), device => new UCSMCChillerDevice() { DataContext = new UCSMCChillerDeviceViewModel(AuroraEnv, CommonDeviceIds.SmcChiller) });
// device => new UCSMCChillerDevice() { DataContext = new UCSMCChillerDeviceViewModel(AuroraEnv, CommonDeviceIds.SmcChiller) });
VisionFactory.RegisterDevices(registry); VisionFactory.RegisterDevices(registry);
//registry.Register(CommonDeviceIds.Light, () => new LightDevice(CommonDeviceIds.Light, eLight.ERI, isSimul), new LightConfig(), registry.Register(CommonDeviceIds.Light, () => new LightDevice(CommonDeviceIds.Light, eLight.ERI, isSimul), new LightConfig(),
// device => new UCLight() { DataContext = new UCLightViewModel(AuroraEnv, CommonDeviceIds.Light, _SequenceSetting.LightValue) }); device => new UCLight() { DataContext = new UCLightViewModel(AuroraEnv, CommonDeviceIds.Light, _SequenceSetting.LightValue) });
// TODO: SystemParameterManager.Initialize 할 위치 찾자. 여기는 조금.... // TODO: SystemParameterManager.Initialize 할 위치 찾자. 여기는 조금....
SystemParameterManager.Initialize(AuroraEnv); SystemParameterManager.Initialize(AuroraEnv);

View File

@ -3,12 +3,8 @@
// 26.04.06 NDY // 26.04.06 NDY
using AuroraACS; using AuroraACS;
namespace WeldingCommon.Devices.ACS namespace WeldingCommon.Devices.ACS
{ {
// ── 레이저 출력 타입 ────────────────────────────────────── // ── 레이저 출력 타입 ──────────────────────────────────────
// Gun의 MainRecipe.eOutType과 동일 // Gun의 MainRecipe.eOutType과 동일
// partial class 밖에 정의 → IScannerACS 인터페이스에서도 참조 가능 // partial class 밖에 정의 → IScannerACS 인터페이스에서도 참조 가능
@ -18,114 +14,6 @@ namespace WeldingCommon.Devices.ACS
Interval, // hz Interval, // hz
} }
#region 26.04.14
//public partial class ScannerACS
//{
// const string AlarmReset = "iAlarmreset";
// const string HeavyAlarm = "iAlarm";
// const string LightAlarm = "iLightAlarm";
// const string AlarmCodes = "iPCAlarmNo"; // 10개
// const string BStageRemarkUse = "iPCset_BLINE_WeldingRemarkUse";
// const string IsLaserOn = "LCI_DEVICE.LaserEnabled";
// /// <summary>
// /// //////////////////////////////////////////////////////
// /// </summary>
// ///
// const string rOneShotTime = "rPCset_ALINE_SHOT_TIME";
// const string rOneShotCoreVoltage = "rPCset_ALINE_SHOT_CORE_VOLTAGE";
// const string rOneShotRingVoltage = "rPCset_ALINE_SHOT_RING_VOLTAGE";
// const string iOneShotComplete = "iPCget_ALINE_SHOT_COMP";
// const string rLineWeldingCoreVoltage = "rPCset_ALINE_LINE_CORE_VOLTAGE";
// const string rLineWeldingRingVoltage = "rPCset_ALINE_LINE_RING_VOLTAGE";
// const string rLineWeldingVel = "rPCset_ALINE_LINE_VEL";
// const string rLineWeldingAcc = "rPCset_ALINE_LINE_ACC";
// const string rLineWeldingLaserOnX = "rPCset_ALINE_LINE_LASERON_X";
// const string rLineWeldingLaserOnY = "rPCset_ALINE_LINE_LASERON_Y";
// const string rLineWeldingLaserOffX = "rPCset_ALINE_LINE_LASEROFF_X";
// const string rLineWeldingLaserOffY = "rPCset_ALINE_LINE_LASEROFF_Y";
// const string iLineWeldingComplete = "iPCget_ALINE_LINE_COMP";
// const string rWeldingPosition1PosX = "rPCset_ALINE_WeldingPosition1_X";
// const string rWeldingPosition1PosY = "rPCset_ALINE_WeldingPosition1_Y";
// const string rWeldingPosition2PosX = "rPCset_ALINE_WeldingPosition2_X";
// const string rWeldingPosition2PosY = "rPCset_ALINE_WeldingPosition2_Y";
// const string rWeldingPosition3PosX = "rPCset_ALINE_WeldingPosition3_X";
// const string rWeldingPosition3PosY = "rPCset_ALINE_WeldingPosition3_Y";
// const string rWeldingPosition4PosX = "rPCset_ALINE_WeldingPosition4_X";
// const string rWeldingPosition4PosY = "rPCset_ALINE_WeldingPosition4_Y";
// const string rWeldingPosition5PosX = "rPCset_ALINE_WeldingPosition5_X";
// const string rWeldingPosition5PosY = "rPCset_ALINE_WeldingPosition5_Y";
// const string rWeldingPosition6PosX = "rPCset_ALINE_WeldingPosition6_X";
// const string rWeldingPosition6PosY = "rPCset_ALINE_WeldingPosition6_Y";
// const string rWeldingPosition7PosX = "rPCset_ALINE_WeldingPosition7_X";
// const string rWeldingPosition7PosY = "rPCset_ALINE_WeldingPosition7_Y";
// const string rWeldingPosition8PosX = "rPCset_ALINE_WeldingPosition8_X";
// const string rWeldingPosition8PosY = "rPCset_ALINE_WeldingPosition8_Y";
// const string rWeldingEdgePointRad1 = "rPCset_ALINE_EdgePointRad1";
// const string rWeldingEdgePointRad2 = "rPCset_ALINE_EdgePointRad2";
// const string rWeldingEdgePointRad3 = "rPCset_ALINE_EdgePointRad3";
// const string rWeldingEdgePointRad4 = "rPCset_ALINE_EdgePointRad4";
// const string rWeldingCorePowerMax = "rPCset_ALINE_WEL_COREPOWER_MAX";
// const string rWeldingCorePowerMin = "rPCset_ALINE_WEL_COREPOWER_MIN";
// const string rWeldingRingPowerMax = "rPCset_ALINE_WEL_RINGPOWER_MAX";
// const string rWeldingRingPowerMin = "rPCset_ALINE_WEL_RINGPOWER_MIN";
// const string rWeldingAcc = "rPCset_ALINE_WEL_ACC";
// const string rWeldingSVel = "rPCset_ALINE_WEL_SVEL";
// const string rWeldingCVel = "rPCset_ALINE_WEL_CVEL";
// const string iWeldingComplete = "iPCget_ALINE_WEL_COMP";
// const string rWeldingStartPosX = "rPCset_ALINE_WEL_ST_POS_X";
// const string rWeldingStartPosY = "rPCset_ALINE_WEL_ST_POS_Y";
// const string rWeldingEndPosX = "rPCset_ALINE_WEL_EN_POS_X";
// const string rWeldingEndPosY = "rPCset_ALINE_WEL_EN_POS_Y";
// const string rLaserONPosX = "rPCset_ALINE_LASER_ONPOS_X";
// const string rLaserONOffset = "rPCset_ALINE_LASER_ON_OFFSET";
// const string rLaserOFFPosX = "rPCset_ALINE_LASER_OFFPOS_X";
// const string rLaserOFFOffset = "rPCset_ALINE_LASER_OFF_OFFSET";
// const string rRampingONOverlapDist = "rPCset_ALINE_RAMP_ON_OVERLAP_DIS";
// const string rRampingONStartPower = "rPCset_ALINE_RAMP_ON_STARTPOWER";
// const string rRampingOFFStartPosX = "rPCset_ALINE_RAMP_OFF_STPOS_X";
// const string rRampingOFFOverlapDist = "rPCset_ALINE_RAMP_OFF_OVERLAP_DIS";
// const string rRampingOFFEndPower = "rPCset_ALINE_RAMP_OFF_ENDPOWER";
// const string iALaserShotMode = "iPCset_ALASER_SHOT_MODE";
// const string iAStageLCType = "iPCset_ALINE_LCTYPE";
// const string iAllAxisHomeComplete = "iPCget_ALLAXIS_HOMECOMP";
// const string iXAxisNumber = "iPCget_LCI_ASMASK_X";
// const string iYAxisNumber = "iPCget_LCI_ASMASK_Y";
// const string iLaserUse = "iPCset_LASER_USE";
// private enum eBuffer
// {
// All_Axis_Home,
// AxisX1_Home,
// AxisX2_Home,
// AxisY1_Home,
// AxisY2_Home,
// AxisZ_Home,
// Welding_Line = 11,
// Welding_AllRound,
// Welding_OneShot
// }
//}
#endregion
#region 26.04.14
public partial class ScannerACS public partial class ScannerACS
{ {
// ── 알람 ────────────────────────────────────────── // ── 알람 ──────────────────────────────────────────
@ -243,6 +131,4 @@ namespace WeldingCommon.Devices.ACS
MOTF_Start = 17, // 26.04.09 NDY xlsx Buffer Info 기준 확정 MOTF_Start = 17, // 26.04.09 NDY xlsx Buffer Info 기준 확정
} }
} }
#endregion
} }

View File

@ -41,7 +41,6 @@ namespace WeldingCommon.Devices.ACS
bool MOTFStart(); bool MOTFStart();
bool MOTFStop(); bool MOTFStop();
bool CheckMOTFComp(); bool CheckMOTFComp();
bool ResetMOTFComp(); // ← 여기에 추가 BUFFER 17에서 완료에 대한 플래그 리셋 0 으로 하는 것 260417
// OneShot // OneShot
bool SetOneShot(int msecShotTime, double secPhzShotPulse1, double secPhzShotPulse2); bool SetOneShot(int msecShotTime, double secPhzShotPulse1, double secPhzShotPulse2);
@ -105,10 +104,10 @@ namespace WeldingCommon.Devices.ACS
private ACSDeviceSetting _setting; private ACSDeviceSetting _setting;
// Scanner는 Stage X (X2) 1축만 사용 | Z 축까지 사용 스캐너 높이 // Scanner는 Stage X (X2) 1축만 사용
// Gun은 X1, X2, Y1, Y2, Z 5축 사용 // Gun은 X1, X2, Y1, Y2, Z 5축 사용
private ACSMotor MotorStageX; // AxisX2 = Scanner Stage X private ACSMotor MotorStageX; // AxisX2 = Scanner Stage X
private ACSMotor MotorStageZ; // 26.04.14 = AxisZ
public MotionVariable _motorVariable; public MotionVariable _motorVariable;
public bool HasHeavyAlarm { get; private set; } public bool HasHeavyAlarm { get; private set; }
@ -138,9 +137,6 @@ namespace WeldingCommon.Devices.ACS
try { MotorStageX = env.DeviceManager[CommonDeviceIds.AxisX2] as ACSMotor; } try { MotorStageX = env.DeviceManager[CommonDeviceIds.AxisX2] as ACSMotor; }
catch { MotorStageX = null; } catch { MotorStageX = null; }
try { MotorStageZ = env.DeviceManager[CommonDeviceIds.AxisZ] as ACSMotor; }
catch { MotorStageZ = null; }
SetMonitoringService(UpdateACSParam, 50); SetMonitoringService(UpdateACSParam, 50);
StartMonitoringService(); StartMonitoringService();
@ -156,16 +152,9 @@ namespace WeldingCommon.Devices.ACS
_motorVariable.X2InPosition = MotorStageX.IsInpos(); _motorVariable.X2InPosition = MotorStageX.IsInpos();
_motorVariable.X2AxisVelocity = MotorStageX.GetFeedbackVelocity(); _motorVariable.X2AxisVelocity = MotorStageX.GetFeedbackVelocity();
_motorVariable.X2AxisAcceleration = MotorStageX.GetAcceleration(); _motorVariable.X2AxisAcceleration = MotorStageX.GetAcceleration();
_motorVariable.IsHome |= MotorStageX.GetServoStatus() == 1; _motorVariable.IsHome = MotorStageX.GetServoStatus() == 1;
}
if (MotorStageZ != null)
{
_motorVariable.ZAxisPosition = MotorStageZ.GetActualPos();
_motorVariable.ZInPosition = MotorStageZ.IsInpos();
_motorVariable.ZAxisVelocity = MotorStageZ.GetFeedbackVelocity();
_motorVariable.ZAxisAcceleration = MotorStageZ.GetAcceleration();
_motorVariable.IsHome |= MotorStageZ.GetServoStatus() == 1;
} }
// 알람 상태 갱신 // 알람 상태 갱신
HasHeavyAlarm = ReadVariableInt(HeavyAlarm) == 1; HasHeavyAlarm = ReadVariableInt(HeavyAlarm) == 1;
HasLightAlarm = ReadVariableInt(LightAlarm) == 1; HasLightAlarm = ReadVariableInt(LightAlarm) == 1;
@ -241,29 +230,10 @@ namespace WeldingCommon.Devices.ACS
bool IScannerACS.CheckMOTFComp() bool IScannerACS.CheckMOTFComp()
{ {
#region 260418 확인 - 확인 완료
// 26.04.17 NDY - 시퀀스 완료 후 장비 상태 복귀
Status.SetStatus(eEqpStatus.Manual);
#endregion
if (IsSimul) return true; if (IsSimul) return true;
return ReadVariableInt(iMOTFComplete) > 0; return ReadVariableInt(iMOTFComplete) > 0;
} }
// 260417여기 추가
bool IScannerACS.ResetMOTFComp()
{
if (IsSimul) return true;
if (WriteVariableInt(iMOTFComplete, 0))
{
Log.I("ResetMOTFComp >> Complete (iPCset_MOF_WEL_COMP = 0)");
return true;
}
Log.E("ResetMOTFComp >> Fail");
return false;
}
// ── OneShot ────────────────────────────────────────────────────────── // ── OneShot ──────────────────────────────────────────────────────────
bool IScannerACS.SetOneShot(int msecShotTime, double secPhzShotPulse1, double secPhzShotPulse2) bool IScannerACS.SetOneShot(int msecShotTime, double secPhzShotPulse1, double secPhzShotPulse2)
{ {

View File

@ -145,10 +145,10 @@ namespace WeldingCommon
public const string ACS = "ACS"; // 26.04.06 추가 public const string ACS = "ACS"; // 26.04.06 추가
//public const string AxisX1 = "AxisX1"; public const string AxisX1 = "AxisX1";
public const string AxisX2 = "AxisX2"; // 26.04.06 추가 public const string AxisX2 = "AxisX2"; // 26.04.06 추가
//public const string AxisY1 = "AxisY1"; public const string AxisY1 = "AxisY1";
//public const string AxisY2 = "AxisY2"; public const string AxisY2 = "AxisY2";
// Ajin Motor // Ajin Motor
public const string AxisZ = "AxisZ"; public const string AxisZ = "AxisZ";
@ -219,8 +219,6 @@ namespace WeldingCommon
public const string MotorInit = "MotorInit"; public const string MotorInit = "MotorInit";
public const string OneShot = "OneShot"; public const string OneShot = "OneShot";
#endregion #endregion
// 26.04.09 NDY - ACS MOTF AutoRun - > SeqAutoRun은 CommonSequenceIds에 존재함.
public const string SeqAutoRunACS = "SeqAutoRunACS";
} }
public class EquipEvent public class EquipEvent
@ -268,10 +266,10 @@ namespace WeldingCommon
// 26 .04.13 // 26 .04.13
public class CommonMotorIds public class CommonMotorIds
{ {
//public const string AxisX1 = "AxisX1"; public const string AxisX1 = "AxisX1";
public const string AxisX2 = "AxisX2"; public const string AxisX2 = "AxisX2";
//public const string AxisY1 = "AxisY1"; public const string AxisY1 = "AxisY1";
//public const string AxisY2 = "AxisY2"; public const string AxisY2 = "AxisY2";
// Ajin Motor // Ajin Motor
public const string AxisZ = "AxisZ"; public const string AxisZ = "AxisZ";

View File

@ -17,7 +17,6 @@ using WeldingCommon.Settings;
namespace WeldingCommon.Sequences namespace WeldingCommon.Sequences
{ {
// 캘리브레이션 작업 시 타는 시퀸스
public class SeqScannerCalibration public class SeqScannerCalibration
{ {
static readonly Logger Log = new Logger("SeqScannerCalibration"); static readonly Logger Log = new Logger("SeqScannerCalibration");

View File

@ -51,7 +51,7 @@ namespace WeldingCommon.Sequences.Monitoring
private static Laser _laser; private static Laser _laser;
private static LaserTruFiber _laserCore; private static LaserTruFiber _laserCore;
private static ScannerACS _acs; // 26.04.13 private static ScannerACS _acs; // 26.04.13
private static ACSMotor _axisX, _axisZ; //, _axisY1, _axisY2, private static ACSMotor _axisX, _axisY1, _axisY2, _axisZ;
public const int NODE_SLEEP = 100; // msec public const int NODE_SLEEP = 100; // msec
@ -80,7 +80,6 @@ namespace WeldingCommon.Sequences.Monitoring
} }
//StartNode 알람
private static SequenceActionResult StartNode(SequenceContext context, string id, SequenceActionResult param) private static SequenceActionResult StartNode(SequenceContext context, string id, SequenceActionResult param)
{ {
_SequenceSetting = context.Settings[CommonSettingIds.Sequence] as SequenceSetting; _SequenceSetting = context.Settings[CommonSettingIds.Sequence] as SequenceSetting;
@ -96,11 +95,11 @@ namespace WeldingCommon.Sequences.Monitoring
if (_axisX is null) if (_axisX is null)
_axisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor; _axisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor;
//if (_axisY1 is null) if (_axisY1 is null)
// _axisY1 = context.Devices[CommonMotorIds.AxisY1] as ACSMotor; _axisY1 = context.Devices[CommonMotorIds.AxisY1] as ACSMotor;
//if (_axisY2 is null) if (_axisY2 is null)
// _axisY2 = context.Devices[CommonMotorIds.AxisY2] as ACSMotor; _axisY2 = context.Devices[CommonMotorIds.AxisY2] as ACSMotor;
if (_axisZ is null) if (_axisZ is null)
_axisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor; _axisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor;

View File

@ -64,7 +64,7 @@ namespace WeldingCommon.Sequences
sb.AddAction(SEQ_ENTER, Sequence_Enter); sb.AddAction(SEQ_ENTER, Sequence_Enter);
sb.AddAction(SEQ_CHECK_INIT_CONDITION, CheckInitCondition); sb.AddAction(SEQ_CHECK_INIT_CONDITION, CheckInitCondition);
sb.AddAction(SEQ_ACS_ALARM_RESET, ACSAlarmReset); sb.AddAction(SEQ_ACS_ALARM_RESET, ACSAlarmReset);
//sb.AddAction(SEQ_INIT_ACS_AXIS, ACSAxisInit); sb.AddAction(SEQ_INIT_ACS_AXIS, ACSAxisInit);
sb.AddAction(SEQ_INIT_COMPLETE, InitComplete); sb.AddAction(SEQ_INIT_COMPLETE, InitComplete);
sb.OnStopped(OnStopped); sb.OnStopped(OnStopped);
@ -116,26 +116,26 @@ namespace WeldingCommon.Sequences
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
//private static SequenceActionResult ACSAxisInit(SequenceContext context, string id, SequenceActionResult param) private static SequenceActionResult ACSAxisInit(SequenceContext context, string id, SequenceActionResult param)
//{ {
// Log.V($"ACS Init Start"); Log.V($"ACS Init Start");
// _motion.AllAxisHomeStart(); _motion.AllAxisHomeStart();
// Thread.Sleep(1000); Thread.Sleep(1000);
// var res = context.RetryUntilSuccess(() => _motion.CheckAllAxisHome(), SEQ_TIMEOUT, MOTION_INTERVAL); var res = context.RetryUntilSuccess(() => _motion.CheckAllAxisHome(), SEQ_TIMEOUT, MOTION_INTERVAL);
// if (res == E2.TIMEOUT) { if (res == E2.TIMEOUT) {
// context.PutValue<int>("AlarmCode", AlarmCode_PrismaticGun.ACS_AXIS_INITIALIZE_FAIL); // 26.04.13 잠시 주석 context.PutValue<int>("AlarmCode", AlarmCode_PrismaticGun.ACS_AXIS_INITIALIZE_FAIL); // 26.04.13 잠시 주석
// context.PutValue<string>("AlarmMessage", "ACS Axis Home Timeout"); context.PutValue<string>("AlarmMessage", "ACS Axis Home Timeout");
// return null; return null;
// } else if (res == E2.CANCELLED) { } else if (res == E2.CANCELLED) {
// context.PutValue<int>("AlarmCode", 0); context.PutValue<int>("AlarmCode", 0);
// context.PutValue<string>("AlarmMessage", "ACS Axis Home Cancel"); context.PutValue<string>("AlarmMessage", "ACS Axis Home Cancel");
// return null; return null;
// } }
// Log.V($"ACS Init End"); Log.V($"ACS Init End");
// return SequenceAction.Ok(eTeachingPosition.SafetyPosition); return SequenceAction.Ok(eTeachingPosition.SafetyPosition);
//} }
private static SequenceActionResult InitComplete(SequenceContext context, string id, SequenceActionResult param) private static SequenceActionResult InitComplete(SequenceContext context, string id, SequenceActionResult param)
{ {

View File

@ -137,15 +137,15 @@ namespace WeldingCommon.Sequences
_laserCal = context.Settings[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam; _laserCal = context.Settings[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam;
_AxisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor; _AxisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor;
//_AxisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor; _AxisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor;
//if (_data[LineInLinesIndex].YAxisType == (int)eYAxisType.Y1) { if (_data[LineInLinesIndex].YAxisType == (int)eYAxisType.Y1) {
// _AxisY = context.Devices[CommonMotorIds.AxisY1] as ACSMotor; _AxisY = context.Devices[CommonMotorIds.AxisY1] as ACSMotor;
// _acsMotion.SetWeldingAxes((int)CommonMotorIds.eMotorIdx.AxisX2, (int)CommonMotorIds.eMotorIdx.AxisY1); _acsMotion.SetWeldingAxes((int)CommonMotorIds.eMotorIdx.AxisX2, (int)CommonMotorIds.eMotorIdx.AxisY1);
//} }
//else { else {
// _AxisY = context.Devices[CommonMotorIds.AxisY2] as ACSMotor; _AxisY = context.Devices[CommonMotorIds.AxisY2] as ACSMotor;
// _acsMotion.SetWeldingAxes((int)CommonMotorIds.eMotorIdx.AxisX2, (int)CommonMotorIds.eMotorIdx.AxisY2); _acsMotion.SetWeldingAxes((int)CommonMotorIds.eMotorIdx.AxisX2, (int)CommonMotorIds.eMotorIdx.AxisY2);
//} }
if (Status.EquipmentStatus == eEqpStatus.Manual) if (Status.EquipmentStatus == eEqpStatus.Manual)

View File

@ -80,10 +80,10 @@ namespace WeldingCommon.Sequences.SubSequence.StageA
_acs = context.Devices[CommonDeviceIds.ACS] as ScannerACS; //260413 _acs = context.Devices[CommonDeviceIds.ACS] as ScannerACS; //260413
if (_AxisX is null) if (_AxisX is null)
_AxisX = _FirstMoveAxis = context.Devices[CommonDeviceIds.AxisX2] as ACSMotor; _AxisX = _FirstMoveAxis = context.Devices[CommonDeviceIds.AxisX2] as ACSMotor;
//if (_AxisY1 is null) if (_AxisY1 is null)
// _AxisY1 = _SecondMoveAxis = context.Devices[CommonDeviceIds.AxisY1] as ACSMotor; _AxisY1 = _SecondMoveAxis = context.Devices[CommonDeviceIds.AxisY1] as ACSMotor;
//if (_AxisY2 is null) if (_AxisY2 is null)
// _AxisY2 = _SecondMoveAxis = context.Devices[CommonDeviceIds.AxisY2] as ACSMotor; _AxisY2 = _SecondMoveAxis = context.Devices[CommonDeviceIds.AxisY2] as ACSMotor;
if (_AxisZ is null) if (_AxisZ is null)
_AxisZ = context.Devices[CommonDeviceIds.AxisZ] as ACSMotor; _AxisZ = context.Devices[CommonDeviceIds.AxisZ] as ACSMotor;

View File

@ -124,8 +124,8 @@ namespace WeldingCommon.Sequences.SubSequence.StageA
_AxisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor; _AxisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor;
_AxisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor; _AxisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor;
//_MotorY1 = context.Devices[CommonMotorIds.AxisY1] as ACSMotor; _MotorY1 = context.Devices[CommonMotorIds.AxisY1] as ACSMotor;
//_MotorY2 = context.Devices[CommonMotorIds.AxisY2] as ACSMotor; _MotorY2 = context.Devices[CommonMotorIds.AxisY2] as ACSMotor;
if (_mainRecipe.YAxisUseType == MainRecipe.YAxisType.Y1) { if (_mainRecipe.YAxisUseType == MainRecipe.YAxisType.Y1) {
_AxisY = _MotorY1; _AxisY = _MotorY1;

View File

@ -1,6 +1,5 @@
using Aurora.Api; using Aurora.Api;
using Aurora.Api.Devices; using Aurora.Api.Devices;
using Aurora.Util.HislogPlus;
using AuroraLaser; using AuroraLaser;
using AuroraLaserScanner; using AuroraLaserScanner;
using CoreUnit.Control.UserControl.Canvas; using CoreUnit.Control.UserControl.Canvas;
@ -9,7 +8,6 @@ using DB;
using Hermes; using Hermes;
using Matrox.MatroxImagingLibrary; using Matrox.MatroxImagingLibrary;
using Newtonsoft.Json; using Newtonsoft.Json;
using OpenCvSharp;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration; using System.Configuration;
@ -74,7 +72,7 @@ namespace WeldingCommon.Sequences
private static int _CenterRingRatio; // Center Ring의 파워 비율 private static int _CenterRingRatio; // Center Ring의 파워 비율
private static float _LaserPowerRatio; // Laser에서 출력 파워 비율 private static float _LaserPowerRatio; // Laser에서 출력 파워 비율
private bool isFirst = true;
private static SeqUploadWeldingList_OutParam result; private static SeqUploadWeldingList_OutParam result;
const int ROTATION_DEGREE = 15; // 15도 설정, 하나의 지그가 30도 이므로, 15도부터 돌도록 설정됨. const int ROTATION_DEGREE = 15; // 15도 설정, 하나의 지그가 30도 이므로, 15도부터 돌도록 설정됨.
@ -118,7 +116,7 @@ namespace WeldingCommon.Sequences
private SequenceActionResult Sequence_Enter(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult Sequence_Enter(SequenceContext context, string id, SequenceActionResult param)
{ {
Log.I("[Sequence_Enter] SeqUploadWeldingList Start"); Log.I("SeqUploadWeldingList Start");
_InitParam = param.Param as SeqUploadWeldingList_InitParam; _InitParam = param.Param as SeqUploadWeldingList_InitParam;
_LaserPowerCalParam = context.GetSetting<LaserPowerCalParam>(CommonSettingIds.LaserPowerCalParam);//우선 AuroraRecipe로 상속받아서 함수 사용하도록 함 _LaserPowerCalParam = context.GetSetting<LaserPowerCalParam>(CommonSettingIds.LaserPowerCalParam);//우선 AuroraRecipe로 상속받아서 함수 사용하도록 함
@ -130,7 +128,7 @@ namespace WeldingCommon.Sequences
InitDev(context); InitDev(context);
if (!CheckDeviceReady(context)) { //Check Device if (!CheckDeviceReady(context)) { //Check Device
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_DeviceNotReady); AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_DeviceNotReady);
Log.E("[Sequence_Enter] The devices are not active."); Log.E("The devices are not active.");
return null; return null;
} }
@ -141,7 +139,7 @@ namespace WeldingCommon.Sequences
// ian0513, 이게 여기 있어야 할까??, 무엇을 측정 하기 위한건지 명확히 알고 실제 공정이면 다른 밑의 Node 로 변경 // ian0513, 이게 여기 있어야 할까??, 무엇을 측정 하기 위한건지 명확히 알고 실제 공정이면 다른 밑의 Node 로 변경
_UploadstartTime = DateTime.Now; _UploadstartTime = DateTime.Now;
isFirst = true;
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
@ -151,15 +149,8 @@ namespace WeldingCommon.Sequences
_LaserPowerCalParam.Initialize(_LaserPowerCalParam.PowerCalibrationCenterBeamCSVFile, _LaserPowerCalParam.PowerCalibrationRingBeamCSVFile); _LaserPowerCalParam.Initialize(_LaserPowerCalParam.PowerCalibrationCenterBeamCSVFile, _LaserPowerCalParam.PowerCalibrationRingBeamCSVFile);
_FlyOffsetX = 0; _FlyOffsetX = 0;
_FlyOffsetY = 0; _FlyOffsetY = 0;
if (_Scanner.Config.UseMarkingOnTheFly) {
if (_InitParam.PageNum == 1 || _InitParam.PageNum == 2)
_FlyOffsetY += _Scanner.Config.XDiff_Page1and2;
else
_FlyOffsetY += _Scanner.Config.XDiff_Page3and4;
}
return true; return true;
} }
@ -168,7 +159,7 @@ namespace WeldingCommon.Sequences
{ {
//Device Init //Device Init
_Scanner = context.GetLaserScanner(); _Scanner = context.GetLaserScanner();
//_Laser = context.GetLaser(); _Laser = context.GetLaser();
} }
private bool CheckDeviceReady(SequenceContext context) private bool CheckDeviceReady(SequenceContext context)
@ -222,7 +213,7 @@ namespace WeldingCommon.Sequences
{ {
if (!CheckCondition()) { if (!CheckCondition()) {
AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_CheckInitCondition); AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_CheckInitCondition);
Log.E("[CheckInitCondition] Condition is not in state to start sequence."); Log.E("Condition is not in state to start sequence.");
context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, false); context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, false);
return SEQ_COMPLETE; return SEQ_COMPLETE;
} }
@ -230,54 +221,46 @@ namespace WeldingCommon.Sequences
var startTime = DateTime.Now; var startTime = DateTime.Now;
context.PutValue(ContextKey.KEY_SEQUENCE_START_TIME, startTime); context.PutValue(ContextKey.KEY_SEQUENCE_START_TIME, startTime);
Log.D("[CheckInitCondition] UploadWeldingList Sequence CheckInitCondition"); Log.D("UploadWeldingList Sequence CheckInitCondition");
return SEQ_MARKING_ON_THE_FLY_ON; return SEQ_MARKING_ON_THE_FLY_ON;
} }
// MOTF 지원 중 // MOTF 지원 중
private SequenceActionResult MarkingOnTheFlyOn(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult MarkingOnTheFlyOn(SequenceContext context, string id, SequenceActionResult param)
{ {
#region 260416 복원 -지운 내용 복원함. if (_Scanner.Config.UseMarkingOnTheFly) {
//if (_Scanner.Config.UseMarkingOnTheFly) if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.XY) {
//{ // 1. Linear Track OTF 활성화 및 엔코더 초기화
// if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.XY) _Scanner.SetFlyX(_Scanner.Config.MarkingOnTheFlyEncoderResolutionX);
// {
// // 1. Linear Track OTF 활성화 및 엔코더 초기화
// _Scanner.SetFlyX(_Scanner.Config.MarkingOnTheFlyEncoderResolutionX);
// // 2. 엔코더 특정 위치갈 때까지 대기 // 2. 엔코더 특정 위치갈 때까지 대기
// _Scanner.WaitForEncoderX(_Scanner.Config.MarkingStartEncoderPositionX); _Scanner.WaitForEncoderX(_Scanner.Config.MarkingStartEncoderPositionX);
// _FlyOffsetX = _Scanner.Config.MarkingOntheFlyOffsetX; _FlyOffsetX = _Scanner.Config.MarkingOntheFlyOffsetX;
// _FlyOffsetY = _Scanner.Config.MarkingOntheFlyOffsetY; _FlyOffsetY = _Scanner.Config.MarkingOntheFlyOffsetY;
// } } else if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.Rotate) {
// else if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.Rotate) Log.I(string.Format("MOTF 사용, Rotate 보상"));
// { // 1. 엔코더 값이 들어오면 바로 X(Rotary) Encoder 리셋
// Log.I(string.Format("MOTF 사용, Rotate 보상")); _Scanner.SetFlyRotate(_Scanner.Config.MarkingOnTheFlyEncoderResolutionRotate);
// // 1. 엔코더 값이 들어오면 바로 X(Rotary) Encoder 리셋
// _Scanner.SetFlyRotate(_Scanner.Config.MarkingOnTheFlyEncoderResolutionRotate);
// // 2. 일괄 회전.(OTW 세팅시, Encoder가 0부터 시작하므로) // 2. 일괄 회전.(OTW 세팅시, Encoder가 0부터 시작하므로)
// foreach (IDrawObject obj in _InitParam.SelectedDrawObjectList) foreach (IDrawObject obj in _InitParam.SelectedDrawObjectList) {
// { obj.Rotate(ROTATION_DEGREE, new UnitPoint(_Scanner.Config.MarkingOnTheFlyRotateCenterX, _Scanner.Config.MarkingOnTheFlyRotateCenterY)); // +15도 회전
// obj.Rotate(ROTATION_DEGREE, new UnitPoint(_Scanner.Config.MarkingOnTheFlyRotateCenterX, _Scanner.Config.MarkingOnTheFlyRotateCenterY)); // +15도 회전 }
// }
// // 3. 원하는 용접 시작 각도 올 때까지 기다리기. // 3. 원하는 용접 시작 각도 올 때까지 기다리기.
// double weldingAngle = _Scanner.Config.MarkingRangeMinRotate + ROTATION_DEGREE; double weldingAngle = _Scanner.Config.MarkingRangeMinRotate + ROTATION_DEGREE;
// _Scanner.WaitForEncoderRotateX(weldingAngle); // -5도부터 용접시작하고 싶으면 10도 넣으면 됨 _Scanner.WaitForEncoderRotateX(weldingAngle); // -5도부터 용접시작하고 싶으면 10도 넣으면 됨
// // _FlyOffsetX, _FlyOffsetY 값 설정 불필요, 0-0 이면 됨. // _FlyOffsetX, _FlyOffsetY 값 설정 불필요, 0-0 이면 됨.
// } }
// // 엔코더 기록(용접 시작) // 엔코더 기록(용접 시작)
// _Scanner.StoreEncoder(0); _Scanner.StoreEncoder(0);
// _Scanner.SaveAndRestartTimer(); // 이전 용접의 T/T을 가져가고 싶으면 여기서 Reset 하기 전에 GetTime으로 읽어가야 함 _Scanner.SaveAndRestartTimer(); // 이전 용접의 T/T을 가져가고 싶으면 여기서 Reset 하기 전에 GetTime으로 읽어가야 함
//} }
#endregion
Log.I($"[MarkingOnTheFlyOn] Comp");
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
@ -288,8 +271,6 @@ namespace WeldingCommon.Sequences
_Scanner.SetTrigger(_Scanner.Config.RecordPeriod, _Scanner.SetTrigger(_Scanner.Config.RecordPeriod,
_Scanner.Config.RecordSignalType1, _Scanner.Config.RecordSignalType2, _Scanner.Config.RecordSignalType1, _Scanner.Config.RecordSignalType2,
_Scanner.Config.RecordSignalType3, _Scanner.Config.RecordSignalType4); _Scanner.Config.RecordSignalType3, _Scanner.Config.RecordSignalType4);
Log.I($"[RecordSignalOn] Scanner SetTrigger 1 {_Scanner.Config.RecordSignalType1.ToString()} ,2 {_Scanner.Config.RecordSignalType2.ToString()}, 3 {_Scanner.Config.RecordSignalType3.ToString()} ,4 {_Scanner.Config.RecordSignalType4.ToString()}");
} }
return SequenceAction.Ok(); return SequenceAction.Ok();
@ -299,28 +280,24 @@ namespace WeldingCommon.Sequences
{ {
//객체에 대한 파라미터 Load 전 lastX,Y를 현재 스캐너 위치로 받아옴 //객체에 대한 파라미터 Load 전 lastX,Y를 현재 스캐너 위치로 받아옴
_Scanner.GetXYPos(out _LastX, out _LastY); _Scanner.GetXYPos(out _LastX, out _LastY);
Log.I($"[LoadDrawObjectScannerParam] 현재 스캐너 위치 Last X ({_LastX}) Last Y ({_LastY})");
_ExternalCommandOffset.X = (float)_InitParam.CellMeasureCenterOffsetX; _ExternalCommandOffset.X = (float)_InitParam.CellMeasureCenterOffsetX;
_ExternalCommandOffset.Y = (float)_InitParam.CellMeasureCenterOffsetY; _ExternalCommandOffset.Y = (float)_InitParam.CellMeasureCenterOffsetY;
Log.I($"[LoadDrawObjectScannerParam] _ExternalCommandOffset X ({_ExternalCommandOffset.X}) Y ({_ExternalCommandOffset.Y})");
// 첫번째 Object의 파라미터만 넣어주자? // 첫번째 Object의 파라미터만 넣어주자?
var scanParam = getScannerParameter(_InitParam.SelectedDrawObjectList.First()); var scanParam = getScannerParameter(_InitParam.SelectedDrawObjectList.First());
if (scanParam != null) { if (scanParam != null) {
result.SettingPower = scanParam.LaserPower1 + scanParam.LaserPower2; result.SettingPower = scanParam.LaserPower1 + scanParam.LaserPower2;
result.SettingVelocity = scanParam.MarkSpeed; result.SettingVelocity = scanParam.MarkSpeed;
} }
//ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[obj.ScannerParamNo]; //ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[obj.ScannerParamNo];
int drawObjectCount = FuncLoadDrawObjectScannerParam(_InitParam.SelectedDrawObjectList); int drawObjectCount = FuncLoadDrawObjectScannerParam(_InitParam.SelectedDrawObjectList);
Log.I($"[LoadDrawObjectScannerParam] SeqUploadWeldingList_OutParam : SettingPower ({result.SettingPower}) SettingVelocity ({result.SettingVelocity}) " +
$"drawObjectCount : ({drawObjectCount})");
//var weldingData = Status.GetProcessingWeldingData(); //var weldingData = Status.GetProcessingWeldingData();
//weldingData.UploadDatas[eUploadData.LaserWeldingRecipeNo].Value = context.Recipes.ActivatedRecipe().Id; //weldingData.UploadDatas[eUploadData.LaserWeldingRecipeNo].Value = context.Recipes.ActivatedRecipe().Id;
//weldingData.UploadDatas[eUploadData.PreWeldingPointCount].Value = drawObjectCount; //weldingData.UploadDatas[eUploadData.PreWeldingPointCount].Value = drawObjectCount;
//if (_PageNo == 1) //if (_PageNo == 1) {
//{
// weldingData.UploadDatas[eUploadData.CommonLaserDrawSpeed].Value = _ScannerParam.MarkSpeed; // weldingData.UploadDatas[eUploadData.CommonLaserDrawSpeed].Value = _ScannerParam.MarkSpeed;
// weldingData.UploadDatas[eUploadData.CommonLaserJumpSpeed].Value = _ScannerParam.JumpSpeed; // weldingData.UploadDatas[eUploadData.CommonLaserJumpSpeed].Value = _ScannerParam.JumpSpeed;
// weldingData.UploadDatas[eUploadData.CommonLaserMainPowerCore].Value = _ScannerParam.LaserPower1; // weldingData.UploadDatas[eUploadData.CommonLaserMainPowerCore].Value = _ScannerParam.LaserPower1;
@ -329,9 +306,7 @@ namespace WeldingCommon.Sequences
// weldingData.UploadDatas[eUploadData.CommonLaserRampingLength_Starting].Value = _ScannerParam.RampingStartDist; // weldingData.UploadDatas[eUploadData.CommonLaserRampingLength_Starting].Value = _ScannerParam.RampingStartDist;
// weldingData.UploadDatas[eUploadData.CommonLaserRampingPower_OverPath].Value = _ScannerParam.RampingEndPower; // weldingData.UploadDatas[eUploadData.CommonLaserRampingPower_OverPath].Value = _ScannerParam.RampingEndPower;
// weldingData.UploadDatas[eUploadData.CommonLaserRampingLength_OverPath].Value = _ScannerParam.RampingEndDist; // weldingData.UploadDatas[eUploadData.CommonLaserRampingLength_OverPath].Value = _ScannerParam.RampingEndDist;
//} //} else {
//else
//{
// weldingData.UploadDatas[eUploadData.CathodeLaserDrawSpeed].Value = _ScannerParam.MarkSpeed; // weldingData.UploadDatas[eUploadData.CathodeLaserDrawSpeed].Value = _ScannerParam.MarkSpeed;
// weldingData.UploadDatas[eUploadData.CathodeLaserJumpSpeed].Value = _ScannerParam.JumpSpeed; // weldingData.UploadDatas[eUploadData.CathodeLaserJumpSpeed].Value = _ScannerParam.JumpSpeed;
// weldingData.UploadDatas[eUploadData.CathodeLaserMainPowerCore].Value = _ScannerParam.LaserPower1; // weldingData.UploadDatas[eUploadData.CathodeLaserMainPowerCore].Value = _ScannerParam.LaserPower1;
@ -367,7 +342,7 @@ namespace WeldingCommon.Sequences
return count; return count;
} }
//
private int FuncLoadDrawObjectScannerParamSelected(IDrawObject obj) private int FuncLoadDrawObjectScannerParamSelected(IDrawObject obj)
{ {
if (!obj.Enabled) if (!obj.Enabled)
@ -388,20 +363,6 @@ namespace WeldingCommon.Sequences
} }
if (obj is Line) { if (obj is Line) {
if (isFirst && (_InitParam.PageNum == 3)) { // 이전 Point 정보가 있고 첫번째 Line인 경우 긴 Line 만들어 Upload
Line LongLine = new Line();
LongLine.PF1 = new PointF((float)_InitParam.LastX, (float)_InitParam.LastY - (float)(_Scanner.Config.XDiff_Page3and4 - _Scanner.Config.XDiff_Page1and2));
LongLine.PF2 = obj.PF1;
LoadLineScannerParam(LongLine);
isFirst = false;
}
if (isFirst && (_InitParam.PageNum == 1)) { // 이전 Point 정보가 있고 첫번째 Line인 경우 긴 Line 만들어 Upload
Line LongLine = new Line();
LongLine.PF1 = new PointF((float)_InitParam.LastX, (float)_InitParam.LastY + (float)(_Scanner.Config.XDiff_Page3and4 - _Scanner.Config.XDiff_Page1and2));
LongLine.PF2 = obj.PF1;
LoadLineScannerParam(LongLine);
isFirst = false;
}
LoadLineScannerParam((Line)obj); LoadLineScannerParam((Line)obj);
count++; count++;
} else if (obj is Dot) { } else if (obj is Dot) {
@ -518,31 +479,31 @@ namespace WeldingCommon.Sequences
else else
_CenterRingRatio = (int)Math.Round((double)(100 * param.LaserPower1) / (double)(param.LaserPower1 + param.LaserPower2), 0); // Discrete 한 값이라서 Ring은 오차 발생 _CenterRingRatio = (int)Math.Round((double)(100 * param.LaserPower1) / (double)(param.LaserPower1 + param.LaserPower2), 0); // Discrete 한 값이라서 Ring은 오차 발생
//if (_Laser.Config.TruFiberType == eTruFiberType.TruFiberS) { // TruFiberS Type은 비율 제어 if (_Laser.Config.TruFiberType == eTruFiberType.TruFiberS) { // TruFiberS Type은 비율 제어
// if (_CenterRingRatio == 0) { // Center가 0인경우 if (_CenterRingRatio == 0) { // Center가 0인경우
// //percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToPercent((double)param.LaserPower2, (uint)eAnalogPortOut.DA1); //percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToPercent((double)param.LaserPower2, (uint)eAnalogPortOut.DA1);
// percentLaser1 = (float)(_LaserPowerCalParam.CalibrateWattToMeasuredVoltage((double)param.LaserPower2, (uint)LaserPowerCalParam.beamMode.Center)); percentLaser1 = (float)(_LaserPowerCalParam.CalibrateWattToMeasuredVoltage((double)param.LaserPower2, (uint)LaserPowerCalParam.beamMode.Center));
// percentLaser1 = percentLaser1 * 10; // 스캐너에 입렵하기 위한 연산 ( 1V : 10 ~~ 10V : 100 ) percentLaser1 = percentLaser1 * 10; // 스캐너에 입렵하기 위한 연산 ( 1V : 10 ~~ 10V : 100 )
// } else { } else {
// //percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToPercent((double)param.LaserPower1 / (double)_CenterRingRatio * 100.0, (uint)eAnalogPortOut.DA1); //percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToPercent((double)param.LaserPower1 / (double)_CenterRingRatio * 100.0, (uint)eAnalogPortOut.DA1);
// percentLaser1 = (float)(_LaserPowerCalParam.CalibrateWattToMeasuredVoltage((double)param.LaserPower1 / (double)_CenterRingRatio * 100.0, (uint)LaserPowerCalParam.beamMode.Center)); percentLaser1 = (float)(_LaserPowerCalParam.CalibrateWattToMeasuredVoltage((double)param.LaserPower1 / (double)_CenterRingRatio * 100.0, (uint)LaserPowerCalParam.beamMode.Center));
// percentLaser1 = percentLaser1 * 10; // 스캐너에 입렵하기 위한 연산 ( 1V : 10 ~~ 10V : 100 ) percentLaser1 = percentLaser1 * 10; // 스캐너에 입렵하기 위한 연산 ( 1V : 10 ~~ 10V : 100 )
// } }
// percentLaser2 = 0; percentLaser2 = 0;
// Log.D(string.Format("TruFiber S Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2,percentLaser1,percentLaser2,_CenterRingRatio)); Log.D(string.Format("TruFiber S Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2,percentLaser1,percentLaser2,_CenterRingRatio));
//} else if (_Laser.Config.TruFiberType == eTruFiberType.TruFiberP) { // Power제어 } else if (_Laser.Config.TruFiberType == eTruFiberType.TruFiberP) { // Power제어
// percentLaser1 = 100; percentLaser1 = 100;
// percentLaser2 = 0; percentLaser2 = 0;
// Log.D(string.Format("TruFiber P Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2, percentLaser1, percentLaser2, _CenterRingRatio)); Log.D(string.Format("TruFiber P Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2, percentLaser1, percentLaser2, _CenterRingRatio));
//} else if (_Laser.Config.TruFiberType == eTruFiberType.CalPercentToMeasuredVoltage) { } else if (_Laser.Config.TruFiberType == eTruFiberType.CalPercentToMeasuredVoltage) {
// percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToMeasuredVoltage(param.LaserPower1, (uint)LaserPowerCalParam.beamMode.Center) * 10; percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToMeasuredVoltage(param.LaserPower1, (uint)LaserPowerCalParam.beamMode.Center) * 10;
// percentLaser2 = (float)_LaserPowerCalParam.CalibrateWattToMeasuredVoltage(param.LaserPower2, (uint)LaserPowerCalParam.beamMode.Ring) * 10; percentLaser2 = (float)_LaserPowerCalParam.CalibrateWattToMeasuredVoltage(param.LaserPower2, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
// Log.D(string.Format("CalPercentToMeasuredVoltage Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2, percentLaser1, percentLaser2, _CenterRingRatio)); Log.D(string.Format("CalPercentToMeasuredVoltage Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2, percentLaser1, percentLaser2, _CenterRingRatio));
//} else { } else {
percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToPercent(param.LaserPower1, (uint)eAnalogPortOut.DA1); percentLaser1 = (float)_LaserPowerCalParam.CalibrateWattToPercent(param.LaserPower1, (uint)eAnalogPortOut.DA1);
percentLaser2 = (float)_LaserPowerCalParam.CalibrateWattToPercent(param.LaserPower2, (uint)eAnalogPortOut.DA2); percentLaser2 = (float)_LaserPowerCalParam.CalibrateWattToPercent(param.LaserPower2, (uint)eAnalogPortOut.DA2);
Log.D(string.Format("Normal Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2, percentLaser1, percentLaser2, _CenterRingRatio)); Log.D(string.Format("Normal Models:: Original Power1 : {0}; Original Power2 : {1}; Calibrated Percent1 :{2:0.000}; Calibrated Percent2 :{3:0.000}; CenterRingRatio :{4:0.000}", param.LaserPower1, param.LaserPower2, percentLaser1, percentLaser2, _CenterRingRatio));
//} }
_Scanner.WriteDA((uint)eAnalogPortOut.DA1, percentLaser1, eFunctionType.LIST); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, percentLaser1, eFunctionType.LIST);
_Scanner.WriteDA((uint)eAnalogPortOut.DA2, percentLaser2, eFunctionType.LIST); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, percentLaser2, eFunctionType.LIST);
@ -735,8 +696,7 @@ namespace WeldingCommon.Sequences
} }
// END- 시작위치 점프 관련 설정 // END- 시작위치 점프 관련 설정
} } else {
else {
// Wobble, PowerProfile, Ramping을 사용하지 않는 일반적인 경우 이쪽으로 들어옴 // Wobble, PowerProfile, Ramping을 사용하지 않는 일반적인 경우 이쪽으로 들어옴
// START- Jump(Line Shot) // START- Jump(Line Shot)
@ -783,10 +743,9 @@ namespace WeldingCommon.Sequences
_Scanner.MarkAbs(obj.PF2.X + xOffset, obj.PF2.Y + yOffset); _Scanner.MarkAbs(obj.PF2.X + xOffset, obj.PF2.Y + yOffset);
Log.I(string.Format($"[RCC Subpath Line Weld] Mark(Ramping) ({obj.PF2.X + xOffset},{obj.PF2.Y + yOffset})")); Log.I(string.Format($"[RCC Subpath Line Weld] Mark(Ramping) ({obj.PF2.X},{obj.PF2.Y})"));
} } else if ((param.RampingStartDist > 0 || param.RampingEndDist > 0) && (param.RampingEndDist + param.RampingStartDist <= obj.Distance)) {
else if ((param.RampingStartDist > 0 || param.RampingEndDist > 0) && (param.RampingEndDist + param.RampingStartDist <= obj.Distance)) {
// RCC 가 아닌 경우 // RCC 가 아닌 경우
_Scanner.SetVectorControl((uint)eAutoControlParameter.AnalogOut1, 0); _Scanner.SetVectorControl((uint)eAutoControlParameter.AnalogOut1, 0);
_Scanner.SetScannerDelay(param.JumpDelay, param.MarkDelay, 0); _Scanner.SetScannerDelay(param.JumpDelay, param.MarkDelay, 0);
@ -833,8 +792,7 @@ namespace WeldingCommon.Sequences
Log.I(string.Format($"[Line Weld] Mark(Ramping) ({obj.PF2.X},{obj.PF2.Y})")); Log.I(string.Format($"[Line Weld] Mark(Ramping) ({obj.PF2.X},{obj.PF2.Y})"));
} } else {
else {
// Ramping 이 없는 경우 // Ramping 이 없는 경우
_Scanner.SetVectorControl((uint)eAutoControlParameter.AnalogOut1, 0); _Scanner.SetVectorControl((uint)eAutoControlParameter.AnalogOut1, 0);
@ -851,7 +809,7 @@ namespace WeldingCommon.Sequences
//_scanner._scannerObj.SetVectorControl((uint)eAutoControlParameter.NoUse, 0); //_scanner._scannerObj.SetVectorControl((uint)eAutoControlParameter.NoUse, 0);
Log.I(string.Format($"[Line Weld] Mark(Ramping) ({obj.PF2.X+ xOffset},{obj.PF2.Y+ yOffset})")); Log.I(string.Format($"[Line Weld] Mark(Ramping) ({obj.PF2.X},{obj.PF2.Y})"));
} }
// END- Mark // END- Mark
@ -1539,31 +1497,25 @@ namespace WeldingCommon.Sequences
private SequenceActionResult MarkingOnTheFlyOff(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult MarkingOnTheFlyOff(SequenceContext context, string id, SequenceActionResult param)
{ {
#region 260416 주석 처리한 내용 복원함 . - 레시피 가공 자체가 안 됨 if (_Scanner.Config.UseMarkingOnTheFly) {
//if (_Scanner.Config.UseMarkingOnTheFly) if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.XY) {
//{ // Linear OTW의 경우, 각 Draw Tool에서 좌표 오프셋을 해 주고 있음
// if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.XY)
// {
// // Linear OTW의 경우, 각 Draw Tool에서 좌표 오프셋을 해 주고 있음
// } } else if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.Rotate) {
// else if (_Scanner.Config.OnTheFlyCoordinate == eOntheFlyCoordinate.Rotate) // 여기서 원래 레시피로 돌려주기
// { foreach (IDrawObject obj in _InitParam.SelectedDrawObjectList) {
// // 여기서 원래 레시피로 돌려주기 obj.Rotate(ROTATION_DEGREE * -1, new UnitPoint(_Scanner.Config.MarkingOnTheFlyRotateCenterX, _Scanner.Config.MarkingOnTheFlyRotateCenterY)); // -15도 회전
// foreach (IDrawObject obj in _InitParam.SelectedDrawObjectList) }
// { }
// obj.Rotate(ROTATION_DEGREE * -1, new UnitPoint(_Scanner.Config.MarkingOnTheFlyRotateCenterX, _Scanner.Config.MarkingOnTheFlyRotateCenterY)); // -15도 회전
// }
// }
// // 추후, Parking Position 을 용접 시작 위치로 자동으로 계산되어 들어가게 개선 필요 // 추후, Parking Position 을 용접 시작 위치로 자동으로 계산되어 들어가게 개선 필요
// _Scanner.Fly_Return(_Scanner.Config.MarkingOntheFlyParkingPositionX, _Scanner.Config.MarkingOntheFlyParkingPositionY); _Scanner.Fly_Return(_Scanner.Config.MarkingOntheFlyParkingPositionX, _Scanner.Config.MarkingOntheFlyParkingPositionY);
// 엔코더 기록(용접 완료)
_Scanner.StoreEncoder(1);
_Scanner.SaveAndRestartTimer();
}
// // 엔코더 기록(용접 완료)
// _Scanner.StoreEncoder(1);
// _Scanner.SaveAndRestartTimer();
//}
#endregion
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
@ -1574,8 +1526,6 @@ namespace WeldingCommon.Sequences
_Scanner.SetTrigger(0, _Scanner.SetTrigger(0,
_Scanner.Config.RecordSignalType1, _Scanner.Config.RecordSignalType2, _Scanner.Config.RecordSignalType1, _Scanner.Config.RecordSignalType2,
_Scanner.Config.RecordSignalType3, _Scanner.Config.RecordSignalType4); _Scanner.Config.RecordSignalType3, _Scanner.Config.RecordSignalType4);
Log.I($"[RecordSignalOff] 기록 종료 ");
} }
return SequenceAction.Ok(); return SequenceAction.Ok();
@ -1583,10 +1533,8 @@ namespace WeldingCommon.Sequences
private SequenceActionResult SaveResultData(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult SaveResultData(SequenceContext context, string id, SequenceActionResult param)
{ {
// 결과 Data 를 업데이트 함. // 결과 Data 를 업데이트 함.
context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, true); context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, true);
Log.I($"[SaveResultData] KEY_SEQUENCE_RESULT : true ");
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
@ -1594,14 +1542,14 @@ namespace WeldingCommon.Sequences
{ {
// 완료 비트 write 하는 Node 추가 필요. format 유지, SeqScoutNormal 없음 // 완료 비트 write 하는 Node 추가 필요. format 유지, SeqScoutNormal 없음
Log.D("[WriteCompletionPLCBit] UploadWeldingList Sequence WriteCompletionPLCBit"); Log.D("UploadWeldingList Sequence WriteCompletionPLCBit");
return SequenceAction.Ok(); return SequenceAction.Ok();
} }
private SequenceActionResult Complete(SequenceContext context, string id, SequenceActionResult param) private SequenceActionResult Complete(SequenceContext context, string id, SequenceActionResult param)
{ {
RestoreDeviceStatus(); RestoreDeviceStatus();
Log.I("[Complete] UploadWeldingList Complete"); Log.I("UploadWeldingList Complete");
_UploadSpanTime = DateTime.Now.Subtract(_UploadstartTime); _UploadSpanTime = DateTime.Now.Subtract(_UploadstartTime);
Log.D(string.Format($"[SeqUploadWeldingList] UploadWeldingList Complete Time : {_UploadSpanTime.TotalMilliseconds}")); Log.D(string.Format($"[SeqUploadWeldingList] UploadWeldingList Complete Time : {_UploadSpanTime.TotalMilliseconds}"));
@ -1652,10 +1600,6 @@ namespace WeldingCommon.Sequences
public List<IDrawObject> SelectedDrawObjectList { get; set; } public List<IDrawObject> SelectedDrawObjectList { get; set; }
public eListNo WeldingScannerListNo { get; set; } public eListNo WeldingScannerListNo { get; set; }
public double PageNum { get; set; }
public double LastX { get; set; }
public double LastY { get; set; }
} }
public class SeqUploadWeldingList_OutParam : OutParam public class SeqUploadWeldingList_OutParam : OutParam

View File

@ -576,8 +576,7 @@ namespace WeldingCommon.Utils
// 다른 프로세스도 파일 읽고 쓸 수 있도록. // 다른 프로세스도 파일 읽고 쓸 수 있도록.
FileStream FileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); FileStream FileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.Unicode); // 26.04.15 기존 코드 주석처리함 StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.Unicode);
//StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.UTF8); // 26.04.15 변경 코드 UTF8로 변경 log 깨짐 현상
if (isFile) { if (isFile) {
sw.WriteLine(strItem); sw.WriteLine(strItem);

View File

@ -89,8 +89,8 @@
<ColumnDefinition Width="1*"></ColumnDefinition> <ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<UniformGrid Grid.Column="0" Rows="3"> <UniformGrid Grid.Column="0" Rows="3">
<usercontrols:UCKeyValue KeyText="Row" Value="{Binding GridRowCount}" DecimalPlaces="0" Unit="count" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" ToolTip="+패턴 찾기 위해서 홀수입력" /> <usercontrols:UCKeyValue KeyText="Row" Value="{Binding GridRowCount}" DecimalPlaces="0" Unit="count" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" />
<usercontrols:UCKeyValue KeyText="Column" Value="{Binding GridColumnCount}" DecimalPlaces="0" Unit="count" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" ToolTip="+패턴 찾기 위해서 홀수입력"/> <usercontrols:UCKeyValue KeyText="Column" Value="{Binding GridColumnCount}" DecimalPlaces="0" Unit="count" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" />
<usercontrols:UCKeyValue KeyText="Unit Length" Value="{Binding UnitLength}" DecimalPlaces="0" Unit="mm" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" /> <usercontrols:UCKeyValue KeyText="Unit Length" Value="{Binding UnitLength}" DecimalPlaces="0" Unit="mm" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" />
</UniformGrid> </UniformGrid>
<UniformGrid Grid.Column="1" Rows="3"> <UniformGrid Grid.Column="1" Rows="3">

View File

@ -29,8 +29,7 @@ using WeldingCommon.Settings;
using WeldingCommon.Utils; using WeldingCommon.Utils;
using WeldingCommon.Process; using WeldingCommon.Process;
using static CoreUnit.Control.UserControl.Canvas.WeldingParameterIDEditor; using static CoreUnit.Control.UserControl.Canvas.WeldingParameterIDEditor;
using System.Diagnostics; using System.Diagnostics; //Process.Start
using Aurora.Util.HislogPlus; //Process.Start
namespace WeldingCommon.Views namespace WeldingCommon.Views
{ {
@ -136,7 +135,7 @@ namespace WeldingCommon.Views
_Scanner = _Aurora.DeviceManager[CommonDeviceIds.Scanner] as Scanner; _Scanner = _Aurora.DeviceManager[CommonDeviceIds.Scanner] as Scanner;
_Laser = _Aurora.DeviceManager[CommonDeviceIds.Laser] as Laser; _Laser = _Aurora.DeviceManager[CommonDeviceIds.Laser] as Laser;
//_LaserConfig = _Aurora.DeviceManager.GetDeviceConfig(_Laser.DeviceId) as LaserConfig; _LaserConfig = _Aurora.DeviceManager.GetDeviceConfig(_Laser.DeviceId) as LaserConfig;
_ScannerConfig = _Aurora.DeviceManager.GetDeviceConfig(_Scanner.DeviceId) as ScannerConfig; _ScannerConfig = _Aurora.DeviceManager.GetDeviceConfig(_Scanner.DeviceId) as ScannerConfig;
//_SeqMarkGrid = _Aurora.SequenceEntry[CommonSequenceIds.SeqMarkGrid] as ISequence; //_SeqMarkGrid = _Aurora.SequenceEntry[CommonSequenceIds.SeqMarkGrid] as ISequence;
@ -211,20 +210,13 @@ namespace WeldingCommon.Views
CurrentY = yPos; CurrentY = yPos;
} }
if (_Laser != null) if (_Laser.GetLaserReady()) {
{
if (_Laser.GetLaserReady())
{
LaserStatus = true; LaserStatus = true;
} } else {
else
{
LaserStatus = false; LaserStatus = false;
} }
} }
}
private void OnUpdateCorrectionTable(EventMessage obj) private void OnUpdateCorrectionTable(EventMessage obj)
{ {
var updateDataGridItem = obj.Param as UpdateDataGridItem; var updateDataGridItem = obj.Param as UpdateDataGridItem;
@ -488,7 +480,7 @@ namespace WeldingCommon.Views
_SeqScannerCalibration.Start(param, OnCompleteScannerCalibration); _SeqScannerCalibration.Start(param, OnCompleteScannerCalibration);
} }
//_SeqScannerCalibration 이 시퀸스가 시작된다. IsSequenceRunning_ScannerCalibration param의 값이 result가 성공해야 성공
private void OnCompleteScannerCalibration(SequenceActionResult res) private void OnCompleteScannerCalibration(SequenceActionResult res)
{ {
if (res != null) { if (res != null) {

View File

@ -112,12 +112,12 @@ namespace WeldingCommon.Views.ACS
ACS = _env.DeviceManager[CommonDeviceIds.ACS] as ScannerACS; ACS = _env.DeviceManager[CommonDeviceIds.ACS] as ScannerACS;
MotorX = _env.DeviceManager[CommonMotorIds.AxisX2] as ACSMotor; MotorX = _env.DeviceManager[CommonMotorIds.AxisX2] as ACSMotor;
//MotorY1 = _env.DeviceManager[CommonMotorIds.AxisY1] as ACSMotor; MotorY1 = _env.DeviceManager[CommonMotorIds.AxisY1] as ACSMotor;
//MotorY2 = _env.DeviceManager[CommonMotorIds.AxisY2] as ACSMotor; MotorY2 = _env.DeviceManager[CommonMotorIds.AxisY2] as ACSMotor;
MotorZ = _env.DeviceManager[CommonMotorIds.AxisZ] as ACSMotor; MotorZ = _env.DeviceManager[CommonMotorIds.AxisZ] as ACSMotor;
XAxis = MotorX; XAxis = MotorX;
//YAxis = MotorY1; YAxis = MotorY1;
ZAxis = MotorZ; ZAxis = MotorZ;
CurrentPosUpdateTimer = CreateTimer( CurrentPosUpdateTimer = CreateTimer(

View File

@ -57,11 +57,7 @@
<RowDefinition Height="1*"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<local:UCScannerMotion Grid.Row="0" Margin="5 0 0 0" DataContext="{Binding ScannerMotionViewModel}"></local:UCScannerMotion> <local:UCScannerMotion Grid.Row="0" Margin="5 0 0 0" DataContext="{Binding ScannerMotionViewModel}"></local:UCScannerMotion>
<local:UCScannerLaserControl Grid.Row="1" Margin="5 5 0 0" DataContext="{Binding ScannerLaserControlViewModel}"></local:UCScannerLaserControl>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<local:UCScannerLaserControl Margin="5 5 0 0" DataContext="{Binding ScannerLaserControlViewModel}"></local:UCScannerLaserControl>
</ScrollViewer>
<!--local:UCScannerLaserControl Grid.Row="1" Margin="5 5 0 0" DataContext="{Binding ScannerLaserControlViewModel}"></local:UCScannerLaserControl>-->
</Grid> </Grid>

View File

@ -19,7 +19,7 @@ namespace WeldingCommon.Views
{ {
private readonly Logger Log = new Logger("UCManualScannerOperationViewModel"); private readonly Logger Log = new Logger("UCManualScannerOperationViewModel");
public ICommand CMD_ShowSelectFieldWindow { get; } // 메뉴얼의 SelectField 팝업 버튼 public ICommand CMD_ShowSelectFieldWindow { get; }
private readonly IAuroraEnvironment _Aurora; private readonly IAuroraEnvironment _Aurora;

View File

@ -28,13 +28,13 @@
<RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Grid.Row="0" Header="Manual Laser Power Control" Margin="0 3 3 0"> <GroupBox Grid.Row="0" Header="Manual Laser Power Control" Margin="0 3 3 0">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition> <ColumnDefinition Width="1.5*"></ColumnDefinition>
@ -44,7 +44,7 @@
<Grid Margin="3"> <Grid Margin="3">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Rows="4"> <UniformGrid Grid.Row="0" Rows="4">
<usercontrols:UCKeyValue KeyText="Power #1" Value="{Binding LaserPower1Percent}" DecimalPlaces="0" Unit="%" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" /> <usercontrols:UCKeyValue KeyText="Power #1" Value="{Binding LaserPower1Percent}" DecimalPlaces="0" Unit="%" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
@ -63,14 +63,14 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Header="Timer Set" Style="{StaticResource StGroupBox4th}"> <GroupBox Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Header="Timer Set" Style="{StaticResource StGroupBox4th}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.5"> <Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.5">
<mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold" <mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
@ -122,7 +122,7 @@
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition> <ColumnDefinition Width="1.5*"></ColumnDefinition>
@ -132,7 +132,7 @@
<Grid Margin="3"> <Grid Margin="3">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Rows="4"> <UniformGrid Grid.Row="0" Rows="4">
<usercontrols:UCKeyValue KeyText="Power #1" Value="{Binding LaserPower1Watt}" DecimalPlaces="0" Unit="W" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" /> <usercontrols:UCKeyValue KeyText="Power #1" Value="{Binding LaserPower1Watt}" DecimalPlaces="0" Unit="W" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
@ -151,14 +151,14 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Header="Timer Set" Style="{StaticResource StGroupBox4th}"> <GroupBox Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Header="Timer Set" Style="{StaticResource StGroupBox4th}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.5"> <Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.5">
<mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold" <mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
@ -207,19 +207,19 @@
<GroupBox Grid.Row="2" Header="Marking On The Fly" Margin="0 3 3 0" IsEnabled="{Binding IsUseMarkingOnTheFly}"> <GroupBox Grid.Row="2" Header="Marking On The Fly" Margin="0 3 3 0" Visibility="{Binding IsUseMarkingOnTheFly, Converter={StaticResource convTrueVisible}}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Header="Encoder Value" Grid.Row="0" Margin="0 5 0 0" Style="{StaticResource StGroupBox4th}"> <GroupBox Header="Encoder Value" Grid.Row="0" Margin="0 5 0 0" Style="{StaticResource StGroupBox4th}">
<Grid Margin="3"> <Grid Margin="3">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition> <ColumnDefinition Width="1*"></ColumnDefinition>
@ -240,7 +240,7 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" MinHeight="30"> <Border Grid.Row="0" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="X Dir FieldOut" VerticalAlignment="Center" HorizontalAlignment="Right"/> <TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="X Dir FieldOut" VerticalAlignment="Center" HorizontalAlignment="Right"/>
@ -267,7 +267,7 @@
<Grid Margin="3"> <Grid Margin="3">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition> <ColumnDefinition Width="1*"></ColumnDefinition>

View File

@ -40,7 +40,7 @@ namespace WeldingCommon.Views
private readonly IAuroraEnvironment _Aurora; private readonly IAuroraEnvironment _Aurora;
private readonly LaserConfig _LaserConfig; private readonly LaserConfig _LaserConfig;
private readonly Scanner _Scanner; // 스캐너 private readonly Scanner _Scanner;
private readonly Laser _Laser; private readonly Laser _Laser;
private readonly ScannerConfig _ScannerConfig; private readonly ScannerConfig _ScannerConfig;
@ -111,9 +111,9 @@ namespace WeldingCommon.Views
_Aurora = aurora; _Aurora = aurora;
_Scanner = _Aurora.DeviceManager[scannerId] as Scanner; _Scanner = _Aurora.DeviceManager[scannerId] as Scanner;
//_Laser = _Aurora.DeviceManager[CommonDeviceIds.Laser] as Laser; _Laser = _Aurora.DeviceManager[CommonDeviceIds.Laser] as Laser;
//_LaserConfig = _Aurora.DeviceManager.GetDeviceConfig(_Laser.DeviceId) as AuroraLaser.LaserConfig; _LaserConfig = _Aurora.DeviceManager.GetDeviceConfig(_Laser.DeviceId) as AuroraLaser.LaserConfig;
_ScannerConfig = _Aurora.DeviceManager.GetDeviceConfig(scannerId) as ScannerConfig; _ScannerConfig = _Aurora.DeviceManager.GetDeviceConfig(scannerId) as ScannerConfig;
_SeqTeachingRun = _Aurora.SequenceEntry[CommonSequenceIds.SeqComponentTeachingRun]; _SeqTeachingRun = _Aurora.SequenceEntry[CommonSequenceIds.SeqComponentTeachingRun];
@ -122,9 +122,9 @@ namespace WeldingCommon.Views
InitVariable(); InitVariable();
CMD_VisibleChanged = new DelegateCommand(VisibleChanged); CMD_VisibleChanged = new DelegateCommand(VisibleChanged);
CMD_LaserShotOnPercent = new DelegateCommand(PerformCmdLaserShotOnPercent); //레이저 온 퍼센트 적용 CMD_LaserShotOnPercent = new DelegateCommand(PerformCmdLaserShotOnPercent);
CMD_LaserShotOnWatt = new DelegateCommand(PerformCmdLaserShotOnWatt); // 레이저 온 와트 적용 CMD_LaserShotOnWatt = new DelegateCommand(PerformCmdLaserShotOnWatt);
CMD_LaserShotOff = new DelegateCommand(PerformCmdLaserShotOff); //레이저 끄기 CMD_LaserShotOff = new DelegateCommand(PerformCmdLaserShotOff);
CMD_ActivateOnTheFly = new DelegateCommand(PerformCmdActivateOnTheFly); CMD_ActivateOnTheFly = new DelegateCommand(PerformCmdActivateOnTheFly);
CMD_DeactivateOnTheFly = new DelegateCommand(PerformCmdDeactivateOnTheFly); CMD_DeactivateOnTheFly = new DelegateCommand(PerformCmdDeactivateOnTheFly);
@ -156,24 +156,17 @@ namespace WeldingCommon.Views
private void VisibleChanged(object obj) private void VisibleChanged(object obj)
{ {
bool visible = (bool)obj; bool visible = (bool)obj;
if (visible) if (visible) {
{
//Init_XYLimitPos(); //Init_XYLimitPos();
// 26.04.16 NDY - 탭 활성화 시마다 ScannerConfig에서 최신값 반영
IsUseMarkingOnTheFly = _ScannerConfig?.UseMarkingOnTheFly ?? false;
_MonitorTimer.Start(); _MonitorTimer.Start();
} } else {
else
{
_MonitorTimer.Stop(); _MonitorTimer.Stop();
} }
} }
private void OnMonitoring(object sender, EventArgs e) private void OnMonitoring(object sender, EventArgs e)
{ {
if (_Scanner.IsActivated == false) if (_Scanner.IsActivated == false) {
{
Log.D(string.Format("[OnMonitoring] Check Scanner device Connect. ScannerLaserControl view OnMonitoring Stop")); Log.D(string.Format("[OnMonitoring] Check Scanner device Connect. ScannerLaserControl view OnMonitoring Stop"));
MessageUtil.ShowWarningToast(string.Format("Check Scanner device Connect.")); MessageUtil.ShowWarningToast(string.Format("Check Scanner device Connect."));
@ -181,12 +174,9 @@ namespace WeldingCommon.Views
} }
double encoderX, encoderY; double encoderX, encoderY;
if (_ScannerConfig.OnTheFlyCoordinate == eOntheFlyCoordinate.XY) if (_ScannerConfig.OnTheFlyCoordinate == eOntheFlyCoordinate.XY) {
{
_Scanner.GetEncoder(out encoderX, out encoderY, false); _Scanner.GetEncoder(out encoderX, out encoderY, false);
} } else {
else
{
_Scanner.GetEncoder(out encoderX, out encoderY, true); _Scanner.GetEncoder(out encoderX, out encoderY, true);
} }
@ -210,22 +200,16 @@ namespace WeldingCommon.Views
markingInfo = _Scanner.GetMarkingInfo(); markingInfo = _Scanner.GetMarkingInfo();
// x 범위 초과 // x 범위 초과
if ((markingInfo & 0x0001) == 0x0001 || (markingInfo & 0x0002) == 0x0002) if ((markingInfo & 0x0001) == 0x0001 || (markingInfo & 0x0002) == 0x0002) {
{
IsFieldOutX = true; IsFieldOutX = true;
} } else {
else
{
IsFieldOutX = false; IsFieldOutX = false;
} }
// y 범위 초과 // y 범위 초과
if ((markingInfo & 0x0004) == 0x0004 || (markingInfo & 0x0008) == 0x0008) if ((markingInfo & 0x0004) == 0x0004 || (markingInfo & 0x0008) == 0x0008) {
{
IsFieldOutY = true; IsFieldOutY = true;
} } else {
else
{
IsFieldOutY = false; IsFieldOutY = false;
} }
@ -235,26 +219,19 @@ namespace WeldingCommon.Views
uint IsList1Busy = readStatus & 16; uint IsList1Busy = readStatus & 16;
uint IsList2Busy = readStatus & 32; uint IsList2Busy = readStatus & 32;
if (IsList1Busy == 16) if (IsList1Busy == 16) {
{
busyStatus = "List1"; busyStatus = "List1";
if (_BeforeBusyList != 1) if (_BeforeBusyList != 1) {
{
_ListIterationCount++; _ListIterationCount++;
} }
_BeforeBusyList = 1; _BeforeBusyList = 1;
} } else if (IsList2Busy == 32) {
else if (IsList2Busy == 32)
{
busyStatus = "List2"; busyStatus = "List2";
if (_BeforeBusyList != 2) if (_BeforeBusyList != 2) {
{
_ListIterationCount++; _ListIterationCount++;
} }
_BeforeBusyList = 2; _BeforeBusyList = 2;
} } else {
else
{
busyStatus = "N/A"; busyStatus = "N/A";
} }
@ -264,26 +241,22 @@ namespace WeldingCommon.Views
private void PerformCmdLaserShotOnPercent(object obj) private void PerformCmdLaserShotOnPercent(object obj)
{ {
if (IsUseLaserAutoOffChecked) if (IsUseLaserAutoOffChecked) {
{ if (_Scanner.GetBusyStatus()) {
if (_Scanner.GetBusyStatus())
{
MessageUtil.ShowWarningToast(string.Format("Laser, Scanner is busy.")); MessageUtil.ShowWarningToast(string.Format("Laser, Scanner is busy."));
return; return;
} }
//if (!_Laser.GetLaserReady()) { if (!_Laser.GetLaserReady()) {
// MessageUtil.ShowWarningToast(string.Format("Laser, Check Laser Ready status.")); MessageUtil.ShowWarningToast(string.Format("Laser, Check Laser Ready status."));
// return; return;
//} }
if (_SeqTeachingRun.RunState == SequenceRunState.Running) if (_SeqTeachingRun.RunState == SequenceRunState.Running) {
{
MessageUtil.ShowWarningToast(string.Format("이미 시퀀스가 Start 상태입니다.", "Laser On"), Log); MessageUtil.ShowWarningToast(string.Format("이미 시퀀스가 Start 상태입니다.", "Laser On"), Log);
return; return;
} }
var currentModelInfo = EquipmentSpecificModelUtil.GetCurrentRecipeEquipmentSpecificModel(); var currentModelInfo = EquipmentSpecificModelUtil.GetCurrentRecipeEquipmentSpecificModel();
if (currentModelInfo.equipmentSpecificModel == null) if (currentModelInfo.equipmentSpecificModel == null) {
{
MessageUtil.ShowWarningToast(string.Format("선택된 model 이 없습니다.", "Laser On")); MessageUtil.ShowWarningToast(string.Format("선택된 model 이 없습니다.", "Laser On"));
return; return;
} }
@ -291,15 +264,13 @@ namespace WeldingCommon.Views
var intervalTimeBlowOn = 0; var intervalTimeBlowOn = 0;
var intervalTimeBlowOff = 0; var intervalTimeBlowOff = 0;
if (currentModelInfo.equipmentSpecificModel.UseBlow) if (currentModelInfo.equipmentSpecificModel.UseBlow) {
{
intervalTimeBlowOn = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOn; intervalTimeBlowOn = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOn;
intervalTimeBlowOff = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOff; intervalTimeBlowOff = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOff;
} }
// Object를 만들어 // Object를 만들어
var param = new SeqTeachingRun_InitParam() var param = new SeqTeachingRun_InitParam() {
{
IsUseExternalObjects = true, IsUseExternalObjects = true,
ExternalObjects = CreateDotForLaserOn(), ExternalObjects = CreateDotForLaserOn(),
@ -314,15 +285,24 @@ namespace WeldingCommon.Views
}; };
_SeqTeachingRun.Start(param, OnCompleteMarkGrid); _SeqTeachingRun.Start(param, OnCompleteMarkGrid);
} } else {
else
{
LaserPowerCalParam powerCalParam = Status.AuroraEnv.SettingEntry[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam; LaserPowerCalParam powerCalParam = Status.AuroraEnv.SettingEntry[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam;
float powerVolt1 = 0, powerVolt2 = 0; float powerVolt1 = 0, powerVolt2 = 0;
powerCalParam.Initialize(powerCalParam.PowerCalibrationCenterBeamCSVFile, powerCalParam.PowerCalibrationRingBeamCSVFile); powerCalParam.Initialize(powerCalParam.PowerCalibrationCenterBeamCSVFile, powerCalParam.PowerCalibrationRingBeamCSVFile);
if (_LaserConfig.TruFiberType == eTruFiberType.TruFiberS) {
powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent) * 10;
} else if(_LaserConfig.TruFiberType == eTruFiberType.TruFiberP){
powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent, (uint)LaserPowerCalParam.beamMode.Center) * 10; powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent, (uint)LaserPowerCalParam.beamMode.Center) * 10;
powerVolt2 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower2Percent, (uint)LaserPowerCalParam.beamMode.Ring) * 10; powerVolt2 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower2Percent, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
} else if (_Laser.Config.TruFiberType == eTruFiberType.CalPercentToMeasuredVoltage) {
powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent, (uint)LaserPowerCalParam.beamMode.Center) * 10;
powerVolt2 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower2Percent, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
} else {
powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent, (uint)LaserPowerCalParam.beamMode.Center) * 10;
powerVolt2 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower2Percent, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
}
Thread.Sleep(50); Thread.Sleep(50);
_Scanner.WriteDA((uint)eAnalogPortOut.DA1, powerVolt1, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, powerVolt1, eFunctionType.COMMAND);
_Scanner.WriteDA((uint)eAnalogPortOut.DA2, powerVolt2, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, powerVolt2, eFunctionType.COMMAND);
@ -335,26 +315,22 @@ namespace WeldingCommon.Views
private void PerformCmdLaserShotOnWatt(object obj) private void PerformCmdLaserShotOnWatt(object obj)
{ {
if (IsUseLaserAutoOffChecked) if (IsUseLaserAutoOffChecked) {
{ if (_Scanner.GetBusyStatus()) {
if (_Scanner.GetBusyStatus())
{
MessageUtil.ShowWarningToast(string.Format("Laser, Scanner is busy.")); MessageUtil.ShowWarningToast(string.Format("Laser, Scanner is busy."));
return; return;
} }
//if (!_Laser.GetLaserReady()) { if (!_Laser.GetLaserReady()) {
// MessageUtil.ShowWarningToast(string.Format("Laser, Check Laser Ready status.")); MessageUtil.ShowWarningToast(string.Format("Laser, Check Laser Ready status."));
// return; return;
//} }
if (_SeqTeachingRun.RunState == SequenceRunState.Running) if (_SeqTeachingRun.RunState == SequenceRunState.Running) {
{
MessageUtil.ShowWarningToast(string.Format("이미 시퀀스가 Start 상태입니다.", "Laser On"), Log); MessageUtil.ShowWarningToast(string.Format("이미 시퀀스가 Start 상태입니다.", "Laser On"), Log);
return; return;
} }
var currentModelInfo = EquipmentSpecificModelUtil.GetCurrentRecipeEquipmentSpecificModel(); var currentModelInfo = EquipmentSpecificModelUtil.GetCurrentRecipeEquipmentSpecificModel();
if (currentModelInfo.equipmentSpecificModel == null) if (currentModelInfo.equipmentSpecificModel == null) {
{
MessageUtil.ShowWarningToast(string.Format("선택된 model 이 없습니다.", "Laser On")); MessageUtil.ShowWarningToast(string.Format("선택된 model 이 없습니다.", "Laser On"));
return; return;
} }
@ -362,8 +338,7 @@ namespace WeldingCommon.Views
var intervalTimeBlowOn = 0; var intervalTimeBlowOn = 0;
var intervalTimeBlowOff = 0; var intervalTimeBlowOff = 0;
if (currentModelInfo.equipmentSpecificModel.UseBlow) if (currentModelInfo.equipmentSpecificModel.UseBlow) {
{
intervalTimeBlowOn = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOn; intervalTimeBlowOn = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOn;
intervalTimeBlowOff = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOff; intervalTimeBlowOff = currentModelInfo.equipmentSpecificModel.IntervalTimeBlowOff;
} }
@ -385,15 +360,25 @@ namespace WeldingCommon.Views
}; };
_SeqTeachingRun.Start(param, OnCompleteMarkGrid); _SeqTeachingRun.Start(param, OnCompleteMarkGrid);
} } else {
else
{
LaserPowerCalParam powerCalParam = Status.AuroraEnv.SettingEntry[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam; LaserPowerCalParam powerCalParam = Status.AuroraEnv.SettingEntry[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam;
float powerVolt1 = 0, powerVolt2 = 0; float powerVolt1 = 0, powerVolt2 = 0;
powerCalParam.Initialize(powerCalParam.PowerCalibrationCenterBeamCSVFile, powerCalParam.PowerCalibrationRingBeamCSVFile); powerCalParam.Initialize(powerCalParam.PowerCalibrationCenterBeamCSVFile, powerCalParam.PowerCalibrationRingBeamCSVFile);
if (_LaserConfig.TruFiberType == eTruFiberType.TruFiberS) {
powerVolt1 = (float)powerCalParam.CalibrateWattToMeasuredVoltage(LaserPower1Watt) * 10;
}
else if (_LaserConfig.TruFiberType == eTruFiberType.TruFiberP) {
powerVolt1 = (float)powerCalParam.CalibrateWattToMeasuredVoltage(LaserPower1Watt, (uint)LaserPowerCalParam.beamMode.Center) * 10;
powerVolt2 = (float)powerCalParam.CalibrateWattToMeasuredVoltage(LaserPower2Watt, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
} else if (_Laser.Config.TruFiberType == eTruFiberType.CalPercentToMeasuredVoltage) {
powerVolt1 = (float)powerCalParam.CalibrateWattToMeasuredVoltage(LaserPower1Watt, (uint)LaserPowerCalParam.beamMode.Center) * 10;
powerVolt2 = (float)powerCalParam.CalibrateWattToMeasuredVoltage(LaserPower2Watt, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
} else {
powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent, (uint)LaserPowerCalParam.beamMode.Center) * 10; powerVolt1 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower1Percent, (uint)LaserPowerCalParam.beamMode.Center) * 10;
powerVolt2 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower2Percent, (uint)LaserPowerCalParam.beamMode.Ring) * 10; powerVolt2 = (float)powerCalParam.CalibratePercentToMeasuredVoltage(LaserPower2Percent, (uint)LaserPowerCalParam.beamMode.Ring) * 10;
}
Thread.Sleep(50); Thread.Sleep(50);
_Scanner.WriteDA((uint)eAnalogPortOut.DA1, powerVolt1, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, powerVolt1, eFunctionType.COMMAND);
_Scanner.WriteDA((uint)eAnalogPortOut.DA2, powerVolt2, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, powerVolt2, eFunctionType.COMMAND);
@ -405,10 +390,8 @@ namespace WeldingCommon.Views
} }
private void OnCompleteMarkGrid(SequenceActionResult res) private void OnCompleteMarkGrid(SequenceActionResult res)
{ {
if (res != null) if (res != null) {
{ if (res.Param is SeqTeachingRun_OutParam result && result.Success == true) {
if (res.Param is SeqTeachingRun_OutParam result && result.Success == true)
{
MessageUtil.ShowSuccessToast(string.Format("Success SeqMarkGrid")); MessageUtil.ShowSuccessToast(string.Format("Success SeqMarkGrid"));
return; return;
} }
@ -419,12 +402,9 @@ namespace WeldingCommon.Views
private void PerformCmdLaserShotOff(object obj) private void PerformCmdLaserShotOff(object obj)
{ {
if (IsUseLaserAutoOffChecked) if (IsUseLaserAutoOffChecked) {
{
_Scanner.StopExecution(); _Scanner.StopExecution();
} } else {
else
{
_Scanner.LaserSignalOff(); _Scanner.LaserSignalOff();
} }
@ -433,8 +413,7 @@ namespace WeldingCommon.Views
private void PerformCmdResetEncoderValue(object obj) private void PerformCmdResetEncoderValue(object obj)
{ {
try try {
{
_Scanner.InitFly2D(); _Scanner.InitFly2D();
// CBW OTW 테스트를 위해 아래는 일단 주석처리 // CBW OTW 테스트를 위해 아래는 일단 주석처리
@ -442,9 +421,7 @@ namespace WeldingCommon.Views
// list 반복 숫자 초기화 // list 반복 숫자 초기화
_ListIterationCount = 0; _ListIterationCount = 0;
} } catch (Exception ex) {
catch (Exception ex)
{
MessageUtil.ShowErrorToast(string.Format($"{ex.Message}")); MessageUtil.ShowErrorToast(string.Format($"{ex.Message}"));
} }
} }
@ -479,13 +456,10 @@ namespace WeldingCommon.Views
private void PerformCmdSimulateEncoder(object obj) private void PerformCmdSimulateEncoder(object obj)
{ {
if (_ToggleSimulateEncoder) if (_ToggleSimulateEncoder) {
{
_Scanner.SimulateEncoder(0); _Scanner.SimulateEncoder(0);
_ToggleSimulateEncoder = false; _ToggleSimulateEncoder = false;
} } else {
else
{
_ToggleSimulateEncoder = true; _ToggleSimulateEncoder = true;
_Scanner.SimulateEncoder(1); _Scanner.SimulateEncoder(1);
} }
@ -493,13 +467,10 @@ namespace WeldingCommon.Views
private void PerformCmdSimulateEncoderXY(object obj) private void PerformCmdSimulateEncoderXY(object obj)
{ {
if (_ToggleSimulateEncoder) if (_ToggleSimulateEncoder) {
{
_Scanner.SimulateEncoder(0); _Scanner.SimulateEncoder(0);
_ToggleSimulateEncoder = false; _ToggleSimulateEncoder = false;
} } else {
else
{
_ToggleSimulateEncoder = true; _ToggleSimulateEncoder = true;
_Scanner.SimulateEncoder(3); _Scanner.SimulateEncoder(3);
} }

View File

@ -11,7 +11,7 @@
xmlns:usercontrols="clr-namespace:AuroraUIComponent.UserControls;assembly=AuroraUIComponent" xmlns:usercontrols="clr-namespace:AuroraUIComponent.UserControls;assembly=AuroraUIComponent"
d:DataContext="{d:DesignInstance Type=local:UCScannerMotionViewModel}" d:DataContext="{d:DesignInstance Type=local:UCScannerMotionViewModel}"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="500" d:DesignWidth="600" x:Name="uc"> d:DesignHeight="400" d:DesignWidth="600" x:Name="uc">
<UserControl.Resources> <UserControl.Resources>
<ResourceDictionary> <ResourceDictionary>
<view:BoolConverter x:Key="convWorkConverter" FalseValue="Not Work" TrueValue="Work"/> <view:BoolConverter x:Key="convWorkConverter" FalseValue="Not Work" TrueValue="Work"/>
@ -164,9 +164,8 @@
</GroupBox> </GroupBox>
<!-- 26.04.06 NDY Stage X Motion 섹션 추가 --> <!-- 26.04.06 NDY Stage X Motion 섹션 추가 -->
<GroupBox Grid.Row="2" Header="Stage X Y Motion (ACS)" Margin="0 3 3 0" <GroupBox Grid.Row="2" Header="Stage X Motion (ACS)" Margin="0 3 3 0"
IsEnabled="{Binding IsStageXActivated}"> IsEnabled="{Binding IsStageXActivated}">
<UniformGrid Rows="2">
<Grid Margin="5"> <Grid Margin="5">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/>
@ -188,30 +187,6 @@
VerticalAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"
Text="* 이미지 방향 반전 적용"/> Text="* 이미지 방향 반전 적용"/>
</Grid> </Grid>
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<GroupBox Grid.Column="0" Header="Stage Z[mm]"
Style="{StaticResource StGBMonitor}" Margin="0 0 5 0" MinWidth="120">
<TextBlock FontSize="18" FontWeight="Bold"
HorizontalAlignment="Center" VerticalAlignment="Center"
Text="{Binding StageZPos, StringFormat={}{0:0.000}}"/>
</GroupBox>
<Button Grid.Column="1" FontWeight="Bold" Margin="3"
Command="{Binding CMD_JogMove}" CommandParameter="Stage_Z_Left" ToolTip="StageZ 위치값 증가">◀ +</Button>
<Button Grid.Column="2" FontWeight="Bold" Margin="3"
Command="{Binding CMD_JogMove}" CommandParameter="Stage_Z_Right" ToolTip="StageZ 위치값 감소">- ▶</Button>
<TextBlock Grid.Column="3" FontSize="10" Foreground="Gray"
VerticalAlignment="Center" HorizontalAlignment="Center"
Text="* 이미지 방향 반전 적용"/>
</Grid>
</UniformGrid>
</GroupBox> </GroupBox>
</Grid> </Grid>

View File

@ -6,7 +6,6 @@ using Aurora.View;
using AuroraACS; // 26.04.06 NDY 추가 using AuroraACS; // 26.04.06 NDY 추가
using AuroraLaser; using AuroraLaser;
using AuroraLaserScanner; using AuroraLaserScanner;
using AuroraMotionBoard.Ajin;
using HarfBuzzSharp; using HarfBuzzSharp;
using Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Excel;
using System; using System;
@ -84,18 +83,12 @@ namespace WeldingCommon.Views
// 26.04.06 NDY Stage X 관련 필드 추가 ================== // 26.04.06 NDY Stage X 관련 필드 추가 ==================
private ACSMotor _MotorX; private ACSMotor _MotorX;
private ACSMotor _MotorZ;
private double _StageXPos; private double _StageXPos;
public double StageXPos { get => _StageXPos; set => SetProperty(ref _StageXPos, value); } public double StageXPos { get => _StageXPos; set => SetProperty(ref _StageXPos, value); }
private double _StageZPos;
public double StageZPos { get => _StageZPos; set => SetProperty(ref _StageZPos, value); }
private bool _IsStageXActivated; private bool _IsStageXActivated;
public bool IsStageXActivated { get => _IsStageXActivated; set => SetProperty(ref _IsStageXActivated, value); } public bool IsStageXActivated { get => _IsStageXActivated; set => SetProperty(ref _IsStageXActivated, value); }
private bool _IsStageZActivated;
public bool IsStageZActivated { get => _IsStageZActivated; set => SetProperty(ref _IsStageZActivated, value); }
// ======================================================== // ========================================================
// PAM, RUW 처럼 2개 이상의 scanner 를 사용하는 경우가 있어, scannerId 를 받는 형태로 생성 // PAM, RUW 처럼 2개 이상의 scanner 를 사용하는 경우가 있어, scannerId 를 받는 형태로 생성
@ -110,8 +103,6 @@ namespace WeldingCommon.Views
// 26.04.06 NDY Stage X 모터 연결 추가 =============== // 26.04.06 NDY Stage X 모터 연결 추가 ===============
try { _MotorX = _Aurora.DeviceManager["AxisX2"] as ACSMotor; } try { _MotorX = _Aurora.DeviceManager["AxisX2"] as ACSMotor; }
catch { _MotorX = null; } catch { _MotorX = null; }
try { _MotorZ = _Aurora.DeviceManager["AxisZ"] as ACSMotor; }
catch { _MotorZ = null; }
// ==================================================== // ====================================================
InitVariable(); InitVariable();
@ -183,16 +174,6 @@ namespace WeldingCommon.Views
{ {
IsStageXActivated = false; IsStageXActivated = false;
} }
if (_MotorZ != null && _MotorZ.IsActivated)
{
StageZPos = _MotorZ.GetActualPos();
IsStageZActivated = true;
}
else
{
IsStageZActivated = false;
}
// ==================================================== // ====================================================
} }
@ -232,8 +213,6 @@ namespace WeldingCommon.Views
// 26.04.06 NDY Stage X 버튼 추가 ================= // 26.04.06 NDY Stage X 버튼 추가 =================
case "Stage_X_Left": MoveStageX(eJogDirection.MINUS); break; case "Stage_X_Left": MoveStageX(eJogDirection.MINUS); break;
case "Stage_X_Right": MoveStageX(eJogDirection.PLUS); break; case "Stage_X_Right": MoveStageX(eJogDirection.PLUS); break;
case "Stage_Z_Left": MoveStageZ(eJogDirection.MINUS); break;
case "Stage_Z_Right": MoveStageZ(eJogDirection.PLUS); break;
// ================================================= // =================================================
} }
} }
@ -248,21 +227,8 @@ namespace WeldingCommon.Views
Log.I($"Stage X Move : {step}mm"); Log.I($"Stage X Move : {step}mm");
_MotorX.SetTargetPos(step, TargetPosType.REL); _MotorX.SetTargetPos(step, TargetPosType.REL);
_MotorX.SetVelocityImm(_MotorX.GetJogSpeed(AuroraACS.Speed.L) * _VelocityRate);
_MotorX.Move(); _MotorX.Move();
} }
private void MoveStageZ(eJogDirection direction)
{
if (_MotorZ == null || !_MotorZ.IsActivated) return;
// 이미지 기준 방향 반전 적용
double step = direction == eJogDirection.PLUS ? -StepValue : +StepValue;
Log.I($"Stage Z Move : {step}mm");
_MotorZ.SetTargetPos(step, TargetPosType.REL);
_MotorZ.SetVelocityImm(_MotorZ.GetJogSpeed(AuroraACS.Speed.L) * _VelocityRate);
_MotorZ.Move();
}
// ========================================================= // =========================================================
private void MoveJogXYPos(eAxisType axisType, eJogDirection direction) private void MoveJogXYPos(eAxisType axisType, eJogDirection direction)
@ -299,11 +265,6 @@ namespace WeldingCommon.Views
private void MoveJogHome() private void MoveJogHome()
{ {
_Scanner.GetBusyStatus();
double xPos, yPos;
_Scanner.GetXYPos(out xPos, out yPos);
Log.W($"xPos[{xPos}] / yPos[{yPos}]");
double finalVelocity = _ScannerConfig.JumpSpeed * _VelocityRate; double finalVelocity = _ScannerConfig.JumpSpeed * _VelocityRate;
_Scanner.SetJumpSpeedCtrl(finalVelocity); _Scanner.SetJumpSpeedCtrl(finalVelocity);
_Scanner.JumpAbs(0, 0); _Scanner.JumpAbs(0, 0);

View File

@ -80,7 +80,7 @@ namespace WeldingCommon.Views
private IScannerACS _motion; // 변경 private IScannerACS _motion; // 변경
private ScannerACS _acs; // 변경 private ScannerACS _acs; // 변경
private ACSMotor _AxisX; // AxisX,Y는 갈보모터 기준이고 private ACSMotor _AxisX;
private ACSMotor _AxisY; private ACSMotor _AxisY;
private ACSMotor _MotorY1, _MotorY2; private ACSMotor _MotorY1, _MotorY2;
public MainRecipe Recipe { get => _Recipe; private set => SetProperty(ref _Recipe, value); } public MainRecipe Recipe { get => _Recipe; private set => SetProperty(ref _Recipe, value); }
@ -118,8 +118,8 @@ namespace WeldingCommon.Views
Recipe = recipeItem as MainRecipe; Recipe = recipeItem as MainRecipe;
//_MotorY1 = _devices[CommonMotorIds.AxisY1] as ACSMotor; //변경 _MotorY1 = _devices[CommonMotorIds.AxisY1] as ACSMotor; //변경
//_MotorY2 = _devices[CommonMotorIds.AxisY2] as ACSMotor; //변경 _MotorY2 = _devices[CommonMotorIds.AxisY2] as ACSMotor; //변경
_AxisX = _env.DeviceManager[CommonMotorIds.AxisX2] as ACSMotor; // 변경 _AxisX = _env.DeviceManager[CommonMotorIds.AxisX2] as ACSMotor; // 변경
//if (Recipe.YAxisUseType == MainRecipe.YAxisType.Y1) { //if (Recipe.YAxisUseType == MainRecipe.YAxisType.Y1) {
@ -313,8 +313,8 @@ namespace WeldingCommon.Views
_MotorY2.Move(); _MotorY2.Move();
Log.V($"Move Y2 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY2}"); Log.V($"Move Y2 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY2}");
//_AxisY = _env.DeviceManager[CommonMotorIds.AxisY1] as ACSMotor; _AxisY = _env.DeviceManager[CommonMotorIds.AxisY1] as ACSMotor;
//_acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY1); _acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY1);
} }
else else
{ {
@ -323,8 +323,8 @@ namespace WeldingCommon.Views
_MotorY1.Move(); _MotorY1.Move();
Log.V($"Move Y1 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY1}"); Log.V($"Move Y1 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY1}");
//_AxisY = _env.DeviceManager[CommonMotorIds.AxisY2] as ACSMotor; _AxisY = _env.DeviceManager[CommonMotorIds.AxisY2] as ACSMotor;
//_acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY2); _acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY2);
} }
} }
} }
@ -341,8 +341,8 @@ namespace WeldingCommon.Views
_MotorY2.Move(); _MotorY2.Move();
Log.V($"Move Y2 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY2}"); Log.V($"Move Y2 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY2}");
//_AxisY = _env.DeviceManager[CommonMotorIds.AxisY1] as ACSMotor; _AxisY = _env.DeviceManager[CommonMotorIds.AxisY1] as ACSMotor;
//_acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY1); _acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY1);
} }
else else
{ {
@ -351,8 +351,8 @@ namespace WeldingCommon.Views
_MotorY1.Move(); _MotorY1.Move();
Log.V($"Move Y1 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY1}"); Log.V($"Move Y1 Position : {teachingSetting.SettingPositions[(int)eTeachingPosition.StageWeldingStartPos].AxisY1}");
//_AxisY = _env.DeviceManager[CommonMotorIds.AxisY2] as ACSMotor; _AxisY = _env.DeviceManager[CommonMotorIds.AxisY2] as ACSMotor;
//_acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY2); _acs.WriteVariableInt("iPCget_LCI_ASMASK_Y", (int)CommonMotorIds.eMotorIdx.AxisY2);
} }
} }

View File

@ -126,40 +126,37 @@
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Header="Object Select" Grid.Row="1" Grid.Column="0" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}"> <GroupBox Header="Object Select" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="10" FontWeight="Bold" <mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
IsOn="{Binding IsObjectSelectAll}" IsOn="{Binding IsObjectSelectAll}"
OffContent="Selected Object" OffContent="Selected Object"
OnContent="All Object"/> OnContent="All Object"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Header="가공 Select" Grid.Row="1" Grid.Column="1" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}"> <GroupBox Header="가공 Select" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition /> <RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- MOTF 대면적 가공 토글 --> <!-- MOTF 대면적 가공 토글 -->
<mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="10" FontWeight="Bold" <mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
IsOn="{Binding IsUseLargeMOTF}" IsOn="{Binding IsUseLargeMOTF}"
OffContent="일반 가공" OffContent="일반 가공"
OnContent="MOTF 대면적 가공"/> OnContent="MOTF 대면적 가공"/>
</Grid>
</GroupBox>
<GroupBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<!-- 페이지 N개 설정 --> <!-- 페이지 N개 설정 -->
<Grid Grid.Row="0" Margin="0 4 0 0" IsEnabled="{Binding IsUseLargeMOTF}"> <Grid Grid.Row="1" Margin="0 4 0 0" IsEnabled="{Binding IsUseLargeMOTF}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/>
<ColumnDefinition Width="50"/> <ColumnDefinition Width="50"/>
@ -181,7 +178,7 @@
</Grid> </Grid>
<!-- Start Set / End Set --> <!-- Start Set / End Set -->
<Grid Grid.Row="1" Height="40" Margin="0 4 0 0" IsEnabled="{Binding IsUseLargeMOTF}"> <Grid Grid.Row="2" Height="40" Margin="0 4 0 0" IsEnabled="{Binding IsUseLargeMOTF}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/>
@ -199,7 +196,7 @@
</Grid> </Grid>
<!-- Offset X / Y --> <!-- Offset X / Y -->
<Grid Grid.Row="2" Margin="0 4 0 0" IsEnabled="{Binding IsUseLargeMOTF}"> <Grid Grid.Row="3" Margin="0 4 0 0" IsEnabled="{Binding IsUseLargeMOTF}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/>

View File

@ -125,11 +125,10 @@ namespace WeldingCommon.Views
//private readonly EquipmentInfo _EquipmentInfo; //private readonly EquipmentInfo _EquipmentInfo;
private readonly Scanner _Scanner; private readonly Scanner _Scanner;
#region To Do : 26.04.15 해당 _Laser와 _IODevice 와 _LaserConfig 전부 걷어내고 _Scanner로 동작하도록 수정해야한다.
private readonly Laser _Laser; private readonly Laser _Laser;
private readonly IODevice _IODevice; private readonly IODevice _IODevice;
private readonly LaserConfig _LaserConfig; private readonly LaserConfig _LaserConfig;
#endregion
private ISequence _SeqScoutNormal; private ISequence _SeqScoutNormal;
private bool _IsSequenceRunning_ScoutNormal; private bool _IsSequenceRunning_ScoutNormal;
public bool IsSequenceRunning_ScoutNormal { get => _IsSequenceRunning_ScoutNormal; set => SetProperty(ref _IsSequenceRunning_ScoutNormal, value); } public bool IsSequenceRunning_ScoutNormal { get => _IsSequenceRunning_ScoutNormal; set => SetProperty(ref _IsSequenceRunning_ScoutNormal, value); }
@ -417,26 +416,20 @@ namespace WeldingCommon.Views
private void OnMonitoring(object sender, EventArgs e) private void OnMonitoring(object sender, EventArgs e)
{ {
// TODO: Laser Device 에 구현된 내용에 따르면, 일부 Laser Device 는 구현이 되어 있지 않은 상태. 항상 false // TODO: Laser Device 에 구현된 내용에 따르면, 일부 Laser Device 는 구현이 되어 있지 않은 상태. 항상 false
if (_Laser.GetPilotLaserStatus()) if (_Laser.GetPilotLaserStatus()) {
{
IsGuidBeam = true; IsGuidBeam = true;
} } else {
else
{
IsGuidBeam = false; IsGuidBeam = false;
} }
if (_Laser.GetLaserReady()) if (_Laser.GetLaserReady()) {
{
IsLaserReady = true; IsLaserReady = true;
// TODO: PRIBAT_L1, PRIBAT_L2 는 IO에 LaserOnLamp 를 켜고 끄는게 필요함. // TODO: PRIBAT_L1, PRIBAT_L2 는 IO에 LaserOnLamp 를 켜고 끄는게 필요함.
// TODO: 우선 주석 처리 해 둠. 레이저 Type 별로 달라서 그런건지 확인하고, 어떻게 공통으로 구현할지를 생각해서 추가해 두자 // TODO: 우선 주석 처리 해 둠. 레이저 Type 별로 달라서 그런건지 확인하고, 어떻게 공통으로 구현할지를 생각해서 추가해 두자
//_iODevice._iOUnit.WriteDoBit(Convert.ToInt32(ePDOAddress.LaserOnLampOn), true); //_iODevice._iOUnit.WriteDoBit(Convert.ToInt32(ePDOAddress.LaserOnLampOn), true);
} } else {
else
{
IsLaserReady = false; IsLaserReady = false;
// TODO: PRIBAT_L1, PRIBAT_L2 는 IO에 LaserOnLamp 를 켜고 끄는게 필요함. // TODO: PRIBAT_L1, PRIBAT_L2 는 IO에 LaserOnLamp 를 켜고 끄는게 필요함.
// TODO: 우선 주석 처리 해 둠. 레이저 Type 별로 달라서 그런건지 확인하고, 어떻게 공통으로 구현할지를 생각해서 추가해 두자 // TODO: 우선 주석 처리 해 둠. 레이저 Type 별로 달라서 그런건지 확인하고, 어떻게 공통으로 구현할지를 생각해서 추가해 두자
@ -446,15 +439,7 @@ namespace WeldingCommon.Views
// TODO: PRIBAT_L1, PRIBAT_L2 는 Blow 의 상태 check 가 들어 있음. 장비 한정이므로 이를 check 하는 것을 modelItem 이나 setting 으로 빼서 진행되도록 함. // TODO: PRIBAT_L1, PRIBAT_L2 는 Blow 의 상태 check 가 들어 있음. 장비 한정이므로 이를 check 하는 것을 modelItem 이나 setting 으로 빼서 진행되도록 함.
#region #region
// 26.04.15 NDY Scanner ACS 변수로 IsLaserReady 모니터링 // 26.04.09 NDY [Stage X Jog] OnMonitoring 내부 - X축 위치 갱신
// 26.04.15 NDY Gun → Scanner 변경: RTC5 ReadStatus 비트7로 레이저 상태 모니터링
//if (_Scanner != null && _Scanner.IsActivated)
//{
// uint status = _Scanner.ReadStatus();
// IsLaserReady = (status & (1 << 7)) != 0;
//}
// 26.04.09 NDY [Stage X Jog] X축 위치 갱신
if (_MotorX != null && _MotorX.IsActivated) if (_MotorX != null && _MotorX.IsActivated)
{ {
StageXPos = _MotorX.GetActualPos(); StageXPos = _MotorX.GetActualPos();