메뉴얼/레시피 화면에 DI Laser_EMISSION_ON(10) 기반 출사중 램프 추가. 260904 현장 실측으로 DI 10 이 DO 9 의 에코가 아닌 실제 발진 피드백임을 확증하여 LaserIOControl 주석도 정정. 출사조건 스냅샷은 [LaserCond] 로그로 4개 시점(ShotOn/Heartbeat/ShotOff/DoorForceOff)에 기록. 표시·기록 전용이며 출사 차단 로직은 변경 없음.
178 lines
7.5 KiB
C#
178 lines
7.5 KiB
C#
using Aurora;
|
|
using Aurora.Api;
|
|
using AuroraDeviceCommon.Utils;
|
|
using AuroraIO;
|
|
using AuroraLaser;
|
|
using Hermes;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using static AuroraIO.AJINEXTEK.AjinIO.IOModuleInfo;
|
|
using static WeldingCommon.Devices.Laser.PAIX_PrismaticScanner;
|
|
|
|
namespace WeldingCommon.Devices.Laser
|
|
{
|
|
public class PAIX_PrismaticScanner : IODevice
|
|
{
|
|
public PAIX_PrismaticScanner(IAuroraEnvironment auroraEnv, string deviceId, bool isSimul) : base(auroraEnv, deviceId, isSimul)
|
|
{
|
|
|
|
}
|
|
public int WriteDoBit(ePrismaticDOAddress index, bool bit) => _iOUnit.WriteDoBit((int)index, bit);
|
|
public bool ReadDiBit(ePrismaticDIAddress index) => _iOUnit.ReadDiBit((int)index);
|
|
|
|
#region 260824 이전 원본 (임시레이저 Core/Ring 2대 구성) — 원복 시 이 블록을 살리고 아래를 제거
|
|
//public enum ePrismaticDIAddress
|
|
//{
|
|
// CoreLaser_Laser_Ready = 9,
|
|
// CoreLaser_Error_State,
|
|
// CoreLaser_Laser_Output_State,
|
|
// CoreLaser_Control_Status,
|
|
// RingLaser_Laser_Ready,
|
|
// RingLaser_Error_State,
|
|
// RingLaser_Laser_Output_State,
|
|
// RingLaser_Control_Status = 23,
|
|
//}
|
|
//public enum ePrismaticDOAddress
|
|
//{
|
|
// CoreLaser_Control = 9,
|
|
// CoreLaser_ErrorClearing,
|
|
// RingLaser_Control = 13,
|
|
// RingLaser_ErrorClearing,
|
|
// EX_Red_Control = 17,
|
|
//}
|
|
#endregion
|
|
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
// 260824 본 레이저(Max MFMC-2000/2000M) 단일 발진기 구성.
|
|
// Core/Ring 2대 → 1대 통합으로 상태 신호 8개 → 4개.
|
|
//
|
|
// ★ 이 enum 이 IO 채널 번호의 단일 소스다. PAIX_PTOP / SeqAutoRunPTOP 의 중복 정의를 제거하고
|
|
// 전부 이곳을 참조하도록 통일했다(260824). 번호 수정은 여기 한 곳만 고치면 된다.
|
|
//
|
|
// ※ 아래 값은 통신배선자료 엑셀 "Digital_IO (본 레이저)" 시트의 도면값이다.
|
|
// 임시레이저에서 도면이 실배선보다 DI 기준 +1 어긋난 전례가 있다(분석문서 §8).
|
|
// 실측 결과가 다르면 여기 숫자만 -1 하면 된다.
|
|
//
|
|
// 괄호 안은 레이저 I/O 커넥터 핀 번호 — 배선 추적용 메모이며 소프트웨어는 사용하지 않는다.
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
// 260824 레이저 38핀 커넥터 매뉴얼 확인 후 명칭·의미 정정. 도면(엑셀) 라벨에 오기가 있었다.
|
|
public enum ePrismaticDIAddress
|
|
{
|
|
// (Pin21) LASER_READY — "Power Supply ON & No error" 일 때 High. 출사 가능 조건.
|
|
Laser_READY = 8,
|
|
|
|
// (Pin22) ERROR/ALARM — ★★ Active-Low ★★
|
|
// 정상 시 High(24V), 알람 발생 시 Low(0V). 판정할 때 반드시 부정(!)을 붙여야 한다.
|
|
// if (!ReadDiBit(Laser_ALARM)) → 알람 발생
|
|
Laser_ALARM,
|
|
|
|
// (Pin23) LASER_EMISSION_ON — Emission ON=High. 실제 발진 중에 High 가 된다.
|
|
// ★ 260904 현장 실측 정정 — 종전 주석의 "DO Laser_REMOTE(External Start) 의 에코" 는 오기다.
|
|
// 이 신호가 들어올 때 실제로 레이저가 출사 중이었음을 현장에서 확인했다.
|
|
// → 메뉴얼 화면 "레이저 출사중" 램프의 판정 근거로 쓴다(UCScannerLaserControlViewModel).
|
|
// ※ 260826 에 레시피 화면 Laser Ready 표시를 DO Laser_REMOTE 되읽기로 정한 판단은 그대로 유효하다.
|
|
// 출사 중에만 뜨는 신호라 애초에 Ready 램프로는 쓸 수 없다.
|
|
Laser_EMISSION_ON,
|
|
|
|
// (Pin24) MAIN_PWR_STATE — 레이저 전원 투입 상태(Key Switch ON=High).
|
|
// ※ 도면(엑셀)에는 "Laser_FIRE" 로 적혀 있으나 오기다. 발진 중 표시가 아니다.
|
|
// DO Laser_AC_KEY 의 에코.
|
|
Laser_MAIN_PWR_STATE,
|
|
}
|
|
public enum ePrismaticDOAddress
|
|
{
|
|
// (Pin5,6 쇼트) REMOTE_AC_KEY_A/B — 외부 제어용 키스위치. 분리 시 Emission OFF.
|
|
Laser_AC_KEY = 8,
|
|
|
|
// (Pin7,8 쇼트) REMOTE_DC_PWR_SW1/SW2 — "External Start"
|
|
// ★ 이름과 달리 모드 전환이 아니라 Emission ON/OFF 를 직접 제어한다.
|
|
// 연결 시 Emission ON, 분리 시 Emission OFF. 구 Core/Ring_Control 자리.
|
|
Laser_REMOTE,
|
|
|
|
// (Pin18) EX_RED_CONTROL+ — 가이드 레이저 ON/OFF. 구 EX_Red_Control 자리(명칭 동일).
|
|
Laser_GUIDE_BEAM_CONTROL,
|
|
|
|
// (Pin20) EX_RESET+ — ★ Water Flow Alarm 리셋 전용. 다른 error/alarm 에는 무효다.
|
|
// 구 Core/Ring_ErrorClearing 의 완전한 대체품이 아니다.
|
|
Laser_ALARM_RESET,
|
|
}
|
|
}
|
|
public class LaserIOControl : Device
|
|
{
|
|
PAIX_PrismaticScanner _ioBoard;
|
|
public IODevice _IOLaser;
|
|
public IOUnit _iOUnit;
|
|
|
|
public LaserIOControl(PAIX_PrismaticScanner io)
|
|
{
|
|
_IOLaser = io;
|
|
_ioBoard = io;
|
|
_iOUnit = io._iOUnit;
|
|
}
|
|
protected override int DoActivate(IDeviceConfig config)
|
|
{
|
|
if (_ioBoard.IsActivated)
|
|
return E1.OK;
|
|
|
|
return E2.NOT_CONNECTED;
|
|
}
|
|
|
|
protected override int DoDeactivate()
|
|
{
|
|
return E1.OK;
|
|
}
|
|
|
|
public int SetEmmision(bool on)
|
|
{
|
|
_ioBoard.WriteDO(1, on);
|
|
return E1.OK;
|
|
}
|
|
|
|
public bool GetLaserReady()
|
|
{
|
|
#region 260824 이전 원본 (Core/Ring 2대 AND 판정)
|
|
//bool coreReady = false;
|
|
//bool ringReady = false;
|
|
//GetLaserDIStatus(ePrismaticDIAddress.CoreLaser_Laser_Ready, out coreReady);
|
|
//GetLaserDIStatus(ePrismaticDIAddress.RingLaser_Laser_Ready, out ringReady);
|
|
//
|
|
//return coreReady && ringReady;
|
|
#endregion
|
|
|
|
// 260824 본 레이저 단일 발진기 — Laser_READY 단독 판정
|
|
bool ready = false;
|
|
GetLaserDIStatus(ePrismaticDIAddress.Laser_READY, out ready);
|
|
|
|
return ready;
|
|
}
|
|
public int GetLaserDevice(ref IODevice _IOLaser)
|
|
{
|
|
if (IsActivated == false || _ioBoard == null)
|
|
{
|
|
return E1.GENERIC;
|
|
}
|
|
_IOLaser = _ioBoard;
|
|
return E1.OK;
|
|
}
|
|
private bool GetLaserDIStatus(ePrismaticDIAddress addr, out bool bValue)
|
|
{
|
|
|
|
bool[] arrDI = new bool[Convert.ToInt32(_IOLaser._iOUnit.GetDICount())];
|
|
int nRet = _IOLaser._iOUnit.GetDiArray(ref arrDI);
|
|
if (nRet == E1.OK && arrDI.Length != 0)
|
|
{
|
|
bValue = arrDI[Convert.ToInt32(addr)];
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
bValue = false;
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|