to3796zw e61e99f9ab feat: bit15 보강·양극 미사용 정리·로그 개편
- D70002(PC_RECIPE_NO): 동일 레시피여도 매 핸드셰이크 에코 유지
- 정지 시 에코워드(Page/Recipe No) 0 초기화 제거(보존)
- bit15 Manual 전환 시 레시피 활성화+로드, bit15 ON 중 AUTO_REQ 자동시작 무시
- [AutoRun Resume] PC bit15(0x0F) 1초 펄스 OFF
- 양극(P) 미사용: PC_AUTO_STATUS_P/양극 용접 핸드셰이크 제거, 용접 응답 음극 통일
- 공유 eCommon READY(0x0F) 제거(PTOP enum은 유지)
- SeqAutoRunPTOP 로그 설명형 개편(노드 Start/End 제거)
- 빌드 0오류. Recipe/Page 수정분은 현장 미적용(추후 검증 예정)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:15:43 +09:00

439 lines
12 KiB
C#

using Aurora.Util.HislogPlus;
using AuroraPLC;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeldingCommon.Devices
{
public partial class PLCController
{
#region
// PLC -> PC [INPUT]
//public enum eCommonBitInput : int
//{
// LIVESTATUS = 0X00,
// AUTOSTATUS,
// AUTOCOMPLETE,
// MANUALCOMPLETE,
// LIGHT_ALSTATUS,
// HEAVY_ALSTATUS,
// EMPTY_6,
// EMPTY_7,
// PAGE_CHGCOMPLETE,
// EMPTY_9,
// EMPTY_10,
// EMPTY_11,
// EMPTY_12,
// EMPTY_13,
// EMPTY_14,
// EMPTY_15,
// WELD_01READYACK,
// WELD_01BUSY,
// WELD_01COMPLETE,
// EMPTY_19,
// EMPTY_20,
// EMPTY_21,
// EMPTY_22,
// EMPTY_23,
// EMPTY_24,
// EMPTY_25,
// EMPTY_26,
// EMPTY_27,
// EMPTY_28,
// EMPTY_29,
// EMPTY_30,
// EMPTY_31,
// EMPTY_32,
// EMPTY_33,
// EMPTY_34,
// EMPTY_35,
// EMPTY_36,
// EMPTY_37,
// EMPTY_38,
// EMPTY_39,
// EMPTY_40,
// EMPTY_41,
// EMPTY_42,
// EMPTY_43,
// EMPTY_44,
// EMPTY_45,
// EMPTY_46,
// EMPTY_47,
// EMPTY_48,
// EMPTY_49,
// EMPTY_50,
// EMPTY_51,
// EMPTY_52,
// EMPTY_53,
// EMPTY_54,
// EMPTY_55,
// EMPTY_56,
// EMPTY_57,
// EMPTY_58,
// EMPTY_59,
// EMPTY_60,
// EMPTY_61,
// EMPTY_62,
// EMPTY_63,
// EMPTY_64,
// EMPTY_65,
// EMPTY_66,
// EMPTY_67,
// EMPTY_68,
// EMPTY_69,
// EMPTY_70,
// EMPTY_71,
// EMPTY_72,
// EMPTY_73,
// EMPTY_74,
// EMPTY_75,
// EMPTY_76,
// EMPTY_77,
// EMPTY_78,
// EMPTY_79,
// EMPTY_80,
// EMPTY_81,
// EMPTY_82,
// EMPTY_83,
// EMPTY_84,
// EMPTY_85,
// EMPTY_86,
// EMPTY_87,
// EMPTY_88,
// EMPTY_89,
// EMPTY_90,
// EMPTY_91,
// EMPTY_92,
// EMPTY_93,
// EMPTY_94,
// EMPTY_95,
// EMPTY_96,
// EMPTY_97,
// EMPTY_98,
// EMPTY_99,
// EMPTY_100,
// AUTOSTATUS_A,
// AUTOCOMPLETE_A,
// MANUALCOMPLETE_A,
// LIGHT_ALSTATUS_A,
// HEAVY_ALSTATUS_A,
// EMPTY_106,
// EMPTY_107,
// PAGE_CHGCOMPLETE_A,
// EMPTY_109,
// EMPTY_110,
// EMPTY_111,
// EMPTY_112,
// EMPTY_113,
// EMPTY_114,
// EMPTY_115,
// WELD_01READYACK_A,
// WELD_01BUSY_A,
// WELD_01COMPLETE_A,
// WELD_02READYACK,
// WELD_02BUSY,
// WELD_02COMPLETE,
// EMPTY_122,
// EMPTY_123,
// WELDMONICOMPLETE,
// WELD_CH2READYACK,
// WELD_CH2BUSY,
// WELD_CH2COMPLETE,
// WELD_CH2MONICOMPLETE,
// EMPTY_129,
// EMPTY_130,
// EMPTY_131,
// EMPTY_132,
// M_POWERACK,
// M_POWERBUSY,
// M_POWERCOMPLETE,
// EMPTY_136,
// PLC_PARA_READ_ACK,
// PLC_PARA_SET_ACK,
// PLC_PARA_CHG_REQ,
// EMPTY_140,
// EMPTY_141,
// EMPTY_142,
// EMPTY_143,
// EMPTY_144,
// EMPTY_145,
// EMPTY_146,
// EMPTY_147,
// EMPTY_148,
// EMPTY_149,
// EMPTY_150,
// EMPTY_151,
// EMPTY_152,
// EMPTY_153,
// EMPTY_154,
// EMPTY_155,
// EMPTY_156,
// EMPTY_157,
// EMPTY_158,
// EMPTY_159,
// EMPTY_160,
// EMPTY_161,
// EMPTY_162,
// EMPTY_163,
// EMPTY_164,
// EMPTY_165,
// EMPTY_166,
// EMPTY_167,
// EMPTY_168,
// EMPTY_169,
// EMPTY_170,
// EMPTY_171,
// EMPTY_172,
// EMPTY_173,
// EMPTY_174,
// EMPTY_175,
// EMPTY_176,
// EMPTY_177,
// EMPTY_178,
// EMPTY_179,
// EMPTY_180,
// EMPTY_181,
// EMPTY_182,
// EMPTY_183,
// EMPTY_184,
// EMPTY_185,
// EMPTY_186,
// EMPTY_187,
// EMPTY_188,
// EMPTY_189,
// EMPTY_190,
// EMPTY_191,
// EMPTY_192,
// EMPTY_193,
// EMPTY_194,
// EMPTY_195,
// EMPTY_196,
// EMPTY_197,
// EMPTY_198,
// EMPTY_199,
//}
#endregion
// PLC -> PC [INPUT]
public enum eCommonBitInput : int
{
PLC_LIVE_STATUS = 0x00,
PLC_AUTO_STATUS = 0x01,
PLC_AUTO_REQ = 0x02,
PLC_MANUAL_REQ = 0x03,
PLC_LIGHT_ALARM_STATUS = 0x04,
PLC_HEAVY_ALARM_STATUS = 0x05,
PLC_DOOR_INTERLOCK = 0x06,
PLC_EMO_STATUS = 0x07,
PLC_PAGE_CHANGE_REQ = 0x08,
PLC_RMS_USED = 0x09,
// 0x0A ~ 0x0F
PLC_WELD_TRIGGER_REQ = 0x10,
PLC_WELD_WAIT = 0x11,
PLC_WELD_COMPLETE_ACK = 0x12,
// 0x13 ~ 0x1D
PLC_ALARM_RESET = 0x1E, // x
PLC_RMS_PARAMETER_READ_REQUEST = 0x25,
// ── 두 번째 블록 (M70600~) ──────────────────────────
PLC_AUTO_STATUS_P = 0x65,
PLC_AUTO_REQ_P = 0x66,
PLC_MANUAL_REQ_P = 0x67,
PLC_LIGHT_ALARM_STATUS_P = 0x68,
PLC_HEAVY_ALARM_STATUS_P = 0x69,
PLC_DOOR_INTERLOCK_P = 0x6A,
PLC_EMO_STATUS_P = 0x6B,
// 0x6D
// 0x6F ~ 0x73
PLC_WELD_P_READY_REQ = 0x74,
PLC_WELD_P_WAIT = 0x75,
PLC_WELD_P_COMP_ACK = 0x76,
}
// PC -> PLC [OUTPUT]
// PC -> PLC [OUTPUT]
public enum eCommonBitOutput : int
{
PC_LIVE_STATUS = 0x00,
PC_AUTO_STATUS = 0x01,
PC_AUTO_COMPLETE = 0x02,
PC_MANUAL_COMPLETE = 0x03,
PC_LIGHT_ALARM_STATUS = 0x04,
PC_HEAVY_ALARM_STATUS = 0x05,
PC_DOOR_INTERLOCK = 0x06,
PC_EMO_STATUS = 0x07,
PC_PAGE_CHANGE_COMPLETE = 0x08,
PC_RECIPE_CHANGE_COMPLETE = 0x09, // 260618: PTOP enum과 동기화 (RestoreDeviceStatus가 common enum 사용)
// 0x0A ~ 0x0F
PC_WELD_TRIGGER_ACK = 0x10,
PC_WELD_BUSY = 0x11,
PC_WELD_COMPLETE = 0x12,
PC_WELD_NG_JUDGE = 0x14,
PC_RMS_PARAMETER_READ_REQUEST_ACK = 0x25,
PC_AUTO_STATUS_P = 0x65,
PC_AUTO_REQUEST_P = 0x66,
PC_LIGHT_ALARM_STATUS_P = 0x68,
PC_HEAVY_ALARM_STATUS_P = 0x69,
PC_WELD_P_READY_REQ = 0x74,
PC_WELD_P_BUSY = 0x75,
PC_WELD_P_COMP_ACK = 0x76,
}
#region
//public enum eCommonBitOutput : int
//{
// PC_LIVE_STATUS = 0X00,
// PC_AUTO_STATUS,
// PC_AUTO_COMPLETE,
// PC_MANUAL_COMPLETE,
// PC_LIGHT_ALARM_STATUS,
// PC_HEAVY_ALARM_STATUS,
// EMPTY_06,
// EMPTY_07,
// PC_PAGE_CHANGE_COMPLETE,
// EMPTY_09,
// EMPTY_10,
// EMPTY_11,
// EMPTY_12,
// EMPTY_13,
// EMPTY_14,
// EMPTY_15,
// PC_WELD_READY_ACK,
// PC_WELD_BUSY,
// PC_WELD_COMPLETE,
// EMPTY_19,
// PC_WELD_NG, // ng(vision Compensation fail) 발생 시 살림
// EMPTY_21,
// EMPTY_22,
// EMPTY_23,
// EMPTY_24,
// EMPTY_25,
// EMPTY_26,
// EMPTY_27,
// EMPTY_28,
// EMPTY_29,
// EMPTY_30,
// EMPTY_31,
// EMPTY_32,
// EMPTY_33,
// EMPTY_34,
// EMPTY_35,
// EMPTY_36,
// PC_RMS_PARAMETER_READ_REQUEST_ACK,
// EMPTY_38,
// EMPTY_39,
// EMPTY_40,
//}
#endregion
public enum eCommonWordInput : int
{
PLC_ERROR_CODE = 0X00,
PLC_PAGE_NO,
PLC_STEP_NO,
EMPTY_03,
PLC_CURRENT_SLOT_NO, // EL / CLEAN 사용
EMPTY_05,
EMPTY_06,
EMPTY_07,
EMPTY_08,
EMPTY_09,
EMPTY_10,
EMPTY_11,
EMPTY_12,
EMPTY_13,
EMPTY_14,
EMPTY_15,
EMPTY_16,
EMPTY_17,
EMPTY_18,
EMPTY_19,
PLC_CELL_ID_01,
PLC_CELL_ID_02,
PLC_CELL_ID_03,
PLC_CELL_ID_04,
PLC_CELL_ID_05,
PLC_CELL_ID_06,
PLC_CELL_ID_07,
PLC_CELL_ID_08,
PLC_CELL_ID_09,
PLC_CELL_ID_10,
PLC_LOT_ID_01,
PLC_LOT_ID_02,
PLC_LOT_ID_03,
PLC_LOT_ID_04,
PLC_LOT_ID_05,
PLC_LOT_ID_06,
PLC_LOT_ID_07,
PLC_LOT_ID_08,
}
public enum eCommonWordOutput : int
{
PC_ERROR_CODE = 0X00,
PC_PAGE_NO,
EMPTY_02,
EMPTY_03,
EMPTY_04,
EMPTY_05,
EMPTY_06,
EMPTY_07,
PC_WELD_OFFSET_X,
EMPTY_09,
PC_WELD_OFFSET_Y,
EMPTY_11,
PC_DISPLACEMENT1_MEASUREMENT,
EMPTY_13,
PC_DISPLACEMENT2_MEASUREMENT = 0X0E,
EMPTY_15,
EMPTY_16,
EMPTY_17,
EMPTY_18,
EMPTY_19,
}
// PLC 주소 초기화
void InitPLCAddress()
{
ePLCErrCode retCode = ePLCErrCode.MemMapPaser_Fail;
switch (mmapFileType) {
case PLCMMapFileType.CSV:
ParsePLCBitWordAddressFromCSV(BitInputPath, BitOutputPath, WordInputPath, WordOutputPath, out retCode);
break;
case PLCMMapFileType.EXCEL:
ParsePLCBitWordAddressFromExcel(BitInputPath, BitOutputPath, WordInputPath, WordOutputPath, out retCode);
break;
default:
Log.E($"No supported fileType: {mmapFileType}");
break;
}
//===================================================
switch (retCode) {
case ePLCErrCode.MemMapPaser_BitInput_LoadFail: {
#warning [LUKAS][PLC] 아래 주석은 Aurora 알람 기능에 연동할 때 검토 (csv 파일이 없을때 알림용)
//_alarmService.SetAlarm(AlarmCode.ALARM_PLC_EXCEL_BIT_INPUT_LOAD_FAIL);
break;
}
case ePLCErrCode.MemMapPaser_BitOutput_LoadFail: {
//_alarmService.SetAlarm(AlarmCode.ALARM_PLC_EXCEL_BIT_OUTPUT_LOAD_FAIL);
break;
}
case ePLCErrCode.MemMapPaser_WordInput_LoadFail: {
//_alarmService.SetAlarm(AlarmCode.ALARM_PLC_EXCEL_WORD_INPUT_LOAD_FAIL);
break;
}
case ePLCErrCode.MemMapPaser_WordOutput_LoadFail: {
//_alarmService.SetAlarm(AlarmCode.ALARM_PLC_EXCEL_WORD_OUTPUT_LOAD_FAIL);
break;
}
}
}
}
}