Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
146 f9daq 1
#include "rs232.h"
2
#include "MIKRO.h"
3
 
4
//#define DEBUG
5
 
6
#define COMWAIT 0.5
7
#define COMDELAY 0.1
8
 
9
static char MIKRO_Send[100], MIKRO_Receive[100];
10
static char MIKRO_Device, MIKRO_Axes, MIKRO_Response;
11
static int MIKRO_Port;
12
static int nin, nout, rstat;
13
static int MIKRO_type[100];
14
 
15
int MIKRO_Cmd (int node, char *cmd)
16
{
17
  printf("Command: %1d %s\n",node,cmd);
18
  Delay(COMDELAY);
19
  FlushInQ (MIKRO_Port);
20
  nout = sprintf (MIKRO_Send, "%1d %s\r", node, cmd);
21
  ComWrt (MIKRO_Port, MIKRO_Send, nout);
22
  if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) {
23
    nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
24
    if (nin==2) return (0);
25
  }
26
  return (-1);
27
}
28
 
29
int MIKRO_Set (int node, char cmd[], int val)
30
{
31
  printf("Command: %1d %s %d\n",node,cmd, val);
32
  Delay(COMDELAY);
33
  FlushInQ (MIKRO_Port);
34
  nout = sprintf (MIKRO_Send, "%1d %s %d\r", node, cmd, val);
35
  ComWrt (MIKRO_Port, MIKRO_Send, nout);
36
  if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) {
37
    nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
38
    if (nin==2) return (0);
39
  }
40
  return (-1);
41
}
42
 
43
int MIKRO_Get (int node, char cmd[], int *val)
44
{
45
  short int stmp;
46
 
47
  Delay(COMDELAY);
48
  FlushInQ (MIKRO_Port);
49
  nout = sprintf (MIKRO_Send, "%1d %s\r", node, cmd);
50
  ComWrt (MIKRO_Port, MIKRO_Send, nout);
51
  if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) {
52
    nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
53
    if (nin>0){
54
//      MIKRO_Receive[--nin]=0;
55
      switch (nin) {
56
        case 9:
57
          sscanf (MIKRO_Receive, "%*x %hx",&stmp);
58
          *val=stmp;
59
          return (0);
60
        case 13:
61
          sscanf (MIKRO_Receive, "%*x %x",val);
62
          return (0);
63
        default:
64
          printf("Node %d Com error => bytes rcved=0x%02x buf=%s\n",node,nin,MIKRO_Receive);
65
          break;
66
      }
67
    }
68
  }
69
  return (-1);
70
}
71
 
72
int MIKRO_GetStat (int node)
73
{
74
  int tmp;
75
 
76
  Delay(COMDELAY);
77
  FlushInQ (MIKRO_Port);
78
  nout = sprintf (MIKRO_Send, "%1d st\r", node);
79
  ComWrt (MIKRO_Port, MIKRO_Send, nout);
80
  if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) {
81
    nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
82
//    if (nin>0) nin--;
83
    MIKRO_Receive[nin]=0;
84
    if (nin==9) {
85
      tmp=0;
86
      sscanf (MIKRO_Receive, "%*x %hx",(short int *)&tmp);
87
          return (tmp);
88
    }
89
  }
90
  return (-1);
91
}
92
 
93
int _VI_FUNC MIKRO_Open (char * dev)
94
{
95
 
96
 
97
  MIKRO_Port=OpenComConfig (dev, "", 38400, 0, 8, 1, 512, 512);
98
//  SetXMode (MIKRO_Port, 0);
99
//  SetCTSMode (MIKRO_Port, LWRS_HWHANDSHAKE_OFF);
100
//  SetComTime (MIKRO_Port, COMWAIT);
101
 
102
  return 0;
103
}
104
 
