Simple HTTP Server Class C#

Source: gist.github.com/aksakalli/9191056

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Threading;
using System.Diagnostics;


class SimpleHTTPServer
{
    private readonly string[] _indexFiles = { 
        "index.html", 
        "index.htm", 
        "default.html", 
        "default.htm" 
    };
    
    private static IDictionary<string, string> _mimeTypeMappings = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) {
        #region extension to MIME type list
        {".asf", "video/x-ms-asf"},
        {".asx", "video/x-ms-asf"},
        {".avi", "video/x-msvideo"},
        {".bin", "application/octet-stream"},
        {".cco", "application/x-cocoa"},
        {".crt", "application/x-x509-ca-cert"},
        {".css", "text/css"},
        {".deb", "application/octet-stream"},
        {".der", "application/x-x509-ca-cert"},
        {".dll", "application/octet-stream"},
        {".dmg", "application/octet-stream"},
        {".ear", "application/java-archive"},
        {".eot", "application/octet-stream"},
        {".exe", "application/octet-stream"},
        {".flv", "video/x-flv"},
        {".gif", "image/gif"},
        {".hqx", "application/mac-binhex40"},
        {".htc", "text/x-component"},
        {".htm", "text/html"},
        {".html", "text/html"},
        {".ico", "image/x-icon"},
        {".img", "application/octet-stream"},
        {".iso", "application/octet-stream"},
        {".jar", "application/java-archive"},
        {".jardiff", "application/x-java-archive-diff"},
        {".jng", "image/x-jng"},
        {".jnlp", "application/x-java-jnlp-file"},
        {".jpeg", "image/jpeg"},
        {".jpg", "image/jpeg"},
        {".js", "application/x-javascript"},
        {".mml", "text/mathml"},
        {".mng", "video/x-mng"},
        {".mov", "video/quicktime"},
        {".mp3", "audio/mpeg"},
        {".mpeg", "video/mpeg"},
        {".mpg", "video/mpeg"},
        {".msi", "application/octet-stream"},
        {".msm", "application/octet-stream"},
        {".msp", "application/octet-stream"},
        {".pdb", "application/x-pilot"},
        {".pdf", "application/pdf"},
        {".pem", "application/x-x509-ca-cert"},
        {".pl", "application/x-perl"},
        {".pm", "application/x-perl"},
        {".png", "image/png"},
        {".prc", "application/x-pilot"},
        {".ra", "audio/x-realaudio"},
        {".rar", "application/x-rar-compressed"},
        {".rpm", "application/x-redhat-package-manager"},
        {".rss", "text/xml"},
        {".run", "application/x-makeself"},
        {".sea", "application/x-sea"},
        {".shtml", "text/html"},
        {".sit", "application/x-stuffit"},
        {".swf", "application/x-shockwave-flash"},
        {".tcl", "application/x-tcl"},
        {".tk", "application/x-tcl"},
        {".txt", "text/plain"},
        {".war", "application/java-archive"},
        {".wbmp", "image/vnd.wap.wbmp"},
        {".wmv", "video/x-ms-wmv"},
        {".xml", "text/xml"},
        {".xpi", "application/x-xpinstall"},
        {".zip", "application/zip"},
        #endregion
    };
    private Thread _serverThread;
    private string _rootDirectory;
    private HttpListener _listener;
    private int _port;
 
    public int Port
    {
        get { return _port; }
        private set { }
    }
 
    /// <summary>
    /// Construct server with given port.
    /// </summary>
    /// <param name="path">Directory path to serve.</param>
    /// <param name="port">Port of the server.</param>
    public SimpleHTTPServer(string path, int port)
    {
        this.Initialize(path, port);
    }
 
    /// <summary>
    /// Construct server with suitable port.
    /// </summary>
    /// <param name="path">Directory path to serve.</param>
    public SimpleHTTPServer(string path)
    {
        //get an empty port
        TcpListener l = new TcpListener(IPAddress.Loopback, 0);
        l.Start();
        int port = ((IPEndPoint)l.LocalEndpoint).Port;
        l.Stop();
        this.Initialize(path, port);
    }
 
    /// <summary>
    /// Stop server and dispose all functions.
    /// </summary>
    public void Stop()
    {
        _serverThread.Abort();
        _listener.Stop();
    }
 
    private void Listen()
    {
        _listener = new HttpListener();
        _listener.Prefixes.Add("http://localhost:" + _port.ToString() + "/");
        _listener.Start();
        while (true)
        {
            try
            {
                HttpListenerContext context = _listener.GetContext();
                Process(context);
            }
            catch (Exception ex)
            {
 
            }
        }
    }
 
    private void Process(HttpListenerContext context)
    {
        string filename = context.Request.Url.AbsolutePath;
        Console.WriteLine(filename);
        filename = filename.Substring(1);
 
        if (string.IsNullOrEmpty(filename))
        {
            foreach (string indexFile in _indexFiles)
            {
                if (File.Exists(Path.Combine(_rootDirectory, indexFile)))
                {
                    filename = indexFile;
                    break;
                }
            }
        }
 
        filename = Path.Combine(_rootDirectory, filename);
 
        if (File.Exists(filename))
        {
            try
            {
                Stream input = new FileStream(filename, FileMode.Open);
                
                //Adding permanent http response headers
                string mime;
                context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) ? mime : "application/octet-stream";
                context.Response.ContentLength64 = input.Length;
                context.Response.AddHeader("Date", DateTime.Now.ToString("r"));
                context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r"));
 
                byte[] buffer = new byte[1024 * 16];
                int nbytes;
                while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
                    context.Response.OutputStream.Write(buffer, 0, nbytes);
                input.Close();
                
                context.Response.StatusCode = (int)HttpStatusCode.OK;
                context.Response.OutputStream.Flush();
            }
            catch (Exception ex)
            {
                context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            }
 
        }
        else
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
        }
        
        context.Response.OutputStream.Close();
    }
 
    private void Initialize(string path, int port)
    {
        this._rootDirectory = path;
        this._port = port;
        _serverThread = new Thread(this.Listen);
        _serverThread.Start();
    }
}

