[M.Diary] 다섯번째 마지막 강좌 시간입니다.

 

지난 시간에 말씀드린대로 최종 동작 구현을 위한 스레드 함수에 대해 살펴보겠습니다.

 

Dim Thread1 As New System.Threading.Thread(AddressOf ThreadFuction1)

먼저 ThreadFuction1()이란 스레드 함수를 선언 해주었습니다.

ThreadFuction1()스레드 함수는 [START]버튼을 눌렀을때 실행되게 됩니다.


Do While thread_state = 1

            Dim pulse_buff As Single = 0
            Dim layer_cnt As Integer = 0
            Dim x_direct As Integer = 0
            Dim counter As Integer = 0
            Dim winding_cnt As Integer = 0

            Dim x_step As Single = 0
            Dim w_step As Single = 0

 

스레드 함수는 Do While문으로 시작 했는데요 thread_state가 1일때 무한반복을 수행합니다.

 

여기서 전역변수로 선언한 thread_state는 [START]버튼을 눌렀을때 1의 값으로 만들어 주고 스레드를 실행하는데요

이변수를 써주는 이유는 현재 스레드의 동작상태를 판별하여 [PAUSE],[STOP]함수를 구현하기 위해서 입니다.

 

뒤를 이어 변수들이 선언 되어있는데요 각 변수의 용도는 다음과 같습니다.

 

pulse_buff x축 펄스연산을 위해 만들어준 변수
layer_cnt 다층 레이어 권선작업을 할때 필요한 변수
x_direct 다층레이어 작업시 x축의 방향전환을 위한 변수
counter 코일권선수 루프계산을 위한 변수
winding_cnt 코일권선수 데이터 저장 변수
x_step x축 분해능 데이터 변수
w_step 코일 굵기에 따른 x축 이동량 연산을 위한변수


'wire size / x-axis step calculator
w_step = Val(wire_total.Text) / 0.1
이 코드는 권선작업에 사용할 코일의 굵기를
y축의 1회전과 x축 이송량에 맞춰 계산하기 위한 코드입니다.


'x-axis step unit conv [1mm] => [0.1mm]
x_step = Val(xpulses.Text) / 10
x축 최소 분해능인 0.1mm에 맞춰 최소 스텝을 계산하는 코드입니다.


'display counter init
winding_counter = 0
현재 권선된 코일회전수 저장을 위한 변수 초기화 코드


check_box_scan(7)
각축의 [방향] 및 [이동]에 대한 설정으로
(7)은 GUI상에 체크박스에 체크된 데이터를 읽어서 연산하게 됩니다.


For layer_cnt = 1 To Val(t_layer.Text)
레이어 층수에 맞춰 권선작업을 위한 For함수


If x_direct = 0 Then
    check_box_scan(0)
    x_direct = 1
ElseIf x_direct = 1 Then
    check_box_scan(1)
    x_direct = 0
End If
다층레이어 작업시 x축 이송방향 변경을 위한 if문

 


For counter = 1 To Val(winding.Text)

    pulse_buff = (w_step * (counter + 2)) - (w_step * counter + 1)

                    byte4 = pulse_buff * x_step


단층 레이어 권선을 위한 for문으로
pulse_buff = (w_step * (counter + 2)) - (w_step * counter + 1)는
y축을 1회전 시켰을때 코일 굵기에 따라 x축 이송 거리를 계산하는 코드로
소숫점 계산이 아닌 정수 계산에 따른 오차를 줄이기 위해
[현재 이송해야 될거리] = [다음 회전시 이송거리] - [지난번 이송거리]
의 수식을 구현 한 코드입니다.

 

byte4 = pulse_buff * x_step는
앞서 계산한 이송거리에 x축에 최소 이송[0.1mm]에 필요한 스텝을 곱하여
y축 1회전에 따라 x축이 이동해야할 거리를 스텝수로 변환하는 코드 입니다.


'coil winding
    BufferOut(0) = 0   ' first by is always the report ID
    BufferOut(1) = Val(byte1) 'Fuction 1byte
    BufferOut(2) = Val(byte2) 'x-axis 2byte
    BufferOut(3) = Val(byte3) 'x-axis 3byte
    BufferOut(4) = Val(byte4) 'x-axis 4byte
    BufferOut(5) = Val(byte5) 'y-axis 5byte
    BufferOut(6) = Val(byte6) 'y-axis 6byte
    BufferOut(7) = Val(byte7) 'y-axis 7byte
    BufferOut(8) = Val(byte8) 'z-axis 8byte
    BufferOut(9) = Val(byte9) 'z-axis 9byte
    BufferOut(10) = Val(byte10)   'pulse delay 10byte
    BufferOut(11) = Val(byte11)   'pulse delay 11byte

    ' write the data (don't forget, pass the whole array)...
    hidWriteEx(VendorID, ProductID, BufferOut(0))

    'thread status flag
    winding_state = winding_state + 1

Next
   'auto & step mode function
            If mode_radio.Checked = True Then
                step_flag = 0
            ElseIf mode_radio.Checked = False Then
                step_flag = 1
            End If
            Do While step_flag = 1
            Loop
        Next

    Loop

End Sub


'coil winding과' write the data (don't forget, pass the whole array)...는 앞서 살펴본 함수이므로 패스
  
'thread status flag
winding_state = winding_state + 1는 아직 미완성(?) 코드로
추후에 권선작업 진행상황을 표시하려고 만들어둔 코드입니다....ㅎㅎㅎ

 

'auto & step mode function
If mode_radio.Checked = True Then
    step_flag = 0
ElseIf mode_radio.Checked = False Then
    step_flag = 1
End If
Do While step_flag = 1
Loop
'auto & step mode function 코드는 다층 권선작업시 한번에 작업[auto] 각층 권선후에 작업을 일시정지한 후에

작업[manual]이 필요할 경우를 위한 [auto & manual] 구현을 위한 코드입니다.


이걸로 기본적인 동작 구현은 끝났습니다.

 

보기엔 조금 없어(?) 보이긴 하지만 그래도 한땀한땀 만든 기계가 동작하는걸 보면 뿌듯해집니다.

 

아직도 개선사항들이 수두룩 하긴 하지만 상용기계를 제작이 목표가 아니기에

 

그때그때 기능을 추가해 주는게 좋을것 같아서 여기서 CNC Coil Winding Machine 프로젝트를 종료하게 되었습니다.

 

관심있으신분들은 좀더 하이퀄리티에 도전해 보시길~~

 

그럼 우리 다음 2차 프로젝트에 만나요~~^^