338 lines
13 KiB
C#
338 lines
13 KiB
C#
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 { 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();
|
|
|
|
/// <summary>
|
|
/// Stores the current counts of the two RTC encoder counters in a cache on the RTC
|
|
/// </summary>
|
|
/// <param name="pos">Storage position. 0 or 1</param>
|
|
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 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();
|
|
public abstract void SetConfigList(uint mem1, uint mem2);
|
|
public abstract uint GetListSpace();
|
|
#endregion
|
|
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);
|
|
}
|
|
|
|
|
|
}
|
|
} |