Data Acquisition in CSharp
Data Acquisition in CSharp
Data Acquisition in CSharp
Data Acquisition in C#
HANS-PETTER HALVORSEN, 2011.05.27
Faculty of Technology, Postboks 203, Kjlnes ring 56, N-3901 Porsgrunn, Norway. Tel: +47 35 57 50 00 Fax: +47 35 57 54 01
Table of Contents
1 Introduction .................................................................................................................................... 4 1.1 1.2 1.3 1.4 2 Visual Studio ............................................................................................................................ 4 USB-6008 DAQ Device ............................................................................................................. 5 NI DAQmx driver...................................................................................................................... 6 Measurement Studio ............................................................................................................... 6
Data Acquisition.............................................................................................................................. 7 2.1 Introduction ............................................................................................................................. 7 Physical input/output signals .......................................................................................... 8 DAQ device/hardware ..................................................................................................... 8 Driver software ................................................................................................................ 9 Your software application ............................................................................................... 9
MAX Measurement and Automation Explorer ..................................................................... 9 DAQ in Visual Studio .............................................................................................................. 11 NI-DAQmx ...................................................................................................................... 11
2.3.1 3
Measurement Studio .................................................................................................................... 16 4.1 4.2 4.3 Introduction ........................................................................................................................... 16 Templates .............................................................................................................................. 17 Toolbox .................................................................................................................................. 17
3 5.1 5.2 6 7
Trending Data ............................................................................................................................... 26 Discretization ................................................................................................................................ 28 7.1 7.2 7.3 7.4 Low-pass Filter ....................................................................................................................... 28 PI Controller........................................................................................................................... 29 Process Model ....................................................................................................................... 30 Final Application .................................................................................................................... 31
OPC ............................................................................................................................................... 35
Appendix A: Source Code ...................................................................................................................... 36 My First DAQ App.............................................................................................................................. 36 Control Application ........................................................................................................................... 37
1 Introduction
In this Tutorial we will learn how to create DAQ (Data Acquisition) applications in Visual Studio and C#. We will use a USB-6008 DAQ device from National Instruments as an example. In order to use DAQ devices from National Instruments in C# and Visual Studio we need to NI-DAQmx driver provides by National Instruments. As part of this installation you can install a .NET API. We will use this API to create a simple DAQ application. In addition we will use Measurement Studio which is an add-on to Visual Studio which makes it easier to create more advanced DAQ applications.
Introduction
The device has the following specifications: 8 analog inputs (12-bit, 10 kS/s) 2 analog outputs (12-bit, 150 S/s) 12 digital I/O USB connection, No extra power-supply neeeded Compatible with LabVIEW, LabWindows/CVI, and Measurement Studio for Visual Studio .NET NI-DAQmx driver software
The NI USB-6008 is well suited for education purposes due to its small size and easy USB connection.
Introduction
2 Data Acquisition
2.1 Introduction
The purpose of data acquisition is to measure an electrical or physical phenomenon such as voltage, current, temperature, pressure, or sound. PC-based data acquisition uses a combination of modular hardware, application software, and a computer to take measurements. While each data acquisition system is defined by its application requirements, every system shares a common goal of acquiring, analyzing, and presenting information. Data acquisition systems incorporate signals, sensors, actuators, signal conditioning, data acquisition devices, and application software. So summing up, Data Acquisition is the process of: Acquiring signals from real-world phenomena Digitizing the signals Analyzing, presenting and saving the data
The DAQ system has the following parts involved, see Figure:
The parts are: Physical input/output signals DAQ device/hardware Driver software Your software application (Application software)
Data Acquisition
2.1.1
2.1.2
DAQ device/hardware
DAQ hardware acts as the interface between the computer and the outside world. It primarily functions as a device that digitizes incoming analog signals so that the computer can interpret them A DAQ device (Data Acquisition Hardware) usually has these functions: Analog input Analog output Digital I/O Counter/timers
We have different DAQ devices, such as: Desktop DAQ devices where you need to plug a PCI DAQ board into your computer. The software is running on a computer. Portable DAQ devices for connection to the USB port, Wi-Fi connections, etc. The software is running on a computer Distributed DAQ devices where the software is developed on your computer and then later downloaded to the distributed DAQ device.
Data Acquisition
2.1.3
Driver software
Driver software is the layer of software for easily communicating with the hardware. It forms the middle layer between the application software and the hardware. Driver software also prevents a programmer from having to do register-level programming or complicated commands in order to access the hardware functions. Driver software from National Instruments: NI-DAQmx
2.1.4
Application software adds analysis and presentation capabilities to the driver software. Your software application normally does such tasks as: Real-time monitoring Data analysis Data logging Control algorithms Human machine interface (HMI)
In order to create your DAQ application you need a programming development tool, such as Visual Studio/C#, LabVIEW, etc..
10
Data Acquisition
Measurement & Automation Explorer (MAX) provides access to your National Instruments devices and systems. With MAX, you can: Configure your National Instruments hardware and software Create and edit channels, tasks, interfaces, scales, and virtual instruments Execute system diagnostics View devices and instruments connected to your system Update your National Instruments software
In addition to the standard tools, MAX can expose item-specific tools you can use to configure, diagnose, or test your system, depending on which NI products you install. As you navigate through MAX, the contents of the application menu and toolbar change to reflect these new tools.
11
Data Acquisition
2.3.1
NI-DAQmx
National Instruments provides a native .NET API for NI-DAQmx. This is available as a part of the NI-DAQmx driver and does not require Measurement Studio. In general, data acquisition programming with DAQmx involves the following steps: Create a Task and Virtual Channels Start the Task Perform a Read operation from the DAQ Perform a Write operation to the DAQ Stop and Clear the Task.
Data acquisition in text based-programming environment is very similar to the LabVIEW NI-DAQmx programming as the functions calls is the same as the NI-DAQmx VIs.
Examples: Examples installed as part of NI-DAQmx: The location of examples will depend on the version of Visual Studio and is listed in the following Developer Zone Article: Using NI-DAQmx in Text Based Programming Environments. The most common location is:
C:\Documents and Settings\All Users\Documents\National Instruments\NI-DAQ\Examples\DotNET<.NET Framework Version>\
Sub-folders named CS contain C# examples. These examples install with NI-DAQmx. Measurement Studio is not required to install the class libraries or the examples. Note! If the paths above do not exist, be sure you have .NET support installed for NI-DAQmx.
12
13
We start by connecting the Analog In and Analog Out wires together (a so called Loopback test). When we click the Write Data button, the value entered in the text box Analog Out will be written to the DAQ device. If we have connected the Analog In and Analog Out wires together we will read the same value in the Analog In textbox when we push the Get Data button.
14
When we have added the necessary References, the Solution Explorer will look like this:
Analog Out: We implement the code for writing to the Analog Out channel in the Event Handler for the Write Data button:
private void btnWriteAnalogOut_Click(object sender, EventArgs e) { Task analogOutTask = new Task(); AOChannel myAOChannel; myAOChannel = analogOutTask.AOChannels.CreateVoltageChannel( "dev1/ao0", "myAOChannel", 0, 5, AOVoltageUnits.Volts );
15
AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream); double analogDataOut; analogDataOut = Convert.ToDouble(txtAnalogOut.Text); writer.WriteSingleSample(true, analogDataOut); }
Analog In: We implement the code for reading data from the Analog In channel in the Event Handler for the Get Data button:
private void btnGetAnalogIn_Click(object sender, EventArgs e) { Task analogInTask = new Task(); AIChannel myAIChannel; myAIChannel = analogInTask.AIChannels.CreateVoltageChannel( "dev1/ai0", "myAIChannel", AITerminalConfiguration.Differential, 0, 5, AIVoltageUnits.Volts ); AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream); double analogDataIn = reader.ReadSingleSample(); txtAnalogIn.Text = analogDataIn.ToString(); }
4 Measurement Studio
4.1 Introduction
C# is a powerful programming language, but has few built-in features for measurement and control applications. Measurement Studio is an add-on to Visual Studio which makes it easier to create such applications. With Measurement Studio we can implement Data Acquisition and a graphical HMI.
Measurement Studio for Visual C# .NET provides: Managed .NET controls for creating rich Web and Windows GUIs Multithreaded API for data acquisition Instrument control APIs Analysis libraries designed for engineers and scientists
16
17
Measurement Studio
4.2 Templates
Measurement Studio has several Templates that make it easier to build DAQ applications.
4.3 Toolbox
Below we see the Toolbox in Visual Studio that is installed with Measurement Studio:
18
Measurement Studio
In addition to the Toolbox, Measurement Studio also installs the following menu item:
5 Control Application
5.1 Introduction
In this example we will use Measurement Studio to create a simple control application. We will control the level in a water tank using manual control. The process is as follows:
We want to control the level in the water tank using a pump on the inflow. We will read the level using our USB-6008 DAQ device (Analog In) and write the control signal (Analog Out) to the DAQ device. The Analog Out (control signal) will be a signal between signal that we need to scale to . We will create the following application: and the Analog In (Level) will be a
19
20
Control Application
We will use a Slider to manually adjust the control signal and a Tank to indicate the level in the real process. In this example we will use the Slide control and Tank control that comes with Measurement Studio.
21
Control Application
Select the NI Windows Application Template in the Measurement Studio node. In the window that appears next, select the Libraries you want to include:
We create the User Interface above in Visual Studio, and it looks like this:
22
Control Application
For the read and write operations we have created a simple Class with two methods:
public class DaqData { public double ReadDaqData() { ... } public void WriteDaqData(double analogDataOut) { ... } }
More about the ReadDaqData() and WriteDaqData() methods below. Read Level: The ReadDaqData() method handles the logic for reading from the DAQ device:
public double ReadDaqData() { Task analogInTask = new Task(); AIChannel myAIChannel; myAIChannel = analogInTask.AIChannels.CreateVoltageChannel( "dev1/ai0", "myAIChannel", AITerminalConfiguration.Differential, 0, 5, AIVoltageUnits.Volts );
23
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream); double analogDataIn = reader.ReadSingleSample(); return analogDataIn; }
Control Application
Write Control Value: The WriteDaqData() method handles the logic for writing to the DAQ device:
public void WriteDaqData(double analogDataOut) { Task analogOutTask = new Task(); AOChannel myAOChannel; myAOChannel = analogOutTask.AOChannels.CreateVoltageChannel( "dev1/ao0", "myAOChannel", 0, 5, AOVoltageUnits.Volts ); AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream); writer.WriteSingleSample(true, analogDataOut); }
Timer: In the previous example (My First DAQ App) we was reading and writing to the DAQ device when clicking a button, but in an ordinary application this is not a good solution. In order to read and write data on regular intervals we will use a Timer. In the Components toolbox we find the Timer Control:
24
Control Application
In the Properties window we can specify the Interval (Sampling Time) in milliseconds.
In the Timer Event we create the main logic in our application. We call the ReadDaqData() and WriteDaqData() methods, updates the GUI, etc.
private void timer1_Tick(object sender, EventArgs e) { DaqData myDaqData = new DaqData(); //Read Data double analogDataIn;
25
analogDataIn = myDaqData.ReadDaqData(); if (analogDataIn analogDataIn if (analogDataIn analogDataIn < = > = 0) 0; 5) 5;
Control Application
//Scaling: analogDataIn = analogDataIn * 4; //0-5V -> 0-20cm tank.Value = analogDataIn; txtLevelValue.Text = analogDataIn.ToString("0.00"); //Write Data double analogDataOut; analogDataOut = sliderControl.Value; myDaqData.WriteDaqData(analogDataOut); }
6 Trending Data
Now we want to extend our application with functionality for viewing historical data using a trend plot. Below we see the new user interface:
In this example we will use the WaveformGraph control in Measurement Studio. The source code is the same as in the previous example, except for one new line of code in the Timer Event:
waveformGraph.PlotYAppend(analogDataIn);
The WaveformGraph control has lots of functionality you can set in the Properties window or clicking the Smart Tag Anchor (little arrow in the upper right corner of the control).
Below we see the Properties window (left side) and the Smart Tag Panel (right side) for the WaveformGraph control:
26
27
Trending Data
7 Discretization
The next improvements to our application would be to implement a Low-pass Filter in order to remove the noise from the signal when reading the level. Another improvement would be to replace the manual control with a PI controller that do the job for us. Finally it would be nice to have a mathematical model of our water tank so we can simulate and test the behavior of the real system without connect to it. So we need to create discrete versions of the low-pass filter, the PI controller and the process model. We can, e.g., use the Euler Forward discretization method: or the Euler Backward discretization method: is the Sampling Time.
Discrete version: It can be shown that a discrete version can be stated as: ( Where )
Where
28
29
Discretization
7.2 PI Controller
A PI controller may be written: ( ) Where is the controller output and ( )
Where
Discrete version: Using Euler: Where This gives: is the Sampling Time.
Finally:
30
Discretization
We can use the Euler Forward discretization method in order to create a discrete model: Then we get: [ Finally: [ ] ]
31
Discretization
Below we will show and describe the important parts of the code. Tutorial: Data Acquisition in C#
32 PI Controller:
Discretization
We create a new Class for our PID algorithm, by right-click in the Solution Explorer (AddNew Item)
Select the Class Item and a proper Name, e.g. PidController. The PidController Class is as follows:
class PidController { public double r; //Reference Value public double Kp; //Proportional Gain for PID Controler public double Ti; //Integral Time for PID Controler public double Ts; //Sampling Time
33
private double z; //Internal variable public double PiController(double y) { double e; // Error between Reference and Measurement double u; // Controller Output //PID Algoritm e = r - y; u = Kp * e + (Kp / Ti) * z; z = z + Ts * e; return u; } }
Discretization
34
public double Ts; public double Tf; public double LowPassFilter(double yFromDaq) { double a; double yFiltered; a = Ts / (Ts + Tf); yFiltered = (1 - a) * yk + a * yFromDaq; yk = yFiltered; return yFiltered; } }
Discretization
Discrete Model: We do the same for the discrete model. We have created a Class and a LevelTankModel Method that we use in our simulation:
levelMeasurement = model.LevelTankModel(controllerOutput);
8 OPC
In order to communicate with an OPC Server we can use the DataSocket API that is part of the Measurement Studio.
35
namespace MyFirstDAQApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void btnGetAnalogIn_Click(object sender, EventArgs e) { Task analogInTask = new Task(); AIChannel myAIChannel; myAIChannel = analogInTask.AIChannels.CreateVoltageChannel( "dev1/ai0", "myAIChannel", AITerminalConfiguration.Differential, 0, 5, AIVoltageUnits.Volts ); AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream); double analogDataIn = reader.ReadSingleSample(); txtAnalogIn.Text = analogDataIn.ToString();
36
37
} private void btnWriteAnalogOut_Click(object sender, EventArgs e) { Task analogOutTask = new Task(); AOChannel myAOChannel; myAOChannel = analogOutTask.AOChannels.CreateVoltageChannel( "dev1/ao0", "myAOChannel", 0, 5, AOVoltageUnits.Volts ); AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream); double analogDataOut; analogDataOut = Convert.ToDouble(txtAnalogOut.Text); writer.WriteSingleSample(true, analogDataOut);
Discretization
} } }
Control Application
The code for this application is as follows:
using using using using using using using using using using using using NationalInstruments; NationalInstruments.DAQmx; NationalInstruments.UI; NationalInstruments.UI.WindowsForms; System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;
namespace Control_Application { public partial class Form1 : Form { public Form1() { InitializeComponent(); timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { DaqData myDaqData = new DaqData();
38
//Read Data double analogDataIn; analogDataIn = myDaqData.ReadDaqData(); if (analogDataIn analogDataIn if (analogDataIn analogDataIn < = > = 0) 0; 5) 5;
Discretization
//Scaling: analogDataIn = analogDataIn * 4; //0-5V -> 0-20cm tank.Value = analogDataIn; txtLevelValue.Text = analogDataIn.ToString("0.00"); //Write Data double analogDataOut; analogDataOut = sliderControl.Value; myDaqData.WriteDaqData(analogDataOut); } private void button1_Click(object sender, EventArgs e) { Application.Exit(); } } /// <summary> /// Reading and Writing Data from DAQ Device /// </summary> public class DaqData { public double ReadDaqData() { Task analogInTask = new Task(); AIChannel myAIChannel; myAIChannel = analogInTask.AIChannels.CreateVoltageChannel( "dev1/ai0", "myAIChannel", AITerminalConfiguration.Differential, 0, 5, AIVoltageUnits.Volts ); AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream); double analogDataIn = reader.ReadSingleSample(); return analogDataIn; } public void WriteDaqData(double analogDataOut) { Task analogOutTask = new Task(); AOChannel myAOChannel; myAOChannel = analogOutTask.AOChannels.CreateVoltageChannel( "dev1/ao0",
39
"myAOChannel", 0, 5, AOVoltageUnits.Volts ); AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream); writer.WriteSingleSample(true, analogDataOut); } } }
Discretization
Telemark University College Faculty of Technology Kjlnes Ring 56 N-3914 Porsgrunn, Norway www.hit.no
Hans-Petter Halvorsen, M.Sc. Telemark University College Department of Electrical Engineering, Information Technology and Cybernetics
Phone: +47 3557 5158 E-mail: [email protected] Blog: http://home.hit.no/~hansha/ Room: B-237a