source: MML/trunk/mml/doc_html/mml/getpv.html @ 4

Last change on this file since 4 was 4, checked in by zhangj, 10 years ago

Initial import--MML version from SOLEIL@2013

File size: 112.7 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2                "http://www.w3.org/TR/REC-html40/loose.dtd">
3<html>
4<head>
5  <title>Description of getpv</title>
6  <meta name="keywords" content="getpv">
7  <meta name="description" content="GETPV - Returns a variable from the online system or the model">
8  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
9  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
10  <meta name="robots" content="index, follow">
11  <link type="text/css" rel="stylesheet" href="../m2html.css">
12</head>
13<body>
14<a name="_top"></a>
15<div><a href="../index.html">Home</a> &gt;  <a href="index.html">mml</a> &gt; getpv.m</div>
16
17<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
18<td align="right"><a href="index.html">Index for mml&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
19
20<h1>getpv
21</h1>
22
23<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
24<div class="box"><strong>GETPV - Returns a variable from the online system or the model</strong></div>
25
26<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
27<div class="box"><strong>function [AM, tout, DataTime, ErrorFlag] = getpv(varargin) </strong></div>
28
29<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
30<div class="fragment"><pre class="comment">GETPV - Returns a variable from the online system or the model
31
32  FamilyName/DeviceList Method
33  [AM, tout, DataTime] = getpv(Family, Field, DeviceList, t, FreshDataFlag, TimeOutPeriod)
34
35  Data Structure
36  [AM, tout, DataTime] = getpv(DataStructure, t, FreshDataFlag, TimeOutPeriod)
37
38  TangoName or ChannelName Method
39  [AM, tout, DataTime, ErrorFlag] = getpv(TangoName, t, FreshDataFlag, TimeOutPeriod)
40
41  CommonName Method (Family can be '' to search all families, Field is optional)
42  [AM, tout, DataTime] = getpv(CommonName, Field, t, FreshDataFlag, TimeOutPeriod)
43  [AM, tout, DataTime] = getpv(Family, Field, CommonName, t, FreshDataFlag, TimeOutPeriod)
44
45  INPUTS
46  1. Family - Family Name
47              Data Structure
48              Channel Name
49              TangoName
50              Accelerator Object
51              For CommonNames, Family=[] searches all families
52              (or Cell Array of inputs)
53
54  2. Field - Subfield name of an accelerator family ('Monitor', 'Setpoint', etc) 
55             {Default: 'Monitor' or '' or ChannelName method}
56             (For non-Family subfields, Field is added as .Field, see Note #8 below for more information.)
57
58  3. DeviceList - [Sector Device #] or [element #] list {Default or empty list: Entire family}
59                  Note: if input 1 is a cell array then DeviceList must be a cell array
60     CommonName - Common name can replace a DeviceList (scalar or vector outputs)
61
62  4. t - Time vector of when to start taking data (t can not be a cell) {Default: 0}
63
64  5. FreshDataFlag -  0   -&gt; Return after first measurement {Default}
65                     else -&gt; Return after FreshDataFlag number of new measurements have been read
66                     Ie, getpv('BPMx',[1 1],0,2) measures the orbit then continues to read the orbit
67                         until 2 new orbits have been measured and returns the last measurement.
68                     Note: 1. t can only be a scalar when using the FreshDataFlag.
69                           2. FreshDataFlag cannot be used with 'Matrix' data types.
70
71  6. TimeOutPeriod - Time-out period when waiting for fresh data {Default: 10 seconds}
72
73  7. 'Struct'  - Return a data structure {Default for data structure inputs}
74     'Numeric' - Return numeric outputs  {Default for non-data structure inputs}
75     'Object'  - Return a accelerator object (AccObj)
76
77  8. Units flag overrides
78     'Physics'  - Use physics  units
79     'Hardware' - Use hardware units
80
81  9. Mode flag overrides
82     'Online' - Get data online
83     'Model'  - get data on the model
84     'Manual' - Get data manually
85
86  10. 'Double' - The output will be a double {Default}
87      'String' - The output will be a string
88
89
90  OUTPUTS
91  1. AM   - Monitor values (Column vector or matrix where each column is a data point in time)
92
93  2. tout - Time when measurement was completed according to the computer time (Matlab time) (row vector)
94            tout-t is the time it took to make the measurement.  diff(t) can be arbitarily small, but tout will
95            report the actual completion time. 
96
97  3. DataTime - Time when the data was measured (as report by the hardware)
98                Time since 00:00:00, Jan 1, 1970 in days (in the present time zone)
99                Units are in Matlab &quot;serial day number&quot; format (days) to be compatible with
100                timing functions like datevec, datenum, datetick, etc. 
101                For exemple, [d,t,datatime] = getam('BPMx',[],0:.5:10);
102                            plot(datatime, d); datetick x
103                When using the model, the datatime is the same a the computer time (Matlab time).
104
105  NOTES
106  1. The output will be a data structure if the word 'struct' appears somewhere on the input line
107     or if the input is a data structure and 'numeric' is not on the input line.
108
109  2. For data structure inputs:
110     Family     - DataStructure.FamilyName (This field must exist)
111     Field      - DataStructure.Field      (Field can be overridden on the input line)
112     DeviceList - DataStructure.DeviceList (DeviceList can be overridden on the input line)
113     Units      - DataStructure.Units      (Units can be overridden on the input line)
114     (The Mode field is ignored!)
115
116  3. For data structure outputs:
117     TimeStamp  - Time (Matlab clock) at the start of the function
118     tout       - Delta time vector at the end of each measurement (relative to TimeStamp)
119
120  4. diff(t) should not be too small.  If the desired time to collect the data is too
121     short then the data collecting will not be able to keep up.  Always check tout.
122     (t - tout) is the time it took to collect the data on each iteration.   
123 
124  5. An easy way to averaged 10 monitors is:
125     PVmean = mean(getpv(Family,DeviceList,0:.5:4.5)')';   % .5 second between measurements
126
127  6. Channel name method is always Online!
128
129  7. It is often useful to measure the update rate of a set of channel by using a very
130     small time between measurements.
131     For exmple, [d, tout] = getpv('BPMx', 'Monitor', [], 0:eps:100*eps);
132                 plot(tout(1:end-1), 1./diff(tout),'.-'); % Point-wise data rate
133                 If the update rate of the hardware is slower then the control system, then
134                 hardware data rate can be visually inspected by plotting,
135                 plot(tout, d,'.-');
136
137  8. For cell array inputs:
138     a. Input 1 defines the size of all cells
139     b. All of the cell array inputs must be the same size
140     c. Field does not have to be a cell array but DeviceList does (if they exist)
141     d. t, FreshDataFlag, TimeOutPeriod can not be cell arrays
142     e. Waveforms do not work with cell arrays.
143
144  8. The Field input can be used for getting the &quot;dot&quot; EPICS field.  For instance, at the ALS
145     getpv('BPMx','SCAN',[1 2],'String') will return SR01S___IBPM2X_AM02.SCAN as a string.
146     (Note: at Spear ':' is used instead of '.')
147
148  10. Error flaga are not used at the moment since all errors cause a Matlab error.
149      Use try;catch statements to catch errors.
150
151  12. If say Golden is a software field in the MML structure in the BPMx family, then
152      getpv('BPMx','Golden', DeviceList) will return the data in that field.
153
154  See also <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>, <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>, <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>, <a href="steppv.html" class="code" title="function ErrorFlag = steppv(varargin)">steppv</a>
155
156  Written by Greg Portmann</pre></div>
157
158<!-- crossreference -->
159<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
160This function calls:
161<ul style="list-style-image:url(../matlabicon.gif)">
162<li><a href="common2dev.html" class="code" title="function [DeviceList, FamilyName, ErrorFlag] = common2dev(CommonNames, FamilyList)">common2dev</a>    COMMON2DEV - Converts a common name to a device list</li><li><a href="elem2dev.html" class="code" title="function Output = elem2dev(Family, ElementList)">elem2dev</a>  ELEM2DEV - Converts a device list to an element list</li><li><a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>  FAMILY2DEV - Return the device list for a family</li><li><a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>     GETFAMILYDATA - Gets data associated with the accelerator control</li><li><a href="getmode.html" class="code" title="function Mode = getmode(Family, Field)">getmode</a>        GETMODE - Returns the present family mode ('Online', 'Simulator', 'Manual', 'Special', etc)</li><li><a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>      GETPV - Returns a variable from the online system or the model</li><li><a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a> GETRF - Gets the RF frequency</li><li><a href="getunits.html" class="code" title="function [Units, UnitsString] = getunits(Family, Field)">getunits</a> GETUNITS - Return the present family units and units string</li><li><a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>     HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units</li><li><a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>   ISFAMILY - True for family names</li><li><a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>        PHYSICS2HW - Converts from 'Physics' units to 'Hardware' units</li></ul>
163This function is called by:
164<ul style="list-style-image:url(../matlabicon.gif)">
165<li><a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>      GETAM - Gets monitor channels</li><li><a href="getdcct.html" class="code" title="function [DCCT, tout, DataTime, ErrorFlag] = getdcct(varargin)">getdcct</a>    GETDCCT - returns the beam current</li><li><a href="getmachineconfig.html" class="code" title="function [ConfigSetpoint, ConfigMonitor, FileName] = getmachineconfig(varargin)">getmachineconfig</a>    GETMACHINECONFIG - Returns or saves to file the present storage ring setpoints and monitors</li><li><a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>      GETPV - Returns a variable from the online system or the model</li><li><a href="getramprate.html" class="code" title="function RampRate = getramprate(varargin)">getramprate</a>        GETRAMPRATE - Returns the ramp rate for a family</li><li><a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a>       GETRF - Gets the RF frequency</li><li><a href="getrunflag.html" class="code" title="function [RunFlag, Delta, Tol] = getrunflag(varargin)">getrunflag</a>       GETRUNFLAG - Returns position if the device is in the process of changing a setpoint</li><li><a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>     GETSP - Gets setpoint channels</li><li><a href="gettune.html" class="code" title="function [Tune, tout, DataTime, ErrorFlag] = gettune(varargin)">gettune</a>   GETTUNE - Returns the betatron tunes</li><li><a href="getx.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getx(varargin)">getx</a>        GETX - Returns the horizontal orbit</li><li><a href="gety.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = gety(varargin)">gety</a> GETY - Returns the vertical orbit</li><li><a href="measidfftable.html" class="code" title="function ffgettbl(Sector, BPMFlag)">measidfftable</a>        FFGETTBL - Measures an insertion device feed forward table for the vertical gap</li><li><a href="plotwaveform.html" class="code" title="function plotwaveform()">plotwaveform</a>       PJ BOussina waveform loader September 11, 2006</li><li><a href="rmgolden.html" class="code" title="function Data = rmgolden(varargin)">rmgolden</a>     RMGOLDEN - Remove the golden values for data set</li><li><a href="rmoffset.html" class="code" title="function Data = rmoffset(varargin)">rmoffset</a>   RMOFFSET - Remove the offset values for data set</li><li><a href="setorbit.html" class="code" title="function [OCS, OCS0, V, S, ErrorFlag] = setorbit(varargin)">setorbit</a>   SETORBIT - Orbit correction function</li><li><a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>   SETPV - Setpoint change of the online system or model</li></ul>
166<!-- crossreference -->
167
168<h2><a name="_subfunctions"></a>SUBFUNCTIONS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
169<ul style="list-style-image:url(../matlabicon.gif)">
170<li><a href="#_sub1" class="code">function [AM, tout, DataTime, DeviceList, ErrorFlag] = getbycommonname(CommonNames, Field, t, t0, FreshDataFlag, TimeOutPeriod, varargin)</a></li><li><a href="#_sub2" class="code">function [AM, tout, DataTime, ErrorFlag] = local_getbyname(ChannelName, OutputDataType, N, t, FreshDataFlag, TimeOutPeriod)</a></li><li><a href="#_sub3" class="code">function [AM, tout, DataTime, ErrorFlag, DeviceIndex] = local_getpv(AO, Field, DeviceList, OutputDataType, t, FreshDataFlag, TimeOutPeriod)</a></li></ul>
171<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
172<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)</a>
1730002 <span class="comment">%GETPV - Returns a variable from the online system or the model</span>
1740003 <span class="comment">%</span>
1750004 <span class="comment">%  FamilyName/DeviceList Method</span>
1760005 <span class="comment">%  [AM, tout, DataTime] = getpv(Family, Field, DeviceList, t, FreshDataFlag, TimeOutPeriod)</span>
1770006 <span class="comment">%</span>
1780007 <span class="comment">%  Data Structure</span>
1790008 <span class="comment">%  [AM, tout, DataTime] = getpv(DataStructure, t, FreshDataFlag, TimeOutPeriod)</span>
1800009 <span class="comment">%</span>
1810010 <span class="comment">%  TangoName or ChannelName Method</span>
1820011 <span class="comment">%  [AM, tout, DataTime, ErrorFlag] = getpv(TangoName, t, FreshDataFlag, TimeOutPeriod)</span>
1830012 <span class="comment">%</span>
1840013 <span class="comment">%  CommonName Method (Family can be '' to search all families, Field is optional)</span>
1850014 <span class="comment">%  [AM, tout, DataTime] = getpv(CommonName, Field, t, FreshDataFlag, TimeOutPeriod)</span>
1860015 <span class="comment">%  [AM, tout, DataTime] = getpv(Family, Field, CommonName, t, FreshDataFlag, TimeOutPeriod)</span>
1870016 <span class="comment">%</span>
1880017 <span class="comment">%  INPUTS</span>
1890018 <span class="comment">%  1. Family - Family Name</span>
1900019 <span class="comment">%              Data Structure</span>
1910020 <span class="comment">%              Channel Name</span>
1920021 <span class="comment">%              TangoName</span>
1930022 <span class="comment">%              Accelerator Object</span>
1940023 <span class="comment">%              For CommonNames, Family=[] searches all families</span>
1950024 <span class="comment">%              (or Cell Array of inputs)</span>
1960025 <span class="comment">%</span>
1970026 <span class="comment">%  2. Field - Subfield name of an accelerator family ('Monitor', 'Setpoint', etc)</span>
1980027 <span class="comment">%             {Default: 'Monitor' or '' or ChannelName method}</span>
1990028 <span class="comment">%             (For non-Family subfields, Field is added as .Field, see Note #8 below for more information.)</span>
2000029 <span class="comment">%</span>
2010030 <span class="comment">%  3. DeviceList - [Sector Device #] or [element #] list {Default or empty list: Entire family}</span>
2020031 <span class="comment">%                  Note: if input 1 is a cell array then DeviceList must be a cell array</span>
2030032 <span class="comment">%     CommonName - Common name can replace a DeviceList (scalar or vector outputs)</span>
2040033 <span class="comment">%</span>
2050034 <span class="comment">%  4. t - Time vector of when to start taking data (t can not be a cell) {Default: 0}</span>
2060035 <span class="comment">%</span>
2070036 <span class="comment">%  5. FreshDataFlag -  0   -&gt; Return after first measurement {Default}</span>
2080037 <span class="comment">%                     else -&gt; Return after FreshDataFlag number of new measurements have been read</span>
2090038 <span class="comment">%                     Ie, getpv('BPMx',[1 1],0,2) measures the orbit then continues to read the orbit</span>
2100039 <span class="comment">%                         until 2 new orbits have been measured and returns the last measurement.</span>
2110040 <span class="comment">%                     Note: 1. t can only be a scalar when using the FreshDataFlag.</span>
2120041 <span class="comment">%                           2. FreshDataFlag cannot be used with 'Matrix' data types.</span>
2130042 <span class="comment">%</span>
2140043 <span class="comment">%  6. TimeOutPeriod - Time-out period when waiting for fresh data {Default: 10 seconds}</span>
2150044 <span class="comment">%</span>
2160045 <span class="comment">%  7. 'Struct'  - Return a data structure {Default for data structure inputs}</span>
2170046 <span class="comment">%     'Numeric' - Return numeric outputs  {Default for non-data structure inputs}</span>
2180047 <span class="comment">%     'Object'  - Return a accelerator object (AccObj)</span>
2190048 <span class="comment">%</span>
2200049 <span class="comment">%  8. Units flag overrides</span>
2210050 <span class="comment">%     'Physics'  - Use physics  units</span>
2220051 <span class="comment">%     'Hardware' - Use hardware units</span>
2230052 <span class="comment">%</span>
2240053 <span class="comment">%  9. Mode flag overrides</span>
2250054 <span class="comment">%     'Online' - Get data online</span>
2260055 <span class="comment">%     'Model'  - get data on the model</span>
2270056 <span class="comment">%     'Manual' - Get data manually</span>
2280057 <span class="comment">%</span>
2290058 <span class="comment">%  10. 'Double' - The output will be a double {Default}</span>
2300059 <span class="comment">%      'String' - The output will be a string</span>
2310060 <span class="comment">%</span>
2320061 <span class="comment">%</span>
2330062 <span class="comment">%  OUTPUTS</span>
2340063 <span class="comment">%  1. AM   - Monitor values (Column vector or matrix where each column is a data point in time)</span>
2350064 <span class="comment">%</span>
2360065 <span class="comment">%  2. tout - Time when measurement was completed according to the computer time (Matlab time) (row vector)</span>
2370066 <span class="comment">%            tout-t is the time it took to make the measurement.  diff(t) can be arbitarily small, but tout will</span>
2380067 <span class="comment">%            report the actual completion time.</span>
2390068 <span class="comment">%</span>
2400069 <span class="comment">%  3. DataTime - Time when the data was measured (as report by the hardware)</span>
2410070 <span class="comment">%                Time since 00:00:00, Jan 1, 1970 in days (in the present time zone)</span>
2420071 <span class="comment">%                Units are in Matlab &quot;serial day number&quot; format (days) to be compatible with</span>
2430072 <span class="comment">%                timing functions like datevec, datenum, datetick, etc.</span>
2440073 <span class="comment">%                For exemple, [d,t,datatime] = getam('BPMx',[],0:.5:10);</span>
2450074 <span class="comment">%                            plot(datatime, d); datetick x</span>
2460075 <span class="comment">%                When using the model, the datatime is the same a the computer time (Matlab time).</span>
2470076 <span class="comment">%</span>
2480077 <span class="comment">%  NOTES</span>
2490078 <span class="comment">%  1. The output will be a data structure if the word 'struct' appears somewhere on the input line</span>
2500079 <span class="comment">%     or if the input is a data structure and 'numeric' is not on the input line.</span>
2510080 <span class="comment">%</span>
2520081 <span class="comment">%  2. For data structure inputs:</span>
2530082 <span class="comment">%     Family     - DataStructure.FamilyName (This field must exist)</span>
2540083 <span class="comment">%     Field      - DataStructure.Field      (Field can be overridden on the input line)</span>
2550084 <span class="comment">%     DeviceList - DataStructure.DeviceList (DeviceList can be overridden on the input line)</span>
2560085 <span class="comment">%     Units      - DataStructure.Units      (Units can be overridden on the input line)</span>
2570086 <span class="comment">%     (The Mode field is ignored!)</span>
2580087 <span class="comment">%</span>
2590088 <span class="comment">%  3. For data structure outputs:</span>
2600089 <span class="comment">%     TimeStamp  - Time (Matlab clock) at the start of the function</span>
2610090 <span class="comment">%     tout       - Delta time vector at the end of each measurement (relative to TimeStamp)</span>
2620091 <span class="comment">%</span>
2630092 <span class="comment">%  4. diff(t) should not be too small.  If the desired time to collect the data is too</span>
2640093 <span class="comment">%     short then the data collecting will not be able to keep up.  Always check tout.</span>
2650094 <span class="comment">%     (t - tout) is the time it took to collect the data on each iteration.</span>
2660095 <span class="comment">%</span>
2670096 <span class="comment">%  5. An easy way to averaged 10 monitors is:</span>
2680097 <span class="comment">%     PVmean = mean(getpv(Family,DeviceList,0:.5:4.5)')';   % .5 second between measurements</span>
2690098 <span class="comment">%</span>
2700099 <span class="comment">%  6. Channel name method is always Online!</span>
2710100 <span class="comment">%</span>
2720101 <span class="comment">%  7. It is often useful to measure the update rate of a set of channel by using a very</span>
2730102 <span class="comment">%     small time between measurements.</span>
2740103 <span class="comment">%     For exmple, [d, tout] = getpv('BPMx', 'Monitor', [], 0:eps:100*eps);</span>
2750104 <span class="comment">%                 plot(tout(1:end-1), 1./diff(tout),'.-'); % Point-wise data rate</span>
2760105 <span class="comment">%                 If the update rate of the hardware is slower then the control system, then</span>
2770106 <span class="comment">%                 hardware data rate can be visually inspected by plotting,</span>
2780107 <span class="comment">%                 plot(tout, d,'.-');</span>
2790108 <span class="comment">%</span>
2800109 <span class="comment">%  8. For cell array inputs:</span>
2810110 <span class="comment">%     a. Input 1 defines the size of all cells</span>
2820111 <span class="comment">%     b. All of the cell array inputs must be the same size</span>
2830112 <span class="comment">%     c. Field does not have to be a cell array but DeviceList does (if they exist)</span>
2840113 <span class="comment">%     d. t, FreshDataFlag, TimeOutPeriod can not be cell arrays</span>
2850114 <span class="comment">%     e. Waveforms do not work with cell arrays.</span>
2860115 <span class="comment">%</span>
2870116 <span class="comment">%  8. The Field input can be used for getting the &quot;dot&quot; EPICS field.  For instance, at the ALS</span>
2880117 <span class="comment">%     getpv('BPMx','SCAN',[1 2],'String') will return SR01S___IBPM2X_AM02.SCAN as a string.</span>
2890118 <span class="comment">%     (Note: at Spear ':' is used instead of '.')</span>
2900119 <span class="comment">%</span>
2910120 <span class="comment">%  10. Error flaga are not used at the moment since all errors cause a Matlab error.</span>
2920121 <span class="comment">%      Use try;catch statements to catch errors.</span>
2930122 <span class="comment">%</span>
2940123 <span class="comment">%  12. If say Golden is a software field in the MML structure in the BPMx family, then</span>
2950124 <span class="comment">%      getpv('BPMx','Golden', DeviceList) will return the data in that field.</span>
2960125 <span class="comment">%</span>
2970126 <span class="comment">%  See also getam, getsp, setpv, steppv</span>
2980127 <span class="comment">%</span>
2990128 <span class="comment">%  Written by Greg Portmann</span>
3000129
3010130
3020131 <span class="comment">% Starting time</span>
3030132 t0 = clock;
3040133
3050134
3060135 <span class="comment">% Defaults</span>
3070136 FieldDefault = <span class="string">'Monitor'</span>;
3080137 Field = FieldDefault;
3090138 DeviceList = [];
3100139 t = 0;
3110140 FreshDataFlag = 0;
3120141 TimeOutPeriod = 10;
3130142 ErrorFlag = 0;
3140143
3150144 StructOutputFlag = 0;
3160145 NumericOutputFlag = 0;
3170146 ObjectOutputFlag = 0;
3180147 ModeFlag = <span class="string">''</span>;
3190148 UnitsFlag = <span class="string">''</span>;
3200149 OutputDataType = <span class="string">'Double'</span>;
3210150
3220151
3230152 <span class="comment">% Look if 'struct' or 'numeric' in on the input line</span>
3240153 InputFlags = {};
3250154 <span class="keyword">for</span> i = length(varargin):-1:1
3260155     <span class="keyword">if</span> isstruct(varargin{i})
3270156         <span class="comment">% Ignor structures</span>
3280157     <span class="keyword">elseif</span> iscell(varargin{i})
3290158         <span class="comment">% Ignor cells</span>
3300159     <span class="keyword">elseif</span> isa(varargin{i},<span class="string">'AccObj'</span>)
3310160         AccObj1 = struct(varargin{i});
3320161         Families = fieldnames(AccObj1);
3330162         j = 0;
3340163         <span class="keyword">for</span> k = 1:length(Families)
3350164             <span class="keyword">if</span> ~isempty(AccObj1.(Families{k}))
3360165                 j = j + 1;
3370166                 tmpcell{j} = AccObj1.(Families{k});
3380167             <span class="keyword">end</span>
3390168         <span class="keyword">end</span>
3400169         <span class="keyword">if</span> length(tmpcell) == 1
3410170             varargin{i} = tmpcell{1};
3420171         <span class="keyword">else</span>
3430172             varargin{i} = tmpcell;
3440173         <span class="keyword">end</span>
3450174         <span class="keyword">if</span> ~NumericOutputFlag
3460175             ObjectOutputFlag = 1;
3470176             StructOutputFlag = 1;
3480177         <span class="keyword">end</span>
3490178     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'struct'</span>)
3500179         StructOutputFlag = 1;
3510180         ObjectOutputFlag = 0;
3520181         varargin(i) = [];
3530182     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'numeric'</span>)
3540183         NumericOutputFlag = 1;
3550184         StructOutputFlag = 0;
3560185         ObjectOutputFlag = 0;
3570186         varargin(i) = [];
3580187     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'simulator'</span>) || strcmpi(varargin{i},<span class="string">'model'</span>)
3590188         ModeFlag = <span class="string">'SIMULATOR'</span>;
3600189         InputFlags = [InputFlags varargin(i)];
3610190         varargin(i) = [];
3620191     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Online'</span>)
3630192         ModeFlag = <span class="string">'Online'</span>;
3640193         InputFlags = [InputFlags varargin(i)];
3650194         varargin(i) = [];
3660195     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Manual'</span>)
3670196         ModeFlag = <span class="string">'Manual'</span>;
3680197         InputFlags = [InputFlags varargin(i)];
3690198         varargin(i) = [];
3700199     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Special'</span>)
3710200         ModeFlag = <span class="string">'Special'</span>;
3720201         InputFlags = [InputFlags varargin(i)];
3730202         varargin(i) = [];
3740203     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'physics'</span>)
3750204         UnitsFlag = <span class="string">'Physics'</span>;
3760205         InputFlags = [InputFlags varargin(i)];
3770206         varargin(i) = [];
3780207     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'hardware'</span>)
3790208         UnitsFlag = <span class="string">'Hardware'</span>;
3800209         InputFlags = [InputFlags varargin(i)];
3810210         varargin(i) = [];
3820211     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'archive'</span>)
3830212         <span class="comment">% Just remove</span>
3840213         varargin(i) = [];
3850214     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'noarchive'</span>)
3860215         <span class="comment">% Just remove</span>
3870216         varargin(i) = [];
3880217     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'String'</span>)
3890218         OutputDataType = <span class="string">'String'</span>;
3900219         InputFlags = [InputFlags varargin(i)];
3910220         varargin(i) = [];
3920221     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Double'</span>)
3930222         OutputDataType = <span class="string">'Double'</span>;
3940223         InputFlags = [InputFlags varargin(i)];
3950224         varargin(i) = [];
3960225     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'WaveForm'</span>) || strcmpi(varargin{i},<span class="string">'Matrix'</span>)
3970226         OutputDataType = <span class="string">'Matrix'</span>;
3980227         InputFlags = [InputFlags varargin(i)];
3990228         varargin(i) = [];
4000229     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Object'</span>)
4010230         ObjectOutputFlag = 1;
4020231         StructOutputFlag = 1;
4030232         varargin(i) = [];
4040233     <span class="keyword">end</span>
4050234 <span class="keyword">end</span>
4060235
4070236 <span class="keyword">if</span> isempty(varargin)
4080237     error(<span class="string">'Must have at least one input (Family, Data structure, or Channel Name).'</span>);
4090238 <span class="keyword">end</span>
4100239
4110240
4120241
4130242 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
4140243 <span class="comment">% CELL OR CELL ARRAY INPUT %</span>
4150244 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
4160245 <span class="keyword">if</span> iscell(varargin{1})
4170246     <span class="comment">%if strcmpi(ModeFlag, 'Online') | (isempty(ModeFlag) &amp; strcmpi(getmode(varargin{1}{1}), 'Online'))</span>
4180247     <span class="comment">%     % Unfortunately the following code using channelnames is not much of a speed improvement over</span>
4190248     <span class="comment">%     % interating over cell arrays (which is needed for simulator mode)</span>
4200249     <span class="comment">%</span>
4210250     <span class="comment">%     % Online cell arrays</span>
4220251     <span class="comment">%     %</span>
4230252     <span class="comment">%     % Online cell arrays are treated differently because to the desired for speed.</span>
4240253     <span class="comment">%     % By loading all the channel names into one array then sending to the c-function</span>
4250254     <span class="comment">%     % with the t-vector, the total time is greatly sped up.  However, using channel names</span>
4260255     <span class="comment">%     % only works in online mode.  The one problem is all output have to scalars.</span>
4270256     <span class="comment">%</span>
4280257     <span class="comment">%</span>
4290258     <span class="comment">%     % Count the number of inputs which are cells (Family or DeviceList) or strings (possibly Field)</span>
4300259     <span class="comment">%     NCellOrString = 1;</span>
4310260     <span class="comment">%     for i = 2:length(varargin)</span>
4320261     <span class="comment">%         if ~iscell(varargin{i})</span>
4330262     <span class="comment">%             if ~ischar(varargin{i})</span>
4340263     <span class="comment">%                 break;</span>
4350264     <span class="comment">%             else</span>
4360265     <span class="comment">%                 NCellOrString = NCellOrString + 1;</span>
4370266     <span class="comment">%             end</span>
4380267     <span class="comment">%         else</span>
4390268     <span class="comment">%             NCellOrString = NCellOrString + 1;</span>
4400269     <span class="comment">%             %if length(varargin{1})~=length(varargin{NCellOrString}) | length(varargin{NCellOrString})==1</span>
4410270     <span class="comment">%             %    error('When using cell, all the cells must be the same size as input 1 or be length one.');</span>
4420271     <span class="comment">%             %end</span>
4430272     <span class="comment">%         end</span>
4440273     <span class="comment">%     end</span>
4450274     <span class="comment">%</span>
4460275     <span class="comment">%     % t (if it exists) should be the next input</span>
4470276     <span class="comment">%     if length(varargin) &gt;= NCellOrString+1</span>
4480277     <span class="comment">%         if iscell(varargin{NCellOrString+1})</span>
4490278     <span class="comment">%             error(sprintf('Expecting input #%d to be a time vector not a cell', NCellOrString+1));</span>
4500279     <span class="comment">%         end</span>
4510280     <span class="comment">%         if ischar(varargin{NCellOrString+1})</span>
4520281     <span class="comment">%             error(sprintf('Expecting input #%d to be a time vector not a string', NCellOrString+1));</span>
4530282     <span class="comment">%         end</span>
4540283     <span class="comment">%         t = varargin{NCellOrString+1};</span>
4550284     <span class="comment">%         varargin{NCellOrString+1} = [];</span>
4560285     <span class="comment">%         if isempty(t)</span>
4570286     <span class="comment">%             t = 0;</span>
4580287     <span class="comment">%         end</span>
4590288     <span class="comment">%     end</span>
4600289     <span class="comment">%</span>
4610290     <span class="comment">%     % FreshDataFlag (if it exists) should be the next input</span>
4620291     <span class="comment">%     if length(varargin) &gt;= NCellOrString+1</span>
4630292     <span class="comment">%         if iscell(varargin{NCellOrString+1})</span>
4640293     <span class="comment">%             error(sprintf('Expecting input #%d to be FreshDataFlag not a cell', NCellOrString+2));</span>
4650294     <span class="comment">%         end</span>
4660295     <span class="comment">%         if ischar(varargin{NCellOrString+1})</span>
4670296     <span class="comment">%             error(sprintf('Expecting input #%d to be FreshDataFlag not a string', NCellOrString+2));</span>
4680297     <span class="comment">%         end</span>
4690298     <span class="comment">%         FreshDataFlag = varargin{NCellOrString+1};</span>
4700299     <span class="comment">%         varargin{NCellOrString+1} = [];</span>
4710300     <span class="comment">%     end</span>
4720301     <span class="comment">%</span>
4730302     <span class="comment">%     % TimeOutPeriod (if it exists) should be the next input</span>
4740303     <span class="comment">%     if length(varargin) &gt;= NCellOrString+1</span>
4750304     <span class="comment">%         if iscell(varargin{NCellOrString+1})</span>
4760305     <span class="comment">%             error(sprintf('Expecting input #%d to be TimeOutPeriod not a cell', NCellOrString+2));</span>
4770306     <span class="comment">%         end</span>
4780307     <span class="comment">%         if ischar(varargin{NCellOrString+1})</span>
4790308     <span class="comment">%             error(sprintf('Expecting input #%d to be TimeOutPeriod not a string', NCellOrString+2));</span>
4800309     <span class="comment">%         end</span>
4810310     <span class="comment">%         TimeOutPeriod = varargin{NCellOrString+1};</span>
4820311     <span class="comment">%         varargin{NCellOrString+1} = [];</span>
4830312     <span class="comment">%     end</span>
4840313     <span class="comment">%</span>
4850314     <span class="comment">%     % Build the channel name matrix</span>
4860315     <span class="comment">%     ChannelNames = [];</span>
4870316     <span class="comment">%     for i = 1:size(varargin{1},1)</span>
4880317     <span class="comment">%         for j = 1:size(varargin{1},2)</span>
4890318     <span class="comment">%             if NCellOrString == 1</span>
4900319     <span class="comment">%                 NewNames = family2channel(varargin{1}{i,j});</span>
4910320     <span class="comment">%             elseif NCellOrString == 2</span>
4920321     <span class="comment">%                 if iscell(varargin{2})</span>
4930322     <span class="comment">%                     NewNames = family2channel(varargin{1}{i,j}, varargin{2}{i,j});</span>
4940323     <span class="comment">%                 else</span>
4950324     <span class="comment">%                     NewNames = family2channel(varargin{1}{i,j}, varargin{2});</span>
4960325     <span class="comment">%                 end</span>
4970326     <span class="comment">%             elseif NCellOrString == 3</span>
4980327     <span class="comment">%                 if iscell(varargin{2})</span>
4990328     <span class="comment">%                     NewNames = family2channel(varargin{1}{i,j}, varargin{2}{i,j}, varargin{3}{i,j});</span>
5000329     <span class="comment">%                 else</span>
5010330     <span class="comment">%                     NewNames = family2channel(varargin{1}{i,j}, varargin{2}, varargin{3}{i,j});</span>
5020331     <span class="comment">%                 end</span>
5030332     <span class="comment">%             end</span>
5040333     <span class="comment">%             ChannelNames = strvcat(ChannelNames, NewNames);</span>
5050334     <span class="comment">%             NameSize(i,j) = size(NewNames,1);</span>
5060335     <span class="comment">%         end</span>
5070336     <span class="comment">%     end</span>
5080337     <span class="comment">%</span>
5090338     <span class="comment">%     ExtraTimeDelay = etime(clock, t0);</span>
5100339     <span class="comment">%</span>
5110340     <span class="comment">%     %if nargout &gt;= 3</span>
5120341     <span class="comment">%     [AMtmp, tout, DataTimetmp, ErrorFlag] = local_getbyname(ChannelNames, 'Double', 1, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);</span>
5130342     <span class="comment">%     %else</span>
5140343     <span class="comment">%     %    [AMtmp, tout] = local_getbyname(ChannelNames, 'Double', 1, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod)</span>
5150344     <span class="comment">%     %end</span>
5160345     <span class="comment">%</span>
5170346     <span class="comment">%     %if StructOutputFlag | nargout &gt;= 3</span>
5180347     <span class="comment">%     % .DataTime is the time on computer taking the data but</span>
5190348     <span class="comment">%     % reference it w.r.t. the time zone where Matlab is running</span>
5200349     <span class="comment">%     DateNumber1970 = 719529;  %datenum('1-Jan-1970');</span>
5210350     <span class="comment">%     days = datenum(t0(1:3)) - DateNumber1970;</span>
5220351     <span class="comment">%     t0_sec = 24*60*60*days + 60*60*t0(4) + 60*t0(5) + t0(6);</span>
5230352     <span class="comment">%     TimeZoneDiff = round((t0_sec - real(DataTimetmp(1,1)))/60/60);</span>
5240353     <span class="comment">%     DataTimetmp = (real(DataTimetmp)/60/60 + TimeZoneDiff)/24 + DateNumber1970 + imag(DataTimetmp)/(1e9 * 60 * 60 * 24);</span>
5250354     <span class="comment">%</span>
5260355     <span class="comment">%     % No time zone adjustment (UTC 00:00:00 Jan 1, 1970)</span>
5270356     <span class="comment">%     %DataTime = real(DataTime)/60/60/24 + imag(DataTime)/(1e9 * 60 * 60 * 24);</span>
5280357     <span class="comment">%     %end</span>
5290358     <span class="comment">%</span>
5300359     <span class="comment">%     for i = 1:size(varargin{1},1)</span>
5310360     <span class="comment">%         for j = 1:size(varargin{1},2)</span>
5320361     <span class="comment">%             AM{i,j} = AMtmp(1:NameSize(i,j),:);</span>
5330362     <span class="comment">%             AMtmp(1:NameSize(i,j),:) = [];</span>
5340363     <span class="comment">%             %if nargout &gt;= 3</span>
5350364     <span class="comment">%             DataTime{i,j} = DataTimetmp(1:NameSize(i,j),:);</span>
5360365     <span class="comment">%             DataTimetmp(1:NameSize(i,j),:) = [];</span>
5370366     <span class="comment">%             %end</span>
5380367     <span class="comment">%</span>
5390368     <span class="comment">%             % If input is a data structure, only change StructOutputFlag if 'numeric' is not on the input line</span>
5400369     <span class="comment">%             StructOutputFlagStart = StructOutputFlag;</span>
5410370     <span class="comment">%             if isstruct(varargin{1}{i,j})</span>
5420371     <span class="comment">%                 if isfield(varargin{1}{i,j},'Field')</span>
5430372     <span class="comment">%                     if ~NumericOutputFlag</span>
5440373     <span class="comment">%                         StructOutputFlag = 1;</span>
5450374     <span class="comment">%                     end</span>
5460375     <span class="comment">%                 end</span>
5470376     <span class="comment">%             end</span>
5480377     <span class="comment">%</span>
5490378     <span class="comment">%             if StructOutputFlag</span>
5500379     <span class="comment">%                 Datatmp = AM{i,j};</span>
5510380     <span class="comment">%                 DataTimetmp = DataTime{i,j};</span>
5520381     <span class="comment">%                 if NCellOrString == 1</span>
5530382     <span class="comment">%                     if isempty(UnitsFlag)</span>
5540383     <span class="comment">%                         AM{i,j} = family2datastruct(varargin{1}{i,j});</span>
5550384     <span class="comment">%                     else</span>
5560385     <span class="comment">%                         AM{i,j} = family2datastruct(varargin{1}{i,j}, UnitsFlag);</span>
5570386     <span class="comment">%                     end</span>
5580387     <span class="comment">%                 elseif NCellOrString == 2</span>
5590388     <span class="comment">%                     if iscell(varargin{2})</span>
5600389     <span class="comment">%                         if isempty(UnitsFlag)</span>
5610390     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}{i,j});</span>
5620391     <span class="comment">%                         else</span>
5630392     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}{i,j}, UnitsFlag);</span>
5640393     <span class="comment">%                         end</span>
5650394     <span class="comment">%                     else</span>
5660395     <span class="comment">%                         if isempty(UnitsFlag)</span>
5670396     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2});</span>
5680397     <span class="comment">%                         else</span>
5690398     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}, UnitsFlag);</span>
5700399     <span class="comment">%                         end</span>
5710400     <span class="comment">%                     end</span>
5720401     <span class="comment">%                 elseif NCellOrString == 3</span>
5730402     <span class="comment">%                     if iscell(varargin{2})</span>
5740403     <span class="comment">%                         if isempty(UnitsFlag)</span>
5750404     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}{i,j}, varargin{3}{i,j});</span>
5760405     <span class="comment">%                         else</span>
5770406     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}{i,j}, varargin{3}{i,j}, UnitsFlag);</span>
5780407     <span class="comment">%                         end</span>
5790408     <span class="comment">%                     else</span>
5800409     <span class="comment">%                         if isempty(UnitsFlag)</span>
5810410     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}, varargin{3}{i,j});</span>
5820411     <span class="comment">%                         else</span>
5830412     <span class="comment">%                             AM{i,j} = family2datastruct(varargin{1}{i,j}, varargin{2}, varargin{3}{i,j}, UnitsFlag);</span>
5840413     <span class="comment">%                         end</span>
5850414     <span class="comment">%                     end</span>
5860415     <span class="comment">%                 end</span>
5870416     <span class="comment">%                 AM{i,j}.Data = Datatmp;</span>
5880417     <span class="comment">%                 AM{i,j}.t = t;</span>
5890418     <span class="comment">%                 AM{i,j}.tout = tout;</span>
5900419     <span class="comment">%                 AM{i,j}.DataTime = DataTimetmp;</span>
5910420     <span class="comment">%                 AM{i,j}.Mode = 'Online';</span>
5920421     <span class="comment">%                 AM{i,j}.CreatedBy = 'getpv';</span>
5930422     <span class="comment">%             end</span>
5940423     <span class="comment">%             StructOutputFlag = StructOutputFlagStart;</span>
5950424     <span class="comment">%         end</span>
5960425     <span class="comment">%     end</span>
5970426     <span class="comment">%</span>
5980427     <span class="comment">%     return</span>
5990428     <span class="comment">%</span>
6000429     <span class="comment">%else</span>
6010430
6020431     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
6030432     <span class="comment">% CELL OR CELL ARRAY INPUT %</span>
6040433     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
6050434     <span class="comment">% Iterate on each cell with special attention to the t vector input</span>
6060435
6070436     <span class="comment">% For an empty input, return empty</span>
6080437     <span class="keyword">if</span> isempty(varargin{1})
6090438         AM =[]; tout = []; DataTime = []; ErrorFlag = 0;
6100439         <span class="keyword">return</span>
6110440     <span class="keyword">end</span>
6120441
6130442     <span class="comment">% If input is a data structure, only change StructOutputFlag if 'numeric' is not on the input line</span>
6140443     <span class="keyword">if</span> isstruct(varargin{1}{1}) &amp;&amp; isfield(varargin{1}{1},<span class="string">'Field'</span>)
6150444         <span class="keyword">if</span> ~NumericOutputFlag
6160445             StructOutputFlag = 1;
6170446         <span class="keyword">end</span>
6180447     <span class="keyword">end</span>
6190448
6200449     
6210450     <span class="comment">% Count the number of inputs which are cells (Family or DeviceList) or strings (possibly Field)</span>
6220451     NCellOrString = 1;
6230452     <span class="keyword">for</span> i = 2:length(varargin)
6240453         <span class="keyword">if</span> ~iscell(varargin{i})
6250454             <span class="keyword">if</span> ~ischar(varargin{i})
6260455                 <span class="keyword">break</span>;
6270456             <span class="keyword">else</span>
6280457                 NCellOrString = NCellOrString + 1;
6290458             <span class="keyword">end</span>
6300459         <span class="keyword">else</span>
6310460             NCellOrString = NCellOrString + 1;
6320461             <span class="comment">%if length(varargin{1})~=length(varargin{NCellOrString}) | length(varargin{NCellOrString})==1</span>
6330462             <span class="comment">%    error('When using cell, all the cells must be the same size as input 1 or be length one.');</span>
6340463             <span class="comment">%end</span>
6350464         <span class="keyword">end</span>
6360465     <span class="keyword">end</span>
6370466
6380467     <span class="comment">% t (if it exists) should be the next input.  Save it then zero it in varargin</span>
6390468     <span class="keyword">if</span> length(varargin) &gt;= NCellOrString+1
6400469         <span class="keyword">if</span> iscell(varargin{NCellOrString+1})
6410470             error(sprintf(<span class="string">'Expecting input #%d to be a time vector not a cell'</span>, NCellOrString+1));
6420471         <span class="keyword">end</span>
6430472         <span class="keyword">if</span> ischar(varargin{NCellOrString+1})
6440473             error(sprintf(<span class="string">'Expecting input #%d to be a time vector not a string'</span>, NCellOrString+1));
6450474         <span class="keyword">end</span>
6460475         t = varargin{NCellOrString+1};
6470476         varargin{NCellOrString+1} = 0;
6480477     <span class="keyword">end</span>
6490478
6500479
6510480     ExtraTimeDelay = etime(clock, t0);
6520481     t = t - ExtraTimeDelay;
6530482
6540483     <span class="comment">% Loop according to t</span>
6550484     <span class="keyword">for</span> itime = 1:length(t)
6560485         T = t(itime)-etime(clock, t0);
6570486         <span class="keyword">if</span> T &gt; 0
6580487             pause(T);
6590488         <span class="keyword">end</span>
6600489
6610490         <span class="keyword">for</span> i = 1:size(varargin{1},1)
6620491             <span class="keyword">for</span> j = 1:size(varargin{1},2)
6630492
6640493                 <span class="comment">% Build the input line</span>
6650494                 <span class="keyword">for</span> k = 1:length(varargin)
6660495                     <span class="keyword">if</span> ~iscell(varargin{k})
6670496                         Inputs1{1,k} = varargin{k};
6680497                     <span class="keyword">elseif</span> length(varargin{k}) == 1
6690498                         Inputs1{1,k} = varargin{k}{1};
6700499                     <span class="keyword">elseif</span> (size(varargin{k},1) == size(varargin{1},1)) &amp;&amp; (size(varargin{k},2) == size(varargin{1},2))
6710500                         Inputs1{1,k} = varargin{k}{i,j};
6720501                     <span class="keyword">else</span>
6730502                         error(<span class="string">'When using cells, all the cells must be the same size or length 1 (repeated).'</span>);
6740503                     <span class="keyword">end</span>
6750504                 <span class="keyword">end</span>
6760505
6770506                 <span class="keyword">if</span> StructOutputFlag
6780507                     <span class="keyword">if</span> itime == 1
6790508                         <span class="comment">% Form the structure on the first time</span>
6800509                         [AM{i,j}, tout(1,itime), DataTime{i,j}, ErrorFlagNew] = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(Inputs1{:}, <span class="string">'Struct'</span>, InputFlags{:});
6810510                     <span class="keyword">else</span>
6820511                         <span class="comment">% Add to the Data and time fields</span>
6830512                         [AM{i,j}.Data(:,itime), tmp, AM{i,j}.DataTime(:,itime), ErrorFlagNew] = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(Inputs1{:}, <span class="string">'Numeric'</span>, InputFlags{:});
6840513                         AM{i,j}.t(1,itime) = t(itime);
6850514                         AM{i,j}.tout(1,itime) = etime(clock, t0);
6860515                         DataTime{i,j}(:,itime) = AM{i,j}.DataTime(:,itime);
6870516                     <span class="keyword">end</span>
6880517                 <span class="keyword">else</span>
6890518                     [AM{i,j}(:,itime), tmp, DataTime{i,j}(:,itime), ErrorFlagNew] = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(Inputs1{:}, <span class="string">'Numeric'</span>, InputFlags{:});
6900519                 <span class="keyword">end</span>
6910520                 ErrorFlag = ErrorFlag | any(ErrorFlagNew);
6920521             <span class="keyword">end</span>
6930522             tout(itime) = etime(clock, t0);
6940523         <span class="keyword">end</span>
6950524     <span class="keyword">end</span>
6960525
6970526     <span class="comment">% Make the output an AccObj object</span>
6980527     <span class="keyword">if</span> ObjectOutputFlag
6990528         AM = AccObj(AM);
7000529     <span class="keyword">end</span>
7010530
7020531     <span class="keyword">return</span>
7030532 <span class="keyword">end</span>
7040533 <span class="comment">%%%%%%%%%%%%%%%%%%</span>
7050534 <span class="comment">% End cell input %</span>
7060535 <span class="comment">%%%%%%%%%%%%%%%%%%</span>
7070536
7080537
7090538
7100539 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
7110540 <span class="comment">% COMMONNAME - Commonname input with no family input %</span>
7120541 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
7130542 <span class="keyword">if</span> isempty(varargin{1})
7140543     <span class="keyword">if</span> length(varargin) &gt;= 2
7150544         <span class="keyword">if</span> ischar(varargin{2})
7160545             Field = varargin{2};
7170546             varargin(2) = [];
7180547         <span class="keyword">end</span>
7190548     <span class="keyword">else</span>
7200549         <span class="comment">% For an empty input, return empty</span>
7210550         <span class="keyword">if</span> isempty(varargin{1})
7220551             AM =[]; tout = []; DataTime = []; ErrorFlag = 0;
7230552             <span class="keyword">return</span>
7240553         <span class="keyword">end</span>
7250554     <span class="keyword">end</span>
7260555     <span class="keyword">if</span> isempty(Field)
7270556         Field = FieldDefault;
7280557     <span class="keyword">end</span>
7290558     <span class="keyword">if</span> length(varargin) &gt;= 2
7300559         CommonNames = varargin{2};
7310560     <span class="keyword">else</span>
7320561         error(<span class="string">'Common names not found on the input line.'</span>);
7330562     <span class="keyword">end</span>
7340563     <span class="keyword">if</span> length(varargin) &gt;= 3
7350564         t = varargin{3};
7360565     <span class="keyword">end</span>
7370566     <span class="keyword">if</span> length(varargin) &gt;= 4
7380567         FreshDataFlag = varargin{4};
7390568     <span class="keyword">end</span>
7400569     <span class="keyword">if</span> length(varargin) &gt;= 5
7410570         TimeOutPeriod = varargin{5};
7420571     <span class="keyword">end</span>
7430572
7440573
7450574     <span class="comment">% Common names with no family name</span>
7460575     <span class="keyword">if</span> ~ischar(CommonNames)
7470576         error(<span class="string">'If Family=[], then DeviceList must be a string of common names.'</span>)
7480577     <span class="keyword">end</span>
7490578     [AM, tout, DataTime, DeviceList, ErrorFlag] = <a href="#_sub1" class="code" title="subfunction [AM, tout, DataTime, DeviceList, ErrorFlag] = getbycommonname(CommonNames, Field, t, t0, FreshDataFlag, TimeOutPeriod, varargin)">getbycommonname</a>(CommonNames, Field, t, t0, FreshDataFlag, TimeOutPeriod, InputFlags{:});
7500579     <span class="keyword">if</span> ErrorFlag
7510580         <span class="keyword">return</span>;
7520581     <span class="keyword">end</span>
7530582
7540583     <span class="keyword">if</span> StructOutputFlag || nargout &gt;= 3
7550584         <span class="comment">% .DataTime is the time on computer taking the data but</span>
7560585         <span class="comment">% reference it w.r.t. the time zone where Matlab is running</span>
7570586         DateNumber1970 = 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
7580587         days = datenum(t0(1:3)) - DateNumber1970;
7590588         t0_sec = 24*60*60*days + 60*60*t0(4) + 60*t0(5) + t0(6);
7600589         TimeZoneDiff = round((t0_sec - real(DataTime(1,1)))/60/60);
7610590         DataTime = (real(DataTime)/60/60 + TimeZoneDiff)/24 + DateNumber1970 + imag(DataTime)/(1e9 * 60 * 60 * 24);
7620591     <span class="keyword">end</span>
7630592
7640593     <span class="comment">% Structure output</span>
7650594     <span class="keyword">if</span> StructOutputFlag
7660595         AM = struct(<span class="string">'Data'</span>, AM);
7670596         AM.FamilyName = CommonNames;
7680597         AM.Field = Field;
7690598         AM.DeviceList = DeviceList;
7700599         AM.Status = [];
7710600         AM.t = t;
7720601         AM.tout = tout;
7730602         AM.DataTime = DataTime;
7740603         AM.TimeStamp = t0;
7750604         [DeviceList1, Family1] = <a href="common2dev.html" class="code" title="function [DeviceList, FamilyName, ErrorFlag] = common2dev(CommonNames, FamilyList)">common2dev</a>(CommonNames(1,:));
7760605         AM.Mode = <a href="getmode.html" class="code" title="function Mode = getmode(Family, Field)">getmode</a>(Family1);                      <span class="comment">% Base on just the first common name</span>
7770606         [AM.Units, AM.UnitsString] = <a href="getunits.html" class="code" title="function [Units, UnitsString] = getunits(Family, Field)">getunits</a>(Family1);  <span class="comment">% Base on just the first common name</span>
7780607         AM.DataDescriptor = <span class="string">'Get by Common Name'</span>;
7790608         AM.CreatedBy = <span class="string">'getpv'</span>;
7800609
7810610         <span class="comment">% Make the output an AccObj object</span>
7820611         <span class="keyword">if</span> ObjectOutputFlag
7830612             AM = AccObj(AM);
7840613         <span class="keyword">end</span>
7850614     <span class="keyword">end</span>
7860615
7870616     <span class="keyword">return</span>
7880617 <span class="keyword">end</span>
7890618 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
7900619 <span class="comment">% End CommonName input with no family input %</span>
7910620 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
7920621
7930622
7940623
7950624 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
7960625 <span class="comment">% Parce inputs depending on Data structure, AO structure, Family, ChannelName method %</span>
7970626 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
7980627 <span class="keyword">if</span> isstruct(varargin{1})
7990628     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
8000629     <span class="comment">% STRUCTURE INPUTS - Data structure or AO structure %</span>
8010630     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
8020631     <span class="keyword">if</span> isfield(varargin{1},<span class="string">'FamilyName'</span>) &amp;&amp; isfield(varargin{1},<span class="string">'Field'</span>)
8030632         <span class="comment">% Data structure - select FamilyName, DeviceList, Units  from the structure (.Mode flag???)</span>
8040633         <span class="comment">% [AM, tout, DataTime, ErrorFlag] = getpv(DataStruct, Field {opt}, t, FreshDataFlag, TimeOutPeriod)</span>
8050634
8060635         <span class="comment">% Only change StructOutputFlag if 'numeric' is not on the input line</span>
8070636         <span class="keyword">if</span> ~NumericOutputFlag
8080637             StructOutputFlag = 1;
8090638         <span class="keyword">end</span>
8100639
8110640         Family = varargin{1}.FamilyName;
8120641
8130642         Field = varargin{1}.Field;
8140643         <span class="keyword">if</span> length(varargin) &gt;= 2
8150644             <span class="keyword">if</span> ischar(varargin{2})
8160645                 Field = varargin{2};
8170646                 varargin(2) = [];
8180647             <span class="keyword">end</span>
8190648         <span class="keyword">end</span>
8200649
8210650         DeviceList = varargin{1}.DeviceList;
8220651
8230652         <span class="keyword">if</span> length(varargin) &gt;= 2
8240653             <span class="comment">% If the input exists use it</span>
8250654             t = varargin{2};
8260655         <span class="keyword">else</span>
8270656             <span class="comment">% Else, get it from the structure if the field exists</span>
8280657             <span class="keyword">if</span> isfield(varargin{1},<span class="string">'t'</span>)
8290658                 t = varargin{1}.t;
8300659             <span class="keyword">end</span>
8310660         <span class="keyword">end</span>
8320661         <span class="keyword">if</span> length(varargin) &gt;= 3
8330662             FreshDataFlag = varargin{3};
8340663         <span class="keyword">end</span>
8350664         <span class="keyword">if</span> length(varargin) &gt;= 4
8360665             TimeOutPeriod = varargin{4};
8370666         <span class="keyword">end</span>
8380667
8390668         [FamilyIndex, AO] = <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(Family);
8400669
8410670         <span class="comment">% Change Units to the data structure units</span>
8420671         <span class="keyword">if</span> isfield(AO, Field)
8430672             AO.(Field).Units = varargin{1}.Units;
8440673         <span class="keyword">end</span>
8450674
8460675     <span class="keyword">elseif</span> isfield(varargin{1},<span class="string">'FamilyName'</span>)
8470676         <span class="comment">% AO structure - use the AO structure directly</span>
8480677         <span class="comment">%  [AM, tout, DataTime, ErrorFlag] = getpv(AO, Field, DeviceList, t, FreshDataFlag, TimeOutPeriod)</span>
8490678         FamilyIndex = 1;
8500679         AO = varargin{1};
8510680         Family = varargin{1}.FamilyName;
8520681
8530682         Field = <span class="string">''</span>;
8540683         <span class="keyword">if</span> length(varargin) &gt;= 2
8550684             <span class="keyword">if</span> ischar(varargin{2})
8560685                 Field = varargin{2};
8570686                 varargin(2) = [];
8580687             <span class="keyword">end</span>
8590688         <span class="keyword">end</span>
8600689         <span class="keyword">if</span> length(varargin) &gt;= 2
8610690             DeviceList = varargin{2};
8620691         <span class="keyword">else</span>
8630692             DeviceList = AO.DeviceList;
8640693             iStatus = find(varargin{1}.Status == 0);
8650694             DeviceList(iStatus,:) = [];
8660695         <span class="keyword">end</span>
8670696         <span class="keyword">if</span> length(varargin) &gt;= 3
8680697             t = varargin{3};
8690698         <span class="keyword">end</span>
8700699         <span class="keyword">if</span> length(varargin) &gt;= 4
8710700             FreshDataFlag = varargin{4};
8720701         <span class="keyword">end</span>
8730702         <span class="keyword">if</span> length(varargin) &gt;= 5
8740703             TimeOutPeriod = varargin{5};
8750704         <span class="keyword">end</span>
8760705     <span class="keyword">else</span>
8770706         error(<span class="string">'Input #1 of unknown type'</span>);
8780707     <span class="keyword">end</span>
8790708     
8800709 <span class="keyword">else</span>
8810710
8820711     <span class="comment">% Family, ChannelName, or Common name are still left</span>
8830712     [FamilyIndex, AO] = <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(varargin{1});
8840713
8850714     <span class="keyword">if</span> FamilyIndex
8860715
8870716         <span class="comment">%%%%%%%%%%%%%%%%</span>
8880717         <span class="comment">% FAMILY INPUT %</span>
8890718         <span class="comment">%%%%%%%%%%%%%%%%</span>
8900719         <span class="comment">%  [AM, tout, DataTime, ErrorFlag] = getpv(Family, Field {opt}, DeviceList, t, FreshDataFlag, TimeOutPeriod)</span>
8910720         Family = varargin{1};
8920721         <span class="keyword">if</span> length(varargin) &gt;= 2
8930722             <span class="keyword">if</span> ischar(varargin{2})
8940723                 Field = varargin{2};
8950724                 varargin(2) = [];
8960725             <span class="keyword">end</span>
8970726         <span class="keyword">end</span>
8980727         <span class="keyword">if</span> isempty(Field)
8990728             Field = FieldDefault;
9000729         <span class="keyword">end</span>
9010730         <span class="keyword">if</span> length(varargin) &gt;= 2
9020731             DeviceList = varargin{2};
9030732         <span class="keyword">end</span>
9040733         <span class="keyword">if</span> length(varargin) &gt;= 3
9050734             t = varargin{3};
9060735         <span class="keyword">end</span>
9070736         <span class="keyword">if</span> length(varargin) &gt;= 4
9080737             FreshDataFlag = varargin{4};
9090738         <span class="keyword">end</span>
9100739         <span class="keyword">if</span> length(varargin) &gt;= 5
9110740             TimeOutPeriod = varargin{5};
9120741         <span class="keyword">end</span>
9130742         
9140743     <span class="keyword">else</span>
9150744         
9160745         <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
9170746         <span class="comment">% CHANNEL NAME OR COMMON NAME INPUT %</span>
9180747         <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
9190748         
9200749         <span class="comment">% Just do input parsing here</span>
9210750         Family = varargin{1};
9220751         
9230752         <span class="comment">% Default field is '' for channel names or it would be added as ChannelName.Field</span>
9240753         <span class="comment">% But for common names it needs to be 'Monitor'</span>
9250754         Field = <span class="string">''</span>;
9260755         <span class="keyword">if</span> length(varargin) &gt;= 2
9270756             <span class="keyword">if</span> ~isnumeric(varargin{2})
9280757                 Field = varargin{2};
9290758                 varargin(2) = [];
9300759             <span class="keyword">end</span>
9310760         <span class="keyword">end</span>
9320761         <span class="keyword">if</span> length(varargin) &gt;= 2
9330762             t = varargin{2};
9340763         <span class="keyword">end</span>
9350764         <span class="keyword">if</span> length(varargin) &gt;= 3
9360765             FreshDataFlag = varargin{3};
9370766         <span class="keyword">end</span>
9380767         <span class="keyword">if</span> length(varargin) &gt;= 4
9390768             TimeOutPeriod = varargin{4};
9400769         <span class="keyword">end</span> 
9410770     <span class="keyword">end</span>
9420771 <span class="keyword">end</span>
9430772 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
9440773 <span class="comment">% End selection of inputs depending on Family, Data Structure, AO structure, or ChannelName method %</span>
9450774 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
9460775
9470776
9480777
9490778 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
9500779 <span class="comment">% AO, ChannelName, or CommonName %</span>
9510780 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
9520781 <span class="keyword">if</span> isempty(t)
9530782     t = 0;
9540783 <span class="keyword">end</span>
9550784 <span class="keyword">if</span> FamilyIndex
9560785     <span class="comment">%%%%%%%%%%%%%%%%%</span>
9570786     <span class="comment">% FAMILY INPUTS %</span>
9580787     <span class="comment">%%%%%%%%%%%%%%%%%</span>
9590788
9600789     <span class="comment">% All ready done</span>
9610790     <span class="comment">%if isempty(Field)</span>
9620791     <span class="comment">%    Field = 'Monitor';</span>
9630792     <span class="comment">%end</span>
9640793
9650794     <span class="keyword">if</span> isempty(DeviceList)
9660795         DeviceList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(Family);     <span class="comment">% Default behavior comes from family2dev</span>
9670796         <span class="comment">%DeviceList = family2dev(Family,1);  % Good status only</span>
9680797         <span class="comment">%DeviceList = AO.DeviceList;         % All devices</span>
9690798     <span class="keyword">end</span>
9700799     <span class="keyword">if</span> ischar(DeviceList)
9710800         <span class="comment">% Convert common name to a DeviceList</span>
9720801         DeviceList = <a href="common2dev.html" class="code" title="function [DeviceList, FamilyName, ErrorFlag] = common2dev(CommonNames, FamilyList)">common2dev</a>(DeviceList, AO);
9730802     <span class="keyword">end</span>
9740803     <span class="keyword">if</span> (size(DeviceList,2) == 1)
9750804         DeviceList = <a href="elem2dev.html" class="code" title="function Output = elem2dev(Family, ElementList)">elem2dev</a>(Family, DeviceList);
9760805     <span class="keyword">end</span>
9770806
9780807
9790808     <span class="comment">% Look for command-line over-rides</span>
9800809     <span class="keyword">if</span> isfield(AO, Field)
9810810         <span class="keyword">if</span> ~isempty(UnitsFlag)
9820811             AO.(Field).Units = UnitsFlag;
9830812         <span class="keyword">end</span>
9840813         <span class="keyword">if</span> ~isempty(ModeFlag)
9850814             <span class="keyword">if</span> strcmp(ModeFlag, <span class="string">'Online'</span>) &amp;&amp; strcmp(AO.(Field).Mode, <span class="string">'Special'</span>)
9860815                 <span class="comment">% For Online over-rides, look for Special mode first</span>
9870816                 AO.(Field).Mode = <span class="string">'Special'</span>;
9880817             <span class="keyword">else</span>
9890818                 AO.(Field).Mode = ModeFlag;
9900819             <span class="keyword">end</span>
9910820         <span class="keyword">end</span>
9920821     <span class="keyword">end</span>
9930822
9940823     
9950824     <span class="comment">% Get data</span>
9960825     ExtraTimeDelay = etime(clock, t0);
9970826     <span class="keyword">if</span> StructOutputFlag || nargout &gt;= 3
9980827         [AM, tout, DataTime, ErrorFlag, DeviceIndex] = <a href="#_sub3" class="code" title="subfunction [AM, tout, DataTime, ErrorFlag, DeviceIndex] = local_getpv(AO, Field, DeviceList, OutputDataType, t, FreshDataFlag, TimeOutPeriod)">local_getpv</a>(AO, Field, DeviceList, OutputDataType, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);
9990828     <span class="keyword">else</span>
10000829         [AM, tout] = <a href="#_sub3" class="code" title="subfunction [AM, tout, DataTime, ErrorFlag, DeviceIndex] = local_getpv(AO, Field, DeviceList, OutputDataType, t, FreshDataFlag, TimeOutPeriod)">local_getpv</a>(AO, Field, DeviceList, OutputDataType, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);
10010830     <span class="keyword">end</span>
10020831     tout = tout + ExtraTimeDelay;
10030832
10040833     
10050834     <span class="keyword">if</span> StructOutputFlag
10060835         <span class="comment">% Structure output</span>
10070836         AM = struct(<span class="string">'Data'</span>, AM);
10080837         <span class="comment">%AM.Data = AM;</span>
10090838         AM.FamilyName = Family;
10100839         AM.Field = Field;
10110840         AM.DeviceList = DeviceList;
10120841         <span class="keyword">if</span> length(AO.Status) == 1
10130842             AM.Status = AO.Status * ones(size(DeviceIndex));
10140843         <span class="keyword">else</span>
10150844             <span class="comment">%AM.Status = family2status(Family, AM.DeviceList);</span>
10160845             AM.Status = AO.Status(DeviceIndex);
10170846         <span class="keyword">end</span>
10180847         <span class="keyword">if</span> isfield(AO, Field)
10190848             AM.Mode = AO.(Field).Mode;
10200849             AM.Units = AO.(Field).Units;
10210850             <span class="keyword">if</span> strcmpi(AM.Units,<span class="string">'hardware'</span>)
10220851                 AM.UnitsString = AO.(Field).HWUnits;
10230852             <span class="keyword">else</span>
10240853                 AM.UnitsString = AO.(Field).PhysicsUnits;
10250854             <span class="keyword">end</span>
10260855             AM.DataDescriptor = <span class="string">'Get by FamilyName'</span>;
10270856         <span class="keyword">else</span>
10280857             AM.Mode = <span class="string">'Online'</span>;
10290858             AM.Units = <span class="string">''</span>;
10300859             AM.UnitsString = <span class="string">''</span>;
10310860             AM.DataDescriptor = <span class="string">'Get by Channel Name'</span>;
10320861         <span class="keyword">end</span>
10330862         AM.CreatedBy = <span class="string">'getpv'</span>;
10340863     <span class="keyword">end</span>
10350864
10360865 <span class="keyword">else</span>
10370866
10380867     <span class="comment">% Look to see if it's a channel name or a common name</span>
10390868     <span class="comment">% Just check the first name so it's a faster test</span>
10400869     [DeviceListTest, FamilyTest] = <a href="common2dev.html" class="code" title="function [DeviceList, FamilyName, ErrorFlag] = common2dev(CommonNames, FamilyList)">common2dev</a>(Family(1,:));
10410870
10420871     <span class="keyword">if</span> ~isempty(FamilyTest)
10430872         <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
10440873         <span class="comment">% Common names where the family was the common name %</span>
10450874         <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
10460875         
10470876         <span class="comment">% Field default will come from getbycommonname via another getpv call</span>
10480877         <span class="comment">% The DeviceList does not matter (and should not be used)</span>
10490878
10500879         CommonNames = Family;
10510880         [AM, tout, DataTime, DeviceList, ErrorFlag] = <a href="#_sub1" class="code" title="subfunction [AM, tout, DataTime, DeviceList, ErrorFlag] = getbycommonname(CommonNames, Field, t, t0, FreshDataFlag, TimeOutPeriod, varargin)">getbycommonname</a>(CommonNames, Field, t, t0, FreshDataFlag, TimeOutPeriod, InputFlags{:});
10520881         <span class="keyword">if</span> ErrorFlag
10530882             <span class="keyword">return</span>;
10540883         <span class="keyword">end</span>
10550884
10560885         <span class="comment">% Structure output</span>
10570886         <span class="keyword">if</span> StructOutputFlag
10580887             AM = struct(<span class="string">'Data'</span>, AM);
10590888             AM.FamilyName = CommonNames;
10600889             AM.Field = Field;
10610890             AM.DeviceList = DeviceList;
10620891             AM.Status = [];
10630892             AM.Mode = <a href="getmode.html" class="code" title="function Mode = getmode(Family, Field)">getmode</a>(FamilyTest(1,:));                      <span class="comment">% Base on just the first common name</span>
10640893             [AM.Units, AM.UnitsString] = <a href="getunits.html" class="code" title="function [Units, UnitsString] = getunits(Family, Field)">getunits</a>(FamilyTest(1,:));  <span class="comment">% Base on just the first common name</span>
10650894             AM.DataDescriptor = <span class="string">'Get by Common Name'</span>;
10660895             AM.CreatedBy = <span class="string">'getpv'</span>;
10670896         <span class="keyword">end</span>
10680897
10690898     <span class="keyword">else</span>
10700899
10710900         <span class="comment">%%%%%%%%%%%%%%%%</span>
10720901         <span class="comment">% CHANNEL NAME %</span>
10730902         <span class="comment">%%%%%%%%%%%%%%%%</span>
10740903
10750904         <span class="comment">% Can't use overrides with channel name method</span>
10760905         <span class="keyword">if</span> ~isempty(UnitsFlag)
10770906             error(<span class="string">'You cannot change the units when using tango names.'</span>)
10780907         <span class="keyword">end</span>
10790908         <span class="keyword">if</span> ~(isempty(ModeFlag) || strcmpi(ModeFlag, <span class="string">'Online'</span>))
10800909             error(<span class="string">'Tango names only have an ''Online'' Mode.'</span>)
10810910         <span class="keyword">end</span>
10820911
10830912
10840913         <span class="comment">% Add Field to Family.Field</span>
10850914         FamilyOld = Family;
10860915         <span class="keyword">if</span> ~isempty(Field)
10870916             Family = strcat(Family, [<span class="string">'.'</span>,Field]);
10880917         <span class="keyword">end</span>
10890918
10900919
10910920         ExtraTimeDelay = etime(clock, t0);
10920921         <span class="keyword">if</span> strcmpi(OutputDataType,<span class="string">'String'</span>)
10930922             <span class="comment">% Get data with strings output</span>
10940923             <span class="keyword">if</span> StructOutputFlag || nargout &gt;= 3
10950924                 [AM, tout, DataTime, ErrorFlag] = getpvonline(Family, <span class="string">'String'</span>, 0, t-ExtraTimeDelay);
10960925             <span class="keyword">else</span>
10970926                 [AM, tout] = getpvonline(Family, <span class="string">'String'</span>, 0, t-ExtraTimeDelay);
10980927             <span class="keyword">end</span>
10990928         <span class="keyword">else</span>
11000929             <span class="comment">% Get data at every point in time vector, t</span>
11010930             <span class="keyword">if</span> StructOutputFlag || nargout &gt;= 3
11020931                 [AM, tout, DataTime, ErrorFlag] = <a href="#_sub2" class="code" title="subfunction [AM, tout, DataTime, ErrorFlag] = local_getbyname(ChannelName, OutputDataType, N, t, FreshDataFlag, TimeOutPeriod)">local_getbyname</a>(Family, OutputDataType, 0, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);
11030932             <span class="keyword">else</span>
11040933                 [AM, tout] = <a href="#_sub2" class="code" title="subfunction [AM, tout, DataTime, ErrorFlag] = local_getbyname(ChannelName, OutputDataType, N, t, FreshDataFlag, TimeOutPeriod)">local_getbyname</a>(Family, OutputDataType, 0, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);
11050934             <span class="keyword">end</span>
11060935         <span class="keyword">end</span>
11070936         tout = tout + ExtraTimeDelay;
11080937
11090938
11100939         <span class="comment">% Structure output for channel name method</span>
11110940         <span class="keyword">if</span> StructOutputFlag
11120941             AM = struct(<span class="string">'Data'</span>, AM);
11130942             <span class="comment">%AM.Data = AM;</span>
11140943             AM.FamilyName = FamilyOld;
11150944             AM.Field = Field;
11160945             AM.DeviceList = [];
11170946             AM.Status = [];
11180947             AM.Mode = <span class="string">'Online'</span>;
11190948             AM.Units = <span class="string">''</span>;
11200949             AM.UnitsString = <span class="string">''</span>;
11210950             AM.DataDescriptor = <span class="string">'Get by Channel Name'</span>;
11220951             AM.CreatedBy = <span class="string">'getpv'</span>;
11230952         <span class="keyword">end</span>
11240953     <span class="keyword">end</span>
11250954 <span class="keyword">end</span>
11260955
11270956
11280957 <span class="keyword">if</span> StructOutputFlag || nargout &gt;= 3
11290958     <span class="comment">% .DataTime is the time on computer taking the data but</span>
11300959     <span class="comment">% reference it w.r.t. the time zone where Matlab is running</span>
11310960     DateNumber1970 = 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
11320961     days = datenum(t0(1:3)) - DateNumber1970;
11330962     t0_sec = 24*60*60*days + 60*60*t0(4) + 60*t0(5) + t0(6);
11340963     TimeZoneDiff = round((t0_sec - real(DataTime(1,1)))/60/60);
11350964     DataTime = (real(DataTime)/60/60 + TimeZoneDiff)/24 + DateNumber1970 + imag(DataTime)/(1e9 * 60 * 60 * 24);
11360965
11370966     <span class="comment">% No time zone adjustment (UTC 00:00:00 Jan 1, 1970)</span>
11380967     <span class="comment">%DataTime = real(DataTime)/60/60/24 + imag(DataTime)/(1e9 * 60 * 60 * 24);</span>
11390968 <span class="keyword">end</span>
11400969
11410970
11420971 <span class="comment">% Structure output</span>
11430972 <span class="keyword">if</span> StructOutputFlag
11440973     <span class="comment">% Add time to structure</span>
11450974     AM.t = t;
11460975     AM.tout = tout;
11470976     AM.DataTime = DataTime;
11480977     AM.TimeStamp = t0;
11490978
11500979     <span class="comment">% Make the output an AccObj object</span>
11510980     <span class="keyword">if</span> ObjectOutputFlag
11520981         AM = AccObj(AM);
11530982     <span class="keyword">end</span>
11540983 <span class="keyword">end</span>
11550984
11560985
11570986
11580987 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
11590988 <span class="comment">%  Main Function for Getting Data Using Common Names  %</span>
11600989 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
11610990 <a name="_sub1" href="#_subfunctions" class="code">function [AM, tout, DataTime, DeviceList, ErrorFlag] = getbycommonname(CommonNames, Field, t, t0, FreshDataFlag, TimeOutPeriod, varargin)</a>
11620991
11630992 <span class="comment">% Convert all the common names to Family and Device lists</span>
11640993 [DeviceList, Family, ErrorFlag] = <a href="common2dev.html" class="code" title="function [DeviceList, FamilyName, ErrorFlag] = common2dev(CommonNames, FamilyList)">common2dev</a>(CommonNames);
11650994
11660995 <span class="keyword">if</span> ErrorFlag
11670996     AM=[]; tout=[]; DataTime=[];
11680997     <span class="keyword">return</span>;
11690998 <span class="keyword">else</span>
11700999
11711000     <span class="comment">% If all the families are the same then compress them</span>
11721001     FamilyTest = unique(Family, <span class="string">'rows'</span>);
11731002
11741003     <span class="keyword">if</span> size(FamilyTest, 1) == 1
11751004         <span class="comment">% 1 Family, Multiple devices are ok</span>
11761005         [AM, tout, DataTime, ErrorFlag] = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(FamilyTest, Field, DeviceList, t, FreshDataFlag, TimeOutPeriod, <span class="string">'Numeric'</span>, varargin{:});
11771006     <span class="keyword">else</span>
11781007         <span class="comment">% Multiple families (loop)</span>
11791008         <span class="comment">% It has to be in a loop for the simulator and to pickup special functions</span>
11801009
11811010         <span class="keyword">if</span> FreshDataFlag &gt;= 1
11821011             error(<span class="string">'The FreshDataFlag is not programmed yet when when getting common names from multiple families (GJP).'</span>);
11831012         <span class="keyword">end</span>
11841013
11851014         <span class="comment">% Loop on the time vector (t0 has already been started)</span>
11861015         <span class="keyword">for</span> itime = 1:length(t)
11871016             T = t(itime)-etime(clock, t0);
11881017             <span class="keyword">if</span> T &gt; 0
11891018                 pause(T);
11901019             <span class="keyword">end</span>
11911020             <span class="keyword">for</span> i = 1:size(Family,1)
11921021                 [AM(i,itime), tmp, DataTime(i,itime), ErrorFlag1] = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(Family(i,:), Field, DeviceList(i,:), <span class="string">'Numeric'</span>, varargin{:});
11931022                 tout(1,itime) = etime(clock, t0);
11941023                 ErrorFlag = ErrorFlag | ErrorFlag1;
11951024             <span class="keyword">end</span>
11961025         <span class="keyword">end</span>
11971026     <span class="keyword">end</span>
11981027 <span class="keyword">end</span>
11991028
12001029
12011030
12021031 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
12031032 <span class="comment">%  Main Function for Getting Data using the Channel Names  %</span>
12041033 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
12051034 <a name="_sub2" href="#_subfunctions" class="code">function [AM, tout, DataTime, ErrorFlag] = local_getbyname(ChannelName, OutputDataType, N, t, FreshDataFlag, TimeOutPeriod)</a>
12061035
12071036 t0 = clock;
12081037 ErrorFlag = 0;
12091038
12101039
12111040 <span class="keyword">if</span> nargout &lt; 3
12121041     [AM, tout] = getpvonline(ChannelName, OutputDataType, N, t);
12131042 <span class="keyword">else</span>
12141043     [AM, tout, DataTime, ErrorFlag] = getpvonline(ChannelName, OutputDataType, N, t);
12151044 <span class="keyword">end</span>
12161045
12171046
12181047 <span class="comment">% FreshDataFlag</span>
12191048 <span class="keyword">if</span> FreshDataFlag &amp;&amp; length(t) == 1
12201049     <span class="comment">% Only use FreshDataFlag for scalar t</span>
12211050     FreshDataCounter = FreshDataFlag;
12221051     AM0 = AM;
12231052     <span class="keyword">while</span> FreshDataCounter
12241053         <span class="keyword">if</span> nargout &lt; 3
12251054             [AM, tout] = getpvonline(ChannelName, OutputDataType, N);
12261055         <span class="keyword">else</span>
12271056             [AM, tout, DataTime, ErrorFlag] = getpvonline(ChannelName, OutputDataType, N);
12281057         <span class="keyword">end</span>
12291058
12301059         <span class="keyword">if</span> ~any((AM-AM0)==0)
12311060             FreshDataCounter = FreshDataCounter - 1;
12321061             AM0 = AM;
12331062         <span class="keyword">end</span>
12341063
12351064         <span class="keyword">if</span> etime(clock, t0) &gt; TimeOutPeriod
12361065             k = find((AM-AM0)==0);
12371066             <span class="keyword">for</span> j = 1:length(k)
12381067                 fprintf(<span class="string">'%s not changing.\n'</span>, deblank(ChannelName(k(j),:)));
12391068             <span class="keyword">end</span>
12401069             error(<span class="string">'Timed out waiting for fresh data.'</span>);
12411070         <span class="keyword">end</span>
12421071     <span class="keyword">end</span>
12431072     tout = etime(clock, t0);
12441073 <span class="keyword">end</span>
12451074
12461075 <span class="keyword">return</span>
12471076
12481077 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
12491078 <span class="comment">%  Main Function for Getting Data using the Accelerator Object  %</span>
12501079 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
12511080 <a name="_sub3" href="#_subfunctions" class="code">function [AM, tout, DataTime, ErrorFlag, DeviceIndex] = local_getpv(AO, Field, DeviceList, OutputDataType, t, FreshDataFlag, TimeOutPeriod)</a>
12521081 <span class="comment">%  INPUTS</span>
12531082 <span class="comment">%  1. AO - the ACCELERATOR_OBJECT structure for the called family</span>
12541083 <span class="comment">%  2. Field - 'Monitor' or 'Setpoint'</span>
12551084 <span class="comment">%  3. DeviceList - Device list</span>
12561085 <span class="comment">%</span>
12571086 <span class="comment">%  OUTPUTS</span>
12581087 <span class="comment">%  1. AM - Vector a read values</span>
12591088 <span class="comment">%  2. TimeStamp - timestamp when data collected</span>
12601089 <span class="comment">%  3. ErrorFlag - 0 if OK, else 1</span>
12611090 <span class="comment">%  4. DeviceIndex - List of status 1 devices</span>
12621091
12631092 <span class="comment">%  Written by Gregory J. Portmann</span>
12641093 <span class="comment">%  Modified by Laurent S. Nadolski</span>
12651094
12661095 t0 = clock;
12671096 ErrorFlag = 0;
12681097 N = 0;  <span class="comment">% Output size</span>
12691098
12701099
12711100 <span class="comment">% Find the index for where the desired data is in the total device list</span>
12721101 DeviceListTotal = AO.DeviceList;
12731102 [DeviceIndex, iNotFound] = findrowindex(DeviceList, DeviceListTotal);
12741103 <span class="keyword">if</span> length(iNotFound) &gt; 0
12751104     <span class="comment">% Device not found</span>
12761105     <span class="keyword">for</span> i = 1:length(iNotFound)
12771106         fprintf(<span class="string">'   No devices to get for Family %s(%d,%d)\n'</span>, AO.FamilyName, DeviceList(i,1), DeviceList(i,2));
12781107     <span class="keyword">end</span>
12791108     error(<span class="string">'%d Devices not found'</span>, length(iNotFound));
12801109 <span class="keyword">end</span>
12811110
12821111 <span class="comment">% Check the DeviceIndex</span>
12831112 <span class="keyword">if</span> isempty(DeviceIndex)
12841113     DataTime = 0 + 0*sqrt(-1);
12851114     tout = etime(clock, t0);
12861115     AM = [];
12871116     <span class="comment">%fprintf('   WARNING:  No devices to get for Family %s (getpv)\n', AO.FamilyName);</span>
12881117     <span class="keyword">return</span>;
12891118 <span class="keyword">end</span>
12901119
12911120 <span class="comment">%% TANGO specific part</span>
12921121
12931122 <span class="comment">% Load Field sub-structure into AOField</span>
12941123 <span class="keyword">if</span> ~isfield(AO, Field);
12951124     <span class="comment">% Try to check it online or simulator</span>
12961125     <span class="keyword">if</span> isfield(AO, <span class="string">'Setpoint'</span>)
12971126         Mode = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(AO.FamilyName, <span class="string">'Setpoint'</span>, <span class="string">'Mode'</span>);
12981127     <span class="keyword">elseif</span> isfield(AO, <span class="string">'Monitor'</span>)
12991128         Mode = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(AO.FamilyName, <span class="string">'Monitor'</span>, <span class="string">'Mode'</span>);
13001129     <span class="keyword">else</span>
13011130         Mode = <span class="string">''</span>;
13021131     <span class="keyword">end</span>
13031132     <span class="keyword">if</span> strcmpi(Mode,<span class="string">'Simulator'</span>) || strcmpi(Mode,<span class="string">'Model'</span>)
13041133         ExtraTimeDelay = etime(clock, t0);
13051134         [AM, tout, DataTime, ErrorFlag] = getpvmodel(AO.FamilyName, Field, DeviceList, t-ExtraTimeDelay, <span class="string">'Physics'</span>, <span class="string">'Numeric'</span>);
13061135         tout = tout + ExtraTimeDelay;
13071136         
13081137         <span class="comment">% Since physics2hw conversions are not known for fields that are not families, just return</span>
13091138         <span class="keyword">return</span>
13101139     <span class="keyword">end</span>
13111140     
13121141     <span class="comment">% Try changing the suffix of the Monitor or Setpoint field</span>
13131142     <span class="keyword">if</span> isfield(AO, <span class="string">'Setpoint'</span>)
13141143         Tango = family2tango(AO, <span class="string">'Setpoint'</span>, DeviceList);
13151144     <span class="keyword">elseif</span> isfield(AO, <span class="string">'Monitor'</span>)
13161145         Tango = family2tango(AO, <span class="string">'Monitor'</span>, DeviceList);
13171146     <span class="keyword">else</span>
13181147         error(sprintf(<span class="string">'Field %s not found for Family %s'</span>, Field, AO.FamilyName));
13191148     <span class="keyword">end</span>
13201149     <span class="keyword">if</span> any(strcmpi(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Machine'</span>),{<span class="string">'spear3'</span>,<span class="string">'spear'</span>}))
13211150         <span class="comment">% Spear likes to change the channel name after the ':'</span>
13221151         
13231152         <span class="comment">%i = findstr(Channel(1,:),':');</span>
13241153         <span class="comment">%if ~isempty(i)</span>
13251154         <span class="comment">%    Channel(:,i:end) = [];</span>
13261155         <span class="comment">%end</span>
13271156         <span class="comment">%Channel = strcat(Channel, [':',Field]);</span>
13281157
13291158         <span class="comment">% Since the location of &quot;:&quot; can be different in each row, loop</span>
13301159         ChannelMat = [];
13311160         <span class="keyword">for</span> j = 1:size(Channel,1)
13321161             i = findstr(Channel(j,:),<span class="string">':'</span>);
13331162             <span class="keyword">if</span> isempty(i)
13341163                 <span class="comment">% I'm not sure what to do if &quot;:&quot; is missing, I'm just add a &quot;:&quot;</span>
13351164                 ChannelMat = strvcat(ChannelMat, [Channel(j,1:i), <span class="string">':'</span>, Field]);
13361165             <span class="keyword">else</span>
13371166                 ChannelMat = strvcat(ChannelMat, [Channel(j,1:i), Field]);
13381167             <span class="keyword">end</span>
13391168         <span class="keyword">end</span>
13401169         Tango = strcat(Tango, [<span class="string">':'</span>,Field]);
13411170     <span class="keyword">else</span>
13421171         <span class="comment">% Add a .Field</span>
13431172         Tango = strcat(Tango, [<span class="string">'.'</span>,Field]);
13441173     <span class="keyword">end</span>
13451174
13461175     ExtraTimeDelay = etime(clock, t0);
13471176     <span class="keyword">if</span> nargout &lt; 3
13481177         [AM, tout] = getpvonline(Tango, OutputDataType, N, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);
13491178     <span class="keyword">else</span>
13501179         [AM, tout, DataTime, ErrorFlag] = getpvonline(Tango, OutputDataType, N, t-ExtraTimeDelay, FreshDataFlag, TimeOutPeriod);
13511180     <span class="keyword">end</span>
13521181     tout = tout + ExtraTimeDelay;
13531182     <span class="keyword">return</span>
13541183 <span class="keyword">end</span>
13551184
13561185
13571186 AOField = AO.(Field);   <span class="comment">% Should I replace this????</span>
13581187
13591188 <span class="comment">% If mode does not exist, force to online mode</span>
13601189 <span class="keyword">if</span> isfield(AOField, <span class="string">'Mode'</span>)
13611190     Mode = AOField.Mode;
13621191 <span class="keyword">else</span>
13631192     Mode = <span class="string">'Online'</span>;
13641193 <span class="keyword">end</span>
13651194
13661195
13671196 <span class="comment">% Check if Online should really be special</span>
13681197 <span class="keyword">if</span> strcmpi(Mode, <span class="string">'Online'</span>)
13691198    <span class="keyword">if</span> isfield(AO.(Field), <span class="string">'SpecialFunctionGet'</span>)
13701199        Mode = <span class="string">'Special'</span>;
13711200    <span class="keyword">end</span>
13721201 <span class="keyword">end</span>
13731202
13741203
13751204 <span class="keyword">if</span> ~isstruct(AO.(Field))
13761205     <span class="comment">% If it's not a structure that just get the field</span>
13771206     <span class="comment">% Hardward and physics get ignored</span>
13781207     t1 = clock;
13791208     [AM, ErrorFlag] = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(AO.FamilyName, Field, DeviceList);
13801209     
13811210     tout = etime(t1, t0);
13821211     <span class="keyword">if</span> nargout &gt;= 3
13831212         days = datenum(t1(1:3)) - 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
13841213         tt = 24*60*60*days + 60*60*t1(4) + 60*t1(5) + t1(6);
13851214         DataTime(1:size(AM,1),1:length(t)) = fix(tt) + rem(tt,1)*1e9*sqrt(-1);
13861215     <span class="keyword">end</span>
13871216     
13881217 <span class="keyword">elseif</span> strcmpi(Mode,<span class="string">'online'</span>)
13891218     <span class="comment">% Online</span>
13901219     <span class="keyword">if</span> strcmpi(AOField.DataType,<span class="string">'Scalar'</span>)
13911220         N = 1;  <span class="comment">% Output size</span>
13921221
13931222         ExtraTimeDelay = etime(clock, t0);
13941223         <span class="keyword">if</span> nargout &lt; 3
13951224             [AM, tout] = getpvonline(AOField.TangoNames(DeviceIndex,:), Field, OutputDataType, N, t-ExtraTimeDelay);
13961225         <span class="keyword">else</span>
13971226             [AM, tout, DataTime, ErrorFlag] = getpvonline(AOField.TangoNames(DeviceIndex,:), Field, OutputDataType, N, t-ExtraTimeDelay);
13981227         <span class="keyword">end</span>
13991228         tout = tout + ExtraTimeDelay;
14001229
14011230         <span class="comment">% FreshDataFlag</span>
14021231         <span class="keyword">if</span> FreshDataFlag &amp;&amp; length(t) == 1
14031232             <span class="comment">% Only use FreshDataFlag for scalar t</span>
14041233             FreshDataCounter = FreshDataFlag;
14051234             AM0 = AM;
14061235             <span class="keyword">while</span> FreshDataCounter
14071236                 <span class="keyword">if</span> nargout &lt; 3
14081237                     [AM, tout] = getpvonline(AOField.TangoNames(DeviceIndex,:), Field,OutputDataType, N);
14091238                 <span class="keyword">else</span>
14101239                     [AM, tout, DataTime, ErrorFlag] = getpvonline(AOField.TangoNames(DeviceIndex,:), Field, OutputDataType, N);
14111240                 <span class="keyword">end</span>
14121241
14131242                 <span class="keyword">if</span> ~any((AM-AM0)==0)
14141243                     FreshDataCounter = FreshDataCounter - 1;
14151244                     AM0 = AM;
14161245                 <span class="keyword">end</span>
14171246
14181247                 <span class="keyword">if</span> etime(clock, t0) &gt; TimeOutPeriod
14191248                     k = find((AM-AM0)==0);
14201249                     <span class="keyword">for</span> j = 1:length(k)
14211250                         fprintf(<span class="string">'%s not changing.\n'</span>, deblank((AOField.TangoNames(DeviceIndex(k(j)),:))));
14221251                     <span class="keyword">end</span>
14231252                     error(<span class="string">'Timed out waiting for fresh data.'</span>);
14241253                 <span class="keyword">end</span>
14251254             <span class="keyword">end</span>
14261255             tout = etime(clock, t0);
14271256         <span class="keyword">end</span>
14281257         
14291258     <span class="keyword">elseif</span> strcmpi(AOField.DataType, <span class="string">'Vector'</span>)
14301259
14311260
14321261         <span class="comment">% Output(DataTypeIndex) must be equal to the number of elements in the family</span>
14331262         
14341263         <span class="comment">% There can only be one Tango or channel name for DataType='Vector'</span>
14351264         TangoNames = deblank(AOField.TangoNames(1,:));
14361265
14371266
14381267
14391268         <span class="comment">% Get data at every point in time vector, t</span>
14401269         AM = [];
14411270         ExtraTimeDelay = etime(clock, t0);
14421271         t = t - ExtraTimeDelay;
14431272         <span class="keyword">for</span> itime = 1:length(t)
14441273             T = t(itime)-etime(clock, t0);
14451274             <span class="keyword">if</span> T &gt; 0
14461275                 pause(T);
14471276             <span class="keyword">end</span>
14481277
14491278             <span class="comment">% Get data</span>
14501279             <span class="keyword">if</span> nargout &gt;= 3
14511280                 [tmp, tout, DataTime(:,itime), ErrorFlag] = getpvonline(TangoNames, <span class="string">'Vector'</span>, N);
14521281             <span class="keyword">else</span>
14531282                 tmp = getpvonline(TangoNames, <span class="string">'Vector'</span>, N);
14541283             <span class="keyword">end</span>
14551284             <span class="keyword">if</span> isfield(AOField, <span class="string">'DataTypeIndex'</span>)
14561285                 tmp = tmp(AOField.DataTypeIndex);
14571286             <span class="keyword">end</span>
14581287             AM = [AM tmp(DeviceIndex,:)];
14591288
14601289             tout(itime) = etime(clock, t0);
14611290         <span class="keyword">end</span>
14621291
14631292         <span class="comment">% FreshDataFlag</span>
14641293         <span class="keyword">if</span> FreshDataFlag &amp; length(t) == 1
14651294             <span class="comment">% Only use FreshDataFlag for scalar t</span>
14661295             FreshDataCounter = FreshDataFlag;
14671296             AM0 = AM;
14681297             <span class="keyword">while</span> FreshDataCounter
14691298                 <span class="keyword">if</span> nargout &gt;= 3
14701299                     [AM, tout, DataTime, ErrorFlag] = getpvonline(TangoNames, <span class="string">'Vector'</span>, N);
14711300                 <span class="keyword">else</span>
14721301                     AM = getpvonline(TangoNames, <span class="string">'Vector'</span>, N);
14731302                 <span class="keyword">end</span>
14741303                 <span class="keyword">if</span> isfield(AOField, <span class="string">'DataTypeIndex'</span>)
14751304                     AM = AM(AOField.DataTypeIndex);
14761305                 <span class="keyword">end</span>
14771306                 AM = AM(DeviceIndex,:);
14781307
14791308                 <span class="keyword">if</span> ~any((AM-AM0)==0)
14801309                     FreshDataCounter = FreshDataCounter - 1;
14811310                     AM0 = AM;
14821311                 <span class="keyword">end</span>
14831312
14841313                 <span class="keyword">if</span> etime(clock, t0) &gt; TimeOutPeriod
14851314                     k = find((AM-AM0)==0);
14861315                     <span class="keyword">for</span> j = 1:length(k)
14871316                         fprintf(<span class="string">'%s[%d,%d] not changing.\n'</span>, AO.FamilyName, DeviceList(k(j),1), DeviceList(k(j),2));
14881317                     <span class="keyword">end</span>
14891318                     error(<span class="string">'Timed out waiting for fresh data.'</span>);
14901319                 <span class="keyword">end</span>
14911320             <span class="keyword">end</span>
14921321             tout = etime(clock, t0);
14931322         <span class="keyword">end</span>
14941323
14951324     <span class="keyword">elseif</span> strcmpi(AOField.DataType,<span class="string">'Matrix'</span>)
14961325
14971326         <span class="keyword">for</span> iDev = 1:length(DeviceIndex)
14981327             <span class="comment">%AM(iDev,:) = rand(1,10); DataTime(iDev,:) = now; ErrorFlag(iDev,:)=0;</span>
14991328             [AM(iDev,:), tout, DataTime(iDev,:), ErrorFlag(iDev,1)] = getpvonline(AOField.TangoNames(DeviceIndex(iDev),:), <span class="string">'Matrix'</span>, N);
15001329         <span class="keyword">end</span>
15011330         ErrorFlag = any(ErrorFlag);
15021331         tout = etime(clock, t0);
15031332
15041333     <span class="keyword">else</span>
15051334         error(sprintf(<span class="string">'Unknown DataType for family %s.'</span>, AO.FamilyName));
15061335     <span class="keyword">end</span>
15071336
15081337     <span class="comment">% Change to physics units if Units = 'physics'</span>
15091338     <span class="keyword">if</span> strcmpi(AO.(Field).Units,<span class="string">'physics'</span>)
15101339         <span class="comment">% Change to physics units</span>
15111340         AM = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(AO.FamilyName, Field, AM, DeviceList);
15121341     <span class="keyword">end</span>
15131342
15141343 <span class="keyword">elseif</span> strcmpi(Mode,<span class="string">'Special'</span>)
15151344
15161345     <span class="keyword">if</span> isfield(AOField, <span class="string">'SpecialFunctionGet'</span>)
15171346         SpecialFunction = AOField.SpecialFunctionGet;
15181347     <span class="keyword">elseif</span> isfield(AOField, <span class="string">'SpecialFunction'</span>)
15191348         SpecialFunction = AOField.SpecialFunction;
15201349     <span class="keyword">else</span>
15211350         error(sprintf(<span class="string">'No special function specified for Family %s (getpv).'</span>, AO.FamilyName));
15221351     <span class="keyword">end</span>
15231352
15241353     <span class="comment">% Get data at every point in time vector, t</span>
15251354     ExtraTimeDelay = etime(clock, t0);
15261355     t = t - ExtraTimeDelay;
15271356     [AM, tout, DataTime, ErrorFlag] = feval(SpecialFunction, AO.FamilyName, Field, DeviceList, t);
15281357     t1 = clock;
15291358     <span class="keyword">if</span> isempty(tout)
15301359         tout = etime(t1, t0);
15311360     <span class="keyword">end</span>
15321361     <span class="keyword">if</span> nargout &gt;= 3 &amp;&amp; isempty(DataTime)
15331362         days = datenum(t1(1:3)) - 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
15341363         tt = 24*60*60*days + 60*60*t1(4) + 60*t1(5) + t1(6);
15351364         DataTime(1:size(AM,1),1) = fix(tt) + rem(tt,1)*1e9*sqrt(-1);
15361365     <span class="keyword">end</span>
15371366     <span class="keyword">if</span> length(t) &gt; length(tout)
15381367         <span class="keyword">for</span> itime = 2:length(t)
15391368             T = t(itime)-etime(clock, t0);
15401369             <span class="keyword">if</span> T &gt; 0
15411370                 pause(T);
15421371             <span class="keyword">end</span>
15431372
15441373             <span class="comment">% Get data</span>
15451374             [Tmp, toutTmp, DataTimeTmp, ErrorFlag] = feval(SpecialFunction, AO.FamilyName, Field, DeviceList, t);
15461375             
15471376             AM = [AM Tmp];
15481377             DataTime = [DataTime DataTimeTmp];
15491378
15501379             t1 = clock;
15511380             tout(1,itime) = etime(t1, t0);
15521381             <span class="keyword">if</span> nargout &gt;= 3 &amp;&amp; isempty(DataTimeTmp)
15531382                 days = datenum(t1(1:3)) - 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
15541383                 tt = 24*60*60*days + 60*60*t1(4) + 60*t1(5) + t1(6);
15551384                 DataTime(1:size(AM,1),itime) = fix(tt) + rem(tt,1)*1e9*sqrt(-1);
15561385             <span class="keyword">end</span>
15571386         <span class="keyword">end</span>
15581387     <span class="keyword">end</span>
15591388
15601389     <span class="comment">% FreshDataFlag</span>
15611390     <span class="keyword">if</span> FreshDataFlag &amp;&amp; length(t) == 1
15621391         <span class="comment">% Only use FreshDataFlag for scalar t</span>
15631392         FreshDataCounter = FreshDataFlag;
15641393         AM0 = AM;
15651394         <span class="keyword">while</span> FreshDataCounter
15661395             <span class="comment">% Get data</span>
15671396             [AM, tout, DataTime, ErrorFlag] = feval(SpecialFunction, AO.FamilyName, Field, DeviceList, t);
15681397
15691398             <span class="keyword">if</span> ~any((AM-AM0)==0)
15701399                 FreshDataCounter = FreshDataCounter - 1;
15711400                 AM0 = AM;
15721401             <span class="keyword">end</span>
15731402
15741403             t1 = clock;
15751404             <span class="keyword">if</span> etime(t1, t0) &gt; TimeOutPeriod
15761405                 k = find((AM-AM0)==0);
15771406                 <span class="keyword">for</span> j = 1:length(k)
15781407                     fprintf(<span class="string">'%s[%d,%d] not changing.\n'</span>, AO.FamilyName, DeviceList(k(j),1), DeviceList(k(j),2));
15791408                 <span class="keyword">end</span>
15801409                 error(<span class="string">'Timed out waiting for fresh data.'</span>);
15811410             <span class="keyword">end</span>
15821411         <span class="keyword">end</span>
15831412         tout = etime(t1, t0);
15841413
15851414         <span class="keyword">if</span> nargout &gt;= 3 &amp;&amp; isempty(DataTime)
15861415             days = datenum(t1(1:3)) - 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
15871416             tt = 24*60*60*days + 60*60*t1(4) + 60*t1(5) + t1(6);
15881417             DataTime(1:size(AM,1),1) = fix(tt) + rem(tt,1)*1e9*sqrt(-1);
15891418         <span class="keyword">end</span>
15901419     <span class="keyword">end</span>
15911420
15921421     <span class="comment">% Change to physics units if Units = 'physics'</span>
15931422     <span class="keyword">if</span> strcmpi(AO.(Field).Units,<span class="string">'physics'</span>)
15941423         <span class="comment">% Change to physics units</span>
15951424         AM = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(AO.FamilyName, Field, AM, DeviceList);
15961425     <span class="keyword">end</span>
15971426
15981427 <span class="keyword">elseif</span> strcmpi(Mode,<span class="string">'manual'</span>)
15991428     <span class="comment">% Always return in hardware units (like connected to the IOC)</span>
16001429     <span class="comment">% The conversion to physics in done at the end</span>
16011430     t = 0;
16021431     <span class="keyword">if</span> strcmp(AO.FamilyName, <span class="string">'TUNE'</span>)
16031432         HarmNumber = [];
16041433         RF = [];
16051434         <span class="keyword">if</span> find(DeviceIndex == 1)
16061435             AM(1,1) = input(sprintf(<span class="string">'   Input the horizontal tune (fraction or Hz) = '</span>));
16071436             <span class="keyword">if</span> AM(1,1) &gt; 1
16081437                 HarmNumber = getharmonicnumber;
16091438                 RF = <a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a>(<span class="string">'Struct'</span>);
16101439                 <span class="keyword">if</span> strcmpi(RF.UnitsString,<span class="string">'MHz'</span>)
16111440                     FundFreq = 1e6*RF.Data / HarmNumber;
16121441                 <span class="keyword">elseif</span> strcmpi(RF.UnitsString,<span class="string">'Hz'</span>)
16131442                     FundFreq = RF.Data / HarmNumber;
16141443                 <span class="keyword">else</span>
16151444                     error(<span class="string">'RF units in not known.'</span>);
16161445                 <span class="keyword">end</span>
16171446                 <span class="comment">%AM(1,1) = (AM(1,1)- RF) / FundFreq;</span>
16181447                 AM(1,1) = AM(1,1) / FundFreq;
16191448                 fprintf(<span class="string">'   Horizontal fraction tune computed to be %f\n\n'</span>, AM(1,1));
16201449             <span class="keyword">end</span>
16211450         <span class="keyword">end</span>
16221451         <span class="keyword">if</span> find(DeviceIndex == 2)
16231452             AM(2,1) = input(sprintf(<span class="string">'   Input the vertical   tune (fraction or Hz) = '</span>));
16241453             <span class="keyword">if</span> AM(2,1) &gt; 1
16251454                 <span class="keyword">if</span> isempty(HarmNumber)
16261455                     HarmNumber = getharmonicnumber;
16271456                 <span class="keyword">end</span>
16281457                 <span class="keyword">if</span> isempty(RF)
16291458                     RF = <a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a>(<span class="string">'Struct'</span>);
16301459                 <span class="keyword">end</span>
16311460                 <span class="keyword">if</span> strcmpi(RF.UnitsString,<span class="string">'MHz'</span>)
16321461                     FundFreq = 1e6*RF.Data / HarmNumber;
16331462                 <span class="keyword">elseif</span> strcmpi(RF.UnitsString,<span class="string">'Hz'</span>)
16341463                     FundFreq = RF.Data / HarmNumber;
16351464                 <span class="keyword">else</span>
16361465                     error(<span class="string">'RF units in not known.'</span>);
16371466                 <span class="keyword">end</span>
16381467                 AM(2,1) = AM(2,1)/FundFreq;
16391468                 <span class="comment">%AM(2,1) = (AM(2,1) - HarmNumber * FundFreq)/FundFreq;</span>
16401469                 fprintf(<span class="string">'   Vertical   fraction tune computed to be %f\n\n'</span>, AM(2,1));
16411470             <span class="keyword">end</span>
16421471         <span class="keyword">end</span>
16431472         <span class="keyword">if</span> find(DeviceIndex == 3)
16441473             AM(2,1) = input(<span class="string">'   Input the synchrotron tune = '</span>);
16451474         <span class="keyword">end</span>
16461475     <span class="keyword">elseif</span> strcmp(AO.FamilyName, <span class="string">'RF'</span>)
16471476         <span class="keyword">if</span> strcmpi(AO.(Field).Units, <span class="string">'Hardware'</span>)
16481477             AM(1) = input(sprintf(<span class="string">'   Input the RF frequency [%s] = '</span>, AO.(Field).HWUnits));
16491478         <span class="keyword">else</span>
16501479             AM(1) = input(sprintf(<span class="string">'   Input the RF frequency [%s] = '</span>, AO.(Field).PhysicsUnits));
16511480             AM = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(AO.FamilyName, Field, AM, [1 1]);
16521481         <span class="keyword">end</span>
16531482     <span class="keyword">else</span>
16541483         <span class="keyword">for</span> i = 1:length(DeviceIndex)
16551484             <span class="keyword">if</span> strcmpi(AO.(Field).Units, <span class="string">'Hardware'</span>)
16561485                 AM(i,:) = input(sprintf(<span class="string">'   Manual input:  %s(%d,%d) [%s] = '</span>, AO.FamilyName, AO.DeviceList(DeviceIndex(i),1), AO.DeviceList(DeviceIndex(i),2), AO.(Field).HWUnits));
16571486             <span class="keyword">else</span>
16581487                 AM(i,:) = input(sprintf(<span class="string">'   Manual input:  %s(%d,%d) [%s] = '</span>, AO.FamilyName, AO.DeviceList(DeviceIndex(i),1), AO.DeviceList(DeviceIndex(i),2), AO.(Field).PhysicsUnits));
16591488                 AM(i,:) = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(AO.FamilyName, Field, AM(i,:), AO.DeviceList(DeviceIndex(i),:));
16601489             <span class="keyword">end</span>
16611490         <span class="keyword">end</span>
16621491     <span class="keyword">end</span>
16631492     
16641493     t1 = clock;
16651494     tout = etime(t1, t0);
16661495     days = datenum(t1(1:3)) - 719529;  <span class="comment">%datenum('1-Jan-1970');</span>
16671496     tt = 24*60*60*days + 60*60*t1(4) + 60*t1(5) + t1(6);
16681497     DataTime(1:size(AM,1),1) = fix(tt) + rem(tt,1)*1e9*sqrt(-1);
16691498
16701499     <span class="comment">% Change to physics units if Units = 'physics'</span>
16711500     <span class="keyword">if</span> strcmpi(AO.(Field).Units,<span class="string">'physics'</span>)
16721501         <span class="comment">% Change to physics units</span>
16731502         AM = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(AO.FamilyName, Field, AM, DeviceList);
16741503     <span class="keyword">end</span>
16751504
16761505
16771506 <span class="keyword">elseif</span> strcmpi(Mode,<span class="string">'Simulator'</span>) || strcmpi(Mode,<span class="string">'Model'</span>)
16781507
16791508     ExtraTimeDelay = etime(clock, t0);
16801509     <span class="comment">%[AM, tout, DataTime, ErrorFlag] = getpvmodel(AO, Field, DeviceList, t-ExtraTimeDelay, 'Physics', 'Numeric');</span>
16811510     [AM, tout, DataTime, ErrorFlag] = getpvmodel(AO, Field, DeviceList, t-ExtraTimeDelay, AO.(Field).Units, <span class="string">'Numeric'</span>);
16821511     tout = tout + ExtraTimeDelay;
16831512
16841513
16851514     <span class="keyword">if</span> strcmpi(OutputDataType, <span class="string">'String'</span>)
16861515         AM = num2str(AM);
16871516     <span class="keyword">end</span>
16881517         
16891518     <span class="comment">% Change to physics units if Units = 'physics'</span>
16901519     <span class="comment">%if strcmpi(AO.(Field).Units,'Hardware')</span>
16911520     <span class="comment">%    % Change to physics units</span>
16921521     <span class="comment">%    AM = physics2hw(AO.FamilyName, Field, AM, DeviceList, getenergymodel);</span>
16931522     <span class="comment">%end</span>
16941523
16951524 <span class="keyword">else</span>
16961525     error(sprintf(<span class="string">'Unknown mode for family %s.'</span>, AO.FamilyName));
16971526 <span class="keyword">end</span>
16981527
16991528
17001529</pre></div>
1701<hr><address>Generated on Mon 21-May-2007 15:29:18 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
1702</body>
1703</html>
Note: See TracBrowser for help on using the repository browser.