2026-03-30 17:09:29 +09:00

341 lines
14 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,
DigitalOutput = 35,
PulseLength = 37,
OutputPeriod = 38,
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, double laser1PulseWidth, double laser2PulseWidth);
public abstract void SetLaserPulse(uint period, uint laserPulseLength);
public abstract void SetLaserPulseCtrl(uint periodHz, uint laserPulseLength);
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();
// 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);
}
}
}