_________________________________________________
Atau
Source: realfiction.net/2010/04/17/A-HTTP-file-server-in-130-lines-of-code/

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

public class HttpFileServer : IDisposable
{
    private readonly string rootPath;
    private const int bufferSize = 1024*512; //512KB
    private readonly HttpListener http;
    
    public HttpFileServer(string rootPath)
    {
        this.rootPath = rootPath;
        http = new HttpListener();
        http.Prefixes.Add("http://localhost:8889/");
        http.Start();
        http.BeginGetContext(requestWait, null);
    }
    
    public void Dispose()
    {
        http.Stop();
    }
    
    private void requestWait(IAsyncResult ar)
    {
        if (!http.IsListening)
        return;
        var c = http.EndGetContext(ar);
        http.BeginGetContext(requestWait, null);
        var url = tuneUrl(c.Request.RawUrl);
        var fullPath = string.IsNullOrEmpty(url) ? rootPath : Path.Combine(rootPath, url);
        if (Directory.Exists(fullPath))
        returnDirContents(c, fullPath);
        else if (File.Exists(fullPath))
        returnFile(c, fullPath);
        else
        return404(c);
    }
    
    private void returnDirContents(HttpListenerContext context, string dirPath)
    {
        context.Response.ContentType = "text/html";
        context.Response.ContentEncoding = Encoding.UTF8;
        using (var sw = new StreamWriter(context.Response.OutputStream))
        {
            sw.WriteLine("<html>");
            sw.WriteLine("<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head>");
            sw.WriteLine("<body><ul>");
            var dirs = Directory.GetDirectories(dirPath);
            foreach (var d in dirs)
            {
                var link = d.Replace(rootPath, "").Replace('\\', '/');
                sw.WriteLine("<li>&lt;DIR&gt; <a href=\"" + link + "\">" + Path.GetFileName(d) + "</a></li>");
            }
            var files = Directory.GetFiles(dirPath);
            foreach (var f in files)
            {
                var link = f.Replace(rootPath, "").Replace('\\', '/');
                sw.WriteLine("<li><a href=\"" + link + "\">" + Path.GetFileName(f) + "</a></li>");
            }
            sw.WriteLine("</ul></body></html>");
        }
        context.Response.OutputStream.Close();
    }

    private static void returnFile(HttpListenerContext context, string filePath)
    {
        context.Response.ContentType = getcontentType(Path.GetExtension(filePath));
        var buffer = new byte[bufferSize];
        using ( var fs = File.OpenRead(filePath))
        {
            context.Response.ContentLength64 = fs.Length;
            int read;
            while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
            context.Response.OutputStream.Write(buffer, 0, read);
        }
        context.Response.OutputStream.Close();
    }

    private static void return404(HttpListenerContext context)
    {
        context.Response.StatusCode = 404;
        context.Response.Close();
    }

    private static string tuneUrl(string url)
    {
        url = url.Replace('/', '\\');
        //url = HttpUtility.UrlDecode(url, Encoding.UTF8);
        url = url.Substring(1);
        return url;
    }

