• Tidak ada hasil yang ditemukan

LAMPIRAN CODE PROGRAM PLC. Program master (P0) STEP 0 IF saklar THEN LOAD V200 TO TP0 SET T0 RESET P1 RESET P2. STEP 1 IF N T0 THEN SET sila SET silc

N/A
N/A
Protected

Academic year: 2021

Membagikan "LAMPIRAN CODE PROGRAM PLC. Program master (P0) STEP 0 IF saklar THEN LOAD V200 TO TP0 SET T0 RESET P1 RESET P2. STEP 1 IF N T0 THEN SET sila SET silc"

Copied!
30
0
0

Teks penuh

(1)

LAMPIRAN CODE PROGRAM PLC Program master (P0) STEP 0 IF saklar THEN LOAD V200 TO TP0 SET T0 RESET P1 RESET P2 STEP 1 IF N T0 THEN SET silA SET silC STEP 2 IF N saklar THEN LOAD V300 TO TP0 SET T0 STEP 3 IF N T0 THEN SET silB

(2)

STEP 4 IF N sb_ret THEN LOAD V300 TO TP0 SET T0 STEP 5 IF N T0 THEN RESET silA RESET silB STEP 6

IF saklar1 AND N saklar2 THEN SET P1 JMP TO 0 OTHRW JMP TO 7 STEP 7

IF saklar2 AND N saklar1 THEN

SET P2 JMP TO 0

OTHRW

(3)

Program slave 1 STEP 0 IF saklar1 THEN LOAD V400 TO TP0 SET T0 STEP 1 IF N T0 THEN SET silD STEP 2 IF sb_ret THEN LOAD V200 TO TP0 SET T0 STEP 3 IF N T0 THEN RESET silD RESET P1 JMP TO 0 Program slave 2 STEP 0 IF saklar2 THEN

(4)

LOAD V400 TO TP0 SET T0 STEP 1 IF N T0 THEN RESET silC STEP 2 IF N sc_ext THEN LOAD V200 TO TP1 SET T0 STEP 3 IF N T0 THEN SET silE STEP 4 IF N se_ret THEN LOAD V100 TO TP1 SET T0 STEP 5

(5)

IF N T0 THEN RESET sile STEP 6 IF se_ret THEN LOAD V200 TO TP1 SET T0 STEP 7 IF N T0 THEN SET silC RESET P2 JMP TO 0

LAMPIRAN CODE PROGRAM OPENCV

/* ---library openCV--- */ #include "stdafx.h"

#include <cv.h> #include <cxcore.h> #include <highgui.h>

(6)

#define PPORT_BASE ((short) 0x378)

/* ---inisialisasi tipe output kirim data--- */

typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum); oupfuncPtr oup32fp;

/* ---inisialisasi fungsi penulisan data register--- */ void Out32 (short portaddr, short datum)

{

(oup32fp)(portaddr,datum); }

/* ---pengiriman logic ke paralel port--- */ void test_write_datum(short datum)

{

short x; short i;

i=PPORT_BASE; x = datum;

/ ---Write the data register--- */ Out32(i,x);

(7)

printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x); }

/* ---fungsi untuk menggambar segitiga pada image--- */ void drawTriangle( IplImage* img, CvSeq* all, char* wndname ) {

CvSeqReader reader;

IplImage* cpy = cvCloneImage( img ); int i;

/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );

/* -membaca 3 sequence element pada satu waktu (semua vertek pada triangle)- */ for( i = 0; i < all->total; i += 3 ) { CvPoint pt[3], *rect = pt; /* ---membaca 3 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader );

(8)

if (count == 3) { /* ---kirim logic 1---*/ test_write_datum(0x1); }

/* ---gambar segitiga sebagai banyak garis yang tertutup--- */

cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); }

/* ---menampilkan gambar segitiga--- */ cvShowImage( wndname, cpy );

cvReleaseImage( &cpy ); }

/* ---fungsi untuk menggambar kotak pada image--- */

void drawSquares( IplImage* img, CvSeq* all, char* wndname ) {

CvSeqReader reader;

IplImage* cpy = cvCloneImage( img ); int i;

(9)

/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );

