123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- #### piston engine electrical system ####
- #### Syd Adams ####
- var ammeter_ave = 0.0;
- var outPut = "systems/electrical/outputs/";
- var BattVolts = props.globals.getNode("systems/electrical/batt-volts",1);
- var Volts = props.globals.getNode("/systems/electrical/volts",1);
- var Amps = props.globals.getNode("/systems/electrical/amps",1);
- var EXT = props.globals.getNode("/controls/electric/external-power",0);
- var switch_list=[];
- var output_list=[];
- var watt_list=[];
- var breaker_list=[];
- strobe_switch = props.globals.getNode("controls/lighting/strobe", 1);
- aircraft.light.new("controls/lighting/strobe-state", [0.05, 1.0], strobe_switch);
- beacon_switch = props.globals.getNode("controls/lighting/beacon", 1);
- aircraft.light.new("controls/lighting/beacon-state", [1.0, 1.0], beacon_switch);
- props.globals.getNode("controls/lighting/beacon", 1).setBoolValue(0);
- props.globals.getNode("controls/circuit-breakers/master", 1).setBoolValue(1);
- props.globals.getNode("controls/circuit-breakers/instruments", 1).setBoolValue(1);
- props.globals.getNode("controls/circuit-breakers/avionic-bus", 1).setBoolValue(1);
- props.globals.getNode("controls/circuit-breakers/fuel-pump", 1).setBoolValue(1);
- props.globals.getNode("controls/circuit-breakers/starter", 1).setBoolValue(1);
- props.globals.getNode("controls/electric/battery-switch", 1).setBoolValue(0);
- props.globals.getNode("controls/electric/engine/generator", 1).setBoolValue(0);
- props.globals.getNode("controls/switches/landing-light", 1).setBoolValue(0);
- props.globals.getNode("controls/gear/brake-parking", 1).setBoolValue(1);
- #props.globals.getNode("controls/electric/avionics-switch", 1).setBoolValue(0);
- #props.globals.getNode("controls/switches/fuel-pump", 1).setBoolValue(0);
- #props.globals.getNode("controls/lighting/instrument-lights", 1).setBoolValue(0);
- #props.globals.getNode("controls/gear/gear-down", 1).setBoolValue(0);
- #var battery = Battery.new(switch-prop,volts,amps,amp_hours,charge_percent,charge_amps);
- Battery = {
- new : func(swtch,vlt,amp,hr,chp,cha){
- m = { parents : [Battery] };
- m.switch = props.globals.getNode(swtch,1);
- if(m.switch.getValue()==nil)m.switch.setBoolValue(0);
- m.ideal_volts = vlt;
- m.ideal_amps = amp;
- m.amp_hours = hr;
- m.charge_percent = chp;
- m.charge_amps = cha;
- return m;
- },
- apply_load : func(load,dt) {
- if(me.switch.getValue()){
- var amphrs_used = load * dt / 3600.0;
- var percent_used = amphrs_used / me.amp_hours;
- me.charge_percent -= percent_used;
- if ( me.charge_percent < 0.0 ) {
- me.charge_percent = 0.0;
- } elsif ( me.charge_percent > 1.0 ) {
- me.charge_percent = 1.0;
- }
- var output =me.amp_hours * me.charge_percent;
- return output;
- }else return 0;
- },
- get_output_volts : func {
- if(me.switch.getValue()){
- var x = 1.0 - me.charge_percent;
- var tmp = -(3.0 * x - 1.0);
- var factor = (tmp*tmp*tmp*tmp*tmp + 32) / 32;
- var output =me.ideal_volts * factor;
- return output;
- }else return 0;
- },
- get_output_amps : func {
- if(me.switch.getValue()){
- var x = 1.0 - me.charge_percent;
- var tmp = -(3.0 * x - 1.0);
- var factor = (tmp*tmp*tmp*tmp*tmp + 32) / 32;
- var output =me.ideal_amps * factor;
- return output;
- }else return 0;
- }
- };
- #var alternator = Alternator.new(num,switch,n2_source,n2_threshold,volts,amps);
- Alternator = {
- new : func (num,switch,src,thr,vlt,amp){
- m = { parents : [Alternator] };
- m.switch = props.globals.getNode(switch,1);
- if(m.switch.getValue()==nil)m.switch.setBoolValue(0);
- m.meter = props.globals.getNode("systems/electrical/gen-load["~num~"]",1);
- m.meter.setDoubleValue(0);
- m.gen_output = props.globals.getNode("engines/engine["~num~"]/amp-v",1);
- m.gen_output.setDoubleValue(0);
- m.meter.setDoubleValue(0);
- m.n2_source = props.globals.getNode(src,1);
- m.n2_threshold = thr;
- m.ideal_volts = vlt;
- m.ideal_amps = amp;
- return m;
- },
- apply_load : func(load) {
- var cur_volt=me.gen_output.getValue();
- var cur_amp=me.meter.getValue();
- if(cur_volt >1){
- var factor=1/cur_volt;
- gout = (load * factor);
- if(gout>1)gout=1;
- }else{
- gout=0;
- }
- if(cur_amp > gout)me.meter.setValue(cur_amp - 0.01);
- if(cur_amp < gout)me.meter.setValue(cur_amp + 0.01);
- },
- get_output_volts : func {
- var out = 0;
- if(me.switch.getBoolValue()){
- var factor = me.n2_source.getValue() / me.n2_threshold;
- if ( factor > 1.0 )factor = 1.0;
- var out = (me.ideal_volts * factor);
- }
- me.gen_output.setValue(out);
- return out;
- },
- get_output_amps : func {
- var ampout =0;
- if(me.switch.getBoolValue()){
- var factor = me.n2_source.getValue() / me.n2_threshold;
- if ( factor > 1.0 ) {
- factor = 1.0;
- }
- ampout = me.ideal_amps * factor;
- }
- return ampout;
- }
- };
- var battery = Battery.new("/controls/electric/battery-switch",24,30,34,1.0,7.0);
- var alternator1 = Alternator.new(0,"controls/electric/engine[0]/generator","/engines/engine[0]/n2",20.0,27.0,70.0);
- var alternator2 = Alternator.new(0,"controls/electric/engine[1]/generator","/engines/engine[1]/n2",20.0,27.0,70.0);
- #####################################
- setlistener("/sim/signals/fdm-initialized", func {
- BattVolts.setDoubleValue(0);
- init_switches();
- settimer(update_electrical,5);
- print("Electrical System ... ok");
- });
- init_switches = func() {
- var tprop=props.globals.getNode("controls/electric/ammeter-switch",1);
- if(tprop.getValue()==nil)tprop.setBoolValue(0);
- setprop("controls/lighting/instrument-lights-norm",0.8);
- append(switch_list,"controls/engines/engine/starter");
- append(output_list,"starter");
- append(watt_list,10.0);
- append(breaker_list,"controls/circuit-breakers/starter");
-
- append(switch_list,"controls/anti-ice/pitot-heat");
- append(output_list,"pitot-heat");
- append(watt_list,0.5);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/lighting/landing-lights");
- append(output_list,"landing-lights");
- append(watt_list,1.0);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/lighting/instrument-lights");
- append(output_list,"instrument-lights");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/lighting/panel-norm");
- append(output_list,"panel-norm");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/lighting/instruments-norm");
- append(output_list,"instruments-norm");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/master");
-
- append(switch_list,"controls/lighting/beacon-state/state");
- append(output_list,"beacon");
- append(watt_list,0.5);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/lighting/nav-lights");
- append(output_list,"nav-lights");
- append(watt_list,0.5);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/lighting/strobe-state/state");
- append(output_list,"strobe");
- append(watt_list,0.5);
- append(breaker_list,"controls/circuit-breakers/master");
- append(switch_list,"controls/engines/engine/fuel-pump");
- append(output_list,"fuel-pump");
- append(watt_list,0.5);
- append(breaker_list,"controls/circuit-breakers/fuel-pump");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"adf");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/instruments");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"dme");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
-
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"KNS80");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"autopilot");
- append(watt_list,0.7);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"adf");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"gps");
- append(watt_list,0.5);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"adf");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"DG");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"transponder");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- # append(switch_list,"controls/electric/avionics-switch");
- # append(output_list,"ki525a");
- # append(watt_list,0.2);
- # append(switch_list,"controls/electric/avionics-switch");
- # append(output_list,"tacan");
- # append(watt_list,0.2);
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"turn-coordinator");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"comm");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"comm[1]");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"nav");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- append(switch_list,"controls/electric/avionics-switch");
- append(output_list,"nav[1]");
- append(watt_list,0.2);
- append(breaker_list,"controls/circuit-breakers/avionic-bus");
- for(var i=0; i<size(switch_list); i+=1) {
- var tmp = props.globals.getNode(switch_list[i],1);
- tmp.setBoolValue(0);
- }
- setprop("controls/electric/avionics-switch",1);
- }
- update_virtual_bus = func( dt ) {
- var PWR = getprop("systems/electrical/serviceable");
- var battery_volts = battery.get_output_volts();
- battery_volts *= getprop("controls/circuit-breakers/master") or 0;
- BattVolts.setValue(battery_volts);
- var alternator1_volts = alternator1.get_output_volts();
- var alternator2_volts = alternator2.get_output_volts();
- var external_volts = 24.0;
- load = 0.0;
- bus_volts = 0.0;
- power_source = nil;
-
- bus_volts = battery_volts;
- power_source = "battery";
- if (alternator1_volts > bus_volts) {
- bus_volts = alternator1_volts;
- power_source = "alternator1";
- }
- if (alternator2_volts > bus_volts) {
- bus_volts = alternator2_volts;
- power_source = "alternator2";
- }
- if ( EXT.getBoolValue() and ( external_volts > bus_volts) ) {
- bus_volts = external_volts;
- }
- bus_volts *=PWR;
- load += electrical_bus(bus_volts);
- ammeter = 0.0;
- if ( power_source == "battery" ) {
- ammeter = -load;
- } else {
- ammeter = battery.charge_amps;
- }
- if ( power_source == "battery" ) {
- battery.apply_load( load, dt );
- } elsif ( bus_volts > battery_volts ) {
- battery.apply_load( -battery.charge_amps, dt );
- }
- ammeter_ave = 0.8 * ammeter_ave + 0.2 * ammeter;
- Amps.setValue(ammeter_ave);
- Volts.setValue(bus_volts);
- alternator1.apply_load(load);
- return load;
- }
- electrical_bus = func(bv) {
- var bus_volts = bv;
- var load = 0.0;
- var srvc = 0.0;
- for(var i=0; i<size(switch_list); i+=1) {
- var srvc = getprop(switch_list[i] or 0);
- var brkr = getprop(breaker_list[i]) or 0;
- load = load + srvc * watt_list[i];
- setprop(outPut~output_list[i],bus_volts * srvc * brkr);
- }
- var DIMMER = bus_volts * getprop("controls/lighting/instrument-lights-norm");
- var INSTR_SWTCH = getprop("controls/lighting/instrument-lights");
- DIMMER=DIMMER*INSTR_SWTCH;
- setprop(outPut~"instrument-lights",DIMMER);
- setprop(outPut~"instrument-lights-norm",DIMMER * 0.0357);
- return load;
- }
- update_electrical = func {
- var scnd = getprop("sim/time/delta-sec");
- update_virtual_bus( scnd );
- settimer(update_electrical, 0);
- }
|