    private static string getcontentType(string extension)
    {
        switch (extension)
        {
            case ".avi": return "video/x-msvideo";
            case ".css": return "text/css";
            case ".doc": return "application/msword";
            case ".gif": return "image/gif";
            case ".htm":
            case ".html": return "text/html";
            case ".jpg":
            case ".jpeg": return "image/jpeg";
            case ".js": return "application/x-javascript";
            case ".mp3": return "audio/mpeg";
            case ".png": return "image/png";
            case ".pdf": return "application/pdf";
            case ".ppt": return "application/vnd.ms-powerpoint";
            case ".zip": return "application/zip";
            case ".txt": return "text/plain";
            default: return "application/octet-stream";
        }
    }

}

_______________________________________________

atau

source: codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server.aspx

 

using System;
using System.Net;
using System.Threading;
using System.Linq;
using System.Text;
 
namespace SimpleWebServer
{
    public class WebServer
    {
        private readonly HttpListener _listener = new HttpListener();
        private readonly Func<HttpListenerRequest, string> _responderMethod;
 
        public WebServer(string[] prefixes, Func<HttpListenerRequest, string> method)
        {
            if (!HttpListener.IsSupported)
                throw new NotSupportedException(
                    "Needs Windows XP SP2, Server 2003 or later.");
 
            // URI prefixes are required, for example 
            // "http://localhost:8080/index/".
            if (prefixes == null || prefixes.Length == 0)
                throw new ArgumentException("prefixes");
 
            // A responder method is required
            if (method == null)
                throw new ArgumentException("method");
 
            foreach (string s in prefixes)
                _listener.Prefixes.Add(s);
 
            _responderMethod = method;
            _listener.Start();
        }
 
        public WebServer(Func<HttpListenerRequest, string> method, params string[] prefixes)
            : this(prefixes, method) { }
 
        public void Run()
        {
            ThreadPool.QueueUserWorkItem((o) =>
            {
                Console.WriteLine("Webserver running...");
                try
                {
                    while (_listener.IsListening)
                    {
                        ThreadPool.QueueUserWorkItem((c) =>
                        {
                            var ctx = c as HttpListenerContext;
                            try
                            {
                                string rstr = _responderMethod(ctx.Request);
                                byte[] buf = Encoding.UTF8.GetBytes(rstr);
                                ctx.Response.ContentLength64 = buf.Length;
                                ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                            }
                            catch { } // suppress any exceptions
                            finally
                            {
                                // always close the stream
                                ctx.Response.OutputStream.Close();
                            }
                        }, _listener.GetContext());
                    }
                }
                catch { } // suppress any exceptions
            });
        }
 
        public void Stop()
        {
            _listener.Stop();
            _listener.Close();
        }
    }
}

How to use code di atas

 

class Program
{
    static void Main(string[] args)
    {
        WebServer ws = new WebServer(SendResponse, "http://localhost:8080/test/");
        ws.Run();
        Console.WriteLine("A simple webserver. Press a key to quit.");
        Console.ReadKey();
        ws.Stop();
    }
 
    public static string SendResponse(HttpListenerRequest request)
    {
        return string.Format("<HTML><BODY>My web page.<br>{0}</BODY></HTML>", DateTime.Now);    
    }
}

 

HTML Page Auto Reload Image

Source: htmlhelpcentral.com/messageboard/showthread.php?19672-automatic-reload-of-specific-image-in-page

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
//<![CDATA[
window.onload = function() {
	img = document.getElementById('refreshImage');
	img.src += "?";
	setInterval("img.src=img.src.replace(/\\?[0-9]*/, '?'+Math.floor(Math.random()*9999999+1));", 5000);
}
//]]>
</script>
</head>

<body>
<img src="theImage.jpg" id="refreshImage" />
</body>
</html>

Capture MainForm Window C#

Source: stackoverflow.com/questions/5124434/how-to-get-the-screenshot-of-the-form

using (var bmp = new Bitmap(this.Width, this.Height)) 
{
             this.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
             bmp.Save(@"E:\pic\TEST.bmp");
 }

Design AGV System

Printf dan Scanf USART pada AVR Studio 4 + AVR AVR GCC

Sumber: embedds.com/using-standard-io-streams-in-avr-gcc/

Mengatur Linker

WinAVR , AVR Studio atau AVR GCC secara default, linker option-nya di-set standard yaitu tanpa floating point conversion.

USART1

Jadi kita ingin mengirim string dengan basic integer number, maka gunakan minimized version. Maka gunakan linker option sebagai berikut.

-Wl,-u,vfprintf -lprintf_min 

Jika kita ingin fungsi untuk floating point maka gunakan standard option dengan floating point conversion:

-Wl,-u,vfprintf -lprintf_flt -lm

Untuk menambahkan linker option pada AVR Studio 4, maka buka project option à Custom Option , lalu tambahkan –Wl, -u, vprintf ke linker option seperti gambar di bawah ini:

