HMI หรือ Human Machine Interface คือ อุปกรณ์ที่ใช้ในการติดต่อระหว่่างผู้ใช้ กับ เครื่องจักร เพื่อใช้ในการควบคุมและการแสดงผล ผ่านทางหน้าจอ เรามักใช้ในการแสดงผลแบบกราฟฟิก ซึ่งส่วนใหญ่ จะแสดงผลในเชิงสัญลักษณ์ หรือไอค่อนที่เป็นตัวแทน เครื่องจักร ถังน้ำ ปั้ม วาล์วน้ำ มอเตอร์ไฟฟ้า และอื่นๆ ที่เป็นส่วนที่เราต้องการติดตามการทำงานของพวกมัน โดยจะแสดงสถานะ ค่าต่างๆ บนหน้าจอแสดงผล พร้อมกับโครงสร้างของระบบการทำงานที่เรายกมาแสดง
ในปัจจุบันมีโปรแกรมหลายๆ ค่ายที่สามารถแสดงผลแบบ HMI ได้ ซึ่งมีทั้งแบบที่ง่าย แต่เสียเงิน และแบบที่ยาก แต่ ฟรี ก็มี วันนี้ เรามาลองติดตั้ง AdvancedHMI กับ C# กันดูครับ

เริ่มแรกก็ไปดาวน์โหลด AdvancedHMI จากที่นี่
http://advancedhmi.com/ จากนั้น ทำการแตกไฟล์ออก ไปวางไว้ที่ไหนก็ได้ครับ เพราะเราจะสนใจแค่ dll ไฟล์ของมัน
เปิดโปรแกรม Visual C# 2010 express ขึ้นมาครับ เริ่มสร้างโปรเจค ตามปกติ ในที่นี้ผมสร้างโปรเจคเป็น windows form application นะครับ
ต่อมาให้เราทำการ add toolbox ที่เป็นของ AdvancedHMI ขึ้นมา อาจจะสร้าง Add tab ขึ้นมาแล้วตั้งชื่อ AdvancedHMI แล้วคลิกขวา Choose items.. ไปที่

แท๊ป .NET Framework Components ให้เรา Browse ไปที่เก็บไฟล์ AdvancedHMIBeta358\AdvancedHMIDrivers\Support\MfgControl.AdvancedHMI.Drivers.dll แล้วคลิกเลือก OK

เราจะได้ Components ที่ทาง AdvancedHMI สร้างมาให้
ทำการ Add reference MfgControl.AdvancedHMI.Drivers.dll เข้าไปกับโปรเจคด้วย

จากนั้น ก็ลาากวางๆ ได้เลยครับ จินตนาการเอาว่า เราจะสร้างระบบเฝ้าติดตามอะไร ในที่นี้ ผมสร้างระบบปั้มน้ำ โดยให้มอเตอร์ปั้มน้ำเข้าถัง หากระดับน้ำต่ำกว่า ระดับที่เราตั้งไว้ และมีวาล์วคอยปิดเปิดทางน้ำออก ซึ่งสามารถปรับอัตราการไหลได้

ที่ส่วนหัวของโค๊ด ให้ทำการ using MfgControl.AdvancedHMI.Controls; เข้าไปด้วย ถ้าต้องการสร้าง object เพิ่ม
ในการเขียนโค๊ดส่งค่าให้แต่ละ Component ไม่ว่าจะเป็น Guage , Tank หรืออะไรก็ตามแต่ ที่มีการแสดงผล แสดงค่าต่างๆ ต้องเช็คให้ดีด้วย ว่ามันรับค่าเป็น float , int หรือว่า double ถ้าเราส่งค่าให้มันไม่ตรงชนิดที่มันจะรับ มันจะแสดงผลผิดพลาด ลองเอา mouse ชี้ค้างไว้ตอนเรา กำหนดค่า ให้ field ที่ชื่อ value ของมันดูครับ มันจะบอกไว้อยู่

ในที่นี้ ผมใช้ Timer 3 ตัวในการกำหนดจังหวะให้กับระบบ มาดูโค๊ดเต็มๆ กันเลยครับ
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MfgControl.AdvancedHMI.Controls;
namespace AdvanceHMI
{
public partial class Form1 : Form
{
Random rnd = new Random();
float waterActual = 100.0f;
float flowrateIn = 2.0f;
float flowrateOut = 2.0f;
public Form1()
{
InitializeComponent();
tank1.Value = waterActual;
waterPump1.Value = false;
txtWaterDetect.Text = "70";
trackBar1.Value = 70;
lbWaterLevel.Text = ((int)waterActual).ToString();
}
private void btnStart_Click(object sender, EventArgs e)
{
timer1.Enabled = true; // timer system
timer2.Enabled = true; // timer water flow rate in
timer3.Enabled = true; // timer water flow rate out
timer1.Interval = 200;
timer2.Interval = 200;
timer3.Interval = 500;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
lbWaterLevel.Text = waterActual.ToString();
if ((int)waterActual <100)
{
if ((int)waterActual <= trackBar1.Value)
{
timer2.Start();
waterPump1.Value = true;
}
}
else
{
timer2.Stop();
waterPump1.Value = false;
}
if (pneumaticBallVave1.Value == true)
{
timer3.Start();
pneumaticBallVave1.Value = true;
}
else
{
timer3.Stop();
pneumaticBallVave1.Value = false;
}
}
private void btnStop_Click(object sender, EventArgs e)
{
timer1.Stop();
timer2.Stop();
timer3.Stop();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void timer3_Tick(object sender, EventArgs e)
{
waterActual = waterActual - flowrateOut;
tank1.Value = waterActual;
}
private void timer2_Tick(object sender, EventArgs e)
{
waterActual = waterActual + flowrateIn;
tank1.Value = waterActual;
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
txtWaterDetect.Text = trackBar1.Value.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
}
private void pneumaticBallVave1_DoubleClick(object sender, EventArgs e)
{
}
private void trackBar2_Scroll(object sender, EventArgs e)
{
flowrateOut = (float)trackBar2.Value;
label3.Text = trackBar2.Value.ToString();
}
private void pneumaticBallVave1_Click(object sender, EventArgs e)
{
pneumaticBallVave1.Value = !pneumaticBallVave1.Value;
}
}
}
ลองโหลดไฟล์ไปเปิดกันดูครับ ไม่รู้ว่าจะเปิดกันได้หรือเปล่า ถ้าไม่ได้ก็สร้างเอาใหม่ ก็แล้วกันครับ
https://dl.dropboxusercontent.com/u/65353188/AdvanceHMI.zip