/* -membaca 4 sequence element pada satu waktu (semua vertek pada square)- */ for( i = 0; i < all->total; i += 4 ) { int a=0; CvPoint pt[4], *rect = pt; int count = 4; /* ---membaca 4 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); if (count == 4) { /* ---kirim logic 1--- */ test_write_datum(0x01); }

(10)

cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); }

/* ---menampilkan gambar segiempat--- */ cvShowImage( wndname, cpy );

cvReleaseImage( &cpy ); }

/* ---fungsi untuk menggambar segilima pada image--- */ void drawPentagon( IplImage* img, CvSeq* all, char* wndname ) {

CvSeqReader reader;

IplImage* cpy = cvCloneImage( img ); int i;

/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );

/* -membaca 5 sequence element pada satu waktu (semua vertek pada pentagon)- */ for( i = 0; i < all->total; i += 5 )

{

(11)

int count = 5; /* ---membaca 5 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); CV_READ_SEQ_ELEM( pt[4], reader ); if (count == 5) { /* ---kirim logic 1--- */ test_write_datum(0x01); }

/* ---gambar segilima sebagai banyak garis yang tertutup--- */

cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); }

/* ---menampilkan gambar segilima--- */ cvShowImage( wndname, cpy );

(12)

}

/* ---fungsi untuk menggambar segienam pada image--- */ void drawHexagon( IplImage* img, CvSeq* all, char* wndname ) {

CvSeqReader reader;

IplImage* cpy = cvCloneImage( img ); int i;

/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );

/* -membaca 6 sequence element pada satu waktu (semua vertek pada hexagon)- */ for( i = 0; i < all->total; i += 6 ) { CvPoint pt[6], *rect = pt; int count = 6; /* ---membaca 6 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader );

(13)

CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); CV_READ_SEQ_ELEM( pt[4], reader ); CV_READ_SEQ_ELEM( pt[5], reader );

/* ---gambar segienam sebagai banyak garis yang tertutup--- */

cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); if (count == 6) { /* ---kirim logic 1--- */ test_write_datum(0x4); } }

/* ---menampilkan gambar segienam--- */ cvShowImage( wndname, cpy );

cvReleaseImage( &cpy ); }

/* ---fungsi untuk menggambar segienam pada image--- */ void drawOctagon( IplImage* img, CvSeq* all, char* wndname )

(14)

{

CvSeqReader reader;

IplImage* cpy = cvCloneImage( img ); int i;

/* -inisialisasi untuk mulai membaca isi variabel secara berurutan- */ cvStartReadSeq( all, &reader, 0 );

/* -membaca 5 sequence element pada satu waktu (semua vertek pada pentagon)- */ for( i = 0; i < all->total; i += 8 ) { CvPoint pt[8], *rect = pt; int count = 8; /* ---membaca 6 vertek--- */ CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); CV_READ_SEQ_ELEM( pt[2], reader ); CV_READ_SEQ_ELEM( pt[3], reader ); CV_READ_SEQ_ELEM( pt[4], reader ); CV_READ_SEQ_ELEM( pt[5], reader ); CV_READ_SEQ_ELEM( pt[6], reader ); CV_READ_SEQ_ELEM( pt[7], reader );

(15)

/* ---gambar segienam sebagai banyak garis yang tertutup--- */

cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); if (count == 8) { /* ---kirim logic 1--- */ test_write_datum(0x4); } }

/* ---menampilkan gambar segiempat--- */ cvShowImage( wndname, cpy );

cvReleaseImage( &cpy ); }

