実験 制御
本実験ではパソコン上のBASICプログラムにより外部信号の入出力をおこない垂直管内の液面レベル制御をおこなう.
実験装置
実験装置は水タンク→チューブポンプ→液だめ管→流出量調節バルブ→ロータメータ→タンクと流れる水の循環系である.液だめ管は電子天秤上にあり,その重量から管内の液面位置がわかる.重量の数値はデジタル信号としてパソコンに送られる.
管上部より水を送入する.水を送入するチューブポンプは制御電圧(0〜10V)に比例して送入速度が制御される.ポンプの制御電圧はパソコンのプログラム上から0〜255の数値をおくり,これがAD変換器で0〜10Vのアナログ値に変換されて設定される.
BASICプログラムによる制御
パソコンは管内の液位の情報y [cm]を取込み目標値とのずれε[cm]を知り比例積分制御:
(1)
によってポンプ制御信号u (0〜100%=0〜255)を計算し,ポンプに流量を指令する.ここで,
Kp :比例ゲイン[ポンプ制御信号%/液面位置cm]
Ti :積分時間[s]
この式はBASICプログラム上では以下のようである.
P=KP*(LVSET-LV)+KP*(εの積分値)/RT+IV
ここで各変数は, P:u KP:Kp LVSET:設定液面レベル
LV:液面の現在位置
RT:Ti IV:定常値でのポンプ信号
実験操作
@信号入力のテスト:パソコン上で, PRINT #1,"D05"
INPUT #1, W$
PRINT W$
というプログラムをRUNさせる.([SHIFT]+[f.5])電子天秤の重量がパソコン上で表示される.
信号出力のテスト:パソコン上で,
OUT &HD4, 200
OUT &HD5, 0
というプログラムを入力して,RUNさせてみる.指示に従ってポンプが動く.下線部を変更すれば流量を制御できる.
A定常値の設定:プログラムLVCONをRUNさせる.制御パラメータを入力する.液面,ポンプ信号の値とその経時変化が表示される.ポンプ信号は40%に設定されている.液面の経時変化をみながら流出液のバルブを調節する.液面が降下→閉側に調節,液面上昇→開側に調節する.(ポンプ流量−液面高さ−流出流量(ロータメータの目盛り))の3値の定常値を設定する.定常値の一例は(40%-29cm-9.8)である.以降流出バルブはなるべく動かさず,各実験はじめの定常値の設定はチューブポンプの手動調節で液面を調整することでおこなう.
Bパラメータの推定:比例ゲインKp ,積分時間Ti の制御パラメータは(1次+むだ時間)系としてプロセスを近似して求められる.これにはステップ応答法と限界感度法がある.
方法Tステップ応答法:上の操作で.液面の定常を確認したのち,ポンプ制御信号を46%にステップ変化させる.(h
=6)
流出液のバルブは動かさない.液面は上昇し,やがて一定値に収束する.15分程度を要する.これが新たな定常値である.
[E]によりプログラムをいったん終了して画面をプリントする.
この操作による液面位置の応答曲線より,収束値y1[cm],むだ時間τ[s](本実験ではτ=15sとしているのでこの値を用いる.)時定数T
[s]が右図のように求められる.これらより,
k (ゲイン定数)=y1/h
Kp=0.9T /(kτ)
Ti =3.33τ
となる.
方法U限界感度法:制御プログラムでTi →∞とおき,定常振動を示すKp
を求める.制御プログラムをRUNさせて,はじめの制御パラメータ入力でKP=14,RT=10000(Ti
→∞に対応)を入力する.数分定常をみたのち[S]で制御を開始する.液面の変化がなくなったら[E]で終了する.KP値を2ずつあけてこの操作を繰り返す.やがて液面が定常振動をおこすようになる.このときのKP値をKpu,振動の周期Pu[s]とすると,最適な制御パラメータは
Kp =0.45 Kpu Ti =0.83 Pu
で求められる.
C制御実験:以下の手順で設定値変更実験および外乱実験をおこなう.また,
Kp 値を、上で求めた値の1/2倍,2倍,5倍と変化させて設定値変更実験をおこなう.
・[SHIFT]+[f・5]での再RUN.
・上で求めたKP, RTを入力する.
・定常値を作る.
・(設定値変更実験の場合) [U,D]で目標液面を設定する.
整定後設定値を再度変えてみよ.
・[S]で制御開始.
・(外乱実験の場合)流出バルブを調節して流出流量を急に変化させてみる.
・[E]で終了.画面がプリントされる.
実験結果の整理および考察
1) 制御結果(液面位置の変化)を概略示しなさい.
2) この結果をもとに「良い制御」とはなにかを考察しなさい.
「制御」パソコン側画面出力、制御プログラム(PC98MS-DOS上のQuickBASIC)
'化学工学実験 液面制御実験 '$INCLUDE: 'QB.BI' '$INCLUDE: 'GEN.BI' 'SET CLS LOCATE 10, 10: PRINT "化学工学実験 液面制御実験" LOCATE 12, 10: INPUT "KP"; KP LOCATE 13, 10: INPUT "RT"; RT SCREEN 87 '変数の初期値 DIM LVEL(262), PM(-3 TO 262), ILV(262) P = 40: PLAST = 40 'ポンプ流量0-15cc/min PMAX = 100: PMIN = 0: OKURE = 3 ' KP = 100: RT = 10000 LV = 0: LVLAST = 20 '液面レベル0-50cm LVSET = 30: LVSETMAX = 50: LVSETMIN = 0 '液面設定レベル0-50cm DISPLV1 = 210: DISPLV2 = 250'画面表示液面範囲20-46cm PM(-3) = P: PM(-2) = P: PM(-1) = P: PM(0) = P '5sおきに制御信号の入出力 ON TIMER(5) GOSUB INOUT TIMER ON 'RETURN POINT AGAIN: CLS TIMECOUNT = 0 'MAX 20min=TOMECOUNT=240 SET = 0 '画面を描く LOCATE 1, 1: PRINT "ポンプ流量": LOCATE 2, 1: PRINT "設定値[+,-]" LOCATE 5, 1: PRINT USING "遅れ ##秒"; OKURE * 5 LOCATE 1, 16: PRINT "100%": LOCATE 8, 18: PRINT "0%" LOCATE 13, 8: PRINT "液面レベル": LOCATE 16, 8: PRINT "レベル設定": LOCATE 17, 8: PRINT "[U,D]" LOCATE 22, 8: PRINT "制御開始[S]": LOCATE 23, 8: PRINT " 終了[E]" LOCATE 19, 8: PRINT "時間Max20min" LOCATE 9, 16: PRINT USING "##cm"; DISPLV2 LOCATE 25, 16: PRINT USING "##cm"; DISPLV1; X = 90: Y = 1: dx = 15: DY = 120 LINE (X - 1, Y - 1)-(X + dx + 1, Y + DY + 1), 14, B X = 155: Y = 1: dx = 480: DY = 120 LINE (X, Y)-(X + dx, Y + DY), 14, B FOR I = 1 TO 9 LINE (X + 1, Y + 12 * I)-(X + dx - 1, Y + 12 * I), 14, , &H1111 NEXT I ' X = 155: Y = 125: dx = 480: DY = 260 LINE (X, Y)-(X + dx, Y + DY), 14, B FOR I = 1 TO 25 LINE (X + 1, Y + 10 * I)-(X + dx - 1, Y + 10 * I), 14, , &H1111 NEXT I FOR I = 1 TO 19 LINE (X + I * 24, Y + 1)-(X + I * 24, Y + DY - 1), 14, , &H1111 NEXT I ' X = 1: Y = 125: dx = 40: DY = 260 LINE (X, Y - 1)-(X + dx, Y + DY + 1), 14, B X = 43: Y = 125: dx = 9: DY = 260 LINE (X, Y - 1)-(X + dx, Y + DY + 1), 14, B LINE (20, 125)-(20, 100): LINE -(90, 100): LINE (16, 113)-(20, 125): LINE -(24, 113) LINE (20, 386)-(20, 392): LINE -(70, 392): LINE (70, 386)-(70, 398): LINE -(86, 386): LINE -(86, 398): LINE -(70, 386) LINE (86, 392)-(106, 392): LINE -(95, 386): LINE (95, 398)-(106, 392) '常にまわっているLOOP DO UNTIL TIMECOUNT > 240 ' A$ = INKEY$ SELECT CASE A$ CASE "E" EXIT DO CASE "-" P = P - 2 CASE "+" P = P + 2 CASE "P" HCOPY 10, 0 CASE "U" LVSET = LVSET + 1 CASE "D" LVSET = LVSET - 1 CASE "S" IF SET = 1 GOTO CYU SET = 1: IV = LVEL(TIMECOUNT) LINE (155 + TIMECOUNT * 2, 126)-(155 + TIMECOUNT * 2, 384), 4 DI = TIMECOUNT * (54 / 240) + 20 LOCATE 23, DI: PRINT USING "制御開始 KP=###.# RT=#####"; KP; RT; ' LOCATE 23, DI: PRINT USING "制御開始 KP=####"; KP; CYU: END SELECT 'ポンプ流量 IF P > PMAX THEN P = PMAX IF P < PMIN THEN P = PMIN ' LOCATE 3, 1: PRINT USING "###%"; P X = 90: Y = 1: dx = 15: DY = 120 LINE (X, Y)-(X + dx, Y + DY * (1 - P / PMAX)), 0, BF LINE (X, Y + DY * (1 - P / PMAX))-(X + dx, Y + DY), 15, BF DAOUTPUT = (255 - 50) * (P / PMAX) + 50 ' O-255 =0-10v '液面設定表示 IF LVSET > LVSETMAX THEN LVSET = LVSETMAX IF LVSET < LVSETMIN THEN LVSET = LVSETMIN DISPLVSET = LVSET IF DISPLVSET > DISPLV2 THEN DISPLVSET = DISPLV2 IF DISPLVSET < DISPLV1 THEN DISPLVSET = DISPLV1 LOCATE 17, 13: PRINT USING " ## cm"; LVSET X = 44: Y = 125: dx = 7: DY = 260 LINE (X, Y)-(X + dx, Y + DY * (1 - (DISPLVSET - DISPLV1) / (DISPLV2 - DISPLV1))), 0, BF LINE (X, Y + DY * (1 - (DISPLVSET - DISPLV1) / (DISPLV2 - DISPLV1)))-(X + dx, Y + DY), 10, BF ' ' LOOP ' 'HCOPY 10, 0: GOTO AGAIN '終了 OWARI: HCOPY 10, 0 END ' INOUT: BEEP TIMECOUNT = TIMECOUNT + 1 LOCATE 20, 8: PRINT USING " ##.#min"; (TIMECOUNT * 5) / 60 '液レベル入力 OPEN "COM1:1200,n,8,1" FOR RANDOM AS #1 PRINT #1, "D05" INPUT #1, W$ 'PRINT #1, "D09" CLOSE LV = VAL(W$) '液レベル画面表示&トレンドプロット LOCATE 14, 11: PRINT USING "###.###"; LV LOCATE 3, 1 XX = 2: YY = 125: DXX = 38: DYY = 260 LINE (XX, YY)-(XX + DXX, YY + DYY * (1 - (LV - DISPLV1) / (DISPLV2 - DISPLV1))), 0, BF LINE (XX, YY + DYY * (1 - (LV - DISPLV1) / (DISPLV2 - DISPLV1)))-(XX + DXX, YY + DYY), 11, BF X0 = 155: Y0 = 385: DYY = 260 LINE (X0 + (TIMECOUNT - 1) * 2, Y0 - DYY * ((LVLAST - DISPLV1) / (DISPLV2 - DISPLV1)))-(X0 + TIMECOUNT * 2, Y0 - DYY * ((LV - DISPLV1) / (DISPLV2 - DISPLV1))), 11 LVLAST = LV '制御ルーチン SELECT CASE SET CASE 0 LVEL(TIMECOUNT) = LV: PM(TIMECOUNT) = P: ILV(TIMECOUNT) = 0 CASE 1 ILV(TIMECOUNT) = ILV(TIMECOUNT - 1) + (LVSET - LV) * DTIME PM(TIMECOUNT) = KP * (LVSET - LV) + KP * ILV(TIMECOUNT) / RT + IV ' PM(TIMECOUNT) = KP * (LVSET - LV) + IV IF PM(TIMECOUNT) > 100 THEN PM(TIMECOUNT) = PMAX IF PM(TIMECOUNT) < 0 THEN PM(TIMECOUNT) = PMIN P = PM(TIMECOUNT) END SELECT ' ポンプ制御信号出力 DAOUTPUT = PM(TIMECOUNT - OKURE) * (255 - 50) / 100 + 50 OUT &HD4, DAOUTPUT OUT &HD5, 0 'ポンプ制御信号トレンドプロット X0 = 155: Y0 = 121: DYY = 120 LINE (X0 + (TIMECOUNT - 1) * 2, Y0 - DYY * (PLAST / PMAX))-(X0 + TIMECOUNT * 2, Y0 - DYY * (P / PMAX)), 15 PLAST = P '液面設定トレンドプロット X0 = 155: Y0 = 385: DYY = 260 XX = X0 + TIMECOUNT * 2: YY = Y0 - DYY * (DISPLVSET - DISPLV1) / (DISPLV2 - DISPLV1) PSET (XX - 1, YY), 15: PSET (XX, YY), 10 PSET (XX, YY - 1), 15: PSET (XX, YY + 1), 10 RETURN |