105
int _VI_FUNC MIKRO_Init (int node, int type)
106
{
107
 MIKRO_type[node]=type;
108
 Delay(0.1);
109
 MIKRO_Cmd(node,"ok 1");  
110
 MIKRO_Cmd(node,"ab");  
111
 switch (type){
112
   case 1:                              // 3M Linear
113
     MIKRO_Cmd(node,"k 1");
114
     MIKRO_Cmd(node,"ad 200");
115
     MIKRO_Cmd(node,"aa 2");
116
     MIKRO_Cmd(node,"fa 1");
117
     MIKRO_Cmd(node,"fd 3000");    // Set Max Dynamic Following Error (1000)
118
     MIKRO_Cmd(node,"sr 1000");
119
     MIKRO_Cmd(node,"sp 750");
120
     MIKRO_Cmd(node,"ac 100");
121
     MIKRO_Cmd(node,"dc 200");
122
     MIKRO_Cmd(node,"por 28000");
123
     MIKRO_Cmd(node,"i 600");
124
     MIKRO_Cmd(node,"ano 2350");
125
     MIKRO_Cmd(node,"ls 1");
126
     MIKRO_Cmd(node,"hp 1");
127
     MIKRO_Cmd(node,"hf 1");
128
     break;
129
   case 2:                              // 3M Rotary
130
     MIKRO_Cmd(node,"k 1");
131
     MIKRO_Cmd(node,"ad 200");
132
     MIKRO_Cmd(node,"aa 1");
133
     MIKRO_Cmd(node,"fa 1");
134
     MIKRO_Cmd(node,"fd 3000");    // Set Max Dynamic Following Error (1000)
135
     MIKRO_Cmd(node,"sr 1000");
136
     MIKRO_Cmd(node,"sp 550");
137
     MIKRO_Cmd(node,"ac 100");
138
     MIKRO_Cmd(node,"dc 200");
139
     MIKRO_Cmd(node,"por 28000");
140
     MIKRO_Cmd(node,"i 600");
141
     MIKRO_Cmd(node,"ano 2350");
142
     MIKRO_Cmd(node,"ls 99");
143
     MIKRO_Cmd(node,"hp 1");
144
     MIKRO_Cmd(node,"hf 1");
145
     break;
146
   case 3:                              // 4M Linear
147
     MIKRO_Cmd(node,"k 1");
148
     MIKRO_Cmd(node,"ad 1000");
149
     MIKRO_Cmd(node,"aa 2");
150
     MIKRO_Cmd(node,"fa 1");
151
     MIKRO_Cmd(node,"fd 3000");    // Set Max Dynamic Following Error (1000)
152
     MIKRO_Cmd(node,"sr 1000");
153
     MIKRO_Cmd(node,"sp 1000");
154
     MIKRO_Cmd(node,"ac 100");
155
     MIKRO_Cmd(node,"dc 200");
156
     MIKRO_Cmd(node,"por 28000");
157
     MIKRO_Cmd(node,"i 600");
158
     MIKRO_Cmd(node,"ano 2600");
159
     MIKRO_Cmd(node,"ls 1");
160
     MIKRO_Cmd(node,"hp 1");
161
     MIKRO_Cmd(node,"hf 1");
162
     break;
163
   case 4:                              // 4M Rotary
164
     MIKRO_Cmd(node,"k 1");
165
     MIKRO_Cmd(node,"ad 100");
166
     MIKRO_Cmd(node,"aa 1");
167
     MIKRO_Cmd(node,"fa 1");
168
     MIKRO_Cmd(node,"fd 3000");    // Set Max Dynamic Following Error (1000)
169
     MIKRO_Cmd(node,"sp 800");
170
     MIKRO_Cmd(node,"sr 1000");
171
     MIKRO_Cmd(node,"ac 100");
172
     MIKRO_Cmd(node,"dc 200");
173
     MIKRO_Cmd(node,"por 28000");
174
     MIKRO_Cmd(node,"i 600");
175
     MIKRO_Cmd(node,"ano 2600");
176
     MIKRO_Cmd(node,"ls 99");
177
     break;
178
   default:
179
     break;
180
  }
181
  MIKRO_Cmd(node,"rd 0");
182
  MIKRO_Cmd(node,"n 2");
183
  MIKRO_Cmd(node,"en");
184
  if (type != 0){
185
    MIKRO_Cmd(node,"eeboot 1");
186
    MIKRO_Cmd(node,"eepsav 1");
187
    Delay(0.1);
188
  }
189
  return 0;
190
}
191
 
