:: Automation :: Database :: HMI/Scada :: Wonderware Add comments
Ada dua tipe data dalam dunia database kalau dilihat dari jumlah tabel yaitu data yang diambil dari single table dan data dari multi table. Single table biasanya hanya menyediakan informasi sederhana, untuk data yang komplek umumnya dipecah-pecah ke dalam beberapa tabel atau lebih dikenal dengan proses normalisasi. InTouch mensupport keduanya, tentunya ada sedikit perbedaan dalam menangani kedua tipe data tersebut.
Singel Tabel
Ambil contoh tabel dibawah :

Langkah pertama untuk ambil data dari tabel itu ya harus buat dulu BindList seperti ini :

Itulah fungsi BindList, yaitu memetakan antara variable di InTouch yang lebih dikenal sebagai Tag dengan kolom tabel di database.
Kemudian script untuk mengambil data adalah seperti ini :

Ngak perlu pusing dengan banyaknya kode di situ, perhatikan saja pada script yang telah toekang beri tanda(box). Untuk mengambil data dari single table cukup memakai sintak SQLSelect. Argument pertama SQLSrv\ID itu Connection ID, kedua adalah nama tabel di database, berikutnya nama BindList, dua argument lainnya adalah Where Expression dan Order Expression dikosongi karena data diambil semua dan ngak diurutkan.
Data-data itu akan ditampilkan ke dalam dua buah listbox yaitu ‘lbxName’ untuk menampilkan Nama device dan ‘lbxDesc’ untuk menampilkan deskripsi device. Hasil akhirnya adalah seperti ini :

Apakah hanya itu caranya ? tidak kita juga bisa memakai kombinasi ‘SQLSetStatement()’ dan ‘SQLExecute()’ seperti ini :

Meskipun lebih komplek tapi cara ini menawarkan fleksibelitas, karena sudah tidak lagi tergantung pada nama fisik table dan kolom di database lagi. Tabel dan kolom yang digunakan adalah tabel/kolom virtual hasil dari SQL Query.
Bingung ?? mari lihat sintak yang berbeda untuk menampilkan tabel diatas:

Hasil akhir sama, tetapi nama kolom berbeda kan? Nantinya nama kolom ini yang dipakai BindList di InTouch seperti ini:

Jika skript untuk ambil data seperti ini :

Selanjutnya untuk menangani multi teble, metode ini yang akan dipakai.
Multi Table
Terkadang untuk alasan fleksibelitas dan efisiensi tabel akhir tidak hanya dibentuk dari sebuah tabel, ia dibuat oleh beberapa tabel. Coba perhatikan tabel log berikut :
Tabel A : Data yang dibentuk dari beberapa tabel.

Perhatikan dibagian sintak SQL-nya, dari sini diketahui bahwa tabel itu dibentuk dari empat buah tabel yaitu : Tabel TDevice yang dipakai sebagai contoh untuk sigle table sebelumnya, tabel TType dan TEU :

dan tabel Log(data) itu sendiri :

Untuk mengambil data seperti yang ada dalam tabel A, seperti biasa buat dulu BindList seperti ini:

Dan ini untuk script InTouch-nya :

Ada sintak baru disitu yaitu SQLAppendStatement() untuk apa, untuk menambah perintah SQL terhadap perintah sebelumnya. Lho kenapa ngak dibuat simple aja, buatkan variabel dan masukkan semua perintah ke variabel itu. Justru itu, message variabel di InTouch kan hanya bisa menampung maksimal 131 karakter selebihnya akan diabaikan dan sintak SQL di InTouch juga harus patuh pada aturan itu, makanya perlu dipecah-pecah pakai SQLAppendStatement() ini.
Stored Procedure
Toekang sendiri kurang menyukai style diatas dimana semua kode di jejalkan ke dalam InTouch. Untuk perintah-perintah SQL yang komplek, toekang lebih memilih membuat stored procedure (sp) langsung di SQL seperti ini :

