23 Apr
Print This Post
Script yang tidak efektif

:: Automation :: HMI/Scada :: Wonderware Add comments

Contoh script yang akan toekang bahas kali ini didapat waktu freelance di salah satu Oil & Gas company. Tugas tukang waktu itu sebenarnya hanya jadi trainer Wonderware selama 4 hari disitu. Di akhir session toekang diminta bantuan untuk backup salah satu aplikasi HMI disono. Reaksi pertama toekang melihat aplikasi itu kaget setengah hidup ! Bukan apa-apa imej toekang selama ini terhadap Oil & Gas Company itu kawasan elit, ngak sembarang orang bisa join, didukung equipment dimana savety sangat dijunjung tinggi. Sehingga komponen penopang lainnya termasuk Automation & Controlnya tentunya kelas wahid. Tapi apa yang toekang liat sungguh mengecewakan.

Ada banyak sekali kode amburadul di situ, tapi toekang hanya akan membahas dua bagian terpenting saja:

Kenali dulu fitur terbaik software itu, kemudian manfaatkan sebaik mungkin
Banyak orang memilih/mempromosikan Wonderware karena alasan HMI yang paling mudah didevelopnya (menurut toekang sih relatif). Tapi jangan lantas itu menjadi landasan pemikiran seorang programer HMI Wonderware ini, trus malas menggali fitur-fitur terbaik software tersebut. Dalam artikel kali ini toekang mencoba mengulas sampel kasus aplikasi yang tidak memakai dua fitur bagus InTouch yaitu ‘QuickFunctions’ dan ‘Indiect Tag’ dan bagaimana solusinya.

QuickFunctions
Mari lihat apa yang ditulis si programer untuk menulis/meng-input record ke database :
graphicsMaksud script ini adalah insert data tiap jam pada menit ke-2 ke database, yang absurd dari script ini adalah kenapa harus menbuat 24 script yang isinya identik dimana hanya beda nilai date-time.

Toekang coba membuatnya menjadi simpel, create QuickFunction dengan nama ‘InsertData’ seperti ini:
graphics
Nah tinggal buat link pada ke-24 script itu seperti ini:
graphics
Jauh lebih mudah bukan ? Akan lebih simpel lagi kalau mengingat angka menit = 2 itu emang terjadi hanya sekali tiap jam kan ? so, ke-24 script tadi bisa dibuang, lalu create satu script berikut :
graphics

Indirect Tag
Kali ini toekang coba membahas report, salah satu fitur penting diaplikasi ini. Report disini dibuat dalam internal view, bukan dibuatkan di Ms Excel atau aplikasi external laen. Alasannya agar tidak bisa di edit operator, kalo di Excel operator mudah memanipulasi, masuk akal.

Bentuk report bulannannya seperti ini :
graphics
Si programer menggunakan tag model ini CUM_MASS\01 .. CUM_MASS\31, CUM_GROSS\01 .. CUM_GROSS\31 dst. Hm bagus … sudah pake supertag dengan nama column sebagai supertagnya, cuman kalo report nilai objectnya itu justru terletak pada row alias tanggal kalo disini .. jadi seharusnya dia buat begini Date01\CUM_MASS, Date01\CUM_GROSS, Date01\WATER ..Date31\CUM_MASS, Date31\CUM_GROSS, Date31\WATER .. sehingga kalau diaplikasikan ke indirect ini jadi lebih simpel.

Oke lupakan itu, mari analisa script yang dibuat untuk generate report :
graphics
Astaga !!!
Si programmer membuat satu script untuk masing-masing row, walhasil ada 31 script (jumlah hari maksimal) disitu, yang secara konsep identik. Iseng-iseng toekang pinjam penggaris anak toekang dan diukur panjang script-nya 148cm ck ck ck. Dan perhatikan juga kesulitan yang dibuat si programer dibagian Connection String(blok biru) … coba dia suruh buat duplikat aplikasi ini dengan nama komputer berbeda. Pasti mabuk dia, harus mengganti satu persatu dimanapun ada sintak ini ‘Data Source = C175′ menjadi ‘Data Source = Nama_PC_Baru’, kenapa variable ini ngak disimpan di tag saja? sehingga jika ada perubahan hanya merubah nilai di tag ini ?

