NohDoyeon241104 5be34e612e feat: 본 레이저 단일 발진기 전환 - IO 채널 재정의 및 enum 단일화
레이저 발진기 교체(임시 Core/Ring 2대 -> 본 레이저 Max MFMC-2000/2000M 1대)에
따른 IO 재정의. 현장 적용 후 정상 동작 확인.

- ePrismaticDIAddress / ePrismaticDOAddress 를 본 레이저 38핀 커넥터 매뉴얼 기준으로
  재정의. 상태 신호 8개 -> 4개. 도면(엑셀) 라벨 오기도 함께 정정
  (Laser_FIRE -> Laser_MAIN_PWR_STATE)
- PAIX_PTOP / SeqAutoRunPTOP 의 중복 enum 정의 제거.
  WeldingCommon 의 PAIX_PrismaticScanner 를 IO 채널 번호의 단일 소스로 통일
- 발진 게이트를 Core/Ring_Control 2발 -> Laser_REMOTE 1발로 변경
  (ExecuteWelding ON/OFF, 정지 시 해제)
- DO 8 충돌 제거: Auto 시작 시 PCLBADReadyStatus(=8) write 삭제.
  본 레이저 배선에서 DO 8 = Laser_AC_KEY 라 그대로 두면 Auto 시작이
  레이저 AC KEY 릴레이를 켠다. LBAD 는 미등록 디바이스라 무의미
- GetLaserReady() 를 Laser_READY 단독 판정으로 변경
- 가이드빔 DO 를 EX_Red_Control -> Laser_GUIDE_BEAM_CONTROL 로 전환
- IO Board 에 설정 화면(UCIOInterfaceView) 연결
- IsLaserReady 표시를 DO Laser_REMOTE 되읽기로 확정 (260826 협의, 현장 미검증)

원복: 각 파일의 "260824 이전 원본" region 을 살리고 아래 블록을 제거하면 된다.
2026-08-26 11:45:40 +09:00

173 lines
6.9 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. DO Laser_REMOTE(External Start) 의 에코.
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;
}
}
}
}