Pemrograman Berorientasi Objek dalam Bahasa Grafis

Object-oriented programming (OOP) adalah konsep yang dirancang untuk memfasilitasi pengembangan sistem yang kompleks dengan memperkenalkan konsep-konsep baru yang lebih dekat ke dunia nyata daripada bahasa pemrograman fungsional dan prosedural. Seperti Wikipedia menulis, "Bahasa manusia biasa secara keseluruhan mencerminkan ideologi OOP, dimulai dengan merangkum ide suatu objek dalam bentuk namanya dan berakhir dengan polimorfisme menggunakan kata dalam arti kiasan, yang akhirnya mengembangkan ekspresi representasi melalui nama objek ke konsep lengkap - kelas."




Tetapi dari sudut pandang setiap orang yang pertama kali menemukan abstraksi ini, setelah bahasa prosedural klasik tidak menjadi lebih jelas, tampaknya sebaliknya itu masih lebih membingungkan.


Di sisi lain, ada notasi grafis dari program, yang tidak dekat dengan bahasa manusia, tetapi jauh lebih dimengerti daripada kode apa pun, tidak seperti OOP. Mungkin saja ini lebih jelas bagi saya, dimanjakan oleh pendidikan teknik, tetapi ada banyak orang seperti saya dan teks ini untuk fisikawan manja yang sama yang tidak mengerti abstraksi tinggi.


Di sini, misalnya, adalah deskripsi nyata dalam notasi grafis dari algoritma kontrol katup gerbang NPP:



Gambar 1. Contoh program kontrol NPP dalam notasi grafis

Di sebelah kiri adalah sinyal input, di sebelah kanan adalah perintah.

Menurut saya, bahkan seorang anak pun dapat membaca algoritma seperti ini:

  • Jika pompa dihidupkan selama 60 detik dan laju aliran kurang dari 10, maka buka katup resirkulasi.
  • Jika pompa dihidupkan, maka berikan perintah untuk membuka dalam waktu 5 detik ke katup 001 dan 002.
  • Jika laju aliran lebih besar dari 20 dan pompa dihidupkan, maka dalam 5 detik untuk mengirim katup rana 003 untuk menutup.

Ketika saya masih mahasiswa, saya bekerja paruh waktu dengan membuat perpustakaan komponen untuk Delphi dan terbiasa dengan OOP secara langsung. Kemudian, ketika saya menemukan program kontrol pembangkit listrik tenaga nuklir yang sebenarnya, saya sangat terkejut bahwa tidak ada abstraksi, enkapsulasi dan, maafkan saya, polimorfisme, hanya rekomendasi C murni, dan MISRA C yang telah ditebang oleh peraturan sehingga semuanya dapat diandalkan , portabel, aman.


Puncak cutoff C dalam praktik saya adalah FIL, untuk sistem kontrol reaktor RBMK. Di dalamnya, fungsi ditulis dalam bahasa C, dikompilasi, dan kemudian dipanggil berdasarkan file teks, di mana mereka dijelaskan dalam bahasa FIL. Akibatnya, dimungkinkan untuk memanggil hanya sejumlah fungsi yang terbatas, tetapi diuji dengan cermat dan di-debug. Dan semua ini atas nama keselamatan dan keandalan.


Tetapi pada saat yang sama, sistem kontrol reaktor dan sistem kontrol NPP secara keseluruhan hanyalah kasus di mana prinsip-prinsip OOP harus diterapkan pada potensi penuh mereka. Bahkan, ada banyak peralatan serupa - katup, pompa, sensor, semuanya mudah diklasifikasikan, ada benda jadi yang sesuai dengan peralatan nyata. Tampaknya di sini - gunakan OOP, kelas, warisan, abstraksi, dan polimorfisme. Tapi tidak, Anda perlu C murni dan ini adalah persyaratan keamanan.


Dan kemudian - bahkan lebih menarik. Bahkan, program untuk mengelola pembangkit listrik tenaga nuklir tidak ditulis oleh programmer, tetapi oleh teknolog - hanya dia yang tahu apa dan kapan harus menutup, membuka, menghidupkan, dan yang paling penting - dia tahu kapan harus mematikan sampan, agar tidak jatuh. Dan programmer harus hati-hati mengimplementasikan semua ini dalam kode C. Dan lebih baik lagi, bahwa tidak akan ada programmer sama sekali, dan teknologinya sendiri menggambar algoritma teknologi dari program kontrol dalam bentuk grafis, secara otomatis menghasilkan kode C dan memasukkannya ke dalam peralatan kontrol. Standar keselamatan internasional merekomendasikan hal ini, dalam hal ini, seorang programmer - seperti pemain biola - tidak diperlukan. Dia hanya memperkenalkan kesalahan dan distorsi tambahan dalam implementasi pemikiran teknolog.




Apa yang mengejutkan saya ketika saya menemukan bahwa teknologi NPP dan desainer, terlepas dari programmer, telah mengembangkan dan berhasil menggunakan pemrograman berorientasi objek, dan bahkan dalam notasi grafis, tetapi kode yang dihasilkan sepenuhnya memenuhi persyaratan keamanan dan tidak mengandung artefak dari metodologi OOP .