avrstudio_linker_options-445x300

Kemudian buka tab Libraries dan tambahkan libprintf_flt.a dan libm.a karena float conversion membutuhkan math library.

avrstudio_linker_options_libraries-441x300

Hal ini juga berlaku untuk fungsi scan. Jika kita akan sering membaca data streams, maka masukan juga linker berikut.

Untuk minimized version:

-Wl,-u,vfscanf -lscanf_min

Untuk float version:

-Wl,-u,vfscanf -lscanf_flt –lm

Men-setting I/O Streams

Send

int USART0SendByte(char u8Data, FILE *stream)
{
   if(u8Data == '\n')
   {
      USART0SendByte('\r', 0);
   }
   //wait while previous byte is completed 
   while(!(UCSR0A&(1<<UDRE0))){};
   // Transmit data
   UDR0 = u8Data;
   return 0;
}

 

Receive

int USART0ReceiveByte(FILE *stream)
{
   uint8_t u8Data;
   // Wait for byte to be received
   while(!(UCSR0A&amp;(1&lt;&lt;RXC0))){};
   u8Data=UDR0;
   //echo input data
   USART0SendByte(u8Data,stream);
   // Return received data
   return u8Data;
}

 

Lalu tambahkan pula kode berikut.

FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, USART0ReceiveByte, _FDEV_SETUP_RW);

 

Kita bisa mengatur untuk mengunakan stream data untuk menerima, mengirim, atau kedua-duanya tergantung dari parameter yang yang kita setting pada FDEV_SETUP_STREAM tadi.

read - _FDEV_SETUP_READ

written - _FDEV_SETUP_READ

read/written - _FDEV_SETUP_RW

Dalam C, stream data itu ada 3. Pada computer bentuk stream data ini digunakan untuk membaca keyboard – stdin (standard input stream), output ke layar – stdout (standard output stream) dan satu lagi output ke layar – stderr (standard error stream). Untuk itu kita perlu menginisialisasi standard stream yang akan kita gunakan sebagai berikut.

stdin=stdout=&amp;uart0_str;

Dengan demikian kita bisa menggunakan fungsi prinf() dan akan memudahkan kita dalam menggunakan usart.

Print Format

Sebelum kita menggunakanfungsi print seperti int fprintf(FILE*, const char *, ) kita perlu faham dulu format datanya. Untuk fungsi ‘printf’ terdiri dari.

fprintf_format

Jika menggunakan fungsi stream standard maka bentuknya printf(formatted string, arguments); fungsi ini memungkinkan kita untuk mengubah arguments yang kita masukan menjadi data string. Bentuk data yang diubah akan ditempatkan pada formatted string dengan cara mengawalinya dengan tanda “%”:

%[flag][leading][width].[precision][length]specifier

Setiap tag dapat diatur sesuai kebutuhan. Hal ini bisa banyak dicari pada tutorial bahasa C.

Flag can be:

space – that can usually is filled if number sign is present;

+ – forces to use plus/minus sign to positive/negative number;

– – left justifies result (default is right);

# – Used with o, x or X specifiers the value is preceded with 0, 0x or 0X respectively for values different than zero; Used with e, E and f forces output to contain a decimal point even if no digits would follow; Used with g or G the result is the same as with e or E but trailing zeros are not removed.

Leading – print a leading zero(ignored for negative numbers);

Width – minimum field of characters to be printed. Padded with spaces if result is shorted and truncated if longer. If * is used then it represents integer number that is taken from argument list.

Precision – represents number of digits after decimal point for double numbers. For integers this number shows the minimum number of digits to be printed. If number is shorter – leading zeros are added, if longer- it is truncated. It also can be specified as * and value taken from arguments.

Length – can be h, l, and L. used for argument compatibility where h – stands for short int, l – long int and L – long double.

Specifier – this is a mandatory specifier. It defines value type of corresponding argument:

  • c – character (eg. a, C, …);
  • i, d – decimal integer (eg 10, -23);
  • u – unsigned integer (eg. 100);
  • e, E – scientific format (eg. 1.2e01, 5E21);
  • f – decimal floating point (eg. -5.014);
  • g, G – shorter e or f (eg. -5.02, 5E2);
  • o, O – octal unsigned integer (eg. 457);
  • x, X – unsigned hexadecimal (eg. 1f8, FF4);
  • s – string of characters (eg. Hello);
  • p – pointer address;
  • n – associated argument points to int variable which holds current count of printed characters;
  • % – % followed after % prints character %.

Pada AVR GCC library stdio.h pada beberapa fungsi mungkin memiliki keterbatasan seperti beberapa tag atau specifiers tidak bekerja.

