#!/usr/bin/env ruby #*** トライアック式電圧調整 require 'curses' require 'LegacyGraphics' Curses.init_screen # screen 3 (^_^;) winX = Curses.cols - 0 winY = Curses.lines - 0 win = LegacyGraphics.new(winY, winX, 0, 0) win.clear; win.box('|', '-') # cls col = 1; ORG = 250 HOR1 = 300; HOR2 = 150; TSC = 20000 VM = 141; PI = 355.0/113; DT = 0.00001 F = 50; c = 0.22 # input "Hz=", F; input "C(in uF)=", C BOV = 20 # input "Break-over Voltage=", BOV infoY = 0 win.locate(1, infoY += 1); win.print("Hz = #{F}") win.locate(1, infoY += 1); win.print("C(in uF) = #{c}") win.locate(1, infoY += 1); win.print("Break-over Voltage = #{BOV}") C = c * 0.000002 B = BOV * 3 (20..HOR1).each {|y| win.pset(ORG, y, '|')} # line(ORG, HOR1)-(ORG, 20), 7 (ORG..500).each {|x| win.pset(x, HOR1, '-')} # line(ORG, HOR1)-(500, HOR1), 7 (ORG..500).each {|x| win.pset(x, HOR1 - HOR2, '-')} # line(ORG, HOR1 - HOR2)-(500, HOR1 - HOR2), 7 (ORG..500).each {|x| win.pset(x, HOR1 - HOR2 - B, '=')} # line(ORG, HOR1 - HOR2 - B)-(500, HOR1 - HOR2 - B), 6 ([150, 180, 210, 240, 270]).each {|m| win.pset(ORG, HOR1 - m, '+') # line(ORG + 1, HOR1 - m)-(ORG - 1, HOR1 - m), 7 } ([20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240]).each {|m| win.pset(ORG + m, HOR1, '+') # line(ORG + m, HOR1 + 1)-(ORG + m, HOR1 - 1), 7 win.pset(ORG + m, HOR1 - HOR2, '+') # line(ORG + m, HOR1 - HOR2 + 1)-(ORG + m, HOR1 - HOR2 - 1), 7 win.pset(ORG + m, HOR1 - HOR2 - B, '$') # line(ORG + m, HOR1 - HOR2 - B + 1)-(ORG + m, HOR1 - HOR2 - B - 1), 6 } win.locate(31, 19); win.print('0') win.locate(42, 19); win.print('.005') win.locate(55, 19); win.print('.01s') win.locate(40, 10); win.print('- VC Voltage -') win.locate(39, 20); win.print('- Load Voltage -') W = 2.0 * PI * F; K = 1.0 / C ([1, 5, 10, 20, 30, 50, 70, 80, 90, 100]).each {|rr| r = rr * 1000 # input "R(in k ohm)=", r win.locate(1, infoY += 1); win.print("R(in k ohm) = #{rr}") # W = 2.0 * PI * F; K = 1.0 / C; vc = 0; vi = 0; sigi = 0.0; i = 0; ls = 1; ts = 0 vc = 0; sigi = 0.0; i = 0; ls = 1; ts = 0 #*** 計算はじめ (0..(1.0 / DT)).each {|n| vi = Math.sin(W * DT * n) * VM break if(W * DT * n > PI) if(vc > BOV * 1.3) # ls = 0; ts = 1 # バグ? ls = 0 end if(vc > BOV) # 追加 ts = 1 end sigi += i; vc = K * DT * sigi; i = (1.0 / r) * (vi - vc) # win.pset(ORG + n * DT * TSC, HOR1 - HOR2 * ls * vc * 3, col) # 誤植!! win.pset(ORG + n * DT * TSC, HOR1 - HOR2 - ls * vc * 3, col) win.pset(ORG + n * DT * TSC, HOR1 - ts * vi * 2 / 3, col) } #*** 計算おわり col += 1; col = 1 if(col == 8) } win.refresh win.close