/* ---Fungsi utama--- */ int _tmain(int argc, _TCHAR* argv[]) {

/* ---Load the library--- */ HINSTANCE hLib;

(16)

if (hLib == NULL) {

fprintf(stderr,"LoadLibrary Failed.\n"); return -1;

}

/* ---men-cek alamat fungsi--- */

oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");

if (oup32fp == NULL) {

fprintf(stderr,"GetProcAddress for Oup32 Failed.\n"); return -1;

}

/* ---inisialisasi variabel--- */ double pilih;

int delay=1000, a=0;

IplImage *fileName;

/* ---Tampilan awal--- */

(17)

printf("\n\nMenu Pilihan Benda : \n"); printf ("1. deteksi lingkaran\n"); printf ("2. deteksi segitiga\n"); printf ("3. deteksi segiempat\n"); printf ("4. deteksi segilima\n"); printf ("5. deteksi segienam\n"); printf ("6. deteksi segidelapan\n\n");

do {

int pilih = 1;

if (pilih>0 && pilih<2) {

do {

printf("\n\n\n\n\n\n\n\n\n\n\n\n Detect Circle \n\n\n");

/* ---mengambil citra dari tempat penyimpanan pheephole--- */ IplImage *im2 = cvLoadImage("D:/SKRIPSI/PH3.jpg",1);

IplImage *im1 = cvLoadImage("D:/SKRIPSI/PH3.jpg",0);

(18)

cvNamedWindow("image processing", 1); cvShowImage("image processing", im2);

/* ---threshold--- */

cvThreshold( im1, im1, 119, 150, CV_THRESH_BINARY ); cvNamedWindow("Tres:");

/* ---menampilkan gambar hasil threshold--- */ cvShowImage("Tres:", im1);

printf("Tres Image ON\n");

/* ---edge detection dengan canny--- */

cvCanny(im1, im1, 145, 150, 3); //harus dari grayscale

/* ---menampilkan gambar hasil canny--- */ cvNamedWindow("Canny",1);

cvShowImage("Canny",im1);

printf("Canny Edge Detection ON\n");

/* -menyimpan gambar hasil dari proses canny ke dalam register-*/ cvSaveImage("saved.jpg",im1);

(19)

/* ---inisialisasi variabel type array--- */ IplImage *gray, *view;

CvMemStorage* storage;

CvSeq* circles;

printf("\n Detecting Circles");

storage = cvCreateMemStorage(0); view = cvCloneImage(img);

/* --mengubah besar image dari ukuran tertentu menjadi 8 bit-- */ gray = cvCreateImage( cvGetSize(img), 8, 1 );

cvCvtColor( img, gray, CV_BGR2GRAY );

/* ---smoothing dengan Gaussian--- */

cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smoothing ini dilakukan untuk mengurangi kesalahan deteksi lingkaran

/* ---mendeteksi lingkaran dengan Hough Gradient--- */

circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );

(20)

for( int i = 0; i < circles->total; i++ ) {

int count=1;

float* p = (float*)cvGetSeqElem( circles, i );

/* ---menggambar lingkaran yang ditemukan pada image--- */

cvCircle( view, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );

cvCircle( view, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

/* --kirim logic 1 ke rangkaian relay melalui parallel port-- */ test_write_datum(0x01);

}

/* ---tampilkan gambar hasil detect lingkaran--- */ cvNamedWindow( "detected", 1 );

cvShowImage( "detected", view );

/* ---delay 1 detik--- */ cvWaitKey(delay);

(21)

/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img); cvDestroyAllWindows(); }while(delay==3000); } pilih=2; if (pilih<3&&pilih>1) { do {

printf("\n\n\n\n\n\n\n\n\n\n\n\n Detect Vertek \n\n\n");

/* ---mengambil citra dari tempat penyimpanan pheephole--- */ IplImage *im2 = cvLoadImage("D:/SKRIPSI/PH3.jpg",1);

IplImage *im1 = cvLoadImage("D:/SKRIPSI/PH3.jpg",0);

/* ---menampilkan gambar original--- */ cvNamedWindow("image processing", 1);

(22)

/* ---threshold--- */

cvThreshold( im1, im1, 119, 150, CV_THRESH_BINARY );

/* ---menampilkan gambar hasil threshold--- */ cvNamedWindow("Tres:");

cvShowImage("Tres:", im1); printf("Tres Image ON\n");

/* ---edge detection dengan canny--- */

cvCanny(im1, im1, 145, 150, 3); //harus dari grayscale

/* ---menampilkan gambar hasil canny--- */ cvNamedWindow("Canny",1);

cvShowImage("Canny",im1); printf("Canny Edge Detection ON\n");

/* ---menyimpan gambar hasil dari proses canny ke dalam register--- */

cvSaveImage("saved.jpg",im1);

IplImage *img = cvLoadImage("saved.jpg");

/* ---inisialisasi variabel type array--- */ IplImage *gray, *view;

(23)

CvMemStorage* storage;

CvSeq* circles;

/* ---inisialisasi variabel--- */

CvSeq* contours;

int i, c, l, N = 11;

/* ---mencari besarnya image original--- */ CvSize sz = cvSize( img->width, img->height);

IplImage* timg = cvCloneImage( img ); // make a copy of input image IplImage* gray = cvCreateImage( sz, 8, 1 );

/* ---menciptakan image dengan ukuran yang baru (1/2 ukuran image lama)--- */

IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 );

/* ---deklarasi variabel--- */

IplImage* tgray;

CvSeq* result;

double s, t;

(24)

CvSeq* all = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );

/* ---memilih ROI pada image dengan lebar dan panjangnya dibagi 2--- */

cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ));

