This commit is contained in:
kje97 2025-07-01 11:15:32 +09:00
commit 078628b364
3 changed files with 3072 additions and 1967 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1906,7 +1906,8 @@ Public Class Main_Form
End If End If
For i = 0 To tableName.Length - 1 For i = 0 To tableName.Length - 1
DBCmd = "SELECT COUNT(PV_SN) FROM " & tableName(i) & " WHERE PV_SN = '" & TestData.Test_Serial & "'" DBCmd = "SELECT COUNT(PV_SN) FROM " & tableName(i) & " WHERE PV_SN = '" & TestData.Test_Serial & "'" &
" AND DATE(TestDate) = CURDATE()"
Dim DupYn As Int16 = DBQueryScalar(DBCmd) Dim DupYn As Int16 = DBQueryScalar(DBCmd)
If DupYn > 0 Then If DupYn > 0 Then
@ -2605,14 +2606,82 @@ SettingFail:
End Function End Function
'Private Sub Jig_End()
' If EndTest() Then
' txbWindow.AppendText("JIG Serial Test End : FAIL" & vbCrLf)
' Exit Sub
' End If
' txbWindow.AppendText("JIG Serial Test End : Success" & vbCrLf)
'End Sub
Private Sub Jig_End() Private Sub Jig_End()
For retryCount As Integer = 0 To 2
txbWindow.AppendText($"JIG 종료 시도 {retryCount + 1}/3" & vbCrLf)
If EndTest() Then If EndTest() Then
txbWindow.AppendText("JIG Serial Test End : FAIL" & vbCrLf) txbWindow.AppendText($"JIG Serial Test End : FAIL (시도 {retryCount + 1})" & vbCrLf)
If retryCount < 2 Then
Threading.Thread.Sleep(1000)
If JigSerial IsNot Nothing AndAlso JigSerial.IsOpen Then
JigSerial.DiscardInBuffer()
JigSerial.DiscardOutBuffer()
Threading.Thread.Sleep(200)
End If
Continue For
Else
txbWindow.AppendText("JIG 정상 종료 실패 - 강제 종료 실행" & vbCrLf)
ForceJigShutdown()
Exit Sub Exit Sub
End If End If
Else
txbWindow.AppendText("JIG Serial Test End : Success" & vbCrLf) txbWindow.AppendText("JIG Serial Test End : Success" & vbCrLf)
Exit For
End If
Next
End Sub End Sub
Private Sub ForceJigShutdown()
Try
txbWindow.AppendText("강제 JIG 종료 시작" & vbCrLf)
If JigSerial IsNot Nothing AndAlso JigSerial.IsOpen Then
Dim shutdownCommands() As String = {"[endmft]"}
For Each cmd In shutdownCommands
Try
SendData(cmd)
Threading.Thread.Sleep(500)
txbWindow.AppendText($"강제 종료 명령 전송: {cmd}" & vbCrLf)
Catch
End Try
Next
Try
Dim portName As String = JigSerial.PortName
Dim baudRate As Integer = JigSerial.BaudRate
JigSerial.Close()
Threading.Thread.Sleep(1000)
JigSerial.PortName = portName
JigSerial.BaudRate = baudRate
JigSerial.Open()
txbWindow.AppendText("시리얼 포트 재연결 완료" & vbCrLf)
Catch serialEx As Exception
txbWindow.AppendText($"시리얼 포트 재연결 실패: {serialEx.Message}" & vbCrLf)
End Try
End If
Catch ex As Exception
txbWindow.AppendText($"강제 종료 중 오류: {ex.Message}" & vbCrLf)
End Try
End Sub
Public Function EPTestRun() As Boolean Public Function EPTestRun() As Boolean
Dim ForCnt As Int16 = 0 Dim ForCnt As Int16 = 0
Try Try
@ -4488,12 +4557,32 @@ ErrorEnd:
End Function End Function
Private Sub InitializeDeviceState()
Try
txbWindow.AppendText("기기 상태 초기화 시작..." & vbCrLf)
Try
TestMode_On(0) ' MFT 모드를 0으로 초기화
Threading.Thread.Sleep(300)
Catch
End Try
txbWindow.AppendText("기기 상태 초기화 완료" & vbCrLf)
Catch ex As Exception
txbWindow.AppendText("기기 초기화 중 오류 (무시하고 계속): " & ex.Message & vbCrLf)
End Try
End Sub
Private Sub rfFunction() Private Sub rfFunction()
Try Try
StartTime = MeasureTimeAll(MeasStart) StartTime = MeasureTimeAll(MeasStart)
TestData.Test_Serial = txbBarcode.Text TestData.Test_Serial = txbBarcode.Text
InitializeDeviceState()
If StartSwitch = True Then If StartSwitch = True Then
If JigSerial.IsOpen = True Then If JigSerial.IsOpen = True Then
@ -4625,6 +4714,19 @@ ProcessEnd:
Jig_End() Jig_End()
NormalEnd: NormalEnd:
myscope.IO.Clear() myscope.IO.Clear()
'txbWindow.AppendText("[" & MeasureTimeAll(MeasEnd) & "ms] Test Play" & vbCrLf)
Try
If TestError = False Then
Jig_End() ' 지그 전원 차단
TestMode_On(0) ' MFT 모드 초기화
txbWindow.AppendText("비정상 종료로 인한 전원 차단" & vbCrLf)
End If
Catch normalEx As Exception
txbWindow.AppendText("정상 종료 처리 중 오류: " & normalEx.Message & vbCrLf)
End Try
'myscope.IO.Clear()
txbWindow.AppendText("[" & MeasureTimeAll(MeasEnd) & "ms] Test Play" & vbCrLf) txbWindow.AppendText("[" & MeasureTimeAll(MeasEnd) & "ms] Test Play" & vbCrLf)
End Sub End Sub
@ -5270,12 +5372,12 @@ ProcessEnd:
End If End If
Else Else
If TDDataSet(TD_Data.TestStep) = TestStepList.Rf_NewFail Or TDDataSet(TD_Data.TestStep) = TestStepList.RF_ReFail Then If TDDataSet(TD_Data.TestStep) = TestStepList.Rf_NewFail Or TDDataSet(TD_Data.TestStep) = TestStepList.RF_ReFail Then
If processNum = TestStepList.HF_NewSuc Or processNum = TestStepList.HF_ReSuc Then If processNum = TestStepList.RF_NewSuc Or processNum = TestStepList.Rf_ReSuc Then
txbOkCount.Text = Val(txbOkCount.Text) + 1 txbOkCount.Text = Val(txbOkCount.Text) + 1
txbNgCount.Text = Val(txbNgCount.Text) - 1 txbNgCount.Text = Val(txbNgCount.Text) - 1
End If End If
Else Else
If processNum = TestStepList.HF_NEWFail Or processNum = TestStepList.HF_ReFail Then If processNum = TestStepList.Rf_NewFail Or processNum = TestStepList.RF_ReFail Then
txbOkCount.Text = Val(txbOkCount.Text) - 1 txbOkCount.Text = Val(txbOkCount.Text) - 1
txbNgCount.Text = Val(txbNgCount.Text) + 1 txbNgCount.Text = Val(txbNgCount.Text) + 1
End If End If
@ -5283,6 +5385,7 @@ ProcessEnd:
End If End If
End Sub End Sub
Private Function CountUpdate() As Boolean Private Function CountUpdate() As Boolean
If rdbAltoPD.Checked = True Then If rdbAltoPD.Checked = True Then
DBCmd = "UPDATE " & pd1CntTableNow & " SET PD1_AltoCnt = '" & txbDayCount.Text & "', PD1_AltoOkCnt = '" & txbOkCount.Text & "', PD1_AltoNgCnt = '" & txbNgCount.Text & "' WHERE PD1_Date = '" & NowDate & "'" DBCmd = "UPDATE " & pd1CntTableNow & " SET PD1_AltoCnt = '" & txbDayCount.Text & "', PD1_AltoOkCnt = '" & txbOkCount.Text & "', PD1_AltoNgCnt = '" & txbNgCount.Text & "' WHERE PD1_Date = '" & NowDate & "'"