Bahkan, jika Anda melihat kode yang dihasilkan dari rangkaian pada Gambar 1, kita akan melihat C murni tanpa kelas di sana.
Misalnya, tabel entri algoritme:


/* Index=0 UID=0 GeneratorClassName=TSignalReader Name=KBA__AA.KBA31EY001.alg_inp Type=  */ state_vars->kbaalgsv0_out_1_ = kba31ap001_xb01; state_vars->kbaalgsv0_out_4_ = kba31cf001_xq01; 

Hanya menetapkan variabel.
Setiap blok digambarkan sebagai menghitung output dengan input, dengan mempertimbangkan parameter yang ditentukan dalam daftar konstanta. Misalnya, blok "Lainnya" terlihat seperti ini dalam kode:


 /* Index=5 UID=5 GeneratorClassName=TLogBlock Name=KBA__AA.KBA31EY001.smu.GT2 Type=  */ locals->v5_out_0_ = state_vars->kbaalgsv0_out_4_ > consts->kbaalgsv3_a_; 

Output blok adalah hasil membandingkan sinyal input dengan nilai dalam konstanta.


Dengan demikian, di blok lain, variabel lokal dari variabel input dihitung secara berurutan, dan pada akhir siklus program, variabel ditulis ke variabel output.


 /* Index=14 UID=14 GeneratorClassName=TSignalWriter Name=KBA__AA.KBA31EY001.alg_out Type=  */ if((action==f_InitState)||(action==f_GoodStep)||(action==f_RestoreOuts)){ kba31ey001_yb01 = locals->v8_out_0_; kba31ey001_yb11 = state_vars->kbaalgsv9_out_0_; kba31ey001_yb12 = state_vars->kbaalgsv12_out_0_; kba31ey001_yb02 = locals->v13_out_0_; }; 

Di mana kelas di sini, Anda bertanya?


Seluruh metodologi yang terkait dengan OOP ada dalam nama variabel. Tampaknya ini bisa dalam nama variabel? Dan mungkin ada jurang yang dalam. Sebagai contoh, nama variabel adalah kba31ap001_xb01, hanya variabel dalam kode C yang memenuhi persyaratan untuk nama variabel. Namun, untuk seorang insinyur desain, tampilannya seperti ini: "Kompartemen reaktor, sistem pasokan air industri, pompa pertama, permulaan". Semua keajaiban konversi ini terjadi berkat sistem pengkodean Jerman yang luar biasa (Kraftwerk-Kennzeichensystem) KKS, kutipan:


โ€œSistem klasifikasi pengkodean ini dirancang untuk pembangkit listrik dan memiliki potensi besar, dan juga memperhitungkan fitur perangkat keras mikroprosesor yang dapat diprogram secara bebas.


Seiring dengan penandaan peralatan teknologi, badan eksekutif (shut-off, safety, shut-off, dll. Katup, mekanisme tambahan), titik pengukuran, unit pemasangan, perangkat otomasi, bangunan dan struktur, sistem KKS memungkinkan penandaan algoritma dan program dari berbagai jenis dan tujuan (pemrosesan algoritma untuk parameter teknologi yang diukur, pensinyalan, regulasi otomatis, perlindungan teknologi, kontrol logis: kunci, ABP, program langkah-demi-langkah, - kalkulasi Indikator hniko-ekonomi dan diagnostik peralatan teknologi), input, output dan sinyal antara algoritma dan program, rekaman video dari semua tingkatan yang ditampilkan pada terminal video, kabel, dll ... "


Tetapi yang paling menarik di bagian akhir nama adalah _xb01 , yang ditentukan melalui garis bawah. Jika Anda melihat basis sinyal untuk proyek manajemen, kita akan melihat kelas-kelas di sana yang dapat dimengerti dan akrab bagi semua orang yang dulu, di suatu tempat dan di suatu tempat tertarik pada OOP (lihat Gambar 2).



Gambar 2. Contoh struktur basis sinyal untuk sistem kontrol pembangkit listrik tenaga nuklir.

Kami memiliki kelas, atau tabel, pada gambar ini adalah kolom "Kategori". Misalnya, "KD1" yang memiliki tabel sinyal pola, bidang kelas Batas pengukuran atas, batas pengukuran lebih rendah, pembacaan sensor , dll. Merupakan abstraksi.


Dan ada juga implementasi kelas ini - sensor spesifik, misalnya, TK21F02B1, yang terletak di sirkuit, seperti yang mungkin Anda tebak dari namanya, di "Kompartemen reaktor, sistem pasokan air industri, pada pompa pertama", dan fakta bahwa ini adalah sensor aliran ada dalam judul ini, tetapi tidak akurat.


Dan instance dari kelas ini memiliki sinyal dan nilai-nilainya spesifik, dalam proses program, dan mereka dapat diakses dengan nama-nama bidang kelas. Misalnya, pembacaan sensor ditunjukkan oleh variabel TK21F02B1_XQ04.


