Ini adalah dua posisi karena memiliki 2 posisi: terbuka (on) dan tertutup (off), dalam literatur berbahasa Inggris on-off. Ada juga tiga atau lebih pengatur posisi, yaitu, katup pengisian air terbuka atau tertutup ke posisi utama, dan posisi "sedikit terbuka" ditambahkan. Setelah menguras air di toilet, pelampung turun, membuka katup sepenuhnya dan air memasuki tangki dengan tekanan penuh, tetapi lebih dekat ke level yang ditentukan, pelampung naik, menutup katup dan mengurangi aliran air. Dan segera setelah permukaan air saat ini (dalam bahasa Inggris PV - Nilai Proses - Nilai saat ini ) naik ke set (dalam bahasa Inggris SP - Set Point - Setpoint), katup menutup dan permukaan air berhenti naik. Dalam kasus yang dijelaskan, pengontrol bahkan lebih mirip dengan pengontrol proporsional - tindakan kontrol berkurang dengan mengurangi ketidaksesuaian (kesalahan), yaitu perbedaan antara tingkat yang ditetapkan dan tingkat saat ini.
Dengan sedikit membuka pipa bawah untuk mengalirkan air, akan mungkin untuk mencapai keadaan seperti itu ketika katup terbuka penuh, dan ketinggian air tidak berkurang (yaitu, aliran air menjadi sama dengan sumbernya) - sistem memasuki keadaan kesetimbangan. Tetapi masalahnya adalah bahwa keadaan ini sangat berbahaya - setiap gangguan eksternal dapat merusak keseimbangan ini - katakanlah kita dapat mengambil sejumlah air dari tangki, dan kemudian mungkin saja semua air akan mengalir keluar dari tangki (karena perubahan tekanan), atau pipa isi ulang akan tersumbat dan aliran akan berkurang, atau pelampung akan pecah dan air akan meluap. Inilah kompleksitas sistem kendali gedung - sistem nyata yang cukup kompleks dan memiliki banyak karakteristik yang harus diperhatikan.Ada karakteristik seperti inersia sistem - jika Anda mematikan kompor yang dipanaskan, maka akan tetap panas untuk waktu yang cukup lama, itulah sebabnya regulator yang lebih kompleks digunakan untuk mengontrol suhu, yaituPID - Diferensial Integral Proporsional . Setiap komponen memiliki karakteristiknya sendiri - semuanya berperilaku berbeda dalam kondisi yang berbeda, tetapi bila digunakan bersama, mereka memungkinkan pencapaian regulasi yang cukup jelas. Semua sistem ini dihitung menurut rumus, tetapi dalam kasus ini yang penting adalah memahami bagaimana sistem akan berperilaku ketika koefisien pengontrol PID berubah: dengan peningkatan tautan proporsional, dampak awal meningkat dan dengan demikian sistem akan dapat dengan cepat mencapai parameter yang diperlukan. Tetapi jika Anda berlebihan, maka overshoot mungkin muncul, yang mungkin lebih buruk daripada kecepatan sistem yang rendah.
Selama keberadaan TAU, deskripsi matematis dari banyak proses ditemukan dan sekarang kami dapat memprediksi bagaimana sistem akan berperilaku dalam keadaan tertentu. Ada banyak program simulasi di mana Anda dapat mengatur parameter sistem, mengatur parameter regulator dan secara kasar melihat apa yang akan terjadi. Saat menjelajahi Internet, saya menemukan situs Excel untuk insinyur, dan ada beberapa simulator regulator, berkat itu Anda dapat melihat perubahan dalam proses saat mengubah faktor kontrol. Yang paling mudah untuk diulang adalah, tentu saja, kontrol ON-OFF., yaitu, dalam bahasa Rusia, regulator dua posisi. Izinkan saya mengingatkan Anda tentang prinsip operasi: jika nilai proses saat ini (Nilai proses = PV) adalah suhu, misalnya, di bawah setpoint (SP), maka regulator menyala (OP) - elemen pemanas dimulai dengan kapasitas penuh. Segera setelah suhu mencapai titik setel, regulator mematikan pasokan tegangan ke elemen pemanas.
Membuat simulator JavaScript
Untuk membuat bagan, saya akan menggunakan pustaka ZingChart - ternyata cukup sederhana dan mudah digunakan. Ada banyak contoh dalam dokumentasi di mana Anda dapat membuat apa saja. Prinsip plotting cukup sederhana - ada larik nilai yang secara otomatis ditempatkan pada grafik secara berurutan, dan dengan demikian grafik proses berkelanjutan muncul dari beberapa ratus titik. Omong-omong, dalam bahasa aslinya di Excel, semuanya dilakukan dengan cara yang persis sama - 300 nilai dihasilkan dan grafik dibuat.
Sebenarnya, itu adalah pembangkitan nilai yang paling sulit, yaitu kesulitan dalam mendeskripsikan proses dengan benar yang bereaksi dengan benar terhadap tindakan kontrol kita - menyalakan elemen pemanas - suhu naik, mematikan - turun, ditambah kelembaman sistem harus diletakkan di sini. Selain itu, lingkungan pemanasan bisa berbeda dan beberapa media memanas dan mendingin lebih cepat, dan beberapa sebaliknya, dan jika kita menyesuaikan levelnya, maka dengan aliran yang sama dari atas, level akan naik lebih tinggi di tangki di mana area dasar lebih kecil. Semua ini saya mengarah pada fakta bahwa prosesnya juga akan tergantung pada transmisi (keuntungan). Dalam bahasa aslinya, parameter penundaan juga dimasukkan ke dalam proses (yah, seperti sistem tidak segera menanggapi sinyal kontrol), tetapi saya memutuskan untuk meninggalkannya - dua sudah cukup. Tapi saya menambahkan perubahan pada pengaturan,meskipun ternyata setpoint dapat berubah dari nol menjadi 100, lebih dari 100 proses mulai berperilaku berbeda, dan tampaknya alasannya adalah rumus proses bersifat universal dan tidak menjelaskan kasus tertentu. Secara umum, mari kita mulai:
Kami membuat 5 bidang untuk memasukkan parameter, meletakkan semua ini dalam tabel, yang kami lukis dengan warna yang bagus di atas di css dan letakkan di tengah:
<table align="center" oninput="setvalues ();">
<tr>
<td>
Process parameters <br>
Gain: <input id="gain" type="number" value ="1" ><br>
Time Constant: <input id="time" type="number" value ="100" ><br>
</td>
<td>
Control parameters <br>
SetPoint(0-100): <input id="sp" type="number" value ="50"><br>
Hysteresis: <input id="hyst" type="number" value ="1">%<br>
</td>
<td>
Plot parameters <br>
Points: <input id="points" type="number" value ="200"><br>
</td>
</tr>
</table>
Seperti yang Anda lihat, setiap kali nilai bidang di dalam tabel berubah, fungsi setvalues ββ() akan dipanggil. Di dalamnya, kami membaca data dari setiap bidang menjadi variabel khusus.
let gain = document.getElementById('gain').value;
let time = document.getElementById('time').value;
let sp = document.getElementById('sp').value;
let points = document.getElementById('points').value;
let hyst = document.getElementById('hyst').value;
Seperti yang telah disebutkan, untuk membuat grafik, Anda memerlukan array dengan data yang menjadi dasar grafik tersebut dibangun, jadi kami membuat banyak array:
let pv = []; //
let pv100 = []; // *100
let op = []; // 1 , 0
let pvp = 0; //
let low = sp-sp*hyst/100;//
let high = +sp+(sp*hyst/100); //
let st=true; //
Saya akan menjelaskan sedikit tentang histeresis. Situasinya begini: ketika suhu mencapai nilai yang ditetapkan, elemen pemanas dimatikan dan segera (sebenarnya, tidak segera, karena ada inersia) proses pendinginan dimulai. Dan setelah mendingin satu derajat atau bahkan sebagian kecil derajat - sistem menyadari bahwa ia telah melampaui cakupan tugas lagi dan Anda perlu menyalakan elemen pemanas lagi. Dalam mode ini, elemen pemanas akan hidup dan mati sangat sering, mungkin sesuatu yang beberapa kali per menit - untuk peralatan, mode seperti itu tidak terlalu baik, dan oleh karena itu, untuk mengecualikan fluktuasi seperti itu, yang disebut histeresis diperkenalkan - deadband - deadband - katakanlah 1 derajat lebih tinggi dan di bawah set point, kami tidak akan bereaksi, dan kemudian jumlah switching dapat dikurangi secara signifikan. Oleh karena itu, variabel rendah adalah batas bawah setpoint, dan variabel tinggi adalah batas atas.Variabel st melacak pencapaian tingkat atas dan memungkinkan proses jatuh ke bawah. Logika dari seluruh proses berada dalam satu lingkaran:
for (var i=0;i<points;i++) {
if (pvp<=(low/100)) {
st=true;
op[i]=1;
}//
else if (pvp<=(high/100)&& st) op[i] = 1;
else { st=false; op[i]=0;}
let a = Math.pow(2.71828182845904, -1/time);
let b = gain*(1 -a);
pv[i] = op[i]*b+pvp*a;
pv100[i] = pv[i]*100;
pvp = pv[i];
}
Hasilnya, kami mendapatkan array dengan jumlah poin tertentu, yang kami kirim ke skrip charting.
scaleX: {
zooming: true
},
series: [
{ values: op , text: 'OP' },
{ values: pv100 , text: 'PV'}
]
};
Kode lengkap di bawah spoiler
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.zingchart.com/zingchart.min.js"></script>
<style>
html,
body,
#myChart {
width: 100%;
height: 100%;
}
input {
width: 25%;
text-align:center;
}
td {
background-color: peachpuff;
text-align: center;
}
</style>
</head>
<body>
<table align="center" oninput="setvalues ();">
<tr>
<td>
Process parameters <br>
Gain: <input id="gain" type="number" value ="1" ><br>
Time Constant: <input id="time" type="number" value ="100" ><br>
</td>
<td>
Control parameters <br>
SetPoint(0-100): <input id="sp" type="number" value ="50"><br>
Hysteresis: <input id="hyst" type="number" value ="2">%<br>
</td>
<td>
Plot parameters <br>
Points: <input id="points" type="number" value ="250"><br>
Animation: <input type="checkbox" id="animation">
</td>
</tr>
</table>
<script>
setTimeout('setvalues ()', 0);
function setvalues (){
let gain = document.getElementById('gain').value;
let time = document.getElementById('time').value;
let sp = document.getElementById('sp').value;
let points = document.getElementById('points').value;
let hyst = document.getElementById('hyst').value;
let anim = document.getElementById('animation').checked ? +1 : 0;
let pv = []; //
let pv100 = []; // *100
let op = []; // 1 , 0
let pvp = 0; //
let low = sp-sp*hyst/100; //
let high = +sp+(sp*hyst/100); //
let st=true; //
for (var i=0;i<points;i++) {
if (pvp<=(low/100)) {
st=true;
op[i]=1;
}
else if (pvp<=(high/100)&& st) op[i] = 1;
else { st=false; op[i]=0;}
let a = Math.pow(2.71828182845904, -1/time);
let b = gain*(1 -a);
pv[i] = op[i]*b+pvp*a;
pv100[i] = pv[i]*100;
pvp = pv[i];
}
ZC.LICENSE = ["569d52cefae586f634c54f86dc99e6a9", "b55b025e438fa8a98e32482b5f768ff5"];
var myConfig = {
type: "line",
"plot": {
"animation": {
"effect": anim,
"sequence": 2,
"speed": 200,
}
},
legend: {
layout: "1x2", //row x column
x: "20%",
y: "5%",
},
crosshairX:{
plotLabel:{
text: "%v"
}
},
"scale-y": {
item: {
fontColor: "#7CA82B"
},
markers: [
{
type: "area",
range: [low, high],
backgroundColor: "#d89108",
alpha: 0.7
},
{
type: "line",
range: [sp],
lineColor: "#7CA82B",
lineWidth: 2,
label: { //define label within marker
text: "SP = "+sp,
backgroundColor: "white",
alpha: 0.7,
textAlpha: 1,
offsetX: 60,
offsetY: -5
}
}]
},
scaleX: {
zooming: true
},
'scale-y-2': {
values: "0:1"
},
series: [
{ scales: "scale-x,scale-y-2", values: op , 'legend-text': 'OP' },
{ values: pv100 , text: 'PV'}
]
};
zingchart.render({
id: 'myChart',
data: myConfig,
height: "90%",
width: "100%"
});
}
</script>
<div id='myChart'></div>
</body>
</html>
Nah, karena simulator sudah siap, sekarang saatnya untuk melihat cara kerjanya. Anda dapat menguji di sini kode yang sama tetapi di github: simulator kontrol on-off
Pengaturan standar: memperkuat tautan 1, konstanta waktu 100 detik, histeresis 2%
Sekarang, jika Anda menetapkan pengaturan yang lebih besar, misalnya 92, maka tiba-tiba prosesnya melambat banyak, meskipun pengaturannya 50 itu bertambah dalam 71 detik yang sama, tetapi hanya kemudian kurva mulai mendekati tugas lebih lambat secara eksponensial, dan mencapai setpoint hanya dalam 278 detik, itulah mengapa perlu untuk memperluas rentang plot ke 300 poin
Contoh ini sangat indikatif, menerjemahkan situasi ke model dengan suhu, kita dapat menyimpulkan bahwa tidak ada daya pemanas yang cukup: pemanas diisi 100%, tetapi suhu berhenti naik setelah beberapa saat. Mungkin ada beberapa solusi: letakkan elemen pemanas kedua dari yang sama, atau berikan tegangan 2 kali lebih banyak padanya (tetapi ini dapat merusak elemen pemanas), atau meletakkan pemanas dengan daya 2 kali lebih banyak, atau menuangkan lebih banyak cairan penghantar panas ke dalam sistem saat melakukan pemanasan cairan. Sangat menarik bahwa jika Anda perlu menjaga suhu di wilayah 95-100 derajat, maka Anda bahkan tidak perlu meletakkan regulator - pasang pemanas berdaya rendah, nyalakan sepenuhnya dan hanya itu - setelah 300 detik (bersyarat 300 detik) Anda bisa mendapatkan 100 derajat yang diinginkan.Masalah dengan sistem seperti itu adalah jika Anda membuka jendela di musim dingin pada suhu minus 40, suhu akan segera turun dan cukup signifikan, dan kinerja sistem semacam itu sangat rendah.
Mari kita tingkatkan bagian penguatan sebanyak 2 kali - ini seperti memasang elemen pemanas kedua dari jenis yang sama, atau menambahkan pipa lain untuk mengisi tangki.
Grafik tersebut ternyata juga cukup indikatif - suhu yang mencapai 51 derajat sebenarnya mencapai 2 kali lebih cepat, tetapi mencapai 92 derajat 4 kali lebih cepat. Saya tidak tahu seberapa dekat simulator semacam itu dengan proses nyata, tetapi karena ketergantungan yang ditentukan di dalamnya eksponensial, ini adalah perilaku sistem yang sepenuhnya diharapkan, tetapi saya bahkan tidak dapat membayangkan menjelaskan dari perspektif menambahkan pipa kedua dan meningkatkan laju pengisian sebesar 4 kali. Respons dari fungsi linier akan lebih dapat diprediksi terhadap peningkatan koefisien, tetapi sistem nyata dalam kehidupan jarang linier.