192
int _VI_FUNC MIKRO_Reset (int node)
193
{
194
 
195
  MIKRO_Cmd(node,"di"); // disables the node
196
 
197
  Delay(COMDELAY);
198
  nout = sprintf (MIKRO_Send, "%1d rn\r", node); // resets the node
199
  ComWrt (MIKRO_Port, MIKRO_Send, nout);
200
 
201
  SetComTime (MIKRO_Port, 20);
202
  nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
203
  SetComTime (MIKRO_Port, COMWAIT);
204
  nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
205
//  if (nin!=0) nin--;
206
//  MIKRO_Receive[nin]=0;
207
  printf("%s\n",MIKRO_Receive);
208
  nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
209
  nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa);
210
//  if (nin!=0) nin--;
211
//  MIKRO_Receive[nin]=0;
212
  printf("%s\n",MIKRO_Receive);
213
  MIKRO_Init(node,0);
214
  return 0;
215
}
216
 
217
int _VI_FUNC MIKRO_ReferenceMove (int node)
218
{
219
  int fac=10;
220
  int n2,as;
221
 
222
  MIKRO_Cmd(node,"ab");
223
  MIKRO_Cmd(node,"en");
224
  MIKRO_Set(node,"ll",-1000000);
225
  MIKRO_Set(node,"ll",1000000);
226
 
227
  if (!(MIKRO_GetStat(node)&0x8000)){
228
    MIKRO_Set(node,"v", -100*fac);
229
    do {
230
      MIKRO_GetPosition(node,&n2);
231
      MIKRO_Get(node,"as",&as);  
232
      printf("Approaching N-limit node=%d  pos=%d speed=%d\n",node,n2,as);
233
    } while (MIKRO_GetStat(node)&0x1 );
234
    if (!(MIKRO_GetStat(node)&0x8000)){
235
      printf("N-limit not reached! Trying with half speed.\n");
236
      MIKRO_Set(node,"v", -50*fac);
237
      do {
238
        MIKRO_GetPosition(node,&n2);
239
        MIKRO_Get(node,"as",&as);  
240
        printf("Approaching N-limit node=%d  pos=%d speed=%d\n",node,n2,as);
241
      } while (MIKRO_GetStat(node)&0x1 );
242
      if (!(MIKRO_GetStat(node)&0x8000)){
243
        printf("N-limit not reached! Aborting ...\n");
244
        MIKRO_Cmd(node,"ab");
245
        return -1;
246
      }
247
    }
248
  }
249
  MIKRO_MoveFor(node,1000);
250
  MIKRO_Set(node,"v", -10*fac);
251
  do {
252
    MIKRO_GetPosition(node,&n2);
253
    MIKRO_Get(node,"as",&as);
254
    printf("Fine tuning 0: node=%d  pos=%d speed=%d\n",node,n2, as);
255
  } while (MIKRO_GetStat(node)&0x1);
256
  if (!(MIKRO_GetStat(node)&0x8000)){
257
    printf("N-limit not reached! Aborting ...\n");
258
    MIKRO_Cmd(node,"ab");
259
    return -1;
260
  }
261
 
262
  MIKRO_MoveFor(node,1000);
263
  MIKRO_Set(node,"ho",0);
264
  MIKRO_Set(node,"ll",-100);
265
  MIKRO_Set(node,"ll",500100);
266
  return 0;
267
}
268
 
269
int _VI_FUNC MIKRO_MoveFor (int node, int dist)
270
{
271
  MIKRO_Set(node,"lr", dist);
272
  MIKRO_Cmd(node,"mv");
273
  while (MIKRO_GetStat(node)&1) Delay(0.1);
274
  return 0;
275
}
276
 
277
int _VI_FUNC MIKRO_MoveTo (int node, int dest)
278
{
279
//  printf("-> MIKRO_MoveTo \n");
280
  MIKRO_Set(node,"la", dest);
281
  MIKRO_Cmd(node,"mv");
282
  while (MIKRO_GetStat(node)&1) Delay(0.1);
283
  return 0;
284
}
285
 
286
int _VI_FUNC MIKRO_GetPosition (int node, int pos[])
287
{
288
  MIKRO_Get(node,"pos",pos);
289
  return 0;
290
}
291
 
292
void _VI_FUNC MIKRO_Close (void)
293
{
294
CloseCom (MIKRO_Port);
295
}
296