Bonjour,

Actuellement en 3ème année d'école d'ingénieur je bloque sur un problème de programmation sur scilab...
N'étant pas vraiment confirmé dans la manipulation de Scilab, je me permets de vous demander un peu d'aide...

J'ai une carte NI 6008 qui contrôle des LEDs et un motoréducteur.

Du côté "digital" j'ai les ports P0 et P1.
Le port 0 possède 8 entrées.
Le port 1 en possède 4
Ainsi j'ai P0.0, P0.1, ... P0.7 qui sont les 8 entrées du port 0
et P1.0, P1.1, P1.2, P1.3 qui sont les 4 entrées du port 1


Sur les ports P1.0 P1.1 et P1.2, j'ai les trois LEDs branchées.

Sur les ports P0.6 et P0.7 j'ai le moto réducteur qui doit tourner dans un sens ou dans l'autre selon la sortie que je sélectionne
(en l’occurrence, P0.6 active le sens horaire, P0.7 le sens anti horaire)...

J'arrive à allumer les LEDs sans souci, en donnant des valeurs entre 0 et 7, mais pas à faire tourner le moteur...
Il semblerait que j'ai un souci d'adresse peut être...

J'ai trouvé des tas de tutos et d'aide sur labview, j'ai déjà envoyé un message sur le forum de NI, mais les conseils que j'ai reçu sont, semble t il, orientés labview...

lien vers mon sujet sur le site NI : http://forums.ni.com/t5/Discussions-...3546996#M26625
lien vers la doc que j'ai étudié sur le site de NI : http://digital.ni.com/public.nsf/all...256FE8006807DF

Voilà ou j'en suis dans mon programme (j'ai tout mis pour être sur de rien oublier, désolé si c'est long ...)
Ce programme permet de commander les LEDs, voir la partie en rouge pour le moteur.
J'ai gardé mes commentaires et ceux des tutos ...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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


Je n'ai pas de messages d'erreur avec ceci...

Merci d'avoir prit le temps de lire...

Cordialement,

Valentin.