Get measurement result from Gauge to PC #1


การเขียนโปรแกรมรับค่าจากเครื่องมือวัด

     บทความนี้ก็จะขอเสนอตัวอย่างการเขียนโปรแกรมมาโคร ใน Excel (VBA) เพื่อรับค่า จากเครื่องมือวัด ตัวเครื่องมือวัดที่จะทำเป็นตัวอย่างในที่นี้คือตัว Dial gauge ย่อห้อ Mitutoyo โดยผ่านทางสาย RS232 นะครับ
สำหรับเครื่องมือวัดอื่น ๆ ที่มีการส่งข้อมูลผ่าน RS232 หรือ Com port  โค๊ดส่วนใหญ่ก็จะเหมือนกันตัวอย่างนี้ จะต่างก็เพียงแค่ส่วนการดักเอาข้อมูลที่เราต้องการออกมาเท่านั้นเอง วิธีการดักเอาข้อมูลที่ต้องการก็ต้องไปดูใน Manual ของเครื่องมือแต่ละตัวเอาว่ามีการส่งข้อมูลแบบใหนนะครับ

ลักษณะการต่อใช้งาน
ลักษณะการต่อใช้งานจะต่อเครื่องมือวัดกับคอมพิวเตอร์ผ่านตัว mini-Processor โดยตัว mini-Processor จะต่อกับ Foot switch เพื่อใช้ในการสั่งให้ตัว Digimatic indicator ทำงาน ในส่วนการสั่งให้ทำงานนี้จะมี Hardware พวกระบบนิวเมตรริกและ PLC มาเกี่ยวข้องด้วยอีก ก็จะเป็น ตรงนี้ก็จะไม่ขอพูดถึงละกันนะครับ
ลักษณะการทำงาน เมื่อเหยียบ Foot switch ระบบกลไกจะทำงาน แล้วตัว Digimatic indicator จะส่งค่าที่อ่านได้ให้ mini-Processor จากนั้นก็จะส่งต่อไปยัง PC อีกทีหนึ่ง

**ปัจจุบันจะมี Hardware ที่ใช้ต่อจากเครื่องมือวัดเข้ากับ PC แล้วส่งค่าออกมาเป็นลักษณะเหมือนการกด Keyboard อยู่นะครับ ถ้าใช้ลักษณะแบบนั้นจะไม่จำเป็นต้องมีการเขียนโปรแกรมควบคุมอะไรเลย

บทความแรกนี้ก็จะเขียน Coding ในส่วนของการตั้งค่า Com port กันก่อนนะครับ
ก็ให้สร้าง Form ขึ้นมาใน Excel นะครับ ให้ตั้งชื่อว่า FmSetting
จากนั้นก็ให้ตั้งชื่อ Control ตามนี้เลยนะครับ


จากนั้นให้ใส่ Code ตามนี้ใน Form FmSetting

Private Sub CommandButton1_Click()
เรียกโปรแกรมย่อย เพื่อบันทึกค่า Setting
Call saveSetting(FmMain.CmTools.ListIndex)
'โหลดค่า Port ออกมาใหม่
If FmMain.CmTools.ListIndex = 0 Then
dtPath = "ThicknessTester"
Else
dtPath = "WeightScale"
End If
dtPath = "D:\Data\" & dtPath

ดึงค่าที่บันทึกไว้มาเก็บในตัวแปร activePort
activePort = Read_Text(dtPath)
'#################
Unload Me
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

เหตุการเมื่อเปิด Form ขึ้นมา
Private Sub UserForm_Activate()
On Error GoTo ErrHnd
Dim dtPath As String
Dim usePort As RSparameter
Call AddListCombo
LaMS.Caption = FmMain.CmTools.Text

If FmMain.CmTools.ListIndex = 0 Then
dtPath = "ThicknessTester"
Else
dtPath = "WeightScale"
End If
dtPath = "D:\Data\" & dtPath
ดึงค่าจากที่เราได้บันทึกไว้ก่อนหน้านี้
usePort = Read_Text(dtPath)

แสดงผลใน Control
CmRate.Text = usePort.cRate
CmParity.Text = usePort.cParity
CmBits.Text = usePort.cBits
CmLenght.Text = usePort.cLenght
CmPort.Text = usePort.cPortName

Exit Sub

ErrHnd:
Select Case Err.Number
Case 13, 380
CmRate.ListIndex = 0
CmParity.ListIndex = 0
CmBits.ListIndex = 0
CmLenght.ListIndex = 0
CmPort.ListIndex = 0
Case Else
MsgBox Err.Number & vbCrLf & Err.Description
End Select

End Sub


โปรแกรมย่อย แสดงรายการของ Combobox
Sub AddListCombo()
With CmRate
.Clear
.AddItem "300"
.AddItem "600"
.AddItem "1200"
.AddItem "2400"
.AddItem "4800"
.AddItem "9600"
.AddItem "19200"
.ListIndex = 0
End With

With CmParity
.Clear
.AddItem "Non"
.AddItem "Odd"
.AddItem "Even"
.ListIndex = 0
End With

With CmBits
.Clear
.AddItem "0"
.AddItem "1"
.AddItem "2"
.ListIndex = 0
End With

With CmLenght
.Clear
.AddItem "6"
.AddItem "7"
.AddItem "8"
.AddItem "9"
End With

With CmPort
.Clear
For i = 1 To 9
If ChkPort(i) = True Then
.AddItem "Com " & i
End If
Next
End With
End Sub
'--------------------โปรแกรมย่อยตรวจสอบ Com port ที่เปิดใช้งานอยู่
Function ChkPort(ByVal PN As Integer) As Boolean
On Error GoTo ChkError
FmMain.XMCommCRC1.CommPort = PN
FmMain.XMCommCRC1.PortOpen = True
FmMain.XMCommCRC1.PortOpen = False
ChkPort = True
Exit Function

