아모센스 마킹 gui
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

16 KiB

Performance Inspect & Laser Marking System - 개발자 메뉴얼

본 문서는 양산형 테스트 기기 모니터링 시스템의 유지보수, 릴리즈, 시스템 통합 및 디버깅을 위한 개발자용 상세 기술 사양서입니다. 시스템 설계 정보, 하드웨어 연동 규격, 그리고 제어 시퀀스를 포함하고 있습니다.


1. 시스템 아키텍처 및 요구사항

1.1 기술 스택

  • 프레임워크: .NET Framework 4.7.2 (WPF)
  • UI 패턴: MVVM (MainWindow, SettingsWindow, StartupLoginWindow 등)
  • 데이터베이스: Microsoft SQL Server 2012 이상 (ADO.NET 연동)
  • 장비 연동:
    • LMC1 레이저 각인 컨트롤러 (C++ Wrapped DLL MarkEzdWrapper.dll 로드)
    • Keysight DMM & PSU (TCP/IP 기반 SCPI 통신)
    • 4251 센서 판독 보드 (시리얼 RS-232 기반 고유 프로토콜)

1.2 개발 환경 구동 요구사항

  • Visual Studio 2022 이상
  • MSBuild 엔진 (XAML 컴파일 지원)
  • MS-SQL Server Express 또는 로컬 DB 인프라
  • EZCAD 2 소프트웨어 및 LMC USB 각인 카드 드라이버

2. 설정 파일 (INI) 상세 사양

실행 파일 경로에 위치하는 INI 설정 파일들의 각 항목별 역할 및 타입 정의입니다.

2.1 Setting.ini

계측 장비 접속 주소, SCPI 제어 명령어 매개변수 및 레이저 각인 도안 태그 매핑([Tags]) 설정을 포함합니다.

; =================================================================
; 성능 검사 모니터링 시스템 - 레이저 마킹기 연동 설정 파일
; =================================================================

[Settings]
; 마킹 제어 라이브러리 및 드라이버(EzCad) 폴더 경로
EzdFolderPath=c:\EzCad

; 테스트 모드 여부 (true 시 하단 테스트 마킹, 강제 검사 버튼 노출)
test=false


[Tags]
; 도안(.ezd) 파일 내의 텍스트 오브젝트 치환용 태그명 매핑 리스트
; (도안에 정의된 오브젝트명과 동일하게 설정해야 정상 작동합니다)
; ※ 아래 5개 태그만 치환됩니다. 불필요 태그는 사용하지 않습니다.

; 일련번호 4자리 순번 치환 태그 (예: 0001)
SerialTag=SERIAL

; 작업 Lot No 치환 태그 (로그인 입력값 YYMMDDLL 전체 전달, 예: 26080401)
LotNoTag=YYMMDD

; QR 코드 데이터 치환 태그 (IC_SN;도면품번;HKMC품번;각인번호; 포맷)
QrCodeTag=DATAMATRIX

; 도면 품번 치환 태그
DrawingNoTag=PARTNO

; HKMC 품번 치환 태그
HkmcNoTag=HKMCPO


; =================================================================
; 계측기 연동 설정 (SCPI / LAN)
; =================================================================

[Equipment]
; 계측기 통신 타임아웃 (ms)
Timeout=5000

; 측정 안정화 대기 시간 (ms) — Power Supply ON 후 이 시간만큼 대기 후 읽음
SettleMilliseconds=2000

; 검사 전 보드 전원 공급 커맨드 (세미콜론으로 구분)
PreBoardCommand=VOLT 5, (@2);OUTP ON, (@2)
PreBoardDelayMilliseconds=2000

; 로그아웃 시 전원 차단 커맨드
LogoutCommand=OUTP OFF, (@1)


