#include "uSMC.h"
#ifdef uSMC_MAIN
//# include "uSMC_ui.h"
#endif /* uSMC_MAIN */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef _WINDOWS
# include "libusmc.h"
# include <getopt.h>
# define Delay(x) usleep((int)(x*1000000))
#else
# include "USMCDLL.H"
# include <utility.h>
# include <ansi_c.h>
/*
# define ERR(s, c) if(opterr) fprintf(stderr,"%s %c\n",s,c);
int opterr = 1;
int optind = 1;
int optopt;
char *optarg;
int getopt(int argc, char **argv, char *opts){
static int sp = 1;
int c;
char *cp;
if(sp == 1)
if(optind >= argc ||
argv[optind][0] != '-' || argv[optind][1] == '\0')
return(EOF);
else if(strcmp(argv[optind], "--") == NULL) {
optind++;
return(EOF);
}
optopt = c = argv[optind][sp];
if(c == ':' || (cp=strchr(opts, c)) == NULL) {
ERR(": illegal option -- ", c);
if(argv[optind][++sp] == '\0') {
optind++;
sp = 1;
}
return('?');
}
if(*++cp == ':') {
if(argv[optind][sp+1] != '\0')
optarg = &argv[optind++][sp+1];
else if(++optind >= argc) {
ERR(": option requires an argument -- ", c);
sp = 1;
return('?');
} else
optarg = argv[optind++];
sp = 1;
} else {
if(argv[optind][++sp] == '\0') {
sp = 1;
optind++;
}
optarg = NULL;
}
return(c);
}
*/
#endif /* _WINDOWS */
// Function that prints information about device state to console
void PrintDState(USMC_State *State) {
printf( "- Current Position in microsteps - %d\n", State
->CurPos
);
printf( "- Temperature - %.2f\xf8\x43\n", State
->Temp
);
printf( "- Step Divisor - %d\n", State
->SDivisor
);
printf( "- Loft State - %s\n", State
->Loft
?"Indefinite":"Fixed" );
printf( "- Power - %s\n", State
->Power
?(State
->FullPower
?"Full":"Half"):"Off" );
if(State->RUN)
printf( "- Step Motor is Running in %s Direction %s\n",
State->CW_CCW?"CCW":"CW", ((State->SDivisor==1) && State->FullSpeed)?"at Full Speed":"" );
else
printf( "- Step Motor is Not Running\n" );
printf( "- Device %s\n", State
->AReset
?"is After Reset":"Position Already Set" );
printf( "- Input Synchronization Logical Pin State - %s\n", State
->SyncIN
?"TRUE":"FALSE" );
printf( "- Output Synchronization Logical Pin State - %s\n", State
->SyncOUT
?"TRUE":"FALSE" );
printf( "- Rotary Transducer Logical Pin State - %s\n", State
->RotTr
?"TRUE":"FALSE" );
printf( "- Rotary Transducer Error Flag - %s\n", State
->RotTrErr
?"Error":"Clear" );
printf( "- Emergency Disable Button - %s\n", State
->EmReset
?"Pushed":"Unpushed" );
printf( "- Trailer 1 Press State - %s\n", State
->Trailer1
?"Pushed":"Unpushed" );
printf( "- Trailer 2 Press State - %s\n", State
->Trailer2
?"Pushed":"Unpushed" );
if( State->Voltage == 0.0f )
printf( "- Input Voltage - Low\n");
else
printf( "- Input Voltage - %.1fV\n", State
->Voltage
);
}
// Function that prints information about device start parameters to console
void PrintDStartParameters(int DPos, float Speed, const USMC_StartParameters *SP ) {
printf( "Destination position - %d\n", DPos
);
printf( "Speed - %.2ftacts/s\n", Speed
);
printf( "Steps Divisor - %d\n", SP
->SDivisor
);
if(SP->SDivisor == 1) {
printf( "Slow start/stop mode - %s\n", SP
->SlStart
?"Enabled":"Disabled" );
} else if(SP->LoftEn) {
printf( "Automatic backlash operation - Enabled\n" );
printf( "Automatic backlash operation direction - %s\n", SP
->DefDir
?"CCW":"CW" );
printf( "Force automatic backlash operation - %s\n", SP
->ForceLoft
?"TRUE":"FALSE" );
} else {
printf( "Automatic backlash operation - Disabled\n" );
}
if(SP->WSyncIN)
printf( "Controller will wait for input synchronization signal to start\n" );
else
printf( "Input synchronization signal ignored \n" );
printf( "Output synchronization counter will %sbe reset\n", SP
->SyncOUTR
?"":"not " );
}
// Function that prints information about device parameters to console
void PrintDParameters(USMC_Parameters *Parameters) {
printf( "The parameters are:\n" );
printf( "Full acceleration time - %.0f ms\n", (double) Parameters
->AccelT
);
printf( "Full deceleration time - %.0f ms\n", (double) Parameters
->DecelT
);
printf( "Power reduction timeout - %.0f ms\n", (double) Parameters
->PTimeout
);
printf( "Button speedup timeout 1 - %.0f ms\n", (double) Parameters
->BTimeout1
);
printf( "Button speed after timeout 1 - %.2f steps/s\n", (double) Parameters
->BTO1P
);
printf( "Button speedup timeout 2 - %.0f ms\n", (double) Parameters
->BTimeout2
);
printf( "Button speed after timeout 2 - %.2f steps/s\n", (double) Parameters
->BTO2P
);
printf( "Button speedup timeout 3 - %.0f ms\n", (double) Parameters
->BTimeout3
);
printf( "Button speed after timeout 3 - %.2f steps/s\n", (double) Parameters
->BTO3P
);
printf( "Button speedup timeout 4 - %.0f ms\n", (double) Parameters
->BTimeout4
);
printf( "Button speed after timeout 4 - %.2f steps/s\n", (double) Parameters
->BTO4P
);
printf( "Button reset timeout - %.0f ms\n", (double) Parameters
->BTimeoutR
);
printf( "Button reset operation speed - %.2f steps/s\n", (double) Parameters
->MinP
);
printf( "Backlash operation distance - %d steps\n", (int)Parameters
->MaxLoft
);
printf( "Revolution distance - %d steps\n", (int)Parameters
->RTDelta
);
printf( "Minimal revolution distance error - %d steps\n", (int)Parameters
->RTMinError
);
printf( "Power off temperature - %.2f\xf8\x43\n", (double)Parameters
->MaxTemp
);
printf( "Duration of the output synchronization pulse - ");
if(Parameters->SynOUTP == 0)
else
printf( "%.1f * [Tact Period]\n", Parameters
->SynOUTP
- 0.5);
printf( "Speed of the last phase of the backlash operation - ");
if(Parameters->LoftPeriod == 0.0f)
else
printf( "%.2f steps/s\n", (double)Parameters
->LoftPeriod
);
printf( "<Angular Encoder Step> Equals <Angular Step Motor Step>/<%.2f>\n", Parameters
->EncMult
);
}
// Function that prints information about device "mode" parameters to console
void PrintDMode(USMC_Mode *Mode) {
printf( "Mode parameters:\n" );
if(Mode->PMode) {
} else {
printf( "Enabled\nButton 1 TRUE state - %s\n", Mode
->Butt1T
?"+3/+5 V":"0 V(GND)" );
printf( "Button 2 TRUE state - %s\n", Mode
->Butt2T
?"+3/+5 V":"0 V(GND)" );
}
printf( "Current reduction regime - %s\n", Mode
->PReg
?"Used":"Not Used" );
if(Mode->ResetD)
printf( "Power - %s\n", Mode
->EMReset
?"Emerjency Off":"Off" );
else
if(Mode->Tr1En || Mode->Tr2En)
printf( "Trailers are - %s\n", Mode
->TrSwap
?"Swapped":"Direct" );
if(Mode->Tr1En)
printf( "Enabled\nTrailer 1 TRUE state - %s\n", Mode
->Tr1T
?"+3/+5 V":"0 V(GND)" );
else
if(Mode->Tr2En)
printf( "Enabled\nTrailer 2 TRUE state - %s\n", Mode
->Tr2T
?"+3/+5 V":"0 V(GND)" );
else
if(Mode->EncoderEn) {
printf( "Encoder - Enabled\n");
printf( "Encoder Position Counter is %s\n", Mode
->EncoderInv
?"Inverted":"Direct");
printf( "Rotary Transducer and Input Syncronisation are\n"
" Disabled Because of Encoder\n");
} else {
printf( "Encoder - Disabled\n");
printf( "Rotary Transducer - ");
if(Mode->RotTeEn) {
printf( "Enabled\nRotary Transducer TRUE state - %s\n", Mode
->RotTrT
?"+3/+5 V":"0 V(GND)" );
printf( "Rotary Transducer Operation - %s\n", Mode
->RotTrOp
?"Stop on error":"Check and ignore error" );
printf( "Reset Rotary Transducer Check Positions - %s\n", Mode
->ResetRT
?"Initiated":"No, why?");
} else {
}
printf("Synchronization input mode:\n");
if(Mode->SyncINOp)
printf("Step motor will move one time to the destination position\n");
else
printf("Step motor will move multiple times by [destination position]\n");
}
printf( "Output Syncronization - ");
if(Mode->SyncOUTEn) {
printf( "Enabled\nReset Output Synchronization Counter - %s\n", Mode
->SyncOUTR
?"Initiated":"No, why?" );
printf( "Number of steps after which synchronization output sygnal occures - %u\n", Mode
->SyncCount
);
} else {
}
printf("Synchronization Output is ");
if(Mode->SyncInvert)
else
}
// Function that prints Encoder state information
void PrintEncState(USMC_EncoderState *EnState, USMC_Parameters *up) {
/*
|Type |Name |Description
|--------|-----------|-------------------------------------------------------------------------
|Int |EncoderPos |Current position measured by encoder
|Int |ECurPos |Current position (in Encoder Steps) - Synchronized with request call
|--------|-----------|-------------------------------------------------------------------------
*/
printf( "The encoder state is:\n" );
printf( "- Current Position in microsteps - %.2f\n", EnState
->ECurPos
/up
->EncMult
);
printf( "- Encoder Position in microsteps - %.2f\n\n", EnState
->EncoderPos
/up
->EncMult
);
printf( "- Current Position in \"Half of Encoder Step\"s - %d\n", EnState
->ECurPos
);
printf( "- Encoder Position in \"Half of Encoder Step\"s - %d\n", EnState
->EncoderPos
);
}
// Function that prints last error information
void PrintError(void) {
char er[101];
USMC_GetLastErr(er,100);
er[100] = '\0';
}
////////////////////////////////////////////////////////////////////////
static int ierr;
static float Speed=15000.0f;
#define MAXNODES 4
static USMC_Devices Devices;
static USMC_StartParameters DStartPar[MAXNODES];
static USMC_Parameters DPar[MAXNODES];
static USMC_State DState[MAXNODES];
static USMC_EncoderState DEncState[MAXNODES];
static USMC_Mode DMode[MAXNODES];
#define ERRLEN 128
static char errstr[ERRLEN];
void uSMC_PrintDevices(void) {
/*
|Type |Name |Description
|--------|-----------|-------------------------------------------------------------------------
|DWORD |NOD |Number of devices connected to computer
|char ** |Serial |Array of pointers to 16–byte ASCII strings of length – NOD
|char ** |Version |Array of pointers to 4–byte ASCII strings of length – NOD
|--------|-----------|-------------------------------------------------------------------------
*/
int i;
for (i=0; i<Devices.NOD; i++) {
printf("Device - %d,\tSerial Number - %.16s,\tVersion - %.4s\n",i
+1,Devices.
Serial[i
],Devices.
Version[i
]);
}
}
int uSMC_SetParameters(int node, int stageType) {
/*
|Type |Name |Description
|--------|-----------|-------------------------------------------------------------------------
|float |AccelT |Acceleration time (in ms)
|float |DecelT |Deceleration time (in ms)
|float |PTimeout |Time (in ms) after which current will be reduced to 60% of normal
|float |BTimeout1 |Time (in ms) after which speed of step motor rotation will be equal to the one specified at
| | |BTO1P field in this structure
|float |BTimeout2 |Time (in ms) after which speed of step motor rotation will be equal to the one specified at
| | |BTO2P field in this structure
|float |BTimeout3 |Time (in ms) after which speed of step motor rotation will be equal to the one specified at
| | |BTO3P field in this structure
|float |BTimeout4 |Time (in ms) after which speed of step motor rotation will be equal to the one specified at
| | |BTO4P field in this structure
|float |BTimeoutR |Time (in ms) after which reset command will be performed (see 5.4.7 at page 53)
|float |BTimeoutD |This field is reserved for future use
|float |MinP |Speed (steps/sec) while performing reset operation
|float |BTO1P |Speed (steps/sec) after BTIMEOUT1 time has passed (see 5.4.8 at page 54)
|float |BTO2P |Speed (steps/sec) after BTIMEOUT2 time has passed (see 5.4.8 at page 54)
|float |BTO3P |Speed (steps/sec) after BTIMEOUT3 time has passed (see 5.4.8 at page 54)
|float |BTO4P |Speed (steps/sec) after BTIMEOUT4 time has passed (see 5.4.8 at page 54)
|WORD |MaxLoft |Value in full steps that will be used performing backlash operation
|DWORD |StartPos |Current Position saved to FLASH. Refer to test.cpp for implementing this functionality.
| | |Should be set to 0 for correct reloading of current position in SMCVieW program
|WORD |RTDelta |Revolution distance – number of full steps per one full revolution
|WORD |RTMinError |Number of full steps missed to raise the error flag
|float |MaxTemp |Maximum allowed temperature (centigrade degrees)
|BYTE |SynOUTP |Duration of the output synchronization pulse ( see 5.4.13 at page 58)
|float |LoftPeriod |Speed (steps/sec) of the last phase of the backlash operation
|float |EncMult |Encoder step multiplier. Should be <Encoder Steps per Revolution> / <SM Steps per Revolution>
| | |and should be integer multiplied by 0.25
|--------|-----------|-------------------------------------------------------------------------
*/
int saveToFlash;
int Dev;
saveToFlash=0;
Dev=node-1;
if (ierr=USMC_GetParameters(Dev,&DPar[Dev])) return ierr;
switch (stageType) {
case -1:
saveToFlash=1;
// DPar[Dev].StartPos = 0;
case 1:
// Linear stage
DPar[Dev].AccelT = 200.0f;
DPar[Dev].DecelT = 200.0f;
DPar[Dev].PTimeout = 1.0f;
DPar[Dev].BTimeout1 = 500.0f;
DPar[Dev].BTimeout2 = 500.0f;
DPar[Dev].BTimeout3 = 500.0f;
DPar[Dev].BTimeout4 = 500.0f;
DPar[Dev].BTimeoutR = 500.0f;
DPar[Dev].MinP = 60.0f;
DPar[Dev].BTO1P = 10.0f;
DPar[Dev].BTO2P = 20.0f;
DPar[Dev].BTO3P = 30.0f;
DPar[Dev].BTO4P = 60.0f;
DPar[Dev].MaxLoft = 32;
DPar[Dev].RTDelta = 200;
DPar[Dev].RTMinError = 15;
DPar[Dev].MaxTemp = 70.0f;
DPar[Dev].SynOUTP = 1;
DPar[Dev].LoftPeriod = 50.0f;
DPar[Dev].EncMult = 1.0f;
break;
case -2:
saveToFlash=1;
case 2:
// Rotation stage
DPar[Dev].MaxTemp = 70.0f;
DPar[Dev].AccelT = 200.0f;
DPar[Dev].DecelT = 200.0f;
DPar[Dev].BTimeout1 = 500.0f;
DPar[Dev].BTimeout2 = 500.0f;
DPar[Dev].BTimeout3 = 500.0f;
DPar[Dev].BTimeout4 = 500.0f;
DPar[Dev].BTO1P = 100.0f;
DPar[Dev].BTO2P = 200.0f;
DPar[Dev].BTO3P = 300.0f;
DPar[Dev].BTO4P = 600.0f;
DPar[Dev].MinP = 500.0f;
DPar[Dev].BTimeoutR = 500.0f;
DPar[Dev].LoftPeriod = 500.0f;
DPar[Dev].RTDelta = 200;
DPar[Dev].RTMinError = 15;
DPar[Dev].EncMult = 2.5f;
DPar[Dev].MaxLoft = 32;
DPar[Dev].PTimeout = 100.0f;
DPar[Dev].SynOUTP = 1;
break;
}
if (ierr=USMC_SetParameters(Dev,&DPar[Dev])) return ierr;
if (saveToFlash) {
if(ierr=USMC_SaveParametersToFlash(Dev)) return ierr;
PrintDParameters(&DPar[Dev]);
printf("\nThese Parameters were Saved to Flash");
}
return FALSE;
}
int uSMC_RevertStartPosition(int node) {
int Dev;
Dev=node-1;
if (ierr=USMC_GetParameters(Dev,&DPar[Dev])) return ierr;
DPar[Dev].StartPos = 0;
if (ierr=USMC_SetParameters(Dev,&DPar[Dev])) return ierr;
if(ierr=USMC_SaveParametersToFlash(Dev)) return ierr;
printf("\nStart Position is Reset to 0\n");
return FALSE;
}
int _VI_FUNC uSMC_PowerOn (int node) {
int Dev;
Dev=node-1;
if (ierr=USMC_GetMode(Dev,&DMode[Dev])) return ierr;
DMode[Dev].ResetD = FALSE;
if (ierr=USMC_SetMode(Dev,&DMode[Dev])) return ierr;
return FALSE;
}
int uSMC_PowerOffSave(int node,int saveToFlash) {
int Dev=node-1;
if (saveToFlash) {
if (ierr=USMC_GetParameters(Dev,&DPar[Dev])) return ierr;
}
if (ierr=USMC_GetMode(Dev,&DMode[Dev])) return ierr;
DMode[Dev].ResetD = TRUE;
if (ierr=USMC_SetMode(Dev,&DMode[Dev])) return ierr;
do {
Sleep(50);
if (ierr=USMC_GetState(Dev,&DState[Dev])) return ierr;
} while(DState[Dev].Power == TRUE);
if (saveToFlash) {
DPar[Dev].StartPos = DState[Dev].CurPos;
if (ierr=USMC_SetParameters(Dev,&DPar[Dev])) return ierr;
if (ierr=USMC_SaveParametersToFlash(Dev)) return ierr;
}
return FALSE;
}
int _VI_FUNC uSMC_PowerOff (int node) {
if (ierr=uSMC_PowerOffSave(node,0)) return ierr;
return FALSE;
}
int _VI_FUNC uSMC_Open (void) {
int i;
if (ierr=USMC_Init(&Devices)) return ierr;
uSMC_PrintDevices();
return FALSE;
}
int _VI_FUNC uSMC_FindSerial (char serial[])
{
int i;
for (i=0; i<Devices.NOD; i++)
if (!strncmp (Devices.
Serial[i
], serial
, 16)) return i
;
return -1;
}
int _VI_FUNC uSMC_Reset (int node) {
return FALSE;
}
int _VI_FUNC uSMC_Init (int node, int type) {
/*
|Type |Name |Masked|Saved|Description
|--------|-----------|------|-----|------------------------------------------------------------
|BOOL |PMode |– |YES |Turn off buttons (TRUE - buttons disabled)
|BOOL |PReg |– |YES |Current reduction regime (TRUE - regime is on)
|BOOL |ResetD |– |YES |Turn power off and make a whole step (TRUE - apply)
|BOOL |EMReset |– |– |Quick power off (see 5.4.6 at page 53)
|BOOL |Tr1T |– |YES |Limit switch 1 TRUE state (TRUE : +3/+5?; FALSE : 0?)
|BOOL |Tr2T |– |YES |Limit switch 2 TRUE state (TRUE : +3/+5?; FALSE : 0?)
|BOOL |RotTrT |– |YES |Rotary Transducer TRUE state (TRUE : +3/+5?; FALSE : 0?)
|BOOL |TrSwap |– |YES |If TRUE, Limit switches are treated to be swapped
|BOOL |Tr1En |– |YES |If TRUE Limit switch 1 Operation Enabled
|BOOL |Tr2En |– |YES |If TRUE Limit switch 2 Operation Enabled
|BOOL |RotTeEn |– |YES |If TRUE Rotary Transducer Operation Enabled
|BOOL |RotTrOp |– |YES |Rotary Transducer Operation Select (stop on error if TRUE)
|BOOL |Butt1T |– |YES |Button 1 TRUE state (TRUE : +3/+5?; FALSE : 0?)
|BOOL |Butt2T |– |YES |Button 2 TRUE state (TRUE : +3/+5?; FALSE : 0?)
|BOOL |ResetRT |YES |– |Reset Rotary Transducer Check Positions (need one full revolution
| | | | |before it can detect error)
|BOOL |SyncOUTEn |– |YES |If TRUE output synchronization enabled
|BOOL |SyncOUTR |YES |– |If TRUE output synchronization counter will be reset
|BOOL |SyncINOp |– |YES |Synchronization input mode:
| | | | |- TRUE - Step motor will move one time to the DestPos
| | | | |- FALSE - Step motor will move multiple times by DestPos microsteps as distance
|DWORD |SyncCount |– |YES |Number of steps after which synchronization output signal occurs
|BOOL |SyncInvert |– |YES |Set this bit to TRUE to invert output synchronization polarity
|BOOL |EncoderEn |– |YES |Enable Encoder on pins {SYNCIN,ROTTR} - disables Synchronization input and Rotary Transducer
|BOOL |EncoderInv |– |YES |Invert Encoder Counter Direction BOOL ResBEnc YES – Reset <EncoderPos> and <ECurPos> to 0
|BOOL |ResEnc |YES |– |Reset <ECurPos> to <EncoderPos>
|--------|-----------|-------------------------------------------------------------------------
Masked –> These Boolean values will be automatically cleared by USMC_GetMode (to FALSE)
*/
int Dev;
Dev=node-1;
// if (ierr=uSMC_PowerOff(node)) return ierr;
if (ierr=uSMC_SetParameters(node,type)) return ierr;
switch (type) {
case -1:
case 1:
if (ierr=USMC_GetMode(Dev,&DMode[Dev])) return ierr;
DMode[Dev].Tr1T = FALSE;
DMode[Dev].Tr2T = FALSE;
DMode[Dev].Tr1En = TRUE;
DMode[Dev].Tr2En = TRUE;
DMode[Dev].TrSwap = FALSE;
DMode[Dev].EncoderEn = FALSE;
if (ierr=USMC_SetMode(Dev,&DMode[Dev])) return ierr;
break;
}
if (ierr=uSMC_PowerOn(node)) return ierr;
return FALSE;
}
int _VI_FUNC uSMC_ReferenceMove (int node) {
int Dev;
float tmpSpeed;
Dev=node-1;
tmpSpeed=Speed;
if (ierr=USMC_GetMode(Dev,&DMode[Dev])) return ierr;
DMode[Dev].Tr1T = FALSE;
DMode[Dev].Tr2T = FALSE;
DMode[Dev].Tr1En = TRUE;
DMode[Dev].Tr2En = TRUE;
DMode[Dev].TrSwap = FALSE;
DMode[Dev].EncoderEn = FALSE;
if (ierr=USMC_SetMode(Dev,&DMode[Dev])) return ierr;
Speed=10000.0f;
if (ierr=USMC_SetCurrentPosition(Dev,0)) return ierr;
if (ierr=uSMC_MoveTo(node,-500000)) return ierr;
if (ierr=uSMC_MoveFor(node,5000)) return ierr;
Speed=500.0f;
if (ierr=uSMC_MoveTo(node,-500000)) return ierr;
Speed=tmpSpeed;
if (ierr=uSMC_MoveFor(node,5000)) return ierr;
if (ierr=USMC_SetCurrentPosition(Dev,0)) return ierr;
return FALSE;
}
int _VI_FUNC uSMC_MoveFor (int node, int dist) {
int CurPos;
if (ierr=uSMC_GetPosition(node,&CurPos)) return ierr;
if (ierr=uSMC_MoveTo(node,CurPos+dist)) return ierr;
return FALSE;
}
int _VI_FUNC uSMC_MoveTo (int node, int dest) {
/*
|Type |Name |Description
|--------|-----------|-------------------------------------------------------------------------
|BYTE |SDivisor |Step is divided by this factor (1,2,4,8)
|BOOL |DefDir |Direction for backlash operation (relative) (see 5.4.15 at page 60)
|BOOL |LoftEn |Enable automatic backlash operation (works if slow start/stop mode is off)
|BOOL |SlStart |If TRUE slow start/stop mode enabled
|BOOL |WSyncIN |If TRUE controller will wait for input synchronization signal to start
|BOOL |SyncOUTR |If TRUE output synchronization counter will be reset
|BOOL |ForceLoft |If TRUE and destination position is equal to the current position
| | |backlash operation will be performed
|--------|-----------|-------------------------------------------------------------------------
*/
int Dev;
time_t tcur,tprev;
Dev=node-1;
if (ierr=USMC_GetStartParameters(Dev,&DStartPar[Dev])) return ierr;
DStartPar[Dev].SDivisor=8;
DStartPar[Dev].SlStart=TRUE;
DStartPar[Dev].LoftEn=FALSE;
DStartPar[Dev].WSyncIN=FALSE;
if (ierr=USMC_Start(Dev,dest,&Speed,&DStartPar[Dev])) return ierr;
do {
Delay(0.01);
if (ierr=USMC_GetState(Dev,&DState[Dev])) return ierr;
if (tcur > tprev) {
printf("%d CurPos %d L%d R%d Rot%d %s %s\n",node
,
DState[Dev].CurPos,DState[Dev].Trailer1,DState[Dev].Trailer2, DState[Dev].RotTr,
DState[Dev].RUN?"Run":"Stopped",DState[Dev].Power?"On":"Off" );
tprev= tcur;
}
} while (DState[Dev].RUN);
return FALSE;
}
int _VI_FUNC uSMC_GetPosition (int node, int *pos) {
/*
|Type |Name |Description
|--------|-----------|-------------------------------------------------------------------------
|int |CurPos
|float |Temp |Current temperature of the power driver
|BYTE |SDivisor |Step is divided by this factor
|BOOL |Loft |Indicates backlash status
|BOOL |FullPower |Full power if TRUE
|BOOL |CW_CCW |Current direction of rotation (relatively to some direction – dependent on
| | |step motor circuits connection and on its construction)
|BOOL |Power |If TRUE then Step Motor power is ON
|BOOL |FullSpeed |If TRUE then full speed. Valid in "Slow Start" mode only
|BOOL |AReset |TRUE After Device reset, FALSE after "Set Position"
|BOOL |RUN |TRUE if step motor is rotating
|BOOL |SyncIN |Logical state directly from input synchronization PIN (pulses treated as positive)
|BOOL |SyncOUT |Logical state directly from output synchronization PIN (pulses are positive)
|BOOL |RotTr |Indicates current rotary transducer logical press state
|BOOL |RotTrErr |Indicates rotary transducer error flag (reset by USMC_SetMode function with ResetRT bit – TRUE)
|BOOL |EmReset |Indicates state of emergency disable button (TRUE – Step motor power off)
|BOOL |Trailer1 |Indicates Limit switch 1 logical press state
|BOOL |Trailer2 |Indicates Limit switch 2 logical press state
|float |Voltage |Power supply voltage (Volts)
|--------|-----------|-------------------------------------------------------------------------
*/
int Dev;
Dev=node-1;
if (ierr=USMC_GetState(Dev,&DState[Dev])) return ierr;
*pos=DState[Dev].CurPos;
return FALSE;
}
void _VI_FUNC uSMC_Close (void) {
USMC_Close();
}
//******************************
#ifdef uSMC_MAIN
#define uSMC_SERIAL_X "0000000000004925"
#define uSMC_SERIAL_Y "0000000000006030"
#define uSMC_SERIAL_Z "0000000000002894"
# ifdef _WINDOWS
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
const char serials[3][16]={uSMC_SERIAL_X,uSMC_SERIAL_Y,uSMC_SERIAL_Z};
int i;
int DestPos[3],CurPos[3];
int nodes[3];
// float Speed=2000.0f;
if (InitCVIRTE (hInstance, 0, 0) == 0) return -1; /* out of memory */
uSMC_Open();
for (i=0;i<3;i++) {
nodes[i]=uSMC_FindSerial(serials[i])+1;
uSMC_Init(nodes[i],1);
uSMC_GetPosition(nodes[i],&CurPos[i]);
}
printf("nodes x,y,z: %2d, %2d, %2d\n",nodes
[0],nodes
[1],nodes
[2]);
printf("Current position: %2d, %2d, %2d\n",CurPos
[0],CurPos
[1],CurPos
[2]);
// uSMC_ReferenceMove(node);
DestPos[0]=32000;
DestPos[1]=125000;
DestPos[2]=300000;
for (i=0;i<3;i++) {
uSMC_MoveTo(nodes[i],DestPos[i]);
uSMC_GetPosition(nodes[i],&CurPos[i]);
}
printf("Current position: %2d, %2d, %2d\n",CurPos
[0],CurPos
[1],CurPos
[2]);
for (i=0;i<3;i++) uSMC_PowerOff(nodes[i]);
uSMC_Close();
return 0;
}
# else
int main (int argc, char **argv) {
int i,j,k;
int node=0,opt,value=0;
int EOldPos=-1;
if ( USMC_Init
( &devices
) ) abort();
while ((opt = getopt(argc, argv, "i:av:f:l:udn:m:s:v:g:h:r:p:")) != -1) {
switch (opt) {
case 'i':
usmc_Init
(node
, atoi(optarg
));
break;
case 'a':
printdevices(devices);
for (i=0; i<devices.NOD; i++) {
USMC_GetState(i,&DState[i]);
printf("%d CurPos %d L%d R%d %s %s\t",i
,
DState[i].CurPos,DState[i].Trailer1,DState[i].Trailer2,
DState[i].RUN?"Run":"Stopped",DState[i].Power?"On":"Off" );
USMC_GetParameters(i,&DPar[i]);
USMC_GetEncoderState(i,&DEncState[i]);
printf("node %d ECurPos 0x%0x %f EncoderPos =0x%04x %f\n",i
,
DEncState[i].ECurPos, (((DEncState[i].ECurPos)>>5)&0x8FFFFF)/DPar[i].EncMult,
DEncState[i].EncoderPos,((DEncState[i].EncoderPos >> 5)&0x8FFFFF)/DPar[i].EncMult);
}
break;
case 'l':
for (i=0; i<5; i++) {
int xpos=i*1000+10000;
usmc_MoveTo (1, xpos);
for (j=0; j<5; j++) {
int ypos=j*1000+10000;
usmc_MoveTo (2, ypos);
for (k=0; k<50; k++) {
int zpos=k*1000+10000;
usmc_MoveTo (3, zpos);
printf("x=%d y=%d z=%d\n",xpos
,ypos
,zpos
);
}
}
}
break;
case 'n':
break;
case 's':
usmc_speed
= atoi(optarg
);
break;
case 'p':
usmc_PowerOnOff
(node
,atoi(optarg
));
break;
case 'm':
usmc_MoveTo
(node
, atoi(optarg
));
printf("usmc_MoveTo node=%d pos=%d \n",node
,atoi(optarg
));
break;
case 'v':
break;
/*
case 'f':
MIKRO_Set (node,optarg,value);
printf("MIKRO_Set node %d cmd=%s val=%d\n",node,optarg, value);
break;
case 'g':
MIKRO_Get (node,optarg,&i);
printf("MIKRO_Get node %d cmd=%s val=%d\n",node,optarg, i);
break;
*/
case 'r':
printf("usmc_Reset node=%d mode=%d\n",node
, atoi(optarg
));
usmc_Reset
(node
, atoi(optarg
));
break;
case 'h':
printf("usmc_ReferenceMove node=%d mode=%d\n",node
, atoi(optarg
));
usmc_ReferenceMove
(node
, atoi(optarg
));
break;
case 'u':
usmc_RelMove(node, 1000);
break;
case 'd':
usmc_RelMove(node, -1000);
break;
default: /* '?' */
help();
break;
}
}
if (argc==1) help();
USMC_Close ();
return 0;
}
# endif /* _WINDOWS */
#endif /* _uSMC_MAIN */