Testing I/O stream functionality

Berikut contoh penggunaan fungsi print (mengirim data usart) dan juga scanf() (menerima data usart).

#include <stdio.h>
#include <math.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void USART0Init(void)
{
// Set baud rate
UBRR0H = (uint8_t)(UBRR_VALUE>>8);
UBRR0L = (uint8_t)UBRR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
//enable transmission and reception
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
}
int USART0SendByte(char u8Data, FILE *stream)
{
   if(u8Data == '\n')
   {
      USART0SendByte('\r', 0);
   }
//wait while previous byte is completed
while(!(UCSR0A&(1<<UDRE0))){};
// Transmit data
UDR0 = u8Data;
return 0;
}
int USART0ReceiveByte(FILE *stream)
{
uint8_t u8Data;
// Wait for byte to be received
while(!(UCSR0A&(1<<RXC0))){};
u8Data=UDR0;
//echo input data
USART0SendByte(u8Data,stream);
// Return received data
return u8Data;
}
//set stream pointer
FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, USART0ReceiveByte, _FDEV_SETUP_RW);
int main (void)
{
//sample data
uint16_t u16Data = 10;
double fltData = 3.141593;
int8_t s8Data = -5;
uint8_t u8str[]="Hello";
uint8_t u8Data;
//Initialize USART0
USART0Init();
//assign our stream to standart I/O streams
stdin=stdout=&usart0_str;
//print unsignet integer
printf("\nunsigned int = %u",u16Data);
//print hexadecimal number
printf("\nhexadecimal unsigned int = %#04x",u16Data);
//print double with fprint function
fprintf(stdout,"\ndouble = %08.3f", fltData);
//print signed data
printf("\nsigned int = %d",s8Data);
//print string
printf("\nstring = %-20s",u8str);
//print string stored in flash
printf_P(PSTR("\nString stored in flash"));
//printing back slash and percent symbol
printf("\nprintf(\"\\nstring = %%-20s\",u8str);");
    while(1)
    {
    printf_P(PSTR("\nPress any key:"));
    //scan standard stream (USART)
    scanf("%c",&u8Data);
    printf_P(PSTR("\nYou pressed: "));
    //print scaned character and its code
    printf("%c; Key code: %u",u8Data, u8Data);
    }
}

 

Berikut hasil yang dicapture pada terminal serial.

printf_example_terminal_results

Program tersebut menggunakan variable float, maka kita terlebih dahulu perlu men-setting linker dengan setting floating point seperti yang telah kita bahas di atas. Fungsi printf juga bisa digunakan untuk menampilkan data pada LCD atau pada perangkat lainnya. Jika operasi stream tidak terikat pada hardware tertentu – fungsi stream yang sama bisa kita definisikan pula untuk hardware berbeda. Kita bisa mengirim data yang sama menggunakan USART atau LCD jika perlu – hanya satu fungsi hardware yang perlu diubah.

 

Labview – Tambahan

FAQ

 

Q:     Ketika saya build .exe, aplikasi yang saya buat tidak berjalan sebagaimana mestinya semisal custom menu bar tidak muncul.

A:     Bisa jadi ketika kita mem-build .exe, file exe tersebut masih berjalan di computer kita. Sehingga proses build menjadi kacau. Maka daripada itu, pastikan  ketika mem-build aplikasi .exe, file tersebut tidak sedang dijalankan. Bisa dilihat di task manager. Solusi amannya clean .exe yang kita buat terlebih dahulu sebelum kita melakukan build.

 

Tips

 

  1. Aplikasi Labview terdiri dari 2 halaman. Yaitu Front Panel (user interface) yang selalu mempunyai Block Diagram(chart programming). Settingan Front Panel yang kita buat akan sama ketika kita run. Jadi ketika kita membuat program dengan window kecil yang kita tempatkan di pojok layar dan dan tidak ideal denga button dan elemen lain, maka begitu pula ketika kita jalankan sebagai aplikasi. Oleh karena itu, aturlah front panel serapi mungkin dan tempatkan pada posisi yang ideal terhadap layar monitor.
  2. Jangan sembarangan mencopy atau mengganti nama VI karena bisa jadi file tersebut berhubungan (caller atau subVI dari VI lainnya) dengan file lainnya dalam satu project. Sehingga biasanya akan menyebakan error can’t find file VI atau file conflict. Lakukan dengan rapid dan hati-hati jika ingin mengedit file-file.
  3. Kita bisa menggunakan Use default setting ktika kita menyambung wire pada structure FOR LOOP (Disable Indexing) atau CASE STRUCTURE (Use Default Setting) dengan cara klik kanan pada sisi objek lalu pilih Use default setting dengan demikian kita tidak perlu menyambung wire pada sisi lainnya (CASE STRUCTURE) akan tetapi efeknya yaitu wire akan bernilai default biasanya false untuk boolean dan no error untuk error line atau pilih Disable Indexing pada FOR LOOP dengan demikian output wire-nya tidak akan berbentuk array akan tetapi tetap single.