[DMM]
; Digital Multimeter — 전압 및 저항 측정 전용 (예시 IP: 192.168.1.100)
VoltageConnection=LAN
VoltageHost=192.168.1.100
VoltagePort=5025
VoltageIdnMatch=34465A
VoltageBaudRate=115200
VoltageTerminator=LF
VoltageSetupCommand=
VoltageReadCommand=MEAS:VOLT:DC?
ResistanceReadCommand=MEAS:RES?


[CurrentDMM]
; Digital Multimeter — 전류 측정 전용 (예시 IP: 192.168.1.102 - 현재 제어 시퀀스에서 미사용)
CurrentDMMConnection=LAN
CurrentDMMHost=192.168.1.102
CurrentDMMPort=5025
CurrentDMMIdnMatch=34465A
CurrentDMMBaudRate=115200
CurrentDMMTerminator=LF
CurrentDMMReadCommand=MEAS:CURR:DC?


[PowerSupply]
; Power Supply — 출력 제어 및 전류 측정 (예시 IP: 192.168.1.101)
CurrentConnection=LAN
CurrentHost=192.168.1.101
CurrentPort=5025
CurrentIdnMatch=E36233A
CurrentBaudRate=9600
CurrentTerminator=LF
CurrentSetupCommand=OUTP ON, (@1)
CurrentCleanupCommand=OUTP OFF, (@1)
CurrentReadCommand=MEAS:CURR? (@1)


[Limits]
; 최종 계측 합/불 판정 규격 임계치 (Min: 하한치, Max: 상한치)
; UI [시험 설정] 메뉴에서 변경 시 자동 저장 및 갱신됩니다.
MinVoltage=4.0
MaxVoltage=6.0

MinCurrent=8.0
MaxCurrent=10.0

MinResistance=0.4
MaxResistance=0.8

2.2 Database.ini

생산 이력 조회 및 적재 목적의 DB 연결 설정입니다.

[Database]
# SQL 데이터베이스 접속 주소 및 계정 정보 (예시 주소)
Db_Server=192.168.1.200
Db_Name=MarkingDb
Db_User=db_user
Db_Password=db_password

# 로컬 테스트 및 DB 점검 시 우회용 플래그
OfflineMode=False


[Login]
# 작업자 로그인 검증 시 호출할 저장 프로시저명
Procedure=dbo.CheckOperator

# 작업 공정 식별 이름 (저장 프로시저 매개변수 바인딩용)
ProcessName=Marking

# 오프라인 로그인 미리보기 활성화 여부
OfflinePreview=false

2.3 Sensor.ini

4251 센서 통신 보드 시리얼 통신을 위한 포트 매핑 파일입니다.

[Sensor]
# 시리얼 COM 포트 번호
Port=COM3

# 통신 속도
BaudRate=115200

# 보드 내부 멀티 채널 스위칭 인덱스 (1 또는 2)
Channel=1

3. 데이터베이스 스키마 및 연동 규격

3.1 테이블 구성 정보

  • [dbo].[Users] (작업자 계정 정보 테이블)

    • OperatorId (VARCHAR(50), UNIQUE): 작업자 로그인 ID
    • Password (VARCHAR(50)): 비밀번호
    • Name (VARCHAR(50)): 작업자 성명
    • IsActive (BIT): 활성 상태 여부
  • [dbo].[Marking] (최종 성능 계측값 및 마킹 결과 저장 테이블)

    • IC_SN (NVARCHAR(30), PRIMARY KEY, NOT NULL): 센서 IC 일련번호 (30자 초과 시 코드 내에서 절삭)
    • PCB_Barcode (NVARCHAR(30), NOT NULL): PCB 바코드 — 정상 검사 시 스캔값, 강제검사(BYPASS) 시 IC_SN 값으로 대체 저장
    • Marking_QR (NVARCHAR(60), NOT NULL): 각인 QR 코드 전체 문자열 (IC_SN;도면품번;HKMC품번;각인번호; 포맷, 60자 초과 시 절삭)
    • Maker (VARCHAR(10)), Model (VARCHAR(10)): 제품 사양 정보 (10자 초과 시 코드 내에서 절삭)
    • Variant_1, Variant_2 (VARCHAR(10)): 제품 변형 코드 (10자 초과 시 절삭)
    • Operator (VARCHAR(10)): 담당 작업자 ID (10자 초과 시 절삭)
    • Production_Date (DATETIME): 생산 일자 및 계측 시간
    • Line (VARCHAR(10)): 생산 라인 (최대 10자 제한, 초과 시 코드 내에서 절삭)
    • Lot_No (VARCHAR(10)): 로트 번호 — YYMMDDLL 형식 입력 (최대 10자 제한, 초과 시 코드 내에서 절삭)
    • Jig_No (VARCHAR(10)): 지그 번호 (10자 초과 시 절삭)
    • PT_Vol_1 (DECIMAL(4,2)), PT_Current_1 (DECIMAL(4,2)), PT_Resistance_1 (DECIMAL(5,3)): 실측 전압(V), 전류(mA), 저항(kΩ) — 소수점 이하 2~3자리로 반올림 적재
    • Result (VARCHAR(10)): 최종 종합 판정 — OK (QR 검증 통과) 또는 NG (불합격 또는 QR 검증 실패)

