diff --git a/SalesPacking_MES_API_Project/OrderPackingProcessor.vbproj b/SalesPacking_MES_API_Project/OrderPackingProcessor.vbproj index aafb537..af69f96 100644 --- a/SalesPacking_MES_API_Project/OrderPackingProcessor.vbproj +++ b/SalesPacking_MES_API_Project/OrderPackingProcessor.vbproj @@ -61,6 +61,11 @@ ..\..\..\..\..\..\..\..\Program Files\Brother bPAC3 SDK\Samples\VBNET\Badge\bin\Release\Interop.bpac.DLL True + + False + True + ..\..\..\..\..\..\..\Windows\assembly\GAC_64\Ivi.Visa.Interop\5.11.0.0__a128c98f1d7717c1\Ivi.Visa.Interop.dll + ..\packages\K4os.Compression.LZ4.1.1.11\lib\net46\K4os.Compression.LZ4.dll diff --git a/SalesPacking_MES_API_Project/mainForm.vb b/SalesPacking_MES_API_Project/mainForm.vb index b5b6cf5..91b004a 100644 --- a/SalesPacking_MES_API_Project/mainForm.vb +++ b/SalesPacking_MES_API_Project/mainForm.vb @@ -7,7 +7,7 @@ Imports Newtonsoft.Json.Linq Public Class mainForm Public projectName As String = "DUALSONIC SalesPacking MES Program Ver." - Public projectVer As String = "1.0.1" + Public projectVer As String = "1.0.2" Private apiItemOutURL As String = "item-outflows/page" diff --git a/SalesPacking_MES_API_Project/weightForm.vb b/SalesPacking_MES_API_Project/weightForm.vb index 2e91398..baaf5c0 100644 --- a/SalesPacking_MES_API_Project/weightForm.vb +++ b/SalesPacking_MES_API_Project/weightForm.vb @@ -18,6 +18,10 @@ Public Class weightForm Private weightResult2 As Double = 0 Private zeroSet As Boolean = True + Private weightBuffer As New List(Of Double) ' 무게 버퍼 + Private Const BUFFER_SIZE As Integer = 3 ' 버퍼 크기 (3개로 축소) + Private Const STABILITY_THRESHOLD As Double = 5.0 ' 안정성 임계값 (5g로 완화) + Private weight(2) Private weight2(1) As String @@ -70,16 +74,25 @@ Public Class weightForm End If ElseIf mainForm.rdbWeightQW.Checked = True Then + If weightResult2 > 5 Then ' 5g 이상이면 측정 시작 - statusTimer.Enabled = False + ' 실시간 무게 표시 + lbNowWeight.Text = Math.Round(weightResult2, 0).ToString() lbWeight.BackColor = Color.Yellow - lbWeight.Text = "측정중" - playTimer.Enabled = False + lbWeight.Text = "측정중 (" & Math.Round(weightResult2, 0).ToString() & "g)" - If AutoMeasureScale() Then - lbNowWeight.Text = weightResult2 + ' 무게 버퍼에 추가 (안정성 확인용) + AddToWeightBuffer(weightResult2) - If weight_compare() Then + ' 버퍼가 충분히 쌓이면 안정성 검사 + If weightBuffer.Count >= 3 AndAlso IsWeightStable() Then + statusTimer.Enabled = False + playTimer.Enabled = False + + Dim stableWeight As Double = GetStableWeight() + lbNowWeight.Text = Math.Round(stableWeight, 0).ToString() + + If weight_compare_improved(stableWeight) Then lbWeight.BackColor = Color.Green lbWeight.Text = "무게 일치" delay(2000) @@ -93,9 +106,6 @@ Public Class weightForm lbWeight.Text = "무게 불일치" ZeroTimer.Enabled = True End If - Else - lbWeight.Text = "무게 측정 불안정" - lbWeight.BackColor = Color.Red End If End If Else @@ -133,6 +143,47 @@ Public Class weightForm End Sub + ' 무게 버퍼에 추가하는 함수 + Private Sub AddToWeightBuffer(weight As Double) + weightBuffer.Add(weight) + + ' 버퍼 크기 초과 시 가장 오래된 값 제거 + If weightBuffer.Count > BUFFER_SIZE Then + weightBuffer.RemoveAt(0) + End If + End Sub + + ' 무게가 안정한지 확인하는 함수 + Private Function IsWeightStable() As Boolean + If weightBuffer.Count < BUFFER_SIZE Then + Return False + End If + + Dim maxWeight As Double = weightBuffer.Max() + Dim minWeight As Double = weightBuffer.Min() + + ' 최대값과 최소값의 차이가 임계값보다 작으면 안정 + Return (maxWeight - minWeight) <= STABILITY_THRESHOLD + End Function + + ' 안정된 무게값을 얻는 함수 (평균값 사용) + Private Function GetStableWeight() As Double + If weightBuffer.Count = 0 Then + Return 0 + End If + + Return weightBuffer.Average() + End Function + + ' 개선된 무게 비교 함수 + Private Function weight_compare_improved(currentWeight As Double) As Boolean + Dim targetWeight As Double = weightSum + Dim upperLimit As Double = targetWeight + weightErrorPlus + Dim lowerLimit As Double = targetWeight - weightErrorMinus + + Return currentWeight >= lowerLimit And currentWeight <= upperLimit + End Function + Private Sub Status_timer_Tick(sender As Object, e As EventArgs) Handles statusTimer.Tick If switchMotion = True Then lbWeight.BackColor = Color.MediumSlateBlue @@ -159,10 +210,33 @@ Public Class weightForm ElseIf mainForm.rdbWeightQW.Checked = True Then - lbNowWeight.Text = weightResult2 + lbNowWeight.Text = Math.Round(weightResult2, 0).ToString() + ' 무게 불일치 후 재측정 모드를 먼저 체크 + If zeroSet = False Then + ' 무게가 변경되었는지 확인 (이전 측정값과 5g 이상 차이나면 재측정 시작) + Static previousWeight As Double = 0 - ' 실제 시리얼 데이터 직접 사용 - If weightResult2 <= 0 Then ' 1g 이하면 비어있음 + If Math.Abs(weightResult2 - previousWeight) >= 5 Then + ' 무게 변화 감지 - 재측정 시작 + statusTimer.Enabled = True + playTimer.Enabled = True + ZeroTimer.Enabled = False + lbWeightEX.Text = weightSum + lbWeight.Text = "재측정 중..." + lbWeight.BackColor = Color.Yellow + + ' 버퍼 초기화 + weightBuffer.Clear() + previousWeight = weightResult2 + Else + ' 무게 변화 없음 - 계속 대기 + lbWeight.Text = "무게를 조정해주세요" + lbWeight.BackColor = Color.Orange + ZeroTimer.Enabled = True + previousWeight = weightResult2 + End If + + ElseIf weightResult2 <= 0 Then statusTimer.Enabled = True playTimer.Enabled = True ZeroTimer.Enabled = False @@ -286,7 +360,7 @@ Public Class weightForm Private Sub QWSerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles QWSerialPort.DataReceived Try - System.Threading.Thread.Sleep(100) ' 100ms 딜레이 + System.Threading.Thread.Sleep(300) '딜레이 Dim incoming As String = QWSerialPort.ReadExisting() 'Debug.Print("수신 데이터: " & incoming)