Jadi mari lihat solusi yang toekang berikan(ceile kaya psikiater aja !) :
graphics
Hanya itu ngak kurang ngak lebih. Penjelasannya begini: 1..31 mewakili tanggal buat loop aja, trus konvert ke string (iDate) trus umpankan ke SQL Statement(blok hijau) . Jadi data tiap harinya sudah didapat kan. Berikutnnya tugas Indirect tag untuk memasukkan ke masing-masing tag yang berkaitan (blok biru).

Akhirnya ..
Terkadang bukan hanya fungsi aja yang penting, ada apa dibalik itu juga lho. Kalau hanya sekadar fungsi tidak diragukan 100% aplikasi itu bekerja, cuman apa ngak dipikirkan takeovernya. Apalagi kalau memikirkan bahwa end-user itu skill programingnya rata-rata dibawah engineer SI kan. Dengan trend begini kemungkinan besar end-user menjadi tergantung pada SI dimana program itu dibeli. Lain halnya klo emang dibuat seperti itu … service itu kan bayar, bayar = income ha ha …

Ah semoga saja ngak, semoga saja si programer itu lagi sial … baru join diperusaan itu trus dikasih job bikin project ini. Belajar ala kadarnya, bikin program secepat mungkin .. berfungsi ..deadline terpenuhi.

