1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
| clear
clc
// This GUI file is generated by guibuilder version 3.0
//////////
f=figure('figure_position',[400,50],'figure_size',[656,481],'auto_resize','on','background',[33],'figure_name','Figure n°%d');
//////////
delmenu(f.figure_id,gettext('File'))
delmenu(f.figure_id,gettext('?'))
delmenu(f.figure_id,gettext('Tools'))
toolbar(f.figure_id,'off')
handles.dummy = 0;
handles.startacquisitionButton=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.100625,0.7954167,0.2296875,0.1108333],'Relief','default','SliderStep',[0.01,0.1],'String','Start Acquisition','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','startacquisitionButton','Callback','startButton_callback(handles)')
handles.stopacquisition=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.1,0.5969163,0.225,0.1135242],'Relief','default','SliderStep',[0.01,0.1],'String','Stop Acquisition','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','stopacquisition','Callback','stopacquisition_callback(handles)')
handles.quit=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.1009375,0.3986784,0.1015625,0.0991189],'Relief','default','SliderStep',[0.01,0.1],'String','Quit','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','quit','Callback','quit_callback(handles)')
handles.duree_mesure=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','left','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.3984375,0.8,0.3,0.0976744],'Relief','default','SliderStep',[0.01,0.1],'String','Durée de la mesure','Style','edit','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','duree_mesure','Callback','')
handles.ImccradioButton=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','left','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.6984375,0.5990099,0.1015625,0.1039604],'Relief','default','SliderStep',[0.01,0.1],'String','Imcc','Style','radiobutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','ImccradioButton','Callback','ImccradioButton_callback(handles)')
handles.monterbelier=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.74375,0.7947368,0.25,0.1],'Relief','default','SliderStep',[0.01,0.1],'String','Monter le Bélier','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','monterbelier','Callback','monterbelier_callback(handles)')
handles.stopperbelier=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.765625,0.6026316,0.23125,0.0947368],'Relief','default','SliderStep',[0.01,0.1],'String','Stopper le bélier','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','stopperbelier','Callback','stopperbelier_callback(handles)')
handles.descendrebelier=uicontrol(f,'unit','normalized','BackgroundColor',[-1,-1,-1],'Enable','on','FontAngle','normal','FontName','Tahoma','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[-1,-1,-1],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.765625,0.4026316,0.23125,0.0947368],'Relief','default','SliderStep',[0.01,0.1],'String','Descendre le bélier','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','descendrebelier','Callback','descendrebelier_callback(handles)')
function startButton_callback(handles)
//Write your callback for startButton here
// durat=get(duration,"string");//Acquisition de la durée d'acquisition en ms
duratbis=3000
mesure.numero_boitier=1
mesure.nb_voies=8
mesure.duree=15 //mesure.duree=durat/1000 mais ne marche pas pour l'instant
mesure.nb_pts=1000
mesure.type_boitier="6008"
[mesure.data,mesure.temps_global]=readNIdata(mesure.numero_boitier,mesure.nb_voies, mesure.duree, mesure.nb_pts, mesure.type_boitier)
global("mesure2")
mesure2=mesure.data
//abscisses : temps
temps_ini=0;
temps=mesure.temps_global-temps_ini;
selection=find(temps>=0);
temps=temps(selection);
//tracé des entrées analogique
figure()
subplot(8,1,1)
plot(temps,mesure.data(selection,1))
xtitle("","temps (s)","voie 1, AI0, Vbat?")
subplot(8,1,2)
plot(temps,mesure.data(selection,2))
xtitle("","temps (s)","voie 2, AI1, Ivide?")
subplot(8,1,3)
plot(temps,mesure.data(selection,3))
xtitle("","temps (s)","voie 2, AI2, Imcc?")
subplot(8,1,4)
plot(temps,mesure.data(selection,4))
xtitle("","temps (s)","voie 2, AI3, Lux?")
subplot(8,1,5)
plot(temps,mesure.data(selection,5))
xtitle("","temps (s)","voie 2, AI4, Ibat?")
subplot(8,1,6)
plot(temps,mesure.data(selection,6))
xtitle("","temps (s)","voie 2, AI5, ????")
subplot(8,1,7)
plot(temps,mesure.data(selection,7))
xtitle("","temps (s)","voie 2, AI6, ????")
subplot(8,1,8)
plot(temps,mesure.data(selection,8))
xtitle("","temps (s)","voie 2, AI7, Effort?")
//tracé des signaux analogiques Vmcc, Imcc, Effort
figure()
subplot(3,1,1)
plot(temps,2*mesure.data(selection,1))
xtitle("","temps (s)","voie 1, AI0, Vbat(V)")
subplot(3,1,2)
plot(temps,-7*(mesure.data(selection,2)-5.5))
xtitle("","temps (s)","voie 2, AI2, Imcc non signé (A)")
subplot(3,1,3)
plot(temps,(750/(0.82-0.55))*(mesure.data(selection,8)-0.55))
xtitle("","temps (s)","voie 2, AI7, Effort(N)")
endfunction
function radioButton_callback(handles)
//Write your callback for radioButton here
endfunction
function stopacquisition_callback(handles)
//Write your callback for stopacquisition here
endfunction
function quit_callback(handles)
//Write your callback for quit here
sleep(500);
f = findobj("tag", "mainWindow");
delete(f);
endfunction
function monterbelier_callback(handles)
//Write your callback for monterbelier here
writeDigPort(2); writeDigPort(0d64)
clear writeDigPort;
endfunction
function descendrebelier_callback(handles)
//Write your callback for descendrebelier here
writeDigPort(1); writeDigPort(0d128)
clear writeDigPort;
endfunction
function stopperbelier_callback(handles)
//Write your callback for descendrebelier here
writeDigPort(0); writeDigPort(0)
clear writeDigPort;
endfunction
function writeDigPort(value)
// Channel parameters
// chan = "Dev1/ao1";
chan = "Dev1/port1"; Dev1/port0
// Data write parameters
pointsToWrite = 1;
timeout = 10.0;
data = uint32(value); // 0x55
[task,err] = DAQ_CreateTask("");
DAQ_ErrChk(task,err);
[err] = DAQ_CreateDOChan(task,chan);
DAQ_ErrChk(task,err);
[err] = DAQ_StartTask(task);
DAQ_ErrChk(task,err);
[pointsWritten,err] = DAQ_WriteDigitalU32(task,1,%t,timeout, DAQ("Val_GroupByChannel"),data);
DAQ_ErrChk(task, err);
DAQ_StopTask( task );
DAQ_ClearTask( task );
endfunction
//******************************************************************************
//acquisition des entrées analogiques
//basé sur l'extension NIDAQ disponible sur Atoms
//Arguments :
//nodevice -> numéro du boitier 6008 ou 6009 installé
//(généralement 1, identifiant du boitier sur NIDaq associé Dev1)
//nb_voies -> nombre de voies utilisées. Les connecter dans l'ordre (Voie 0, 1 ...)
//duree -> durée de la mesure (en s)
//nb_pts -> nombre de valeurs ou d'échantillons prelevés pendant la durée d'acquisition
//(pour un 6008 : 10000 échantillons max pour l'ensemble des voies multiplexées
//pour un 6009, 47000 échantillons maxi)
//type_boitier -> choisir 6008 ou 6009
//datamat -> datamat(:,i) renvoit les données acquises sur la voie i
//temps -> renvoi l'évolution temporelle à partir du début de l'acquisition
//******************************************************************************
function [datamat,temps]=readNIdata(nodevice, nb_voies, duree, nb_pts, type_boitier)
// durat=ascii(get(duration,"string"))-48;//Acquisition du nombre de compactage entré par l'utilisateur
// **********************
// Paramètres du boitier
// **********************
device = "Dev"+string(nodevice);
nbchan=nb_voies;
// Taux de rafraichissement des échantillons
// Pour un 6008 : 10000 échantillons / s pour l'ensemble des voies multiplexées
// soit 10000 / nbchan échantillons pour l'ensemble des nbchan voies
// Pour un 6009 : 47000 échantillons / s pour l'ensemble des voies multiplexées
// soit 47000 / nbchan échantillons pour l'ensemble des nbchan voies
if(type_boitier==6008 | type_boitier=='6008') max_nb_pts=9000; type_boitier='6008';
else max_nb_pts=45000; type_boitier='6009';
end
if(nb_pts*nbchan>max_nb_pts)
message="Diminuer le nombre de points par voies. Max = "+String(max_nb_pts)+" pour un boitier NI"+type_boitier;
messagebox("Information", message,"error" );
return 0;
end
rate = nb_pts/duree;
// Construction automatique des numéros de voie en fonction du numéro du
// boitier (nodevice) et du nombre de voies utilisées (nbchan)
chan="";
for i = 0:nbchan-1
chan = chan+"Dev"+string(nodevice)+"/ai"+string(i)+",";
end
chan = part(chan,1:length(chan)-1);
disp("Voies d''acqusition: "+chan);
// Valeurs limites des voies (en V)
maxVal = 10.0;
minVal = -10.0;
// ****************************
// Paramètres de l'acquisition
// ****************************
// Source de l'horloge
source = "OnboardClock";
// Nombre d'échantillons par voie, calculé automatiquement
samplesPerChan = rate*duree;
// Paramètres de lecture des données
// Taille du stockage (en nombre d'échantillons)
// Pour une acquisition continue, il faut prévoir un buffer suffisamment
// large de manière à ce qu'il puisse amortir un ralentissement du
// traitement.
bufferSize = samplesPerChan * nbchan;
// Nombre de points à lire = taille du buffer ou nombre d'échantillons par voie
// En conséquence (à vérifier), peut-être prendre pointsToRead = bufferSize;
pointsToRead = samplesPerChan;
// Durée (en s) pour écrire tous les échantillons : valeur par défaut à 10 s
// Si timeout = -1, attente infinie
// Si timeout = 0, un essai de lecture puis renvoi d'erreur si pas de retour
// On prend une valeur supérieure à la période d'acquisition juste pour être
// tranquille sans rien planter
// Durée de la mesure, valeur définie en s
//duree = 5;
timeout = duree*1.1;
// *******************************************************************
// Programme général, basé sur les bibliothèques National Instruments
// *******************************************************************
// On commence par un reset du matériel (par sécurité, pas obligatoire)
//[err] = DAQ_ResetDevice(device); //SC je l'ai viré
// Val_RSE pour mode SingleEnded et Val_Diff pour différentiel
// Il y a 4 voies différentielles ou 8 voies single ended sur 6009
// Sous Labview, chaque voie est configurable séparément mais là
// je ne vois pas comment faire de manière programmée et je n'ai pas testé
// la création successive de chacune des voies...pour une même tâche ?????.
[taskAI,err] = DAQ_CreateTask(""); DAQ_ErrChk(taskAI,err);
[err] = DAQ_CreateAIVoltageChan(taskAI, chan, DAQ("Val_RSE"),...
minVal, maxVal);
DAQ_ErrChk(taskAI,err);
// Val_FiniteSamps pour N echantillons et Val_ContSamps pour mode continu
[err] = DAQ_CfgSampClkTiming(taskAI, source, rate,...
DAQ("Val_Rising"), DAQ("Val_FiniteSamps"),samplesPerChan);
DAQ_ErrChk(taskAI,err);
[err] = DAQ_StartTask(taskAI); DAQ_ErrChk(taskAI,err);
// Val_GroupByChannel pour des données groupées par voies d'acquisition
// Val_GroupByScanNumber pour des données entrelacées
[data,pointsRead,err] = DAQ_ReadAnalogF64(taskAI,pointsToRead,timeout,...
DAQ("Val_GroupByChannel"),bufferSize);
DAQ_ErrChk(taskAI, err);
// Inscription dans un fichier
// mprintf ("%d échantillons acquis\n",pointsRead);
disp(string(pointsRead)+" échantillons acquis sur chaque voie.");
// Arrêt et fermeture des tâches ouvertes quand c'est fini
DAQ_StopTask(taskAI);
DAQ_ClearTask(taskAI);
// **************************************************************************
// Récupération des données et inscription dans un fichier pour tracé externe
// **************************************************************************
// Taille de la matrice
[nlig,ncol]=size(data);
// Mise en place des échantillons dans un vecteur groupé par voie
disp("Dimension du tableau d''acquisition: nb de lignes= " + string(nlig)+ ...
"/ nb de colonnes= " + string(ncol));
// Si le tableau data n'est pas vide
if pointsRead>0 then
//remodelage de data
datamat = matrix(data,ncol/nbchan,nbchan);
//pour juger de l'effet du remodelage
[nlig,ncol]=size(datamat);
disp("Dimension du tableau remodelé: nb de lignes= "+string(nlig) + ...
"/ nb de colonnes= " + string(ncol));
// for i = 1:nbchan
//// pour extraire les colonnes et générer le tracé de chacune
//// des voies sur la même figure.
// plot(datamat(:,i));
// end
// affichage direct (colonnes=voies; lignes=échantillons que l'on peut interrompre
//disp(datamat);
end;
temps=[0:duree/nb_pts:duree-duree/nb_pts];
// Nettoyage des mémoires et des variables
clear chan minVal maxVal samplesPerChan pointsToRead timeout;
clear task err data pointsRead i duree;
endfunction |
Partager