tips-1

Figure FOR LOOP

tips-2

Figure CASE STRUCTURE

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Tutorial 15 Local Variable, Global Variable, & Shared Variable

Local Variable

Dalam  LabVIEW sebuah elemen hanya mempunyai satu symbol pada block diagram, maka untuk mengisi atau membaca elemen tersebut pada kode lainnya yang masih dalam satu VI bisa menggunakan local variable.  Klik kanan, buka function palette.

lv15-1

Figure 15.1

Jika sudah ditambahkan pada block diagram, maka klik kiri > pilih elemen yang akan kita akses. Missal saya akan mengakses message box.

lv15-2

Figure 15.2

Kita bisa mengisi atau membaca variable tersebut. Klik kanan pada local variable yang sudah kita assign sebagai message box tadi, lalu pilih change to read jika ingin membaca isi dari elemen message box.

lv15-3

Figure 15.3

Atau jika dalam mode read kita akan mengubahnya menjadi mode write kita tinggal klik kanan pada local variable tersebut.

lv15-4

Figure 15.4

lv15-5

Figure 15.5

Dengan demikian,  dengan menggunakan local variable kita bisa mengakses suatu elemen dari mana saja, walaupun intinya suatu elemen hanya bisa digunakan pada satu diagram saja.

Global Variable

Global variable digunakan untuk berbagi nilai bersama-sama antar VI dalam satu project file.

lv15-6

Figure 15.6

Sebuah global variable biasanya di save dalam format .vi. Akan tetapi vi ini tidak mempunyai block diagram.

lv15-7

Figure 15.7

Pada gambar di atas adalah global variable dengan format .vi. Jika kita buka file tersebut maka bisa kita lihat seperti gambar di bawah  ini.

lv15-8

Figure 15.8

Untuk menggunakannya kita bisa drag file tersebut dari project file window ke program block diagram yang kita inginkan. Jika pada file global variable tadi mempunyai lebih dari satu elemen, dengan cara klik kiri kita bisa memilih elemen mana yang akan kita gunakan.

lv15-9

Figure 15.9

Global variable ini juga bisa kita set sebagai mode write atau  read.

lv15-10

Figure 15.10

Shared Variable

Jika kita mempunyai 2 buah computer dan ingin kedua software pada dua computer tadi berkomunikasi satu sama lain maka kita bisa gunakan shared variable. Dengan membuat shared libraries melalui network-published variable pada kedua masing-masing PC maka kita dapat membuat sharing data diantara PC tersebut.

Biasanya dalam beberapa kasus, satu computer bertindak sebagai publisher dan mengirim data ke shared variable yang mana PC lainnya bertindak sebagai subscriber dan menerima data tersebut.

  1. Lakukan pengaturan shared variable pada PC yang aka kita jadikan sebagai publisher dengan cara klik kanan My Computer >> New>>Variable seperti pada gambar di bawah ini. Dengan demikian, maka akan muncul sebuah dialog box untuk men-setting shared variable yang kita buat.

lv15-11

Figure 15.11

  1. Pada dialog box, pada tab variable, pastikan bahwa Variable Type bernilai Network-Published seperti ditunjukan pada gambar di bawah ini. Pada window ini kita dapat mengatur Data Type dan Name dari variable yang akan kita buat. Klik OK pada dialog box dan perlu diketahui bahwa library yang kita buat belum mempunyai nama dan belum di save (untitled library). Pada project file kita, shared variable akan terlihat terexpand ke bawah seperti ditunjukan pada gambar berikutnya.

lv15-12

Figure 15.12

lv15-13

Figure 15.13

  1. Save project kita, maka secara otomatic akan muncul pesan bahawa kita harus mengisi nama library lalu save. Jalankan VI Anda yang mana menyimpan data ke shared variable yang kita buat tadi. Dengan demikian, maka library dan hared variable kita akan ter-deploy pada publisher PC kita.
  2. Pada subscriber PC, buka Project Explorer dan buat shared variable seperti halnya dijelaskan pada poin 1. Pada variable tab ceklis Enable Aliasing dan pilih PSP URL pada bagian Bind To. Click Browse, lalu pilih IP sesuai publisher PC kita tadi, lalu expand. Maka kita akan bisa melihat shared library dan variable kita seperti ditunjukan pada gambar di bawah. Pilih, lalu klik OK untuk keluar dari variable configuration window.

lv15-14

