#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include "sim.h"#include "extintf.h"#include "rcs_prnt.hh"#include "inifile.h"#include "amplifier.h"#include "dcmotor2.h"#include "encoder.h"#include "simmot_n.h"Include dependency graph for simmot.c:

Go to the source code of this file.
Defines | |
| #define | NAMELEN 8 |
Functions | |
| char | __attribute__ ((unused)) ident[]="$Id |
| int | simMotQuit () |
| int | simDacNum () |
| int | simDacWrite (int dac, double volts) |
| int | simDacWriteAll (int max, double *volts) |
| unsigned int | simEncoderIndexModel (void) |
| int | simEncoderSetIndexModel (unsigned int model) |
| int | simEncoderNum () |
| int | simEncoderRead (int axis, double *counts) |
| int | simEncoderReadAll (int max, double *counts) |
| int | simEncoderResetIndex (int encoder) |
| int | simEncoderReadLatch (int encoder, int *flag) |
| int | simEncoderReadLevel (int encoder, int *flag) |
| int | simMaxLimitSwitchRead (int axis, int *flag) |
| int | simMinLimitSwitchRead (int axis, int *flag) |
| int | simHomeSwitchRead (int axis, int *flag) |
| int | simAmpEnable (int axis, int enable) |
| int | simAmpFault (int axis, int *fault) |
Variables | |
| int | silly_count = 0 |
|
|
|
|
|
Definition at line 69 of file simmot.c. 00069 : simmot.c,v 1.11 2001/12/01 21:24:29 paul_c Exp $";
00070
00071 #define NAMELEN 8 /* length of stat file names */
00072
00073 #include "simmot_n.h"
00074
00075 #if defined(rtlinux) || defined(rtai)
00076 #include "rtlnml.h"
00077
00078 rtlnml_t nml_sim_command_channel = NULL;
00079 rtlnml_t nml_sim_status_channel = NULL;
00080
00081 #endif
00082
00083 static AMPLIFIER_STRUCT amplifier[SIM_MAX_AXIS];
00084 static double ampOutput[SIM_MAX_AXIS];
00085 static DC_MOTOR_STRUCT dcmotor[SIM_MAX_AXIS];
00086 static ENCODER_STRUCT encoder[SIM_MAX_AXIS];
00087
00088 #if defined(rtlinux) || defined(rtai)
00089 static struct simmot_status_struct stat;
00090 #endif
00091
00092
00093 /*
00094 simInit takes INI file, then composes section strings as:
00095
00096 AXIS_<0..SIM_MAX_AXIS-1>
00097 */
00098 int simMotInit(const char * filename)
00099 {
00100 int t;
00101 #if !defined(rtlinux) && !defined(rtai)
00102 char sectionString[INIFILE_MAX_LINELEN];
00103 #endif
00104 int retval = 0;
00105 #if defined(rtlinux) || defined(rtai)
00106 struct simmot_command_struct *cmd;
00107 #endif
00108
00109 #if defined(rtlinux) || defined(rtai)
00110 if (NULL == nml_sim_command_channel) {
00111 rtlnml_init();
00112 #ifdef rtlinux
00113 nml_sim_command_channel = rtlnml_open("simmot_cmd","simmot","emc.nml",4096,1);
00114 #else
00115 nml_sim_command_channel = rtainml_open("simmot_cmd","simmot","emc.nml",4096, 1,1014);
00116 #endif
00117 if (NULL == nml_sim_command_channel) {
00118 return -1;
00119 }
00120 }
00121
00122 if (NULL == nml_sim_status_channel) {
00123 #ifdef rtlinux
00124 nml_sim_status_channel = rtlnml_open("simmot_stat","simmot","emc.nml",4096,1);
00125 #else
00126 nml_sim_status_channel = rtainml_open("simmot_stat","simmot","emc.nml",4096, 1, 1015);
00127 #endif
00128 if (NULL == nml_sim_status_channel) {
00129 return -1;
00130 }
00131 }
00132
00133 switch(rtlnml_read(nml_sim_command_channel)) {
00134 case 0:
00135 /* FIXME this function needs to be polled */
00136 break;
00137
00138 case SIMMOT_COMMAND_TYPE:
00139 cmd = (struct simmot_command_struct *) rtlnml_get_local_pointer(nml_sim_command_channel);
00140 for (t = 0; t < SIM_MAX_AXIS; t++) {
00141 stat.amplifier[t] = amplifier[t] = cmd->amplifier[t];
00142 stat.dcmotor[t] = dcmotor[t] = cmd->dcmotor[t];
00143 stat.encoder[t] = encoder[t] = cmd->encoder[t];
00144 }
00145 stat.initialized = 1;
00146 stat.cmd_count++;
00147 rtlnml_write(nml_sim_status_channel, &stat,SIMMOT_STATUS_TYPE,sizeof(stat));
00148 break;
00149
00150 case -1:
00151 /* Error from rtlnml_read() */
00152 return -1;
00153
00154 default:
00155 /* THIS should never happen */
00156 break;
00157 }
00158
00159 #else
00160
00161 for (t = 0; t < SIM_MAX_AXIS; t++) {
00162 #ifndef UNDER_CE
00163 sprintf(sectionString, "AXIS_%d", t);
00164 #else
00165 strcpy(sectionString,"AXIS_");
00166 _itoa(t,sectionString+5,10);
00167 #endif
00168
00169 if (0 != amplifierIniLoad(&lifier[t], filename, sectionString)) {
00170 retval = -1;
00171 }
00172 ampOutput[t] = 0.0;
00173
00174 if (0 != dcmotorIniLoad(&dcmotor[t], filename, sectionString)) {
00175 retval = -1;
00176 }
00177
00178 if (0 != encoderIniLoad(&encoder[t], filename, sectionString)) {
00179 retval = -1;
00180 }
00181 }
00182 #endif
00183
00184 return retval;
00185 }
|
|
||||||||||||
|
Definition at line 484 of file simmot.c. Referenced by extAmpEnable().
00485 {
00486 if (axis < 0 ||
00487 axis >= SIM_MAX_AXIS) {
00488 return -1;
00489 }
00490
00491 amplifierEnable(&lifier[axis]);
00492
00493 return 0;
00494 }
|
|
||||||||||||
|
Definition at line 496 of file simmot.c. Referenced by extAmpFault().
00497 {
00498 if (axis < 0 ||
00499 axis >= SIM_MAX_AXIS) {
00500 return -1;
00501 }
00502
00503 *fault = amplifierIsTripped(&lifier[axis]);
00504
00505 return 0;
00506 }
|
|
|
Definition at line 205 of file simmot.c. Referenced by extDacNum().
00206 {
00207 return SIM_MAX_AXIS;
00208 }
|
|
||||||||||||
|
Definition at line 215 of file simmot.c. Referenced by extDacWrite(), and simDacWriteAll().
00216 {
00217 ampOutput[dac] = amplifierRunCycle(&lifier[dac], volts);
00218
00219 return 0;
00220 }
|
|
||||||||||||
|
Definition at line 222 of file simmot.c. Referenced by extDacWriteAll().
00223 {
00224 int t;
00225
00226 if (max > SIM_MAX_AXIS) {
00227 return -1;
00228 }
00229
00230 for (t = 0; t < max; t++) {
00231 if (-1 == simDacWrite(t, volts[t])) {
00232 return -1;
00233 }
00234 }
00235
00236 return 0;
00237 }
|
|
|
Definition at line 239 of file simmot.c. 00240 {
00241 return EXT_ENCODER_INDEX_MODEL_MANUAL;
00242 }
|
|
|
Definition at line 253 of file simmot.c. Referenced by extEncoderNum().
00254 {
00255 return SIM_MAX_AXIS;
00256 }
|
|
||||||||||||
|
Definition at line 262 of file simmot.c. Referenced by extEncoderRead(), and simEncoderReadAll().
00263 {
00264 double motorPos;
00265 int iCounts;
00266
00267 motorPos = dcmotorRunCycle(&dcmotor[axis], ampOutput[axis]);
00268 iCounts = encoderGetCounts(&encoder[axis], motorPos);
00269
00270 *counts = (double) iCounts;
00271
00272 simPos[axis] = *counts;
00273
00274 return 0;
00275 }
|
|
||||||||||||
|
Definition at line 277 of file simmot.c. Referenced by extEncoderReadAll().
00278 {
00279 int t;
00280
00281 if (max > SIM_MAX_AXIS) {
00282 return -1;
00283 }
00284
00285 for (t = 0; t < max; t++) {
00286 if (-1 == simEncoderRead(t, &counts[t])) {
00287 return -1;
00288 }
00289 }
00290
00291 #if defined(rtlinux) || defined(rtai)
00292 if (NULL != nml_sim_status_channel) {
00293 for (t = 0; t < SIM_MAX_AXIS; t++) {
00294 stat.amplifier[t] = amplifier[t];
00295 stat.dcmotor[t] = dcmotor[t];
00296 stat.encoder[t] = encoder[t];
00297 stat.ampOutput[t] = ampOutput[t];
00298 }
00299 rtlnml_write(nml_sim_status_channel, &stat,SIMMOT_STATUS_TYPE,sizeof(stat));
00300 }
00301 #endif
00302 return 0;
00303 }
|
|
||||||||||||
|
Definition at line 310 of file simmot.c. Referenced by extEncoderReadLatch().
00311 {
00312 #ifdef USE_STAT_FILES
00313 struct stat buf;
00314 char homeFile[NAMELEN];
00315 #endif
00316
00317 if (encoder < 0 ||
00318 encoder >= SIM_MAX_AXIS) {
00319 return -1;
00320 }
00321
00322 #ifdef USE_STAT_FILES
00323 /* to test home flag logic, this code tests for the existence
00324 of files "home<n>", for axis n.
00325 During controller debug, touch these files to create them
00326 and the controller should see a home flag. */
00327
00328 #ifndef UNDER_CE
00329 sprintf(homeFile, "home%d", encoder);
00330 #else
00331 strcpy(homeFile,"home");
00332 _itoa(encoder, homeFile+4,10);
00333 #endif
00334
00335 if (0 == stat(homeFile, &buf)) {
00336 /* positive limit file exists */
00337 *flag = 1;
00338 }
00339 else {
00340 *flag = 0;
00341 }
00342
00343 #else
00344 *flag = 1; /* always show latch so homing will work */
00345
00346 #endif
00347
00348 return 0;
00349 }
|
|
||||||||||||
|
Definition at line 351 of file simmot.c. Referenced by extEncoderReadLevel().
00352 {
00353 *flag = 0;
00354
00355 return 0;
00356 }
|
|
|
Definition at line 305 of file simmot.c. Referenced by extEncoderResetIndex().
00306 {
00307 return 0;
00308 }
|
|
|
Definition at line 244 of file simmot.c. Referenced by extEncoderSetIndexModel().
00245 {
00246 if (model != EXT_ENCODER_INDEX_MODEL_MANUAL) {
00247 return -1;
00248 }
00249
00250 return 0;
00251 }
|
|
||||||||||||
|
Definition at line 443 of file simmot.c. Referenced by extHomeSwitchRead().
00444 {
00445 #ifdef USE_STAT_FILES
00446 struct stat buf;
00447 char homeFile[NAMELEN];
00448 #endif
00449
00450 if (axis < 0 ||
00451 axis >= SIM_MAX_AXIS) {
00452 return -1;
00453 }
00454
00455 #ifdef USE_STAT_FILES
00456 /* to test home switch logic, this code tests for the existence
00457 of file "hs<n>" for home switch on axis n.
00458 During controller debug, touch these files to create them
00459 and the controller should see a home. */
00460
00461 #ifndef UNDER_CE
00462 sprintf(homeFile, "hs%d", axis);
00463 #else
00464 strcpy(homeFile,"hs");
00465 _itoa(axis, homeFile+2,10);
00466 #endif
00467
00468 if (0 == stat(homeFile, &buf)) {
00469 /* home switch file exists */
00470 *flag = 1;
00471 }
00472 else {
00473 *flag = 0;
00474 }
00475
00476 #else
00477 *flag = ((silly_count++)%100)>50; /* always show switch on so homing will work */
00478
00479 #endif
00480
00481 return 0;
00482 }
|
|
||||||||||||
|
Definition at line 358 of file simmot.c. Referenced by extMaxLimitSwitchRead().
00359 {
00360 #ifdef USE_STAT_FILES
00361 struct stat buf;
00362 char maxFile[NAMELEN];
00363 #endif
00364
00365 if (axis < 0 ||
00366 axis >= SIM_MAX_AXIS) {
00367 return -1;
00368 }
00369
00370 #ifdef USE_STAT_FILES
00371 /* to test limit switch logic, this code tests for the existence
00372 of files "lim<n>p" for max limits on axis n.
00373 During controller debug, touch these files to create them
00374 and the controller should see a limit. */
00375 #ifndef UNDER_CE
00376 sprintf(maxFile, "lim%dp", axis);
00377 #else
00378 strcpy(maxFile,"lim");
00379 _itoa(axis, maxFile+3,10);
00380 strcat(maxFile,"p");
00381 #endif
00382
00383 if (0 == stat(maxFile, &buf)) {
00384 /* maximum limit file exists */
00385 *flag = 1;
00386 }
00387 else {
00388 *flag = 0;
00389 }
00390
00391 #else
00392 *flag = 0;
00393
00394 #endif
00395
00396 return 0;
00397 }
|
|
||||||||||||
|
Definition at line 399 of file simmot.c. Referenced by extMinLimitSwitchRead().
00400 {
00401 #ifdef USE_STAT_FILES
00402 struct stat buf;
00403 char minFile[NAMELEN];
00404 #endif
00405
00406 if (axis < 0 ||
00407 axis >= SIM_MAX_AXIS) {
00408 return -1;
00409 }
00410
00411 #ifdef USE_STAT_FILES
00412 /* to test limit switch logic, this code tests for the existence
00413 of files "lim<n>n" for min limits on axis n.
00414 During controller debug, touch these files to create them
00415 and the controller should see a limit. */
00416
00417 #ifndef UNDER_CE
00418 sprintf(minFile, "lim%dn", axis);
00419 #else
00420 strcpy(minFile,"lim");
00421 _itoa(axis, minFile+3,10);
00422 strcat(minFile,"n");
00423 #endif
00424
00425 if (0 == stat(minFile, &buf)) {
00426 /* minimum limit file exists */
00427 *flag = 1;
00428 }
00429 else {
00430 *flag = 0;
00431 }
00432
00433 #else
00434 *flag = 0;
00435
00436 #endif
00437
00438 return 0;
00439 }
|
|
|
Definition at line 187 of file simmot.c. Referenced by extMotQuit().
00188 {
00189 #if defined(rtlinux) || defined(rtai)
00190
00191 if (NULL != nml_sim_command_channel) {
00192 rtlnml_close(nml_sim_command_channel,"sim_cmd");
00193 }
00194
00195 if (NULL != nml_sim_status_channel) {
00196 rtlnml_close(nml_sim_status_channel,"sim_stat");
00197 }
00198
00199 rtlnml_exit();
00200 #endif
00201
00202 return 0;
00203 }
|
|
|
|
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001