3.2 이전 공정 결과 교차 검증 (Subquery)

검사 개시 시점, 제품의 S/N(IC_SN)을 기반으로 선행 공정이 완료되었는지 조회합니다.

SELECT 
    (SELECT Result FROM Housing_Assembly WHERE IC_SN = @IC_SN) AS HousingResult,
    (SELECT Final_Result FROM Cal_EOL_Result WHERE IC_SN = @IC_SN) AS CalResult,
    (SELECT Result FROM EOL WHERE IC_SN = @IC_SN) AS EolResult
  • 판정 조건: 조회 결과 3개 항목이 모두 PASS 또는 OK 상태이어야 최종 검사 기동이 허용됩니다.

3.3 로그인 저장 프로시저 ([dbo].[CheckOperator])

  • 프로시저 스펙:
    CREATE PROCEDURE [dbo].[CheckOperator]
        @Operator VARCHAR(50),
        @Password VARCHAR(50),
        @ProcessName VARCHAR(50) = NULL
    AS
    BEGIN
        SELECT COUNT(*) 
        FROM Users 
        WHERE OperatorId = @Operator 
          AND Password = @Password 
          AND IsActive = 1
    END
    
  • 호출 매핑 코드: ADO.NET SqlCommand 객체를 사용하여 CommandType.StoredProcedure 형식으로 호출하며 리턴값이 1일 경우 검증 처리합니다.

4. 하드웨어 제어 프로토콜 및 SCPI 사양

4.1 4251 센서 통신 보드 시리얼 패킷 규격

센서 일련번호를 추출하고 보드를 제어하기 위해 RS-232 시리얼(115200bps)을 통해 다음 패킷 명령을 전송합니다.

  1. 보드 대기 및 리셋 명령: "x00o"
  2. 보드 채널 결속 명령: "x00c_00{channel}101:owt28006727ea97c7801"
    • {channel}Sensor.ini에서 파싱한 값 (예: 1 또는 2)
  3. 고유 ID(IC_SN) 읽기 명령: "x00c_00{channel}101:ow2800326003e"
    • 송신 후 보드 응답 버퍼에서 16진수 일련번호 데이터(16자)를 추출합니다.
  4. 보정 기본값 전송: "x00c_00{channel}001:owt28006727ea97c7801"

4.2 계측 장비 제어 SCPI 명령어 구성 및 시퀀스