/* ---filter untuk mengurangi noise dengan down-scale dan upscale--- */

cvPyrDown( timg, pyr, 7 ); cvPyrUp( pyr, timg, 7 );

tgray = cvCreateImage( sz, 8, 1 );

/* ---menemukan contours dengan metode chain code dan menyimpan semuanya ke dalam sebuah list--- */

cvFindContours( gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );

/* ---test setiap contour--- */ while( contours )

{

/* ---memberikan ketebalan garis contour 0.02--- */

result = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0 );

(25)

/* ----kontur segitiga harus punya 3 vertek setelah perkiraan yang secara relatif area besar (untuk menyaring noise kontur---/

if( result->total == 3 && fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 && cvCheckContourConvexity(result) )

{

/* ---menyimpan vertek yang ditemukan ke result--- */ cvSeqPush( all,(CvPoint*)cvGetSeqElem( result, i )); }

/* ---cek countour berikutnya--- */ contours = contours->h_next; } }while(delay==3000); } int count pilih=3; if (pilih<4&&pilih>2) { if (count = 3)

(26)

{

printf("\n Detecting Triangle\n"); storage = cvCreateMemStorage(0);

view = cvCloneImage(img);

cvNamedWindow( "detectedT", 1 );

/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */

drawTriangle( view, img, storage, "detectedT" );

/* ---delay 1 detik--- */ cvWaitKey(delay);

/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);

cvDestroyAllWindows(); }

if (count = 4) {

(27)

storage = cvCreateMemStorage(0); view = cvCloneImage(img);

cvNamedWindow( "detectedS", 1 );

/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */

drawTriangle( view, img, storage, "detectedS" );

/* ---delay 1 detik--- */ cvWaitKey(delay);

/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);

cvDestroyAllWindows(); }

if (count = 5) {

printf("\n Detecting Pentagon \n"); storage = cvCreateMemStorage(0);

view = cvCloneImage(img);

(28)

cvNamedWindow( "detectedP", 1 );

/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */

drawTriangle( view, img, storage, "detectedP" );

/* ---delay 1 detik--- */ cvWaitKey(delay);

/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);

cvDestroyAllWindows(); }

if (count = 6) {

printf("\n Detecting Hexagon \n"); storage = cvCreateMemStorage(0);

view = cvCloneImage(img);

(29)

/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */

drawTriangle( view, img, storage, "detectedH" );

/* ---delay 1 detik--- */ cvWaitKey(delay);

/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img);

cvDestroyAllWindows(); }

if (count = 8) {

printf("\n Detecting Octagon \n"); storage = cvCreateMemStorage(0);

view = cvCloneImage(img);

cvNamedWindow( "detectedO", 1 );

/* ---fungsi untuk detect triangle dan menampilkan hasil deteksi--- */

(30)

drawTriangle( view, img, storage, "detectedO" );

/* ---delay 1 detik--- */ cvWaitKey(delay);

/* ---hapus semua data dan tampilan--- */ cvReleaseImage(&img); cvDestroyAllWindows(); } } }while(delay==1000); }

Referensi

Dokumen terkait