27 Responses to “Script yang tidak efektif”

  1. Tonai says:

    hahahahaha
    keren keren

    yah mau di oil and gas ya sama aja pak
    tergantung engineer masing2lah
    hehehehe

    bapak mah enak, OS Engineer di sana mau buat indirect seapapun gak ngaruh gak ada yg meriksa, coba klo PLC/DCS engineer, bikin aneh sedikit aja dimarahin,hehehehe

  2. zulfitriza says:

    mas, pertam2 salut buat Mas yang mauh Share ilmunya disini, jadi kita2 yang berkeinginan tau lebih dalam dengan Wonderware jadi kebantu, perkenalkan panggil aja saya Zul Mas, saya baru mau dalamin SCADA diamplikasikan dengan Wonderware, jujur aja saya sangat pemula sekali, mungkin baru tau apa itu SCADA aja, tapi klu minta design blon bisa, jadi bisa bikin tutorial yang sangat beginer banget ngak Mas…contonya mulai design awal suatu sistem SCADA,, dan bertahap ditingkatkan terus pengembangan nya gitu..

    thank you

  3. idhar says:

    Pak e-one,,,

    pak klo mo belajar HMI InTouch (supaya lwbih terstruktur), langkah-langkahnya (trik-triknya) apa saja sih pak ?

    • toekang says:

      wah pertanyaan berat ..
      ya paling2 banyak-banyak liat contoh program yang sudah jadi ..
      nah dari situ pilih trik dan konsep yg paling sesuai ..:)

  4. idhar says:

    kalo begitu, boleh ga saya minta contoh program yang sederhana (tapi konseptual) pak e-one? soalnya kalo di manual pdf nya ga ada contoh ny pak.

  5. idhar says:

    pak e-one punya contoh yang sederhana untuk dipelajari oleh mhswa yang baru belajar InTouch ? soalnya kalo di pdf nya agak bingung juga.

  6. idhar says:

    Pak E-one, kalo “DA Server DASSIDirect” ini I/O servernya?

    • toekang says:

      ???? kok pertanyaanya ngak nyambung dgn topik diatas ?
      Sejak di luncurkan InTouch 8.0, WW memperkenalkan juga DA Server
      sebagai pengganti I/O Server.

  7. fajar maulana says:

    ass..
    pak iwan salam kenal dari saya, btw perbanyak ya artikelnya
    saya banyak belajar dai blog anda
    saya mendengar nama anda dari mas fathoni

  8. hidayat says:

    ass,,,,
    pak iwan salam kenal juga dari saya, disini saya baru pemula dan masih pembelajaran mengenai scada,

    saya ingin bertanya kepada bapak, gimana caranya mengkoneksikan scada dengan plc allen bradley>>?

    terima kasih sebelumnya,

  9. toekang says:

    salam kenal juga,
    Scada-nya apa?
    simpel-nya gini, install I/O Server yg dpt mengenali si PLC.
    klo di Wonderware bisa pake DASABCIP

  10. blawong says:

    ada yang tau penyebab error code : WWHEAP dengan remarks :/info–1PID=456Outoffreesharedmapformemmoryallocation(64512Bytes,1Maps)

    kira-kira di sebabkan oleh apa? seteleah saya cari-cari..katanya WWHEAP ini adalah bug di Intouch….namun dah di solve dengan adanya versi SP1

  11. toekang says:

    wwHeap = Wonderware Memory Manager, itu kira2 tool untuk memanage dinamic memory(hanya kira2 lho), sayang mas blawong ngk menjelasin errornya pas kondisi apa? enak2 running tau2 muncul spt itu atau apa? apakah kejadiannya sering? setelah direstart sembuhkan?
    dr kejadian itu biasanya toekang analisa problemnya.
    InTouch-nya versi brapa? klo Versi 9 dan 10 emang sudah keluar SP1-nya.
    Kadang2 InTouch seperti itu kalau pas Viewer & Maker run bareng. makanya sebisa mungkin toekang tidak sering2 run viewer dan maker bersamaan.

  12. rifki irawan says:

    mas kalo mau belajar dari dasar tentang wonderware hal pertama agar mudah memahami untuk selanjutnya apa yang harus dipelajari??!

  13. Nugroho says:

    mas mau tanya nih, saya mencoba baca dari database melalui wonderware kenapa g bisa ya??
    > isi binlist udah benar, karena saat insert dan update udah bisa

    saya coba pake script seperti ini g bisa:
    SQLSelect( ConnectionID, “TDEKIDAKA”, “DEKIDAKA”, “fid=1″, “” );

    lalu saya ganti dengan (yg di select hanay yg ada di bindlist):

    SQLSetStatement( ConnectionID, ” SELECT [fstart_hour] ,[fend_hour] FROM” );
    SQLAppendStatement( ConnectionID, ” [DB_Test].[dbo].[TDEKIDAKA] where fid = 1″ );
    SQLExecute( ConnectionID, “DEKIDAKA”, 0 );
    > masih g bisa juga ..

    apa script saya ada salah??.. mohon masa bantuan nya..pleaseee
    nuwun

    • toekang says:

      script kuplitnya gimana? sarat utama agar record bisa ke-retrieve itu pada statement ini :
      “SQLNext(ConnectionID);” , sudah ada baris itu?
      Dengan asumsi tidak ada error di Wonderware Loggernya … kemungkinan belum disisipi statement diatas.

  14. Nugroho says:

    maaf nih mo tanya lg..biar scrip nya enak diapndang d gmn ya??..::

    DIM i AS REAL;
    DIM line_ID AS MESSAGE;

    FOR i = 1 TO 23
    IF i tag yang saya pakai adalah tak local, bukan tagname …
    nuwun

    • Nugroho says:

      DIM i AS REAL;
      DIM line_ID AS MESSAGE;

      FOR i = 1 TO 23
      IF i < 10 THEN
      line_id =StringLeft( StringFromReal( i, 0, "f" ),1);
      ELSE line_id =StringLeft( StringFromReal( i, 0, "f" ),2);
      ENDIF;

      CALL funcSELECTdekidaka( line_ID);

      IF i == 1 THEN
      start_1 = START_HOUR ;
      end_1 = END_HOUR ;
      ELSE IF i == 2 THEN
      start_2 = START_HOUR ;
      end_2 = END_HOUR ;
      ELSE IF i == 3 THEN
      start_3 = START_HOUR ;
      end_3 = END_HOUR ;
      ELSE IF i == 4 THEN
      start_4 = START_HOUR ;
      end_4 = END_HOUR ;
      ELSE IF i == 5 THEN
      start_5 = START_HOUR ;
      end_5 = END_HOUR ;
      ELSE IF i == 6 THEN
      start_6 = START_HOUR ;
      end_6 = END_HOUR ;
      ELSE IF i == 7 THEN
      start_7 = START_HOUR ;
      end_7 = END_HOUR ;
      ELSE IF i == 8 THEN
      start_8 = START_HOUR ;
      end_8 = END_HOUR ;
      ELSE IF i == 9 THEN
      start_9 = START_HOUR ;
      end_9 = END_HOUR ;
      ELSE IF i == 10 THEN
      start_10 = START_HOUR ;
      end_11 = END_HOUR ;
      ELSE IF i == 12 THEN
      start_12 = START_HOUR ;
      end_12 = END_HOUR ;
      ELSE IF i == 13 THEN
      start_13 = START_HOUR ;
      end_13 = END_HOUR ;
      ELSE IF i == 14 THEN
      start_14 = START_HOUR ;
      end_14 = END_HOUR ;
      ELSE IF i == 15 THEN
      start_15 = START_HOUR ;
      end_15 = END_HOUR ;
      ELSE IF i == 16 THEN
      start_16 = START_HOUR ;
      end_16 = END_HOUR ;
      ELSE IF i == 2 THEN
      start_17 = START_HOUR ;
      end_17 = END_HOUR ;
      ELSE IF i == 18 THEN
      start_18 = START_HOUR ;
      end_18 = END_HOUR ;
      ELSE IF i == 19 THEN
      start_19 = START_HOUR ;
      end_19 = END_HOUR ;
      ELSE IF i == 20 THEN
      start_20 = START_HOUR ;
      end_20 = END_HOUR ;
      ELSE IF i == 21 THEN
      start_22 = START_HOUR ;
      end_22 = END_HOUR ;
      ELSE IF i == 23 THEN
      start_23 = START_HOUR ;
      end_23 = END_HOUR ;

      ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;
      ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;
      ENDIF;
      NEXT;
      "

      • toekang says:

        yang baris 4 sampe 8 itu maksudnya agar urut begini 01…23 ya, klo ya pake ini aja
        Text(i, “0#”); saja dan sejak kapan ada index pake real mas? integer atuh … :)

        yang start_1..23 dan end_1..23 masak bukan tagname? klo bukan tagnama buat apaan?
        masak mo nge-DIM segitu banyaknya variable?

        klo itu tagande ya buat aja indirect, seperti contoh diatas.

        • Nugroho says:

          tapi pakae real jg bisa lho..script nya udah ok, kalo pake text(i,”0#”) blm pernah :-P
          iya, saya nge-DIM segitu …

          udah tak oba bikin indirect tag nya, tp saya mau tanya bgaimana untuk mngerlurin nya ya??
          kan seperti ini ::

          STARThourly.Name = “start_”+line_ID;
          ENDhourly.Name = “end_”+line_ID;

          nah kalo mau tau isi/mengeluarkan dari ‘start_1′ (misal) gmn?, maklum blm pernah pakai indirect tag ..hehehe
          mohon bantuan nya ya :-)

        • toekang says:

          iya sih, cuman lucu juga ..lagian judulnya kan script yg tidak efektif, makanya integer akan lebih efektif drpd real dalam hal index-ing krn scr memory meke lebih kecil.
          —————————————–
          for i = 1 to 23
          iHourStart.Name = “start_” + id;
          iHourEnd.Name = “end_” + id;

          iHourStart = START_HOUR;
          iHorEnd = START_END;
          next i;

          coba baca ini juga : http://toekangscada.com/2009/09/25/indirect-tagmane-loop-simple/ dan download aja contoh di http://toekangscada.com/2013/12/27/wonderware-intouch-template-os-x/ … itu banyak make Indirect Tag

Leave a Reply