ChkError:
'MsgBox Err.Number & vbCrLf & Err.Description
Select Case Err.Number
Case 8002                 'Error 8002 Wrong port number
ChkPort = False

'Error 8012 Port not open
End Select
End Function

'#####  โปรแกรมย่อยบันทึกข้อมูลลง Text file #####
Sub saveSetting(ByVal ToolID As Integer)
On Error GoTo ErrorCheck
Dim Txt001
Dim TxtObj
Dim FileName As String

If ToolID = 0 Then
FileName = "ThicknessTester"
Else
FileName = "WeightScale"
End If

Set Txt001 = CreateObject("scripting.filesystemobject")
Set TxtObj = Txt001.createtextfile("D:\Data\" & FileName, True)

TxtObj.writeline CmRate.Text                   '1
TxtObj.writeline CmLenght.Text               '2
TxtObj.writeline CmBits.Text                     '3
TxtObj.writeline CmParity.Text                 '4
TxtObj.writeline CmPort.Text                    '5
TxtObj.Close


Exit Sub

ErrorCheck:
Select Case Err.Number
Case 76
Txt001.createfolder ("D:\Data")
Resume
Case Else
MsgBox Err.Number & vbCrLf & Err.Description, vbExclamation
End Select

End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If PortStatus = False Then Call saveSetting(FmMain.CmTools.ListIndex)
End Sub

จากนั้นให้ทำการแทรก Module แล้วใส่ Code ดังนี้
'+++++สร้างตัวแปรเพื่อรับค่าการตั้งค่าการเชื่อมต่อของ Com port +++++
Public Type RSparameter
cRate As Integer
cLenght As Integer
cBits As Integer
cParity As String
cPortName   As String
cPortNo As Integer
End Type

ประกาศตัวแปร เพื่อให้ใช้ได้ทั้ง Project
Global PortStatus As Boolean
Global activePort As RSparameter

ส่วนด้านล่างนี้คือส่วนของฟังก์ชั่นการวัดซ้ำนะครับ
'#######  ส่วนของตัวแปรที่ใช้ในการทำซ้ำและเลื่อนไปแถวใหม่  ต้องกำหนดตัวแปรด้านล่างก่อน  #######
Public RowRec As Integer
'เก็บค่าแถวปัจจุบันที่ทำงานอยู่   เริ่มโปรแกรมให้กำหนดเป็น 1
Public ColRec As Integer
'เก็บค่าคอลัมน์ปัจจุบันที่ทำงานอยู่ เริ่มโปรแกรมกำหนดเป็น 0
Public CountPnl As Integer
'เก็บค่าจำนวนงานที่จะให้วัดซ้ำ  ระบุใน Setting ก่อนเริ่มการทำงาน
Public ColMax As Integer
'เก็บค่าจำนวนคอลัมน์ หรือจำนวนจุดที่ต้องการให้วัดซ้ำเมื่อครบตาม จำนวนที่ต้องการให้วัดซ้ำ


Sub EnterValue(ByVal Data As String)
If CountPnl <= 0 Then Exit Sub

'If RowRec Mod CountPnl = 0 Then   'เริ่มซ้ำที่แผ่นสุดท้าย
If (CountPnl = 1 Or RowRec Mod CountPnl = 1) And ColMax > 1 Then 'เริ่มซ้ำที่แผ่นแรก

Select Case ColRec
Case Is < ColMax - 1
ActiveCell.Value = Data
ColRec = ColRec + 1
ActiveCell.Offset(0, 1).Activate
Case ColMax - 1
ActiveCell.Value = Data
ColRec = 0
ActiveCell.Offset(1, -(ColMax - 1)).Activate
RowRec = RowRec + 1
End Select

Else
ActiveCell.Value = Data
ActiveCell.Offset(1, 0).Activate
RowRec = RowRec + 1
End If

End Sub

โปรแกรมย่อยเลื่อนแถว
Sub KickAndGo(ByVal Data As String)
ActiveCell.Value = Data
'++++++ move select cell+++++++
ActiveCell.Offset(1, 0).Activate
End Sub

'++++ Call FmMain form ++++
Sub callMain()
FmMain.Show
End Sub

โปรแกรมย่อยอ่านค่าจาก Text  ไฟล์ที่เราบันทึกค่า Setting ไว้นะครับ
Function Read_Text(ByVal Fname As String) As RSparameter   
On Error GoTo ChkError
Dim Jira
Dim Bi
Dim Item As Integer
Set Jira = CreateObject("Scripting.filesystemobject")
Set Bi = Jira.opentextfile(Fname)
Item = 1
Do Until Bi.atendofstream = True
FStr = Bi.readline
Select Case Item
Case 1
Read_Text.cRate = FStr
Case 2
Read_Text.cLenght = FStr
Case 3
Read_Text.cBits = FStr
Case 4
Read_Text.cParity = FStr
Case 5
Read_Text.cPortName = FStr
Read_Text.cPortNo = Right(FStr, 1)
Case Else
End Select
Item = Item + 1
Loop
PortStatus = True
Exit Function

'ดัก Error
ChkError:
Select Case Err.Number
Case 76
MkDir "D:\Data\"
Set Bi2 = Jira.createtextfile(Fname)
Case Else
MsgBox Err.Number & vbCrLf & Err.Description
End Select
PortStatus = False
End Function


ตอนนี้ก็จะเสร็จสิ้นในส่วนของการบันทึก Setting ของ Comport แล้วนะครับ
ในบทความต่อไปก็จะมาดูในส่วนของการรับค่าจากเครื่องมือวัดกัน

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2

Make BIG checkbox in Excel

เอา Password Excel VBA ออก