dengan ’spGetData’ sebagai nama Stored Procedure-nya, nantinya di InTouch tinggal di eksekusi aja Stored Procedure ini dengan perintah ‘EXEC spGetData’ :

Simpel kan ? Di samping itu manfaat lain jika dibuatkan di sp ini kita dapat langsung tau hasil dari sintak-sintak SQL yang kita buat, mudah memaintenannya, lebih cepat karena langsung di proses di server. Btw ..terserah anda, nyaman pake yang mana.
Sekedar Tip !
Selalu pantau Wonderware Logger ! Seringkali kita sibuk mencari dimana letak kesalahan kode kita tanpa menengok ke fasilitas standard yang telah diberikan oleh Wonderware ini, padahal disitu sering masalah kita telah dijelaskan dengan detil.


Tnx..good article..
Menambah wawasan bangets..
hehehehe
keren banget pak
cuma kayaknya nie levelnya buat midle to high
klo buat pemula pasti pusing hehehe
Ah ngak juga ..low, midle, high ..ingusan, pakar ..itu kan kamu aja yang membuat area spt itu
ya tetep aja pak
kayak alarm analog input aja ada HHH, HH, H, L, LL, LLL
inget gak? hehehehehe
Ha ya yang itu … wah aku babak belur di protes operator ..napa makin banyak sih kategorinya, padahal tipikal orang Viscose kan ngak mau ribet …, lha sampe sekarang pun yg namanya alarm itu ya yang kelap-kelip merah haha
Gimana koneksi wonderware kalo pake database yang gratisan kayak MySql misalnya..? Kan lumaya ngirit, daripada “lumanyun”….’He..he..he……!
Kalau tujuannya hanya gratis MSDE(SQL Server 2000 versi gratis), SQL Server 2005 Express Edition, Oracle 10g Express Edition itu semua gratis.
Tapi kalau udah familier MySQL dan pingin coba konek ke InTouch satu2nya cara sampe saat ini ya via ODBC bisa pake MyODBC download disini http://www.mysql.com/products/connector/odbc/.
Dulu toekang pernah buat aplikasi InTouch-MySQL-PHP untuk intranet, agak lambat insert data ke MySQL kalau jumlah datanya banyak … ini mungkin karena pake ODBC itu.
Saya menggunakan InTouch 9.0 dan PLC ABB Masterpiece 200/1. Saya ingin menampung semua deskripsi alarm ‘OK’/'Fault’ pada SQL Server 2000. Alarm dari field dikirim oleh PLC dengan DAT type Integer.
Contoh: 1:1:I105 (Port1:PLC1:DAT(I)105) berisi 16 bit. Saya ingin membuat script untuk membaca setiap perubahan tiap bit I105.
Selama ini saya membuat tag untuk masing-masing bit, wah sangat boros tag (puluhan DAT x 16). Barangkali toekang berkenan memberikan solusi untuk masalah saya ini. Trims
Kalo tujuannya untuk menghemat tag bisa saja, yang di akses dari PLC hanya nilai Integer(16bit) atau Integer(32bit-> yg ini hanya bisa kalau pake OPC). Tetapi akan banyak effort di script. Buatlah pasangan Nilai Integer tadi misal tag A01 yg IO Integer, A01in memory integer. Nah buatlah skrip DataChange untuk setiap tag Alarm, di skrip itu nanti A01 dipecah misal A01.00 untuk bit pertama compare dgn bit A01in.00 kalo berbeda tulis alarm ke SQL server diakhir script transfer nilai A01 ke A01in sebagai pengingat status terakhir.
Tips-nya pake QuickFunction untuk skrip ini plus manfaatin Indirect Tag + Superscript agar lebih effisien.
Satu hal lagi karena alarm ini terpisah dari alarm built-in, ya harus konsisten semuanya harus dibuat model gini.
makasih, Pak. membantu sekali
sama - sama
sekedar nimbrung..
untuk check error connection:
ResultCode =SQLSelect(ConnectionID,”",”",”",”");
if ResultCode 0 then
ErrorMsg=SQLErrorMsg(ResultCode);
endif;
yup betul sekali …
dulu toekang sering pake scrip ini, tapi belakangan ngak pernah
soalnya nambah banyak skripnya, trus analisanya kadang kurang lengkap (ErrorMsg itu kan message tag yg panjangnya max 131 char),
toekang lebih suka mlototin langsung di logger-nnya ..lebih komplit.
saya buat table dimana akan dilakukan insert melalui intouch serta di panggil lewat intouch seperti tutorial di atas.
kalo insert sudah berhasil tapi kalo manggil kok tidak muncul??
tutorial yg dipake
-OLEDB(http://toekangscada.web.id/2008/04/22/di-intouch-oledb-menjadikan-hidup-lebih-mudah/)
-Singel Tabel(http://toekangscada.web.id/2008/04/25/intouch-sql-untuk-single-dan-multi-table/)
Maksudnya manggil itu Select ?
Data itu mau ditampilkan ke mana, di contoh ini kan ke ‘Listbox’ ya
harus dibuatin object ‘Listbox’-nya dulu.
Adda pessan error ngak ? klo sintak SQL-nya ngak jlimet bisa pake cara mas Suryana itu ..ato klo males bisa liat di loggernya
Pak Toekang, nanya lagi donk!!!
Kalo di access tuh ada properties “required” dimana waktu tabel tersebut g diisi maka ada notification nya. Nah kalo di sql yg mana yach???
nah kan udah jelas di help-nya (tekan F1)
property required itu jika diisi dgn yes brarti setiap kita masukin record field ini harus diisi tidak boleh kosong atau null.
nah padanannya di SQL Server ya tentu saja ‘allow null’
ardneh jgn dijawab mulu pak
biar suruh mikir dulu, klo gak gitu gak bisa bisa nanti hahahaha
yach tega nich bang Fathoni…..
btw kalo q munculin $operator kok g mo muncul yach tp kalo $datestring ma $timestring bisa muncul
masak seh ???
di tempatku kok muncul … itu variable (message/string) default
aja (tanpa ada yg login) kan sudah berisi ‘none’
eh iya bisa, maaf ada lalai di tagname…
makasih bang…
Bos,
Procedure diatas itu untuk keperluan Intouch membaca dari SQL ato sebaliknya SQL ambil data dari Intouch?
Untuk cara SQL ambil data dari Intouch apakah bisa diterapkan pake Stored Procedure tersebut?
Thanx
Toekang belum pernah tau ada cara agar SQL bisa baca data dari InTouch…
Mungkin bisa kali ya pake fasilitas triger di SQL Server … btw untuk semua tutorial di sini adalah dari aplikasi klien (InTouch) menulis/membaca data ke SQL Server
Pak,
Saya ingin menanyakan yg mungkin aga melenceng, maklum pemula he he he.. Kalau di intouch tersebut jika kita sudah mengambil data dari database tersebut lalu ingin membuat/menconvert table tersebut dalam format excel, bagaimana caranya ya pak?
Mohon bantuannya pak, Thanks…
Pake DDE juga bisa walau agak ribet …
klo toekang sih lebih suka langsung di EXCEL-nya pake macro ..
klo urusan bikin laporan or nampilin data ke Excel
Have you ever tried to use OLE to manipulate database such as Access?
OLE_CreateObject(%pCnn,”ADODB.Connection”);
pCnn.Open(”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + InfoInTouchAppDir() + “\Test.mdb”);
OLE_CreateObject(%m_RS,”ADODB.Recordset”);
%m_RS.Open( “Customers”, %pCnn, 3
%m_RS.AbsolutePosition = 2; {Move to 2nd record}
%m_RS.Fields(”Name”).Value = “toekang”;
%m_RS.Update();
But Intouch reported error at %m_RS.Fields(”Name”).Value.
Intouch seemed not support this ADODB recordset property.
Email me: magnaforemost@gmail.com
Are You Sure used Wonderware InTouch ?
As I know InTouch doesn’t have function like OLE_Create() and
InTouch doesn’t support OOP like pCnn.Open() except You create
this in ActiveX object
Sure.
Intouch support OLE very good,but the limitation is that Intouch only support 4 type of data such as String(Message 0 then
Test1=%obj1.ShowOpenDialog(”Refiner”,”wav File|*.wav”,1,”Open a Sound File”,”C:\AlarmSound”,sFilename);
PlaySound(Test1,16);
EndIf;
OLE_CreateObject(%pCnn,”ADODB.Connection”);
%pCnn.Open(”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + InfoInTouchAppDir() + “\Test.mdb”);
OLE_CreateObject(%m_RS,”ADODB.Recordset”);
%m_RS.Open( “Customers”, %pCnn, 3
%m_RS.AbsolutePosition = 2; {Move to 2nd record}
%m_RS.Fields(”Name”).Value = “toekang”; {Problem,Problem!!!}
%m_RS.Update();
OLE_CreateObject(%pCnn,”ADODB.Connection”);
%pCnn.Open(”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + InfoInTouchAppDir() + “\Test.mdb”);
OLE_CreateObject(%m_RS,”ADODB.Recordset”);
%m_RS.Open( “Customers”, %pCnn, 3);
%m_RS.AbsolutePosition = 2; {Move to 2nd record}
%m_RS.Fields(”Name”).Value = “toekang”; {Problem,Problem!!! Intouch is expecting a semicolon after %m_RS.Fields(”Name”) instead of Value of Field’s member.}
%m_RS.Update();
Intouch doesn’t support Variant Data type,that’s the reason why Intouch report errors %m_RS.Fields(”Name”).Value = “toekang”; since %m_RS.Fields(”Name”).Value is a variant.
You didn’t show how to put data from Intouch into dbo.Tdata and dbo.TDevice,dbo.TType,dbo.TEU.Please write another tutorial.
Thx.
Yes You right..
This is only simple sample to show different between single and multiple table ..
You can use function SQLInsert() to put data from InTouch to database
My reply was was truncating.
Please drop me an email at:
magnaforemost@gmail.com
Ae ?
ae kak thoni, gmana kbarny ^^
Kak, Please Help Me… !
Qu k susahan pas d excel ny ma di data base ny & klo bisa tambahan ny g’mana carany flash (swf) dan scada wonderware intouch saling terkoneksi.
Kendala :
1. d excel kn aq dah nyoba pake wwwpoke (), ma wwwrequest ().
aq coba2x berhasil tuh.
tpi yg jdi kndala ny sini, file excel harus di buka dulu.
aq pengen ny langsung tanpa di buka applikasi terlebih dahulu ?
2. Trus d database ny aq pengen melihat count record d database ?
3. Trus, bisa g klo di scada wonderware mencari file data terus
mengupdate ny, tanpa di bantu oleh ActiveX, VB taw pun DELPHI
jadi langsung di script wonderware ny ?
4. Trus, g’mana cara ny TREND bisa aq Print Screen
(ambil grafik gambarnya), buat di PRINT ?
5. Trus g’mana cara ny, pengen sisipin flash swf, di scada intouch
& klo bisa var d flash bisa saling terkoneksi ama scada
intouch ?
6. Trus g’mana tutorial ny ngegunakan alarm configuration ?
Aq tunggu jawaban ny y kak, cz ntar lgi mo di running pkerjaan ny.
Please ya kak.
Klo bisa sample ny ma doc
kirim ja ke
mif_puzzle@yahoo.co.id
PLEASE…. !
Sukses trus, buat kak thoni…
& Sukses trus, buat automation industry.
maaf mas (or mbak) ..
Fathoni bngak disini … dia di toekangplc.com
toekang coba jawab ya (sori Ton ..ini mestinya kerjaan ente) :
1. Tujuan wwwpoke() & wwwrequest() ini buat apa ya?
klo hanya untuk menguji validasi data ..lebih akurat wwclient
bawaan InTouch(untuk ver 8.0 ke atas di install terpisah)
2. ngak ngerti mksud pertanyaannya …:(
3. Bisa, Intouch kan nyediain script2 siap pake untuk akses ke
database. Coba aja pake fungsi SQLSelect() di kombinasi dengan
SQLInsert(), klo kurang mantap buat aja stored procedure dan
akses pake SQLExecute().
4. Bisa pake fungsi PrintWindow()
5. Flash kayaknya sampe InTouch 9.5 belum bisa (kecuali kalau
pake ActiveX.
6. belum sempat bahas alarm ..
moga-moga membantu
Mas toekang…
mau nanya nich..kalau untuk mengkoneksi SQL server 2005 dengan WinCC gimana ya? maksudnya untuk manggil tag yang ada di project.mcp bagaimana caranya? diatas disebut bindlist…apa softwarenya kita buat sendiri atau memang bawaan InTouch? Bisa diaplikasikan ke WinCC nggak?
Mohon pencerahannya.
Sukses selalu
Toekang sedikit sekali elmu WinCC-nya.
Klo di WinCC kan sudah ada paket database server-nya, tergantung
versinya. Dulu tukang pake yg versi 6 SP2 itu di bundle ama SQL Server 2000. Yg lebih baru kayaknya sudah SQL 2005.
Nah klo pake versi native-nya kan bisa langsung pake user archive.
Klo mo maksain (cuman benepit-nya apa ya?) bisa saja WinCC 6 SP2 yg di bundle dgn SQL 2000, konek ke SQL 2005 .. tinggal obrak-abrik saja VBS-nya ..:) bikin aja object2 untuk konek ke SQL 2005 pake OLEDB.
bindlist itu bikinan InTouch aja, jadi ngak bisa diterapkan general. kasarnya itu cara InTouch untuk memudahkan keluar-masuk data ke dan dari DB.
Finally self-solve my question:
OLE_CreateObject(%pCnn,”ADODB.Connection”);
%pCnn.Open(”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + InfoInTouchAppDir() + “\Test.mdb”);
OLE_CreateObject(%m_RS,”ADODB.Recordset”);
%m_RS.Open( “Customers”, %pCnn, 3);
%m_RS.AbsolutePosition = 2; {Move to 2nd record}
%Field=%m_RS.Fields.Item(1) {Add an OLE Object Field for Field “Name”}
%Field.Value = “toekang”;
%m_RS.Update();
Supposed to be %m_RS.Open(“Customers”, %pCnn, 1,3); {adOpenKeyset, adLockOptimistic}
terima kasih banyak nih
sangat membantu banget penyusunan tugas saya..
^_^
sukses selalu
permisi mas, numpang nanya gimana caranya database yang dibuka lewat intouch jadi triger ke PLC ??
terima kasih sebelumnya..
^_^
Via tagname yang telah didefinisikan di bindlist, kan tag tersebut dapat nilai dr database. Emang kasusnya seperti apa kok sampe memerlukan triger PLC dr Database?
kasusnya identifikasi benda dengan webcam, hasil identifikasinya disimpan dalam database, hasil identifikasi ini yang dipakai buat ngegerakin aktuatornya mas,,
^_^
oke mas saya coba pake bindlist, terima kasih sarannya
…
apa ngk bisa potong kompas Sensor benda ke PLC –> actuator, parelel dgn itu PLC –> Wonderware –> Database. Lain cerita klo Sensor + Database udah jadi satu paket.