using Aurora.Api; using Hermes; using System; using System.Threading; namespace AuroraLaserScanner { public enum eRTCType { RTC5, RTC6 } public enum eScannerNo { SCANNER_0 = 0, SCANNER_1 = 1, SCANNER_2 = 2 } public enum eLaserMode { CO2 = 0, YAG_1, YAG_2, YAG_3, LASER } public enum eWaitEncoderMode { NoUse, Range, OverStepping, UnderStepping, BothDirection } public enum eOntheFlyCoordinate { XY, Rotate } public enum eLaserSignal { LASERON, LASER1, LASER2 }; public enum eRecordSignal { LaserON = 0, StatusAX, StatusAY, SampleX = 7, SampleY, SampleZ, SampleAX_Corr, SampleAY_Corr, SampleAZ_Corr, StatusAX_LaserOn = 16, StatusAY_LaserOn, SampleAX_Out = 20, SampleAY_Out, SampleAX_Trans = 25, SampleAY_Trans, SampleAZ_Trans, AnalogOut1 = 33, AnalogOut2 = 34, Encoder0 = 43, Encoder1 = 44 } public enum eEthConfigLinkLossMode { Mode0 = 0, Mode1, Mode2, Mode3, Mode4 } public enum eFunctionType { COMMAND, LIST }; public enum eAnalogPortOut { DA1 = 1, DA2 } public enum eEncoderWaitThroughMode { UnderStepping = -1, BothSide = 0, OverStepping = 1 } public enum eParkType { RealImage = 0, VirtualImage = 1 } public enum eListNo { NONE = 0, LIST1 = 1, LIST2 = 2 }; public enum eAutoControlParameter { NoUse = 0, AnalogOut1, AnalogOut2, DigitalOut8Bit, PulseLength, HalfPeriod, DigitalOut16bit, FocusShift } public abstract class ScannerObj { protected Logger Log = new Logger("Scanner"); public const int NO_ERROR = 0; public const uint PORT_COUNT = 5; protected double m_ScaleXYFactor = 1; protected double m_ScaleZFactor = 1; protected uint m_PrimaryHeadNo = 1; protected uint m_SecondHeadNo = 1; protected bool m_UseEncoderFeedbackMode = false; protected double m_MarkingOnTheFlyEncoderResolutionX = 1; protected double m_MarkingOnTheFlyEncoderResolutionY = 1; protected double m_MarkingOnTheFlyEncoderResolutionRotate = 1; public bool IsOpenUnit { get { lock (this) { return isOpenUnit; } } set { lock (this) { isOpenUnit = value; } } } private bool isOpenUnit = false; public double CommandPosX { get { lock (this) { return m_commandPosX; } } set { lock (this) { m_commandPosX = value; } } } public double CommandPosY { get { lock (this) { return m_commandPosY; } } set { lock (this) { m_commandPosY = value; } } } public double CommandPosZ { get { lock (this) { return m_commandPosZ; } } set { lock (this) { m_commandPosZ = value; } } } double m_commandPosX = 0; double m_commandPosY = 0; double m_commandPosZ = 0; protected uint m_deviceNo; //Config Parameter를 ScannerRTC에서 사용하려면 Obj에서 함수로 불러와서 사용해야 할 수 밖에 없는건가.. public void SetXYScaleFactor(ScannerConfig config) { m_ScaleXYFactor = config.ScaleXYFactor; m_ScaleZFactor = config.ScaleZFactor; } public void SetConfigParameter(ScannerConfig config) { m_PrimaryHeadNo = config.PrimaryHeadNo; m_SecondHeadNo = config.SecondHeadNo; m_UseEncoderFeedbackMode = config.UseEncoderFeedbackMode; m_MarkingOnTheFlyEncoderResolutionX = config.MarkingOnTheFlyEncoderResolutionX; m_MarkingOnTheFlyEncoderResolutionY = config.MarkingOnTheFlyEncoderResolutionY; m_MarkingOnTheFlyEncoderResolutionRotate = config.MarkingOnTheFlyEncoderResolutionRotate; } //추상함수 선언 //internal int GetLastError() { return NO_ERROR; } //초기화 public abstract uint Open(); public abstract void Close(); // MOTION FUNCTIONS public virtual int Initialize(ScannerConfig config) { m_deviceNo = (uint)config.ScannerId; Open(); SetXYScaleFactor(config); SetConfigParameter(config); return E1.OK; } public abstract uint LoadProgramFile(string fileName); public abstract uint LoadCorrectionFile(string fileName, uint correctionNo, bool use3DMode); public abstract void JumpAbs(double x, double y, eFunctionType type = eFunctionType.COMMAND); public abstract void JumpAbs3D(double x, double y, double z, eFunctionType type = eFunctionType.COMMAND); public abstract void JumpRel(double x, double y, eFunctionType type = eFunctionType.COMMAND); public abstract void JumpRel3D(double x, double y, double z, eFunctionType type = eFunctionType.COMMAND); public abstract void JumpAbsZ(double z, eFunctionType type = eFunctionType.COMMAND); public abstract void JumpRelZ(double z, eFunctionType type = eFunctionType.COMMAND); public abstract void MarkAbs(double x, double y); public abstract void ArcAbs(double x, double y, double angle /*(+)가 반시계 방향*/); public abstract void ArcRel(double x, double y, double angle /*(+)가 반시계 방향*/ ); public abstract void MarkRel(double x, double y); public abstract void GetXYPos(out double x, out double y); public abstract void GetZPos(out double z); public abstract void GetEncoder(out double encoderX, out double encoderY, bool rotateMode = false); public abstract uint GetMarkingInfo(); public abstract uint GetStartStopInfo(); /// /// Stores the current counts of the two RTC encoder counters in a cache on the RTC /// /// Storage position. 0 or 1 public abstract void StoreEncoder(uint pos); public abstract void ReadEncoder(out double encoder0_0, out double encoder1_0, out double encoder0_1, out double encoder1_1, bool rotateMode = false); public abstract void WaitForEncoderX(double position); public abstract void WaitForEncoderY(double position); public abstract void WaitForEncoderRotateX(double angle); public abstract void WaitForEncoderRotateY(double angle); public abstract void WaitForEncoderRotateXMode(double angle, eEncoderWaitThroughMode mode); public abstract void WaitForEncoderRotateYMode(double angle, eEncoderWaitThroughMode mode); public abstract void WaitForEncoderXMode(double position, eEncoderWaitThroughMode mode); public abstract void WaitForEncoderYMode(double position, eEncoderWaitThroughMode mode); public abstract void WaitForEncoderMode(double position, uint encoderNo, eEncoderWaitThroughMode mode); public abstract void WaitForEncoderRange(double minX, double maxX, double minY, double maxY); public abstract void WaitForEncoderRotateRange(double minRotateX, double maxRotateX, double minRotateY, double maxRotateY); public abstract void SetFlyX(double encoderResolution = 0); public abstract void SetFlyX(double encoderResolution = 0, double diameter = 0); public abstract void SetFlyY(double encoderResolution = 0); public abstract void SetFlyRotate(double encoderResolution); public abstract void SetFlyRotatePos(double encoderResolution); public abstract void SetRotateCenter(double posX, double posY, eFunctionType type = eFunctionType.COMMAND); public abstract void ActivateFlyXY(double encoderResolutionX, double encoderResolutionY); public abstract void ActivateFly1Axis(int axis, int mode, double scale, int offset); public abstract void Fly_Return(double posX, double posY); public abstract void ParkPosition(double posX, double posY, eParkType type = eParkType.VirtualImage); public abstract void ParkReturn(double posX, double posY, eParkType type = eParkType.VirtualImage); public abstract void InitFly2D(int offsetX = 0, int offsetY = 0); public abstract void SimulateEncoder(uint EncoderNo); public abstract void SetControlMode(uint mode); public abstract void SetLaesrDelay(int laserOnDelay, uint laserOffDelay); public abstract void SetScannerDelay(uint jumpDelay, uint markDelay, uint arcDelay); public abstract void SetJumpSpeedCtrl(double speed); public abstract void SetJumpSpeed(double speed); public abstract void SetMarkSpeed(double speed); public abstract void SetStartList(eListNo no); public abstract uint LoadList(eListNo no); public abstract void SetEndList(); public abstract void ExecuteList(eListNo no); public abstract void StartLoop(); public abstract void QuitLoop(); public abstract void AutoChange(); public abstract bool GetBusyStatus(); public abstract void SelectCorrectionTable(int no); public abstract void StopExecution(); public abstract uint GetRTCVersion(); public abstract uint GetDLLVersion(); public abstract void SetLaserTiming(uint halfPeriod, uint laser1PulseWidth, uint laser2PulseWidth); public abstract void SetStandby(uint periodkHz, uint laserPulseWidthUs); public abstract void SetLaserMode(eLaserMode mode); public abstract void SetLaserControl(uint mode); public abstract void SetFirstPulseKiller(uint width); //unit:us public abstract void LaserSignalOn(); public abstract void LaserSignalOff(); public abstract void LaserOnList(double interval); public abstract void SetAngle(double angle, uint atOnce = 1, eFunctionType type = eFunctionType.COMMAND); public abstract void SetOffset(double offsetX, double offsetY, uint atOnce = 1, eFunctionType type = eFunctionType.COMMAND); public abstract void DisableLaser(); public abstract void EnableLaser(); public abstract bool GetModulationMode(); // Write DA public abstract void WriteDA(uint portNo, float value/*0~100%*/, eFunctionType type = eFunctionType.COMMAND); //Ramping 관련 기능 추가 public abstract void SetVectorControl(uint portNo, uint value); public abstract void ParaMarkAbs(double x, double y, float powerValue/*0~100%*/ ); public abstract void ParaMarkRel(double x, double y, float powerValue/*0~100%*/ ); public abstract void ParaJumpAbs(double x, double y, float powerValue/*0~100%*/ ); public abstract void ParaJumpRel(double x, double y, float powerValue/*0~100%*/ ); public abstract void ParaLaserOnPulsesList(double period/*msec 최소시간은 0.01msec*/, uint pulses /*0~65535*/, float powerValue/*0~100%*/ ); //SetTrigger 기능 관련 추가 public abstract void StopTrigger(); public abstract void SetTrigger(uint period/*㎲*/, eRecordSignal signal1, eRecordSignal signal2); public abstract void SetTrigger(uint period/*㎲*/, eRecordSignal signal1, eRecordSignal signal2, eRecordSignal signal3, eRecordSignal signal4); public abstract void Measurement_status(out uint busy, out uint pos); public abstract uint ReadStatus(); public abstract void GetWaveForm(uint channel, uint number, out int[] data); public abstract void SetWobbelMode(bool wobbelEnable, double tansversal, double longitudinal, double frequency, int mode); public abstract void SetWobbelDirection(int dX, int dY); public abstract void SetWobbelVector(double tansversal, double longitudinal, UInt32 period, float power); public abstract void ConfigLaserSignal(eLaserSignal pin2, eLaserSignal pin1, eLaserSignal pin9); public abstract void LongDelay(uint delay); public abstract void SetEthernetConfigLinkLoss(eEthConfigLinkLossMode mode); public abstract int CheckEthernetConnection(out uint errorCode); public abstract void SetLaserPinOutList(uint pins); public abstract void SetLaserPinOut(uint pins); public abstract void SetPortDefault(uint port, uint value); public abstract uint GetLastError(); #region 리스트 실행 시간 측정 public abstract void SaveAndRestartTimer(); public abstract double GetTime(); #endregion public abstract uint GetListSpace(); public abstract void SetConfigList(uint mem1, uint mem2); public void WaitForListTaskCompleted(int timeOut, SequenceContext context = null) //단위는 초 { TimeSpan spanTime; DateTime startTime = DateTime.Now; do { spanTime = DateTime.Now.Subtract(startTime); if (spanTime.TotalMilliseconds > (timeOut * 1000)) { Log.E("ERR_SCANNER_TIMEOUT_FOR_LIST_CMP"); // @TIMEOUT 인데 왜 탈출을 안하도록 했는지 ? break; } if (context != null && context.Stopped) { Log.I("SCANNER_WAIT_LIST_COMPLETE_FORCED_EXIT"); break; } //Thread.Sleep(1); } while (GetBusyStatus() == true); } } }