Figure 15.14

  1. Simpan variable ini pada VI, pada subscriber computer, dan kita pun bisa membaca data yang di-write dari publisher PC.

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Tutorial 14 Membuat File CFG Untuk Menyimpan Nilai Variable

Terkadang kita ingin menyimpan setting-an dari applikasi kita semisal port serial atau port aplikasi DAQ yang kita setting sebagai control sehingga memungkinkan diganti-ganti oleh user. Akan tetapi ketika aplikasi kita dimatikan maka setting-an tersebut hilang dan saat menghidupkan kembali aplikasi kita ternyata kita harus memasukannya settingan kembali. Oleh karena itu, kita simpan saja nilai settingan tersebut pada file .cfg.

Misal kita akan menyimpan data settingan port serial. Untuk membuat program ini kita akan menggunakan Configuration File Vis seperti terlihat pada gambar di bawah ini.

lv14-1

Figure 14.1

lv14-2

Figure 14.2

lv14-3

Figure 14.3

Intinya kita akan menggunakan Open Config Data, Read Key (untuk membaca isi file), Write Key (untuk menulis pada file), dan Close Config Data.

lv14-4

Figure 14.4

Kita gunakan application directory lalu menggabungkan dengan nama file menggunakan Build Path.

lv14-5

Figure 14.5

lv14-6

Figure 14.6

PadaRead Key atau pun Read Key ada Sectio dan Key. Gunakan nama Section dan Key yang sama untuk menulis atau membaca data yang sama.

lv14-7

Figure 14.7

Kita juga menggunakan Type Cast untuk menkonversi tipe data. Pada bagian  read kita mengubah dari tipe data string ke visa resource name. Sedangkan pada bagian write kita mengubah sebaliknya dari tipe VISA resource name menjadi string untuk dituliskan ke file cfg.

lv14-8

Figure 14.8

Kita juga menggunakan Merge Error .

lv14-9

Figure 14.9

Terakhir adalah bagian Close Config Data.

Sekarang mari kita coba.

lv14-10

Figure 14.10

Kita pilih COM pada combo box yang tersedia. Lalu kita klik write. Lalu klik read. Pada display read akan tampil nama COM3 yang sama dengan yang kita write. Sekarang kita buka file .cfg yang kita gunakan untuk menyimpan data kita.

lv14-11

Figure 14.11

lv14-12

Figure 14.12

Pada file tersebut telah tertulis data yang kita masukan.

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Tutorial 13 Build Installer

Klik kanan pada Build Specification pada tab Items Project File kita. Lalu pilih New > Installer.

lv13-1

Figure 13.1

 

Maka akan muncul properties window seperti berikut.

lv13-2

Figure 13.2

14.1 Product Information

Dalam kasus ini saya akan mengisi informasi pada Product Information sebagai berikut.

lv13-3

Figure 13.3

14.2 Destination

Pada bagian ini kita akan mengatur dimanakah directory program kita akan di-install dengan nama folder yang kita tentukan. Misal:

lv13-4

Figure 13.4

14.3 Source File

Pada bagian ini kita masukan file .exe yang sudah kita buat pada sesi sebelumnya. File tersebut kita tambahkan ke ruas kanan dengan cara sorot/highlight pada file exe kita lalu klik tanda panah ke kanan.

lv13-5

Figure 13.5

Lalu saya akan menambahkan juga file lain yang saya perlukan yang berkaitan dengan aplikasi saya yaitu file Log Table.xlsx yang akan saya akses dalam folder EXCEL LOG serta file readme.pdf pada folder readme. Juga saya akan tambahkan file com_set.cfg yang merupakan file yang saya perlukan untuk menyimpan beberapa parameter.

lv13-6

Figure 13.6

14.4 Source File Setting

Pada bagian ini kita bisa mengatur file aplikasi kita. Apakah akan di-hidden atau diproteksi dengan cara read only, dsb.

lv13-7

Figure 13.7

14.6 Shortcuts

Disini kita bisa mengatur shortcut apa saja yang akan termasuk kedalam installer kita yang akan muncul di start menu.

lv13-8

Figure 13.8

14.7 Additional Installers

Pada bagian ini kita bisa mengatur installer apa saja yang akan include dengan installer aplikasi yang kita buat. Default installer yang dicentang adalah installer run time engine labview yang mana diperlukan sebagai pendukung agar software kita bisa dijalankan pada computer target.

lv13-9

Figure 13.9