모든 TCP/IP 계측기는 포트 5025를 통해 SCPI 표준 명령으로 조작됩니다.

  1. 장비 연결 및 아이덴티티 검증 (Handshake):
    • 각 계측기 접속 후 *IDN? 명령을 전송하여 응답 텍스트에 Setting.ini에 지정된 장비 모델명(예: 34465A, E36233A)이 수록되어 있는지 확인합니다.
  2. 테스트 주전원(CH1) 인가:
    • OUTP ON, (@1)
    • 전원 공급 후 신호 안정을 위해 SettleMilliseconds(기본 2000ms, 즉 2초)만큼 대기합니다.
  3. 측정 데이터 수집:
    • 전압(V): 전압 DMM(예: 192.168.1.100)에 MEAS:VOLT:DC?를 질의하여 획득.
    • 저항(Ω): 저항 DMM(예: 192.168.1.100)에 MEAS:RES?를 질의하여 획득. (획득값은 kΩ 단위 조정을 위해 1000으로 나눔)
    • 전류(A): 파워서플라이(예: 192.168.1.101)의 CH1에 MEAS:CURR? (@1)을 질의하여 획득. (획득값은 mA 단위 조정을 위해 1000을 곱함)
    • 주의: 전류 측정 전용 DMM(예: 192.168.1.102) 장비는 설정 파일에 로드되나 실제 측정 시퀀스 상에서는 사용되지 않습니다.
  4. 주전원(CH1) 차단:
    • OUTP OFF, (@1)
    • 계측 도중 예외가 발생하더라도 finally 구문 내에서 차단 명령을 전송합니다.

5. 레이저 마킹기 연동 사양 (LMC1 API)

C++로 개발된 레이저 각인기 드라이버 DLL인 MarkEzdWrapper.dll을 P/Invoke를 통해 호출합니다.

5.1 연동 시 핵심 규칙

  1. 세션 핸들 (hHandle) 관리:
    • 프로그램 시작 시 InitMarkEzd() 함수를 호출하여 세션 포인터(IntPtr)를 받아 전역 변수로 관리합니다.
    • 각인 관련 API 함수 호출 시 이 IntPtr 핸들을 첫 번째 매개변수로 전달해야 합니다.
  2. 유니코드 마샬링 (CharSet.Unicode):
    • C++ DLL 단의 모든 문자열 인자가 const wchar_t* (유니코드)를 사용하므로, DllImport 선언의 문자셋 속성은 CharSet = CharSet.Unicode로 설정해야 정상 작동합니다.
  3. HWND 부모 창 핸들 지연 초기화:
    • Init 함수는 부모 WPF 윈도우의 핸들(IntPtr)을 요구합니다.
    • Window 생성자 시점에는 핸들이 미생성 상태이므로, 반드시 **Dispatcher.BeginInvoke(..., DispatcherPriority.Loaded)**를 활용하여 메인 윈도우 로드가 완료된 후에 핸들을 추출해 초기화해야 합니다.

5.2 DLL 가져오기 (P/Invoke) 선언 명세

