├── License.pdf ├── MATLAB ├── icons │ ├── 0.png │ ├── 1.png │ ├── C.png │ ├── GY.png │ ├── I.png │ ├── MC.png │ ├── MGY.png │ ├── MI.png │ ├── MR.png │ ├── MSe.png │ ├── MSf.png │ ├── MTF.png │ ├── R.png │ ├── Se.png │ ├── Sf.png │ ├── TF.png │ ├── fx.png │ ├── Constant.png │ └── FaultInject.png ├── VirtualADAPT.mdl ├── FaultInjectionGUI.fig ├── uninstallVirtualADAPT.m ├── installVirtualADAPT.m ├── initBatteries.m ├── Sensors and Actuators.txt ├── FaultInjectionGUI.m └── ADAPTComponents.m ├── docs └── VirtualADAPT.pdf └── README.md /License.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/License.pdf -------------------------------------------------------------------------------- /MATLAB/icons/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/0.png -------------------------------------------------------------------------------- /MATLAB/icons/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/1.png -------------------------------------------------------------------------------- /MATLAB/icons/C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/C.png -------------------------------------------------------------------------------- /MATLAB/icons/GY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/GY.png -------------------------------------------------------------------------------- /MATLAB/icons/I.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/I.png -------------------------------------------------------------------------------- /MATLAB/icons/MC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MC.png -------------------------------------------------------------------------------- /MATLAB/icons/MGY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MGY.png -------------------------------------------------------------------------------- /MATLAB/icons/MI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MI.png -------------------------------------------------------------------------------- /MATLAB/icons/MR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MR.png -------------------------------------------------------------------------------- /MATLAB/icons/MSe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MSe.png -------------------------------------------------------------------------------- /MATLAB/icons/MSf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MSf.png -------------------------------------------------------------------------------- /MATLAB/icons/MTF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/MTF.png -------------------------------------------------------------------------------- /MATLAB/icons/R.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/R.png -------------------------------------------------------------------------------- /MATLAB/icons/Se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/Se.png -------------------------------------------------------------------------------- /MATLAB/icons/Sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/Sf.png -------------------------------------------------------------------------------- /MATLAB/icons/TF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/TF.png -------------------------------------------------------------------------------- /MATLAB/icons/fx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/fx.png -------------------------------------------------------------------------------- /docs/VirtualADAPT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/docs/VirtualADAPT.pdf -------------------------------------------------------------------------------- /MATLAB/VirtualADAPT.mdl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/VirtualADAPT.mdl -------------------------------------------------------------------------------- /MATLAB/icons/Constant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/Constant.png -------------------------------------------------------------------------------- /MATLAB/FaultInjectionGUI.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/FaultInjectionGUI.fig -------------------------------------------------------------------------------- /MATLAB/icons/FaultInject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/VirtualADAPT/HEAD/MATLAB/icons/FaultInject.png -------------------------------------------------------------------------------- /MATLAB/uninstallVirtualADAPT.m: -------------------------------------------------------------------------------- 1 | %uninstall 2 | 3 | rmpath(genpath(pwd)); 4 | savepath; 5 | 6 | disp(['Removed ' pwd ' and subdirectories to pathdef.m']) -------------------------------------------------------------------------------- /MATLAB/installVirtualADAPT.m: -------------------------------------------------------------------------------- 1 | %install 2 | 3 | addpath(genpath(pwd)); 4 | savepath; 5 | 6 | disp(['Added ' pwd ' and subdirectories to pathdef.m']); 7 | 8 | -------------------------------------------------------------------------------- /MATLAB/initBatteries.m: -------------------------------------------------------------------------------- 1 | function initBatteries(Batt1Voltage, Batt2Voltage) 2 | 3 | set_param('VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/Battery1/CircuitEquivalent/C0','IC',num2str(Batt1Voltage)); 4 | set_param('VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/Battery2/CircuitEquivalent/C0','IC',num2str(Batt2Voltage)); -------------------------------------------------------------------------------- /MATLAB/Sensors and Actuators.txt: -------------------------------------------------------------------------------- 1 | Sensors (73): 2 | "E135", "E140", "E142", "E161", "E165", "E167", "E181", 3 | "E235", "E240", "E242", "E261", "E265", "E267", "E281", 4 | "ESH141A", "ESH144A", "ESH160A", 5 | "ESH170", "ESH171", "ESH172", "ESH173", "ESH174", "ESH175", "ESH183", "ESH184", 6 | "ESH241A", "ESH244A", "ESH260A", 7 | "ESH270", "ESH271", "ESH272", "ESH273", "ESH274", "ESH275", "ESH283", "ESH284", 8 | "FT520", "FT525", 9 | "ISH136", "ISH162", "ISH166", "ISH180", 10 | "ISH236", "ISH262", "ISH266", "ISH280", 11 | "IT140", "IT161", "IT167", "IT181", 12 | "IT240", "IT261", "IT267", "IT281", 13 | "LT500", "LT505", 14 | "ST165", "ST265", "ST515", "ST516", 15 | "TE128", "TE129", "TE133", 16 | "TE228", "TE229", 17 | "TE500", "TE501", "TE502", "TE505", "TE506", "TE507", "TE510", "TE511" 18 | 19 | Actuators (24): 20 | "EY136_OP", "EY141_CL", "EY144_CL", "EY160_CL", 21 | "EY170_CL", "EY171_CL", "EY172_CL", "EY173_CL", 22 | "EY174_CL", "EY175_CL", "EY183_CL", "EY184_CL", 23 | "EY236_OP", "EY241_CL", "EY244_CL", "EY260_CL", 24 | "EY270_CL", "EY271_CL", "EY272_CL", "EY273_CL", 25 | "EY274_CL", "EY275_CL", "EY283_CL", "EY284_CL" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Motivation 2 | 3 | The Advanced Diagnostic and Prognostic Testbed (ADAPT), developed at NASA Ames Research Center, is functionally representative of an electrical power system (EPS) on an exploration vehicle, and has been developed to: 4 | * Serve as a technology-neutral basis for testing and evaluating software and hardware diagnostic systems, 5 | * Allow accelerated testing of diagnostic algorithms by manually or algorithmically inserting faults, 6 | * Provide a real-world physical system such that issues that might be disregarded in smaller-scale experiments and simulations are exposed, 7 | * Act as a stepping stone between pure research and deployment in aerospace systems, thus creating a concrete path to maturing diagnostic technologies, and 8 | * Develop analytical methods and software architectures in support of the above goals. 9 | 10 | The ADAPT hardware includes components that can generate, store, distribute, and monitor electrical power. The EPS can deliver AC (Alternating Current) and DC (Direct Current) power to loads. A data acquisition and control system sends commands to and receives data from the EPS. The testbed operator stations are integrated into a software architecture that allows for nominal and faulty operations of the EPS, and includes a system for logging all relevant data to assess the performance of the health management applications. 11 | 12 | # The ADAPT Hardware 13 | 14 | The major system components of ADAPT include power generation, storage, and distribution components. Two power generation sources are connected to three sets of batteries, which in turn supply two load banks. Each load bank has provision for 6 AC loads and 2 DC loads. To be more specific, ADAPT consists of the following three classes of components – power generation, power storage, and power distribution. 15 | * **Power Generation:** The two sources of power generation include two battery chargers. The battery chargers are connected to appropriate wall outlets through relays. The two power generation sources can be interchangeably connected to the three batteries. Hardware relay logic prevents connecting one charge source to more than one battery at the same time, and from connecting one charging circuit to another charging circuit. 16 | * **Power Storage:** Three sets of batteries are used to store energy for operation of the loads. Each “battery” consists of two 12-volt sealed lead acid batteries connected in series to produce a 24-volt output. Two battery sets are rated at 100 Amp-hrs and the third set is rated at 50 Amp-hrs. The batteries and the main circuit breakers are placed in a ventilated cabinet that is physically separated from the equipment racks; however, the switches for connecting the batteries to the upstream chargers or downstream loads are located in the equipment racks. 17 | * **Power Distribution:** Electromechanical relays are used to route the power from the sources to the batteries; and from the batteries to the AC and DC loads. All relays are of the normally-open type. An inverter converts the 24-volt DC battery input to a 120-volt r.m.s. AC output. Circuit breakers are located at various points in the distribution network to prevent overcurrents from causing unintended damage to the system components. 18 | 19 | 20 | # Virtual ADAPT 21 | 22 | VirtualADAPT is a high-fidelity, Matlab® Simulink®-based simulation testbed that emulates the ADAPT hardware for running offline health management experiments. This simulation testbed models all components of the ADAPT hardware within the power storage and power distribution subsystems. The physical components of the testbed, i.e., the batteries, relays, and the loads, are replaced by simulation modules that generate the same dynamic behaviors as the hardware test bed. 23 | 24 | 25 | 26 | ## Installation 27 | 28 | For the model to execute, the fault interface GUI functions must be on the Matlab path. To do this, run the script 29 | [installVirtualADAPT.m](https://github.com/nasa/VirtualADAPT/blob/master/MATLAB/installVirtualADAPT.m). 30 | 31 | The script [uninstallVirtualADAPT.m](https://github.com/nasa/VirtualADAPT/blob/master/MATLAB/uninstallVirtualADAPT.m) will remove the directories from the Matlab path. 32 | 33 | 34 | ## Quick Start Guide 35 | 36 | To generate data, load [VirtualADAPT.mdl](https://github.com/nasa/VirtualADAPT/blob/master/MATLAB/VirtualADAPT.mdl) in Simulink and hit the start button. The simulation is configured to run indefinitely and write data to the MATLAB workspace as a matrix of floating-point values. The 'Sensors' section of the file [Sensors And Actuators.txt](https://github.com/nasa/VirtualADAPT/blob/master/MATLAB/Sensors%20and%20Actuators.txt) contains the sensor names which correspond to the columns of this matrix. 37 | 38 | To command a relay or circuit breaker, find the simulation input port for the desired actuator (eg. 'EY144_CL') and 39 | double-click the switch connected to it. Because the simulation is 'solved' as quickly as possible rather than running 40 | in real-time, it is easier to configure relays before starting the simulation. 41 | 42 | To inject ADAPT faults, use the fault injection GUI which is opened (and closed) automatically when the Simulink model 43 | is opened (and closed). Fault modes are specific to components but are of the following general modes when referring to 44 | parameter values: 45 | 46 | * Nominal - Magnitude (M) unused. Nominal value (N) unaltered. 47 | * Incipient - N + M\*T, where T is the number of seconds since injection. 48 | * Abrupt - (N + 1)\*M 49 | * Bias - N + M 50 | * StuckAt - M 51 | 52 | Faults are added/removed to/from the Simulink model when added/removed using the GUI. 53 | 54 | A second method for injecting faults is to open the model in simulink, navigate to the desired block, and change the values 55 | manually. Alternately, the MATLAB functions get_param and set_param can be used to set these values from a script or the 56 | command line. 57 | 58 | 59 | ## Extended Documentation 60 | 61 | The document [VirtualADAPT.pdf](https://github.com/nasa/VirtualADAPT/blob/master/docs/VirtualADAPT.pdf) describes the Virtual ADAPT simulation model in more detail. Please refer to this document for instructions on running the simulation. 62 | 63 | ## License 64 | 65 | This software is released under the [NASA Open Source Agreement Version 1.3](https://github.com/nasa/VirtualADAPT/blob/master/License.pdf). 66 | 67 | ## Notices 68 | 69 | Copyright © 2017 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. 70 | 71 | ### Disclaimers 72 | 73 | No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS." 74 | 75 | Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 76 | -------------------------------------------------------------------------------- /MATLAB/FaultInjectionGUI.m: -------------------------------------------------------------------------------- 1 | function varargout = FaultInjectionGUI(varargin) 2 | % FAULTINJECTIONGUI M-file for FaultInjectionGUI.fig 3 | % FAULTINJECTIONGUI, by itself, creates a new FAULTINJECTIONGUI or raises the existing 4 | % singleton*. 5 | % 6 | % H = FAULTINJECTIONGUI returns the handle to a new FAULTINJECTIONGUI or the handle to 7 | % the existing singleton*. 8 | % 9 | % FAULTINJECTIONGUI('CALLBACK',hObject,eventData,handles,...) calls the local 10 | % function named CALLBACK in FAULTINJECTIONGUI.M with the given input arguments. 11 | % 12 | % FAULTINJECTIONGUI('Property','Value',...) creates a new FAULTINJECTIONGUI or raises the 13 | % existing singleton*. Starting from the left, property value pairs are 14 | % applied to the GUI before FaultInjectionGUI_OpeningFcn gets called. An 15 | % unrecognized property name or invalid value makes property application 16 | % stop. All inputs are passed to FaultInjectionGUI_OpeningFcn via varargin. 17 | % 18 | % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one 19 | % instance to run (singleton)". 20 | % 21 | % See also: GUIDE, GUIDATA, GUIHANDLES 22 | 23 | % Edit the above text to modify the response to help FaultInjectionGUI 24 | 25 | % Last Modified by GUIDE v2.5 24-Jul-2012 07:36:36 26 | 27 | % Begin initialization code - DO NOT EDIT 28 | gui_Singleton = 1; 29 | gui_State = struct('gui_Name', mfilename, ... 30 | 'gui_Singleton', gui_Singleton, ... 31 | 'gui_OpeningFcn', @FaultInjectionGUI_OpeningFcn, ... 32 | 'gui_OutputFcn', @FaultInjectionGUI_OutputFcn, ... 33 | 'gui_LayoutFcn', [] , ... 34 | 'gui_Callback', []); 35 | if nargin && ischar(varargin{1}) 36 | gui_State.gui_Callback = str2func(varargin{1}); 37 | end 38 | 39 | if nargout 40 | [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 41 | else 42 | gui_mainfcn(gui_State, varargin{:}); 43 | end 44 | % End initialization code - DO NOT EDIT 45 | 46 | 47 | % --- Executes just before FaultInjectionGUI is made visible. 48 | function FaultInjectionGUI_OpeningFcn(hObject, eventdata, handles, varargin) 49 | % This function has no output args, see OutputFcn. 50 | % hObject handle to figure 51 | % eventdata reserved - to be defined in a future version of MATLAB 52 | % handles structure with handles and user data (see GUIDATA) 53 | % varargin command line arguments to FaultInjectionGUI (see VARARGIN) 54 | 55 | % Choose default command line output for FaultInjectionGUI 56 | handles.output = hObject; 57 | 58 | % Update handles structure 59 | guidata(hObject, handles); 60 | 61 | % UIWAIT makes FaultInjectionGUI wait for user response (see UIRESUME) 62 | % uiwait(handles.figure1); 63 | 64 | % clear out fault table 65 | %set(handles.faultTable,'Data',{}) 66 | 67 | ADAPTComponents; % loads 'components' variable 68 | 69 | % determine active fault modes in the sim and initialize faults table 70 | data = {}; 71 | count = 0; 72 | names = fieldnames(components); 73 | for i=1:length(names) 74 | component = names{i}; 75 | path = components.(component).path; 76 | % for each fault mode, check if it is present 77 | for j=1:length(components.(component).faultModes) 78 | faultPath = [path components.(component).paths{j}]; 79 | if ~strcmp(get_param(faultPath,'FP'),'Nominal') 80 | % add to table 81 | count = count+1; 82 | data{count,1} = component; 83 | data{count,2} = components.(component).faultModes{j}; 84 | data{count,3} = get_param(faultPath,'FT'); 85 | data{count,4} = get_param(faultPath,'FM'); 86 | end 87 | end 88 | end 89 | set(handles.faultTable,'Data',data); 90 | 91 | % put it here 92 | % contents = get(handles.component,'String'); 93 | % data{i,1} = contents{get(handles.component,'Value')}; 94 | % contents = get(handles.fault,'String'); 95 | % data{i,2} = contents{get(handles.fault,'Value')}; 96 | % data(i,3) = cellstr(get(handles.injection,'String')); 97 | % data(i,4) = cellstr(get(handles.magnitude,'String')); 98 | 99 | % set_param([components.(component).path components.(component).paths{faultIndex}],'FT',num2str(injectionTime)); 100 | % set_param([components.(component).path components.(component).paths{faultIndex}],'FM',num2str(magnitude)); 101 | % set_param([components.(component).path components.(component).paths{faultIndex}],'FP',components.(component).profiles(faultIndex)); 102 | 103 | 104 | % get user data 105 | userData = get(handles.figure1,'UserData'); 106 | userData.components = components; 107 | set(handles.figure1,'UserData',userData); 108 | 109 | % populate the component drop-down 110 | componentNames = sort(fieldnames(components)); 111 | set(handles.component,'String',componentNames); 112 | 113 | % populate the fault drop-down for the first fault 114 | updateFaultMode(handles); 115 | 116 | 117 | 118 | % function loadFaults(handles,parameters) 119 | % faultData = {}; 120 | % components = fieldnames(parameters.components); 121 | % for i=1:length(components) 122 | % component = components{i}; 123 | % tf = parameters.components.(component).tf; 124 | % if tfsize(data,1) 288 | % nothing or phantom row selected 289 | if size(data,1)==1 290 | %if only 1 entry, select him 291 | row = 1; 292 | else 293 | % else nothing selected and multiple entries, do nothing 294 | return; 295 | end 296 | end 297 | if isempty(data) 298 | return; 299 | elseif ~isempty(data{row,1}) 300 | % remove fault 301 | removeFault(userData,data{row,1},data{row,2}); 302 | % then remove this row 303 | data(row,:) = []; 304 | set(handles.faultTable,'Data',data); 305 | end 306 | % if now has 4 rows then expand col widths 307 | if size(data,1)==4 308 | expandColWidths(handles); 309 | end 310 | 311 | 312 | 313 | % --- Executes on button press in resetToNominal. 314 | function resetToNominal_Callback(hObject, eventdata, handles) 315 | % hObject handle to resetToNominal (see GCBO) 316 | % eventdata reserved - to be defined in a future version of MATLAB 317 | % handles structure with handles and user data (see GUIDATA) 318 | userData = get(handles.figure1,'UserData'); 319 | data = get(handles.faultTable,'Data'); 320 | % if have >3 faults want to expand the col widths b/c scrollbar will 321 | % disappear 322 | if size(data,1)>5 323 | expandColWidths(handles); 324 | end 325 | data = {}; 326 | set(handles.faultTable,'Data',data); 327 | 328 | % reset to nominal 329 | resetToNominal(userData); 330 | 331 | 332 | function injection_Callback(hObject, eventdata, handles) 333 | % hObject handle to injection (see GCBO) 334 | % eventdata reserved - to be defined in a future version of MATLAB 335 | % handles structure with handles and user data (see GUIDATA) 336 | 337 | % Hints: get(hObject,'String') returns contents of injection as text 338 | % str2double(get(hObject,'String')) returns contents of injection as a double 339 | 340 | 341 | % --- Executes during object creation, after setting all properties. 342 | function injection_CreateFcn(hObject, eventdata, handles) 343 | % hObject handle to injection (see GCBO) 344 | % eventdata reserved - to be defined in a future version of MATLAB 345 | % handles empty - handles not created until after all CreateFcns called 346 | 347 | % Hint: edit controls usually have a white background on Windows. 348 | % See ISPC and COMPUTER. 349 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 350 | set(hObject,'BackgroundColor','white'); 351 | end 352 | 353 | 354 | 355 | function magnitude_Callback(hObject, eventdata, handles) 356 | % hObject handle to magnitude (see GCBO) 357 | % eventdata reserved - to be defined in a future version of MATLAB 358 | % handles structure with handles and user data (see GUIDATA) 359 | 360 | % Hints: get(hObject,'String') returns contents of magnitude as text 361 | % str2double(get(hObject,'String')) returns contents of magnitude as a double 362 | 363 | 364 | % --- Executes during object creation, after setting all properties. 365 | function magnitude_CreateFcn(hObject, eventdata, handles) 366 | % hObject handle to magnitude (see GCBO) 367 | % eventdata reserved - to be defined in a future version of MATLAB 368 | % handles empty - handles not created until after all CreateFcns called 369 | 370 | % Hint: edit controls usually have a white background on Windows. 371 | % See ISPC and COMPUTER. 372 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 373 | set(hObject,'BackgroundColor','white'); 374 | end 375 | 376 | 377 | % --- Executes on selection change in component. 378 | function component_Callback(hObject, eventdata, handles) 379 | % hObject handle to component (see GCBO) 380 | % eventdata reserved - to be defined in a future version of MATLAB 381 | % handles structure with handles and user data (see GUIDATA) 382 | 383 | % Hints: contents = get(hObject,'String') returns component contents as cell array 384 | % contents{get(hObject,'Value')} returns selected item from component 385 | updateFaultMode(handles); 386 | 387 | % --- Executes during object creation, after setting all properties. 388 | function component_CreateFcn(hObject, eventdata, handles) 389 | % hObject handle to component (see GCBO) 390 | % eventdata reserved - to be defined in a future version of MATLAB 391 | % handles empty - handles not created until after all CreateFcns called 392 | 393 | % Hint: popupmenu controls usually have a white background on Windows. 394 | % See ISPC and COMPUTER. 395 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 396 | set(hObject,'BackgroundColor','white'); 397 | end 398 | 399 | 400 | % --- Executes on selection change in fault. 401 | function fault_Callback(hObject, eventdata, handles) 402 | % hObject handle to fault (see GCBO) 403 | % eventdata reserved - to be defined in a future version of MATLAB 404 | % handles structure with handles and user data (see GUIDATA) 405 | 406 | % Hints: contents = get(hObject,'String') returns fault contents as cell array 407 | % contents{get(hObject,'Value')} returns selected item from fault 408 | 409 | 410 | % --- Executes during object creation, after setting all properties. 411 | function fault_CreateFcn(hObject, eventdata, handles) 412 | % hObject handle to fault (see GCBO) 413 | % eventdata reserved - to be defined in a future version of MATLAB 414 | % handles empty - handles not created until after all CreateFcns called 415 | 416 | % Hint: popupmenu controls usually have a white background on Windows. 417 | % See ISPC and COMPUTER. 418 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 419 | set(hObject,'BackgroundColor','white'); 420 | end 421 | 422 | 423 | % --- Executes when selected cell(s) is changed in faultTable. 424 | function faultTable_CellSelectionCallback(hObject, eventdata, handles) 425 | % hObject handle to faultTable (see GCBO) 426 | % eventdata structure with the following fields (see UITABLE) 427 | % Indices: row and column indices of the cell(s) currently selecteds 428 | % handles structure with handles and user data (see GUIDATA) 429 | if size(eventdata.Indices,1)>0 430 | set(hObject,'UserData',eventdata.Indices(1)) 431 | end 432 | 433 | 434 | % --- Executes when user attempts to close figure1. 435 | function figure1_CloseRequestFcn(hObject, eventdata, handles) 436 | % hObject handle to figure1 (see GCBO) 437 | % eventdata reserved - to be defined in a future version of MATLAB 438 | % handles structure with handles and user data (see GUIDATA) 439 | 440 | % Hint: delete(hObject) closes the figure 441 | delete(hObject); 442 | 443 | 444 | % --- Executes on button press in saveConfig. 445 | function saveConfig_Callback(hObject, eventdata, handles) 446 | % hObject handle to saveConfig (see GCBO) 447 | % eventdata reserved - to be defined in a future version of MATLAB 448 | % handles structure with handles and user data (see GUIDATA) 449 | % save what is in fault table 450 | data = get(handles.faultTable,'Data'); 451 | uisave('data','config.mat'); 452 | 453 | 454 | % --- Executes on button press in loadConfig. 455 | function loadConfig_Callback(hObject, eventdata, handles) 456 | % hObject handle to loadConfig (see GCBO) 457 | % eventdata reserved - to be defined in a future version of MATLAB 458 | % handles structure with handles and user data (see GUIDATA) 459 | [filename pathname] = uigetfile('*.mat'); 460 | if filename~=0 461 | load([pathname filename]); 462 | % inject each fault in config file 463 | for i=1:size(data,1) 464 | component = data{i,1}; 465 | faultMode = data{i,2}; 466 | injectionTime = data{i,3}; 467 | magnitude = data{i,4}; 468 | userData = get(handles.figure1,'UserData'); 469 | addFault(userData,injectionTime,component,faultMode,magnitude) 470 | end 471 | set(handles.faultTable,'Data',data); 472 | end 473 | -------------------------------------------------------------------------------- /MATLAB/ADAPTComponents.m: -------------------------------------------------------------------------------- 1 | % ADAPT components 2 | 3 | % faultModes is names for the fault modes 4 | % path is root path of component 5 | % paths is subpaths for blocks associated with fault modes 6 | % profiles is index of fault profile to set in blocks associated with fault 7 | % modes 8 | 9 | % batteries 10 | 11 | components.Battery1.faultModes = {'Capacitance' 'Disconnected'}; 12 | components.Battery1.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/Battery1/CircuitEquivalent/'; 13 | components.Battery1.paths = {'C0' 'BatteryConnected'}; 14 | components.Battery1.profiles = [1 1]; 15 | 16 | components.Battery2.faultModes = {'Capacitance' 'Disconnected'}; 17 | components.Battery2.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/Battery2/CircuitEquivalent/'; 18 | components.Battery2.paths = {'C0' 'BatteryConnected'}; 19 | components.Battery2.profiles = [1 1]; 20 | 21 | % inverters 22 | 23 | components.Inverter1.faultModes = {'Power Failure'}; 24 | components.Inverter1.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/Inverter1/'; 25 | components.Inverter1.paths = {'InverterConnected'}; 26 | components.Inverter1.profiles = 1; 27 | 28 | components.Inverter2.faultModes = {'Power Failure'}; 29 | components.Inverter2.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/Inverter2/'; 30 | components.Inverter2.paths = {'InverterConnected'}; 31 | components.Inverter2.profiles = 1; 32 | 33 | % load bank 1 dc loads 34 | 35 | components.L1G_NEMO.faultModes = {'Capacitance Abrupt' 'Capacitance Incipient' 'Inductance Abrupt' 'Inductance Incipient' 'Resistance1 Abrupt' 'Resistance1 Incipient' 'Resistance2 Abrupt' 'Resistance2 Incipient'}; 36 | components.L1G_NEMO.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/DCLoadBank1/L1G/NEMO/'; 37 | components.L1G_NEMO.paths = {'C' 'C' 'I' 'I' 'R1' 'R1' 'R2' 'R2'}; 38 | components.L1G_NEMO.profiles = [1 2 1 2 1 2 1 2]; 39 | 40 | components.L1H_Resistance.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 41 | components.L1H_Resistance.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/DCLoadBank1/L1H/'; 42 | components.L1H_Resistance.paths = {'R' 'R'}; 43 | components.L1H_Resistance.profiles = [1 2]; 44 | 45 | % load bank 2 dc loads 46 | 47 | components.L2G_Resistance.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 48 | components.L2G_Resistance.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/DCLoadBank2/Load2G/'; 49 | components.L2G_Resistance.paths = {'R' 'R'}; 50 | components.L2G_Resistance.profiles = [1 2]; 51 | 52 | components.L2H_DCLoadBox.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 53 | components.L2H_DCLoadBox.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/DCLoadBank2/Load2H/DCLoadBox/'; 54 | components.L2H_DCLoadBox.paths = {'R' 'R'}; 55 | components.L2H_DCLoadBox.profiles = [1 2]; 56 | 57 | % load bank 1 ac loads 58 | 59 | components.L1A_LGT6_Bulb1.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 60 | components.L1A_LGT6_Bulb1.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/LGT6/LightBulb1/'; 61 | components.L1A_LGT6_Bulb1.paths = {'R' 'R'}; 62 | components.L1A_LGT6_Bulb1.profiles = [1 2]; 63 | 64 | components.L1A_LGT6_Bulb2.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 65 | components.L1A_LGT6_Bulb2.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/LGT6/LightBulb2/'; 66 | components.L1A_LGT6_Bulb2.paths = {'R' 'R'}; 67 | components.L1A_LGT6_Bulb2.profiles = [1 2]; 68 | 69 | components.L1A_LGT6_Bulb3.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 70 | components.L1A_LGT6_Bulb3.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/LGT6/LightBulb3/'; 71 | components.L1A_LGT6_Bulb3.paths = {'R' 'R'}; 72 | components.L1A_LGT6_Bulb3.profiles = [1 2]; 73 | 74 | components.L1B_Fan1.faultModes = {'Resistance Abrupt' 'Resistance Incipient' 'Friction Abrupt' 'Friction Incipient'}; 75 | components.L1B_Fan1.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1B/FAN1/'; 76 | components.L1B_Fan1.paths = {'Resistance' 'Resistance' 'Friction' 'Friction'}; 77 | components.L1B_Fan1.profiles = [1 2 1 2]; 78 | 79 | components.L1C_Fan3.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 80 | components.L1C_Fan3.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1C/FAN3/'; 81 | components.L1C_Fan3.paths = {'R' 'R'}; 82 | components.L1C_Fan3.profiles = [1 2]; 83 | 84 | components.L1D_LGT8.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 85 | components.L1D_LGT8.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1D/LGT8/'; 86 | components.L1D_LGT8.paths = {'R' 'R'}; 87 | components.L1D_LGT8.profiles = [1 2]; 88 | 89 | components.L1E_Pump2.faultModes = {'Flow Resistance Abrupt' 'Flow Resistance Incipient'}; 90 | components.L1E_Pump2.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1E/PMP2/'; 91 | components.L1E_Pump2.paths = {'PumpResistance' 'PumpResistance'}; 92 | components.L1E_Pump2.profiles = [1 2]; 93 | 94 | components.L1F_LGT4.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 95 | components.L1F_LGT4.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1F/LGT4/'; 96 | components.L1F_LGT4.paths = {'R' 'R'}; 97 | components.L1F_LGT4.profiles = [1 2]; 98 | 99 | % load bank 2 ac loads 100 | 101 | components.L2A_Pump1.faultModes = {'Flow Resistance Abrupt' 'Flow Resistance Incipient'}; 102 | components.L2A_Pump1.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2A/PMP1/'; 103 | components.L2A_Pump1.paths = {'PumpResistance' 'PumpResistance'}; 104 | components.L2A_Pump1.profiles = [1 2]; 105 | 106 | components.L2B_LGT2.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 107 | components.L2B_LGT2.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2B/LGT2/'; 108 | components.L2B_LGT2.paths = {'R' 'R'}; 109 | components.L2B_LGT2.profiles = [1 2]; 110 | 111 | components.L2C_Fan4.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 112 | components.L2C_Fan4.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2C/FAN4/'; 113 | components.L2C_Fan4.paths = {'R' 'R'}; 114 | components.L2C_Fan4.profiles = [1 2]; 115 | 116 | components.L2D_LGT9.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 117 | components.L2D_LGT9.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2D/LGT9/'; 118 | components.L2D_LGT9.paths = {'R' 'R'}; 119 | components.L2D_LGT9.profiles = [1 2]; 120 | 121 | components.L2E_LGT7_Bulb1.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 122 | components.L2E_LGT7_Bulb1.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/LGT7/LightBulb1/'; 123 | components.L2E_LGT7_Bulb1.paths = {'R' 'R'}; 124 | components.L2E_LGT7_Bulb1.profiles = [1 2]; 125 | 126 | components.L2E_LGT7_Bulb2.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 127 | components.L2E_LGT7_Bulb2.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/LGT7/LightBulb2/'; 128 | components.L2E_LGT7_Bulb2.paths = {'R' 'R'}; 129 | components.L2E_LGT7_Bulb2.profiles = [1 2]; 130 | 131 | components.L2E_LGT7_Bulb3.faultModes = {'Resistance Abrupt' 'Resistance Incipient'}; 132 | components.L2E_LGT7_Bulb3.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/LGT7/LightBulb3/'; 133 | components.L2E_LGT7_Bulb3.paths = {'R' 'R'}; 134 | components.L2E_LGT7_Bulb3.profiles = [1 2]; 135 | 136 | components.L2F_Fan2.faultModes = {'Resistance Abrupt' 'Resistance Incipient' 'Friction Abrupt' 'Friction Incipient'}; 137 | components.L2F_Fan2.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2F/FAN2/'; 138 | components.L2F_Fan2.paths = {'Resistance' 'Resistance' 'Friction' 'Friction'}; 139 | components.L2F_Fan2.profiles = [1 2 1 2]; 140 | 141 | % circuit breakers 142 | 143 | components.EY162.faultModes = {'Failed Off' 'Current Limit'}; 144 | components.EY162.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/CircuitBreakerEY162/'; 145 | components.EY162.paths = {'CircuitBreakerConnected' 'CurrentLimit'}; 146 | components.EY162.profiles = [1 1]; 147 | 148 | components.EY166.faultModes = {'Failed Off' 'Current Limit'}; 149 | components.EY166.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/CircuitBreakerEY166/'; 150 | components.EY166.paths = {'CircuitBreakerConnected' 'CurrentLimit'}; 151 | components.EY166.profiles = [1 1]; 152 | 153 | components.EY180.faultModes = {'Failed Off' 'Current Limit'}; 154 | components.EY180.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/CircuitBreakerEY180/'; 155 | components.EY180.paths = {'CircuitBreakerConnected' 'CurrentLimit'}; 156 | components.EY180.profiles = [1 1]; 157 | 158 | components.EY262.faultModes = {'Failed Off' 'Current Limit'}; 159 | components.EY262.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/CircuitBreakerEY262/'; 160 | components.EY262.paths = {'CircuitBreakerConnected' 'CurrentLimit'}; 161 | components.EY262.profiles = [1 1]; 162 | 163 | components.EY266.faultModes = {'Failed Off' 'Current Limit'}; 164 | components.EY266.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/CircuitBreakerEY266/'; 165 | components.EY266.paths = {'CircuitBreakerConnected' 'CurrentLimit'}; 166 | components.EY266.profiles = [1 1]; 167 | 168 | components.EY280.faultModes = {'Failed Off' 'Current Limit'}; 169 | components.EY280.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/CircuitBreakerEY280/'; 170 | components.EY280.paths = {'CircuitBreakerConnected' 'CurrentLimit'}; 171 | components.EY280.profiles = [1 1]; 172 | 173 | % circuit breakers with open commands 174 | 175 | components.EY136.faultModes = {'Stuck'}; 176 | components.EY136.path = 'VirtualADAPT/VirtualADAPTv1/EY136_OPFaultInject/'; 177 | components.EY136.paths = {''}; 178 | components.EY136.profiles = [1]; 179 | 180 | components.EY236.faultModes = {'Stuck'}; 181 | components.EY236.path = 'VirtualADAPT/VirtualADAPTv1/EY236_OPFaultInject/'; 182 | components.EY236.paths = {''}; 183 | components.EY236.profiles = [1]; 184 | 185 | % relays 186 | 187 | components.EY141.faultModes = {'Stuck'}; 188 | components.EY141.path = 'VirtualADAPT/VirtualADAPTv1/EY141_CLFaultInject/'; 189 | components.EY141.paths = {''}; 190 | components.EY141.profiles = [1]; 191 | 192 | components.EY144.faultModes = {'Stuck'}; 193 | components.EY144.path = 'VirtualADAPT/VirtualADAPTv1/EY144_CLFaultInject/'; 194 | components.EY144.paths = {''}; 195 | components.EY144.profiles = [1]; 196 | 197 | components.EY160.faultModes = {'Stuck'}; 198 | components.EY160.path = 'VirtualADAPT/VirtualADAPTv1/EY160_CLFaultInject/'; 199 | components.EY160.paths = {''}; 200 | components.EY160.profiles = [1]; 201 | 202 | components.EY170.faultModes = {'Stuck'}; 203 | components.EY170.path = 'VirtualADAPT/VirtualADAPTv1/EY170_CLFaultInject/'; 204 | components.EY170.paths = {''}; 205 | components.EY170.profiles = [1]; 206 | 207 | components.EY171.faultModes = {'Stuck'}; 208 | components.EY171.path = 'VirtualADAPT/VirtualADAPTv1/EY171_CLFaultInject/'; 209 | components.EY171.paths = {''}; 210 | components.EY171.profiles = [1]; 211 | 212 | components.EY172.faultModes = {'Stuck'}; 213 | components.EY172.path = 'VirtualADAPT/VirtualADAPTv1/EY172_CLFaultInject/'; 214 | components.EY172.paths = {''}; 215 | components.EY172.profiles = [1]; 216 | 217 | components.EY173.faultModes = {'Stuck'}; 218 | components.EY173.path = 'VirtualADAPT/VirtualADAPTv1/EY173_CLFaultInject/'; 219 | components.EY173.paths = {''}; 220 | components.EY173.profiles = [1]; 221 | 222 | components.EY174.faultModes = {'Stuck'}; 223 | components.EY174.path = 'VirtualADAPT/VirtualADAPTv1/EY174_CLFaultInject/'; 224 | components.EY174.paths = {''}; 225 | components.EY174.profiles = [1]; 226 | 227 | components.EY175.faultModes = {'Stuck'}; 228 | components.EY175.path = 'VirtualADAPT/VirtualADAPTv1/EY175_CLFaultInject/'; 229 | components.EY175.paths = {''}; 230 | components.EY175.profiles = [1]; 231 | 232 | components.EY183.faultModes = {'Stuck'}; 233 | components.EY183.path = 'VirtualADAPT/VirtualADAPTv1/EY183_CLFaultInject/'; 234 | components.EY183.paths = {''}; 235 | components.EY183.profiles = [1]; 236 | 237 | components.EY184.faultModes = {'Stuck'}; 238 | components.EY184.path = 'VirtualADAPT/VirtualADAPTv1/EY184_CLFaultInject/'; 239 | components.EY184.paths = {''}; 240 | components.EY184.profiles = [1]; 241 | 242 | components.EY241.faultModes = {'Stuck'}; 243 | components.EY241.path = 'VirtualADAPT/VirtualADAPTv1/EY241_CLFaultInject/'; 244 | components.EY241.paths = {''}; 245 | components.EY241.profiles = [1]; 246 | 247 | components.EY244.faultModes = {'Stuck'}; 248 | components.EY244.path = 'VirtualADAPT/VirtualADAPTv1/EY244_CLFaultInject/'; 249 | components.EY244.paths = {''}; 250 | components.EY244.profiles = [1]; 251 | 252 | components.EY260.faultModes = {'Stuck'}; 253 | components.EY260.path = 'VirtualADAPT/VirtualADAPTv1/EY260_CLFaultInject/'; 254 | components.EY260.paths = {''}; 255 | components.EY260.profiles = [1]; 256 | 257 | components.EY270.faultModes = {'Stuck'}; 258 | components.EY270.path = 'VirtualADAPT/VirtualADAPTv1/EY270_CLFaultInject/'; 259 | components.EY270.paths = {''}; 260 | components.EY270.profiles = [1]; 261 | 262 | components.EY271.faultModes = {'Stuck'}; 263 | components.EY271.path = 'VirtualADAPT/VirtualADAPTv1/EY271_CLFaultInject/'; 264 | components.EY271.paths = {''}; 265 | components.EY271.profiles = [1]; 266 | 267 | components.EY272.faultModes = {'Stuck'}; 268 | components.EY272.path = 'VirtualADAPT/VirtualADAPTv1/EY272_CLFaultInject/'; 269 | components.EY272.paths = {''}; 270 | components.EY272.profiles = [1]; 271 | 272 | components.EY273.faultModes = {'Stuck'}; 273 | components.EY273.path = 'VirtualADAPT/VirtualADAPTv1/EY273_CLFaultInject/'; 274 | components.EY273.paths = {''}; 275 | components.EY273.profiles = [1]; 276 | 277 | components.EY274.faultModes = {'Stuck'}; 278 | components.EY274.path = 'VirtualADAPT/VirtualADAPTv1/EY274_CLFaultInject/'; 279 | components.EY274.paths = {''}; 280 | components.EY274.profiles = [1]; 281 | 282 | components.EY275.faultModes = {'Stuck'}; 283 | components.EY275.path = 'VirtualADAPT/VirtualADAPTv1/EY275_CLFaultInject/'; 284 | components.EY275.paths = {''}; 285 | components.EY275.profiles = [1]; 286 | 287 | components.EY283.faultModes = {'Stuck'}; 288 | components.EY283.path = 'VirtualADAPT/VirtualADAPTv1/EY283_CLFaultInject/'; 289 | components.EY283.paths = {''}; 290 | components.EY283.profiles = [1]; 291 | 292 | components.EY284.faultModes = {'Stuck'}; 293 | components.EY284.path = 'VirtualADAPT/VirtualADAPTv1/EY284_CLFaultInject/'; 294 | components.EY284.paths = {''}; 295 | components.EY284.profiles = [1]; 296 | 297 | components.EY170.faultModes = {'Stuck'}; 298 | components.EY170.path = 'VirtualADAPT/VirtualADAPTv1/EY170_CLFaultInject/'; 299 | components.EY170.paths = {''}; 300 | components.EY170.profiles = [1]; 301 | 302 | % sensors 303 | 304 | components.LT500.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 305 | components.LT500.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/SensorLT500/'; 306 | components.LT500.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 307 | components.LT500.profiles = [1 3 2 4]; 308 | 309 | components.TE500.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 310 | components.TE500.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/SensorTE500/'; 311 | components.TE500.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 312 | components.TE500.profiles = [1 3 2 4]; 313 | 314 | components.TE501.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 315 | components.TE501.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/SensorTE501/'; 316 | components.TE501.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 317 | components.TE501.profiles = [1 3 2 4]; 318 | 319 | components.TE502.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 320 | components.TE502.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1A/SensorTE502/'; 321 | components.TE502.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 322 | components.TE502.profiles = [1 3 2 4]; 323 | 324 | components.ST515.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 325 | components.ST515.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1B/SensorST515/'; 326 | components.ST515.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 327 | components.ST515.profiles = [1 3 2 4]; 328 | 329 | components.FT525.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 330 | components.FT525.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1E/SensorFT525/'; 331 | components.FT525.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 332 | components.FT525.profiles = [1 3 2 4]; 333 | 334 | components.TE511.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 335 | components.TE511.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank1/L1F/SensorTE511/'; 336 | components.TE511.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 337 | components.TE511.profiles = [1 3 2 4]; 338 | 339 | components.FT520.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 340 | components.FT520.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2A/SensorFT520/'; 341 | components.FT520.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 342 | components.FT520.profiles = [1 3 2 4]; 343 | 344 | components.TE510.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 345 | components.TE510.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2B/SensorTE510/'; 346 | components.TE510.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 347 | components.TE510.profiles = [1 3 2 4]; 348 | 349 | components.LT505.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 350 | components.LT505.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/SensorLT505/'; 351 | components.LT505.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 352 | components.LT505.profiles = [1 3 2 4]; 353 | 354 | components.TE505.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 355 | components.TE505.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/SensorTE505/'; 356 | components.TE505.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 357 | components.TE505.profiles = [1 3 2 4]; 358 | 359 | components.TE506.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 360 | components.TE506.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/SensorTE506/'; 361 | components.TE506.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 362 | components.TE506.profiles = [1 3 2 4]; 363 | 364 | components.TE507.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 365 | components.TE507.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2E/SensorTE507/'; 366 | components.TE507.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 367 | components.TE507.profiles = [1 3 2 4]; 368 | 369 | components.ST516.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 370 | components.ST516.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/ACLoadBank2/L2F/SensorST516/'; 371 | components.ST516.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 372 | components.ST516.profiles = [1 3 2 4]; 373 | 374 | components.E165.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 375 | components.E165.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorE165/'; 376 | components.E165.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 377 | components.E165.profiles = [1 3 2 4]; 378 | 379 | components.E167.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 380 | components.E167.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorE167/'; 381 | components.E167.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 382 | components.E167.profiles = [1 3 2 4]; 383 | 384 | components.E181.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 385 | components.E181.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorE181/'; 386 | components.E181.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 387 | components.E181.profiles = [1 3 2 4]; 388 | 389 | components.E265.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 390 | components.E265.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorE265/'; 391 | components.E265.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 392 | components.E265.profiles = [1 3 2 4]; 393 | 394 | components.E267.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 395 | components.E267.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorE267/'; 396 | components.E267.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 397 | components.E267.profiles = [1 3 2 4]; 398 | 399 | components.E281.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 400 | components.E281.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorE281/'; 401 | components.E281.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 402 | components.E281.profiles = [1 3 2 4]; 403 | 404 | components.IT167.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 405 | components.IT167.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorIT167/'; 406 | components.IT167.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 407 | components.IT167.profiles = [1 3 2 4]; 408 | 409 | components.IT181.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 410 | components.IT181.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorIT181/'; 411 | components.IT181.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 412 | components.IT181.profiles = [1 3 2 4]; 413 | 414 | components.IT267.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 415 | components.IT267.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorIT267/'; 416 | components.IT267.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 417 | components.IT267.profiles = [1 3 2 4]; 418 | 419 | components.IT281.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 420 | components.IT281.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorIT281/'; 421 | components.IT281.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 422 | components.IT281.profiles = [1 3 2 4]; 423 | 424 | components.ST165.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 425 | components.ST165.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorST165/'; 426 | components.ST165.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 427 | components.ST165.profiles = [1 3 2 4]; 428 | 429 | components.ST265.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 430 | components.ST265.path = 'VirtualADAPT/VirtualADAPTv1/PowerDistribution/SensorST265/'; 431 | components.ST265.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 432 | components.ST265.profiles = [1 3 2 4]; 433 | 434 | components.E135.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 435 | components.E135.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/SensorE135/'; 436 | components.E135.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 437 | components.E135.profiles = [1 3 2 4]; 438 | 439 | components.E140.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 440 | components.E140.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/SensorE140/'; 441 | components.E140.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 442 | components.E140.profiles = [1 3 2 4]; 443 | 444 | components.E142.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 445 | components.E142.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/SensorE142/'; 446 | components.E142.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 447 | components.E142.profiles = [1 3 2 4]; 448 | 449 | components.IT140.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 450 | components.IT140.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/SensorIT140/'; 451 | components.IT140.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 452 | components.IT140.profiles = [1 3 2 4]; 453 | 454 | components.TE128.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 455 | components.TE128.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/SensorTE128/'; 456 | components.TE128.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 457 | components.TE128.profiles = [1 3 2 4]; 458 | 459 | components.TE129.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 460 | components.TE129.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery1Subsystem/SensorTE129/'; 461 | components.TE129.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 462 | components.TE129.profiles = [1 3 2 4]; 463 | 464 | components.E235.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 465 | components.E235.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/SensorE235/'; 466 | components.E235.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 467 | components.E235.profiles = [1 3 2 4]; 468 | 469 | components.E240.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 470 | components.E240.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/SensorE240/'; 471 | components.E240.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 472 | components.E240.profiles = [1 3 2 4]; 473 | 474 | components.E242.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 475 | components.E242.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/SensorE242/'; 476 | components.E242.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 477 | components.E242.profiles = [1 3 2 4]; 478 | 479 | components.IT240.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 480 | components.IT240.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/SensorIT240/'; 481 | components.IT240.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 482 | components.IT240.profiles = [1 3 2 4]; 483 | 484 | components.TE228.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 485 | components.TE228.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/SensorTE228/'; 486 | components.TE228.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 487 | components.TE228.profiles = [1 3 2 4]; 488 | 489 | components.TE229.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 490 | components.TE229.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/Battery2Subsystem/SensorTE229/'; 491 | components.TE229.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 492 | components.TE229.profiles = [1 3 2 4]; 493 | 494 | components.E161.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 495 | components.E161.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/SensorE161/'; 496 | components.E161.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 497 | components.E161.profiles = [1 3 2 4]; 498 | 499 | components.E261.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 500 | components.E261.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/SensorE261/'; 501 | components.E261.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 502 | components.E261.profiles = [1 3 2 4]; 503 | 504 | components.IT161.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 505 | components.IT161.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/SensorIT161/'; 506 | components.IT161.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 507 | components.IT161.profiles = [1 3 2 4]; 508 | 509 | components.IT261.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 510 | components.IT261.path = 'VirtualADAPT/VirtualADAPTv1/PowerStorage/SensorIT261/'; 511 | components.IT261.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 512 | components.IT261.profiles = [1 3 2 4]; 513 | 514 | components.TE133.faultModes = {'Gain' 'Bias' 'Incipient' 'Stuck'}; 515 | components.TE133.path = 'VirtualADAPT/VirtualADAPTv1/SensorTE133/'; 516 | components.TE133.paths = {'MSe' 'MSe' 'MSe' 'MSe'}; 517 | components.TE133.profiles = [1 3 2 4]; 518 | --------------------------------------------------------------------------------