Saya juga akan menambahkan installer lainnya. Karena pada kasus saya ini menggunakan module DAQ sebagai digital IO, maka saya akan tambahkan installer untuk DAQ. Dan juga installer lainnya yang memang berkaitan dengan fungsi-fungsi yang digunakan pada aplikasi kita. Semisal pada installer DAQ ini termasuk di dalamnya driver dari perangkat modul DAQ. Hal ini dikarenakan bahwa di computer target belum terinstall file-file LabVIEW yang men-support aplikasi kita seperti pada computer depelopment yang kita gunakan untuk membangun aplikasi labVIEW kita yang memang terinstall software depelopment LabVIEW full service.

lv13-10

Figure 13.10

14.7 Dialog Information

Pada bagian ini memungkinkan kita untuk menambahkan dialog seperti dialog licence.

lv13-11

Figure 13.11

14.10 Version Information

lv13-12

Figure 13.12

Klik Build, tunggu sampai proses build selesai.

lv13-13

Figure 13.13

Setelah itu coba kita lihat file installer kita dengan cara klik explore.

lv13-14

Figure 13.14

Maka akan muncul windows explorer dengan directory folder Volume dan  di dalamnya ada file setup, dll, yang siap untuk kita jalankan sebagai installer.

lv13-15

Figure 13.15

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Tutorial 12 Build EXE File

File peoject yang kita buat tetntunya akan kita build .exe-nya agar bisa dijalankan pada computer lain yang tidak memiliki LavVIEW Development Software. Ikuti langkah-langkahnya sebagai berikut.

Klik kanan pada Build Specification > New > Application (EXE)

lv12-1

Figure 12.1

Maka akan muncul My Application Properties yang harus kita setting sesuai yang kita inginkan.

12.1 Information

Misal saya punya sebuah project file degan nama new-project, maka saya akan mengisi properties tersebut dengan settingan sebagai berikut.

lv12-2

Figure 12.2

 

 

 

12.2 Source Files

lv12-3

Figure 12.3

Masukan aplikasi utama kita yang nanti akan muncul pertama kali ketika file .exe yang kita buat dijalankan. Program utama pada kasus ini adalah Aplikasi Main.vi, saya masukan ke startup Vis karena saat pertama kali .exe dijalankan saya hanya ingin satu page/halaman vi yang muncul.

12.3 Destination

Pada bagian destination  ini kita bisa membuat folder yang nantinya bisa kita gunakan  sebagai directory untuk aplikasi yang kita jalankan mengakses file-file yang include dalam proses jalannya aplikasi.

lv12-4

Figure 12.4

Misal saya akan menambahkan folder EXCEL_LOG dan readme karena saya akan menggunakannya untuk menyimpan file yang akan saya gunakan saat aplikasi dijalankan. Klik tanda (+) Add Destination untuk menambah destination baru.

lv12-5

Figure 12.5

lv12-6

Figure 12.6

12.4 Source File Setting

lv12-7

Figure 12.7

Pada tab ini kitabisa mengatur file-file mana saja yang akan masuk ke bundle .exe atau tidak, ataukah masuk ke folder lain yang sudah kita buat di Destination  tadi. Sebagai contoh lihat pada gambar di bawah ini.

lv12-8

Figure 12.8

lv12-9

Figure 12.9

 

12.5 Icon

Pada bagian ini kita bisa mengatur icon seperti apa yang akan terlihat mewakili file .exe kita nanti. Pada kasus ini saya memakai gambar camera. File yang bisa digunakan untuk icon ini adalah file gambar yang berekstensi .ico. Jika Anda mempunyai gambar dengan ekstensi lain, Anda bisa mengkonversi file tersebut ke file .ico pada web-web yang tersedia di internet secara online. Cukup google saja dengan keyword “convert .ico online”.

lv12-10

Figure 12.10

12.8 Version Information

Pada tab ini Anda dapat menambahkan informasi yang mengenai file .exe yang dibuat.

lv12-11

Figure 12.11

12.10 Shared Variable Deployment

Shared variable memungkinkan kita untuk mengunakan variable yang sama antar vi dalam jaringan. Saya setting agar share variable yang saya gunakan auto deploy saat aplikasi dijalankan, artinya shere variable tersebut akan tersimpan seperti server di computer sehigga memungkinkan juga untuk diakses lewat vi lain di computer yang berbeda. Lalu ketika applikasi dihentikan, share variable tersebut di undeploy yang artinya tidak dapat diakses lagi.

lv12-12

Figure 12.12

Denga menekan tombol build, maka program exe akan ter-generate. Program exe yang kita build bisa kita lihat di folder yang sudah kita setting pada Properties ini. Kita juga bisa membuka folder degan cara klik kanan pada profile .exe yang kita buat lalu klik explore. Atau kita juga bisa menjalankannya dengan klik run.

lv12-13

Figure 12.13

lv12-14

Figure 12.14

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Follow

Get every new post delivered to your Inbox.