สร้าง Realtime Trend บน VB 2008 Express |
Written by Administrator | |
Thursday, 11 April 2013 18:39 | |
บทความนี้จะแสดงวิธีสร้าง Realtime trend อย่างง่ายบน VB 2008 Express (จะใช้ VB 2010 หรือ 2012 Express ก็ได้)
หลักการ- ใช้ Microsoft Chart Control เพื่อแสดง Realtime trend
- แสดงสัญญาณเช่นจาก OPC Server ด้วย COPC32 หรือจากฐานข้อมูล ฯลฯ ในตัวอย่างนี้ใช้สัญญาณจำลองจากฟังกชั่น Rnd() ของ VB.Net
ขั้นตอนเปิด VB 2008 Express หรือ 2010/2012 Express ขึ้นมา สร้างโปรเจ็คใหม่ แล้ววาง Chart Control ลงไปใน Form
เข้าดูโค้ด แล้ว Import ไลบรารี่ของ Chart เข้ามา
ประกาศตัวแปรอาเรย์ขนาด 20 item คือ pnt และ tm สำหรับเก็บค่าสัญญาณและเวลาตามลำดับ เนื่องจากในตัวอย่างนี้เราจะพล็อตแค่ 20 sample (20 ช่วงเวลา)
กลับไปที่Design View แล้วดับเบิ้ลคลิ้กที่ Form เพื่อสร้างEvent “Form_Load” แล้วเขียนโค้ดกำหนดค่าเริ่มต้นของอาเรย์ดังนี้
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i = 0 To 19 pnt(i) = 0 tm(i) = "" Next End Sub โค้ดด้านบนเป็นการใส่ค่าเปล่า ๆ ให้ pnt และ tm ก่อนเอาไปพล็อต เพื่อป้องกันปัญหาค่า Null ซึ่งเอาไปพล็อตไม่ได้
ให้เอา Timer มาวางลงใน Form เพื่อให้ Timer สร้างการพล็อต
ตั้งเวลาทำงานเป็น 1 วินาที และให้ Enable เป็น True เพื่อเริ่มทำงาน
พักเรื่อง Timer ไว้ก่อน
เข้าไปคอนฟิก Chart เพื่อสร้างกลุ่มSeriesของสัญญาณ โดยเลือก Chart1 บน Form จากนั้นคลิ้กเปิด Collection ของ Chart1 (คลิ้กปุ่ม …) ดังรูป
กำหนด ChartType เป็น Line และ XValueType เป็น String คลิ้ก OK
สร้าง Sub ชื่อ plot เพื่อใช้ในการพล็อต Trend (Sub นี้จะถูกเรียกใช้ใน Timer ภายหลัง)
Private Sub plot() Dim i As Integer For i = 0 To 18 pnt(i) = pnt(i + 1) tm(i) = tm(i + 1) Next Randomize() pnt(19) = Rnd(0) * 1000 tm(19) = Now.ToString() Chart1.Series("Series1").Points.Clear() For i = 0 To 19 Chart1.Series("Series1").Points.AddXY(tm(i), pnt(i)) Next End Sub โค้ดด้านบนเป็นการวนลูปเติมค่าให้ pnt และ tm ตัวที่ 0 ถึง 18 ให้รับค่าจากตัวถัดไป ก่อนที่จะรับค่าสัญญาณ Random และเวลาปัจจุบันใส่ให้ตัวที่ 19
แต่ถ้ารับค่าจาก COPC32 ก็จะเป็น
pnt(19) = copc1.getvl(0) สังเกตุว่าเราทำการ Clear Sampleใน Chart ก่อนที่จะพล็อตSampleทั้ง20ตัวลงไป
ดับเบิ้ลคลิ้กที่ Timer บนFormเพื่อเข้าสู่โค้ดของ Timer
ให้เรียกใช้ Sub plot ใน Timer
โค้ดทั้งหมดจะเป็นดังนี้
Imports System.Windows.Forms.DataVisualization.Charting Public Class Form1 Public pnt(0 To 19) As Double, tm(0 To 19) As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i = 0 To 19 pnt(i) = 0 tm(i) = "" Next End Sub Private Sub plot() Dim i As Integer For i = 0 To 18 pnt(i) = pnt(i + 1) tm(i) = tm(i + 1) Next Randomize() pnt(19) = Rnd(0) * 1000 tm(19) = Now.ToString() Chart1.Series("Series1").Points.Clear() For i = 0 To 19 Chart1.Series("Series1").Points.AddXY(tm(i), pnt(i)) Next End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick plot() End Sub End Class ทดสอบรันโปรเจ็คจะได้สัญญาณ Trend ถูกพล็อตขึ้นมามีคาบกว้าง 20 sample
|