Pada titik ini, kita dapat mengatakan, tunggu, ini bukan OOP sama sekali, atau bahkan tidak OOP sama sekali, itu hanya struktur data, itu dalam standar C. Dan di mana enkapsulasi metode di kelas? Pemrosesan data harus di kelas, maka ini akan menjadi metode OOP halal nyata.
Mari kita lihat bagaimana subroutine kontrol keandalan sensor terlihat dalam bentuk grafis. Gambar 3 adalah bagian dari rangkaian pemrosesan sinyal:



Gambar 3. Contoh program pemrosesan sinyal.

Dapat dilihat bahwa dalam pemrosesan subrutin nama variabel TK21F02B1_XQ04 digunakan, dibentuk sesuai dengan aturan KKS dan berdasarkan tabel bidang kelas. Dalam contoh di atas, pembacaan sensor dihitung dalam persen TK21F02B1_XQ03 sesuai dengan nilai yang ditetapkan dari bidang kelas contoh seperti TK21F02B1_Xmin dan TK21F02B1_Xmax.


Jika kita beralih ke kode yang dihasilkan dari skema ini, kita akan melihat tugas sederhana dari nilai ke variabel, C murni dan tidak ada plus dan OOP.


  /* Index=12 UID=12 GeneratorClassName=TSignalReader Name=KD1.kd3_45.SR6 Type=    */ state_vars->su100v12_out_0_ = tk21f02b1_ai; 

Dan penugasan hasil perhitungan, juga sebagai penugasan sederhana dari suatu variabel (dengan memeriksa validitas nomor, agar tidak menjatuhkan sistem jika kami menerima kesalahan sebagai hasil dari pemrosesan sinyal)


 /* Index=100 UID=100 GeneratorClassName=TSignalWriter Name=KD1.kd3_45.SW3 Type=    */ if(isfinite(locals->v63_out_0_)){ tk21f02b1_xq04 = locals->v63_out_0_; }; 

Dan pada saat apa persatuan bidang metode pengolahan kelas ini muncul? Bahkan, saya kenal dengan dua opsi untuk fokus ini. Sekarang kita akan menganalisis salah satunya. ( Opsi kedua diuraikan di sini .. )
Mari kita lihat bagaimana blok tempat rangkaian program pemrosesan dikonfigurasikan pada diagram (lihat Gbr. 4).


Kami memiliki sirkuit di mana kami menempatkan blok submodel dari bahasa pemrograman grafis, di dalam blok ini adalah sirkuit grafis, bagian dari yang ditunjukkan pada Gambar 3, sebuah program untuk memproses sinyal dari sensor.


Dalam properti blok ini, kita melihat bidang basis data sinyal dan daftar drop-down yang berisi sinyal yang sudah ada dalam basis data, contoh kelas, sensor spesifik jenis ini. Cukup memilih sensor yang diinginkan, instance kelas dengan nama, dan keajaiban terjadi. Dalam skema tersebut, semua blok baca dan tulis menerima nama dari tipe TK21F02B1_XQ03 , (kelas contoh nama sensor + nama bidang).


Sekarang, ketika membuat kode C, semua variabel akan menerima nilai dari sensor yang diinginkan. Dan programmer tidak diperlukan, teknologis melakukan semuanya sendiri ketika ia mengembangkan skema dalam bahasa pemrograman grafis untuk algoritma kontrol NPP.



Gambar 4. Contoh pengaturan sirkuit pemrosesan sensor.

Untuk menetapkan nama, skrip otomasi khusus digunakan dalam lingkungan desain sistem kontrol, kira-kira sama seperti pada Gambar 5. Semua blok bacaan dalam diagram diberi nama yang terdiri dari nama objek dan nama bidang dalam kelas (lihat Gambar 5).



Gambar 5. Mengatur nama variabel dalam membaca blok.

Jelaslah bahwa dengan cara yang sama sejumlah opsi pemrosesan sinyal yang tidak terbatas dapat dibuat, pada dasarnya metode untuk kelas dalam metodologi OOP. Dengan cara yang sama, mereka dapat dibentuk untuk sensor, yang disimpulkan ketika ditampilkan pada frame video sistem SCADA, atau misalnya, pemrosesan prosedur untuk mengubah pengaturan. Diagram dibuat dalam bentuk grafis, disimpan sebagai blok dan digunakan jika perlu.


Untuk meringkas: dalam bahasa pemrograman grafis, metode OOP juga digunakan dan bermanfaat. Dan setelah menghasilkan kode sumber untuk program kontrol, semua artefak dari metodologi OOP menghilang dan tetap bersih C, aman, dapat diandalkan, diverifikasi.


Jelas bahwa aplikasi alat otomasi tersebut, selain mempercepat pengembangan, juga dapat secara signifikan mengurangi waktu pengembangan, jumlah kesalahan dalam program kontrol.

Source: https://habr.com/ru/post/id451148/


All Articles