[DllImport("MarkEzdWrapper.dll", EntryPoint = "InitMarkEzd", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr InitMarkEzd();

[DllImport("MarkEzdWrapper.dll", EntryPoint = "Init", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private static extern int Init(IntPtr hHandle, string strEzCadPath, IntPtr hOwenWnd);

[DllImport("MarkEzdWrapper.dll", EntryPoint = "LoadEzdFile", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private static extern int LoadEzdFile(IntPtr hHandle, string strEzCadFileName);

[DllImport("MarkEzdWrapper.dll", EntryPoint = "ChangeTextByName", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private static extern int ChangeTextByName(IntPtr hHandle, string strTextName, string strTextNew);

[DllImport("MarkEzdWrapper.dll", EntryPoint = "Mark", CallingConvention = CallingConvention.Cdecl)]
private static extern int Mark(IntPtr hHandle);

[DllImport("MarkEzdWrapper.dll", EntryPoint = "Close", CallingConvention = CallingConvention.Cdecl)]
private static extern int Close(IntPtr hHandle);

6. 데모용 시뮬레이션 격리 및 릴리즈 배포 가이드

6.1 데모 모드 격리 코드 해제 방법

상용 빌드 릴리즈 시, 데이터베이스에 실제 로그인하지 않고 통과하는 데모 우회 로직을 소스 코드 단에서 제거해야 합니다.

  1. LoginServicesStub.cs 파일을 엽니다.
  2. ExistsAsync 메서드 안의 catch (Exception ex) 구문 내부에 위치한 아래의 DEMO MODE 주석 배너 영역 코드를 삭제하거나 주석 처리하여 릴리즈 빌드를 만드십시오.
// ==================== [DEMO MODE START] ====================
// 데모 시뮬레이션용 프로시저 성공 연출 코드
// 상용 릴리즈 시 이 블록은 완전히 제거(삭제)할 수 있습니다.
if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure))
{
    System.Diagnostics.Debug.WriteLine(string.Format("[데모 시뮬레이션] 프로시저 '{0}' 호출 모사 (ID: {1}, PW: {2}, Process: {3})", 
        _loginSettings.Procedure, operatorId, password, _loginSettings.ProcessName));
    return IsDefaultAccount(operatorId, password);
}
// ==================== [DEMO MODE END] ====================

6.2 릴리즈 게시 및 단일 설치 파일(MarkingSetup.exe) 자동 생성 가이드

본 프로젝트는 Visual Studio 게시 프로필 및 WiX Toolset 커스텀 타깃이 적용되어 있어, CLI 게시 명령 한 번으로 단일 실행 설치 파일(MarkingSetup.exe)을 자동으로 컴파일 및 생성합니다.

  • 권장 CLI 게시 명령어 (Terminal):
    dotnet publish marking_gui/marking_gui.csproj -c Release -r win-x86 --self-contained
    
  • 자동 빌드 및 패키징 동작 순서:
    1. 프로젝트 릴리즈 바이너리 및 의존 라이브러리 일체 자동 수집
    2. C:\marking\libs\ 경로로 모든 런타임 DLL 격리 구성
    3. WiX Toolset(wix build)이 가동하여 MSI 패키지 및 단일 EXE 부트스트랩 번들 컴파일
    4. 최종 설치 파일 MarkingSetup.exeC:\marking\bin\Release\net9.0-windows\win-x86\publish\ 폴더로 자동 생성 이관
  • 배포 및 전달 대상 파일:
    • MarkingSetup.exe (단일 파일만 현장에 전달하여 1-Click 설치 진행)

6.3 배포 설치 디렉터리(C:\marking\) 파일 구조 및 런타임 생성 폴더 사양

MarkingSetup.exe로 인스톨된 후 C:\marking\ 아래에 배치되는 파일 및 런타임 가동 중 생성되는 디렉터리 명세입니다.

C:\marking\
├── marking_gui.exe                    # 메인 WPF 실행 바이너리
├── marking_gui.dll                    # 핵심 애플리케이션 어셈블리
├── marking_gui.deps.json              # 종속성 매니페스트
├── marking_gui.runtimeconfig.json     # .NET 9.0 런타임 환경 구성
├── Setting.ini                        # 마킹기 경로, 태그 매핑, 계측기 IP, SCPI 전원, [Limits] 판정 임계치 종합 설정
├── Database.ini                       # MS-SQL 접속 계정 및 오프라인 모드(OfflineMode) 설정
├── Sensor.ini                         # 4251 센서 통신 보드 시리얼 포트(COM), BaudRate, 채널 설정
├── libs\                              # C++ LMC 드라이버 라이브러리 격리 폴더
│   ├── MarkEzdWrapper.dll             # C# - C++ LMC P/Invoke 래퍼
│   ├── DataMgr.dll                    # EZCAD 데이터 매니저
│   ├── MarkEzd.dll                    # EZCAD 커널 마킹 라이브러리
│   └── haspms32.dll                   # 동글/라이선스 보안 라이브러리 일체
├── logs\                              # 런타임 가동 중 일별 자동 생성되는 시스템/통신/마킹 이력 로그
│   └── 2026-07-23.log                 # 텍스트 형태의 일자별 로그 파일
└── publish_backup\                    # 게시 및 버전 업데이트 시 기존 파일 자동 백업 보관 폴더