114
README.md Normal file
View File

@ -0,0 +1,114 @@
# MAXIMUM & ALTO 기능 자동 검사 프로그램
## 📌 프로그램 개요
| 항목 | 내용 |
| ---------- | -------------------------------------------------------------------------------------------------------------------- |
| **프로그램 명** | `MAXIMUM_Multi_Function_Tester Ver.1.1.2` |
| **설치 위치** | 6층 공장 라인 중간 / 9층 사무실 가장 오른쪽 검사 장비 |
| **용도** | 반 조립 제품의 주파수 발생 여부 검사 및 제조 정보 자동 입력 |
| **연결 장비** | Oscilloscope, Spectrum Analyzer, Control Box JIG, Barcode Scanner 등 |
| **설명** | 자동으로 Jig 작동, 펌웨어 확인, 주파수 출력 감지 후 제조 정보 입력까지 수행하는 통합 검사 시스템 |
---
## 🖥️ 프로그램 UI
| 검사 모드 선택 화면 | 검사 실행 화면 |
| -------------------------------------------------------------------- | --------------------------------------------------------------------- |
| ![모드 선택](attachment:603ac612-2ac3-47f3-98c5-d5ce4ffb274e\:image.png) | ![검사 실행](attachment\:fbe5f209-29d2-4b75-8401-b7a06a34b3cc\:image.png) |
---
## 🔢 검사 모드별 기능 요약
검사 모드는 제품 타입 및 단계에 따라 최대 8가지로 구분됩니다.
| 모드 | 설명 | 주요 테스트 기능 | 함수명 |
| --- | --------------------- | ------------------ | ------------------- |
| 1-1 | 업체전용 (RF/EP) | RF/EP 주파수 감지 | `CompanyFunction()` |
| 1-2 | 수입검사 (HF/RF/EP) | 중간 부저 테스트 | `iqcFunction()` |
| 1-3 | 생산 1 (HF 측정/정보입력) | HIFU 출력 측정 및 DB 저장 | `hfFunction()` |
| 1-4 | 생산 2 (RF/MC/EP) | RF, 미세전류, EP 테스트 | `rfFunction()` |
| 2-1 | ALTO 수입검사 (HF/EP) | ALTO HF/EP 테스트 | `altoFunctionIQC()` |
| 2-2 | ALTO 생산 3 (HF/EP) | ALTO 생산 테스트 | `AltoFunctionPD()` |
| 3-2 | DUALSONIC 생산 4 (HF) | DUALSONIC HF 테스트 | `DSTestFunction()` |
| 4-2 | EFFECT 생산 5 (HF/정보입력) | HF 테스트 및 제조 정보 입력 | `hfFunction()` |
※ DUALSONIC/EFFECT의 수입검사 모드는 UI상 비활성화됨.
---
## 🧪 검사 순서 흐름 예시
### 예: 생산 1(HF)
```vbnet
hfFunction()
-> TDDataSearch()
-> JigRun_On()
-> FirmVerCheck()
-> BatteryTest()
-> TempTest()
-> HFTestRun()
-> DataWrite()
-> HIFU_PostReg() → dbHFSave()
→ CountChanage() → CountUpdate()
-> Save_Csv()
```
---
## 🗃️ 데이터베이스 테이블 구성
```vbnet
' 메인 테이블
Private TDTable = "jomtTesterDB.jomtCartridgeTbl"
Private hfDataTable = "jomtTesterDB.jomtHFTestTbl"
Private rfDataTable = "jomtTesterDB.jomtRFTestTbl"
Private pd1CntTable = "jomtTesterDB.jomtMES_PD1Tbl"
Private iqcCntTable = "jomtTesterDB.jomtMES_IQCTbl"
Private NonTDTable = "jomtTesterDB.jomtNonTDTbl"
' 테스트 서버용 테이블
Private TDTestTable = "jomtTesterServerDB.jomtCartridgeTbl"
Private hfDataTestTable = "jomtTesterServerDB.jomtHFTestTbl"
Private rfDataTestTable = "jomtTesterServerDB.jomtRFTestTbl"
Private pd1CntTestTable = "jomtTesterServerDB.jomtMES_PD1Tbl"
Private iqcCntTestTable = "jomtTesterServerDB.jomtMES_IQCTbl"
Private NonTDTestTable = "jomtTesterServerDB.jomtNonTDTbl"
' 사용 중인 현재 테이블
Private TDTableNow = TDTable
Private hfTableNow = hfDataTable
Private rfTableNow = rfDataTable
Private pd1CntTableNow = pd1CntTable
Private iqcCntTableNow = iqcCntTable
Private NonTDTableNow = NonTDTable
```
---
## 📂 파일 구조 예시
```
📦 MAXIMUM_Multi_Function_Tester/
┣ 📄 Main_From.vb
┣ 📄 MysqlModule.vb
┣ 📄 PostgreSQLModule.vb
┣ 📄 scopeModule.vb
┣ 📄 spectrumModule.vb
┣ 📄 TimeKenalModule.vb
┗ 📁 Documentation/
┗ 📄 검사_자동화_프로그램_사용설명서.pdf
```
---
## 📎 기타 참고 링크
* [Notion 기능 설명 정리 링크](https://www.notion.so/03-MAXIMUM-ALTO-1dd93e9b33758054bfc3cf46d9930b9f?pvs=21)
---
필요하면 마크다운용 `.md` 파일로도 저장해 드릴 수 있어요. 원하시면 말씀 주세요.