การเขียนโปรแกรมรับค่าจากเครื่องมือวัด
บทความนี้ก็จะขอเสนอตัวอย่างการเขียนโปรแกรมมาโคร ใน 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
แล้วนะครับ
ในบทความต่อไปก็จะมาดูในส่วนของการรับค่าจากเครื่องมือวัดกัน
ความคิดเห็น
แสดงความคิดเห็น