Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
284 | f9daq | 1 | unit ST_function; |
2 | |||
3 | interface |
||
4 | uses Windows, SysUtils{, Dialogs}; |
||
5 | |||
6 | const |
||
7 | ErrNotLoadDLL=32768; |
||
8 | type |
||
9 | |||
10 | TUSMC_Devices = packed record |
||
11 | NOD: DWORD; |
||
12 | Serial: Pointer; //array of PChar; |
||
13 | Version: Pointer; //array of PChar; |
||
14 | end; {USMC_Devices} |
||
15 | |||
16 | TUSMC_Parameters =record |
||
17 | AccelT : Single; // 'Acceleration time (in ms) |
||
18 | DecelT : Single; // 'Deceleration time (in ms) |
||
19 | PTimeout : Single; //'Time (in ms) after which current will be reduced to 60% of normal |
||
20 | BTimeout1 : Single; //'Time (in ms) after which speed of step motor rotation will be equal to the one specified at |
||
21 | // 'BTO1P field (see below). (This parameter is used when controlling step motor using buttons) |
||
22 | BTimeout2 : Single; //' |
||
23 | BTimeout3 : Single; // ' |
||
24 | BTimeout4 : Single; // ' |
||
25 | BTimeoutR : Single; // 'Time (in ms) after which reset command will be performed |
||
26 | BTimeoutD : Single; // 'This field is reserved for future use |
||
27 | MinP : Single ; // 'Speed (steps/sec) while performing reset operation. (This parameter is used when controlling |
||
28 | // 'step motor using buttons) |
||
29 | BTO1P : Single; // 'Speed (steps/sec) after BTIMEOUT 1 time have p:sed. (This parameter is used when controlling |
||
30 | // 'step motor using buttons) |
||
31 | BTO2P : Single; // ' |
||
32 | BTO3P : Single ; // ' |
||
33 | BTO4P : Single ; // ' |
||
34 | MaxLoft : WORD; // 'Value in full steps that will be used performing backl:h operation |
||
35 | StartPos : DWORD; // 'This field is reserved for future use |
||
36 | RTDelta : WORD; // 'Revolution distance – number of full steps per one full revolution |
||
37 | RTMinError : WORD; // 'Number of full steps missed to raise the error flag |
||
38 | MaxTemp : Single; // 'Maximum allowed temperature (Celsius) |
||
39 | SynOUTP : Byte; // 'Duration of the output synchronization pulse |
||
40 | LoftPeriod : Single; // 'Speed of the last phase of the backlash operation. |
||
41 | EncMult: Single; // Encoder step multiplier. Should be <Encoder Steps per Revolution> |
||
42 | // / <SM Steps per Revolution> and should be integer multiplied by 0.25 |
||
43 | Reserved: array [1..16] of Byte; // <Unused> File padding |
||
44 | end; {USMC_Parameters} |
||
45 | |||
46 | TUSMC_StartParameters = record |
||
47 | SDivisor: byte; //'Step is divided by this factor (1,2,4,8) |
||
48 | DefDir: LongBool; // 'Direction for backlash operation (relative) |
||
49 | LoftEn: LongBool; // 'Enable automatic backlash operation (works if slow start/stop mode is off) |
||
50 | SlStart: LongBool; // 'If TRUE slow start/stop mode enabled. |
||
51 | WSyncIN: LongBool; // 'If TRUE controller will wait for input synchronization signal to start |
||
52 | SyncOUTR: LongBool; // 'If TRUE output synchronization counter will be reset |
||
53 | ForceLoft: LongBool; // 'If TRUE and destination position is equal to the current position backlash operation will be performed. |
||
54 | Reserved: array [1..4] of Byte; // <Unused> File padding |
||
55 | end; {USMC_StartParameters} |
||
56 | |||
57 | TUSMC_Mode = record |
||
58 | PMode : LongBool; // 'Turn off buttons (TRUE - buttons disabled) |
||
59 | PReg : LongBool; // 'Current reduction regime (TRUE - regime is on) |
||
60 | ResetD : LongBool; // 'Turn power off and make a whole step (TRUE - apply) |
||
61 | EmReset : LongBool; // 'Quick power off |
||
62 | Tr1T : LongBool; // 'Trailer 1 TRUE state (TRUE : +3/+5?; FALSE : 0?) |
||
63 | Tr2T : LongBool; // 'Trailer 2 TRUE state (TRUE : +3/+5?; FALSE : 0?) |
||
64 | RotTrT : LongBool; // 'Rotary Transducer TRUE state (TRUE : +3/+5?; FALSE : 0?) |
||
65 | TrSwap : LongBool; // 'If TRUE, Trailers are treated to be swapped |
||
66 | Tr1En : LongBool; // 'If TRUE Trailer 1 Operation Enabled |
||
67 | Tr2En : LongBool; // 'If TRUE Trailer 2 Operation Enabled |
||
68 | RotTeEn : LongBool; // 'If TRUE Rotary Transducer Operation Enabled |
||
69 | RotTrOp : LongBool; // 'Rotary Transducer Operation Select (stop on error for TRUE) |
||
70 | Butt1T : LongBool; // 'Button 1 TRUE state (TRUE : +3/+5?; FALSE : 0?) |
||
71 | Butt2T : LongBool; // 'Button 2 TRUE state (TRUE : +3/+5?; FALSE : 0?) |
||
72 | ResetRT : LongBool; // 'Reset Rotary Transducer Check Positions (need one full revolution before it can detect error) |
||
73 | SyncOUTEn : LongBool; // 'If TRUE output syncronization enabled |
||
74 | SyncOUTR : LongBool; // 'If TRUE output synchronization counter will be reset |
||
75 | SyncINOp : LongBool; // 'Synchronization input mode: |
||
76 | //'True - Step motor will move one time to the destination position |
||
77 | //'False - Step motor will move multiple times by steps equal to the value destination position |
||
78 | SyncCount : DWORD; // 'Number of steps after which synchronization output sygnal occures |
||
79 | SyncInvert : LongBool; // 'Set to TRUE to invert output synchronization signal |
||
80 | EncoderEn : LongBool; // Enable Encoder on pins {SYNCIN,ROTTR} - disables Synchronization input and Rotary Transducer |
||
81 | EncoderInv : LongBool; // Invert Encoder Counter Direction |
||
82 | ResBEnc : LongBool; // Reset <EncoderPos> and <ECurPos> to 0 |
||
83 | ResEnc : LongBool; // Reset <ECurPos> to <EncoderPos> |
||
84 | Reserved: array [1..8] of Byte; // <Unused> File padding |
||
85 | end; {USMC_Mode} |
||
86 | |||
87 | TUSMC_State = record |
||
88 | CurPos: integer; // 'Current position (in microsteps) |
||
89 | Temp: single; // 'Current temperature of the driver |
||
90 | SDivisor: byte; // 'Step is divided by this factor |
||
91 | Loft: LongBool; // 'Indicates backlash status |
||
92 | FullPower: LongBool; // 'If TRUE then full power. |
||
93 | CW_CCW: LongBool; // 'Current direction. Relatively! |
||
94 | Power: LongBool; // 'If TRUE then Step Motor is ON. |
||
95 | FullSpeed: LongBool; // 'If TRUE then full speed. Valid in "Slow Start" mode only. |
||
96 | AReset: LongBool; // 'TRUE After Device reset, FALSE after "Set Position". |
||
97 | RUN: LongBool; // 'Indicates if step motor is rotating |
||
98 | SyncIN: LongBool; // 'Logical state directly from input synchronization PIN |
||
99 | SyncOUT: LongBool; // 'Logical state directly from output synchronization PIN |
||
100 | RotTr: LongBool; // 'Indicates current rotary transducer press state |
||
101 | RotTrErr: LongBool; // 'Indicates rotary transducer error flag |
||
102 | EmReset: LongBool; // 'Indicates state of emergency disable button (local control) |
||
103 | Trailer1: LongBool; // 'Indicates trailer 1 logical state. |
||
104 | Trailer2: LongBool; // 'Indicates trailer 2 logical state. |
||
105 | Voltage: Single; // 'Input power source voltage (6-39V) -=24 version 0nly=- |
||
106 | Reserved: array [1..8] of Byte; // <Unused> File padding |
||
107 | end; {USMC_State} |
||
108 | |||
109 | TUSMC_EncoderState = record |
||
110 | EncoderPos : integer; // Current position measured by encoder |
||
111 | ECurPos : integer; // Current position (in Encoder Steps) - Synchronized with request call |
||
112 | Reserved: array [1..8] of Byte; // <Unused> File padding |
||
113 | end; {USMC_EncoderState} |
||
114 | |||
115 | D_USMC_Init = function (out USMC_Devices: TUSMC_Devices) : Longword; cdecl; |
||
116 | D_USMC_GetState = function (Device: Longword; // IN - Device number |
||
117 | out Str: TUSMC_State // OUT - Structure representing divice state |
||
118 | ) : Longword ; cdecl; |
||
119 | D_USMC_SaveParametersToFlash = function (Device: Longword // IN - Device number |
||
120 | ) : Longword ; cdecl; |
||
121 | D_USMC_GetMode = function ( Device: Longword; // IN - Device number |
||
122 | out Str: TUSMC_Mode // OUT - Structure representing some of divice parameters |
||
123 | ): Longword ; cdecl; |
||
124 | D_USMC_SetMode= function ( Device: Longword; // IN - Device number |
||
125 | var Str: TUSMC_Mode // IN/OUT Structure representing some of divice parameters |
||
126 | ): Longword ; cdecl; |
||
127 | D_USMC_GetParameters = function ( Device: Longword; // IN - Device number |
||
128 | out Str: TUSMC_Parameters // OUT - Structure representing some of divice parameters |
||
129 | ) : Longword ; cdecl; |
||
130 | D_USMC_SetParameters = function ( Device: Longword; // IN - Device number |
||
131 | var Str: TUSMC_Parameters // IN/OUT Structure representing some of divice parameters |
||
132 | ): Longword ; cdecl; |
||
133 | D_USMC_GetStartParameters = function ( Device: Longword; // IN - Device number |
||
134 | out Str: TUSMC_StartParameters // OUT - Structure representing start function parameters |
||
135 | ) : Longword ; cdecl; |
||
136 | D_USMC_Start = function ( Device: Longword; // IN - Device number |
||
137 | DestPos: integer; // IN - Destination position |
||
138 | var Speed: single; // IN/OUT - Speed of rotation |
||
139 | out Str: TUSMC_StartParameters // IN/OUT - Structure representing start function parameters |
||
140 | ) : Longword ; cdecl; |
||
141 | D_USMC_Stop = function ( Device: Longword // IN - Device number |
||
142 | ) : Longword ; cdecl; |
||
143 | D_USMC_SetCurrentPosition = function ( Device: Longword; // IN - Device number |
||
144 | Position: integer // IN - New current position in 1/8 steps (5 least significant bits are ignored) |
||
145 | ) : Longword ; cdecl; |
||
146 | D_USMC_GetEncoderState = function ( Device: Longword; // IN - Device number |
||
147 | var Str: TUSMC_EncoderState //IN/OUT Structure containing encoder state |
||
148 | ) : Longword ; cdecl; |
||
149 | D_USMC_GetLastErr = procedure (ErrString: PChar; Size: Integer) cdecl; |
||
150 | D_USMC_Close = function : Longword ; cdecl; |
||
151 | |||
152 | TStandaClass = class(TObject) |
||
153 | protected |
||
154 | HandleStandaDLL: THandle; |
||
155 | public |
||
156 | bDllLoadOK: Boolean; |
||
157 | USMC_Init: D_USMC_Init; |
||
158 | USMC_GetState: D_USMC_GetState; |
||
159 | USMC_SaveParametersToFlash: D_USMC_SaveParametersToFlash; |
||
160 | USMC_GetMode: D_USMC_GetMode; |
||
161 | USMC_SetMode: D_USMC_SetMode; |
||
162 | USMC_GetParameters: D_USMC_GetParameters; |
||
163 | USMC_SetParameters: D_USMC_SetParameters; |
||
164 | USMC_GetStartParameters: D_USMC_GetStartParameters; |
||
165 | USMC_Start: D_USMC_Start; |
||
166 | USMC_Stop: D_USMC_Stop; |
||
167 | USMC_SetCurrentPosition: D_USMC_SetCurrentPosition; |
||
168 | USMC_GetEncoderState: D_USMC_GetEncoderState; |
||
169 | USMC_GetLastErr: D_USMC_GetLastErr; |
||
170 | USMC_Close: D_USMC_Close; |
||
171 | function LoadLibAndFuncs : Integer; |
||
172 | function UnLoadLibAndFuncs : Integer; |
||
173 | constructor Create; |
||
174 | destructor Destroy; override; |
||
175 | end; |
||
176 | (******************************************************************************) |
||
177 | |||
178 | implementation |
||
179 | |||
180 | constructor TStandaClass.Create; |
||
181 | var |
||
182 | iError: Integer; |
||
183 | begin |
||
184 | inherited Create; |
||
185 | iError := LoadLibAndFuncs; |
||
186 | if iError <> 0 then |
||
187 | begin |
||
188 | bDllLoadOK := false; |
||
189 | if iError=ErrNotLoadDLL then //ShowMessage('TStandaClass.Create: Error "can`t Load DLL" ') |
||
190 | else ;//ShowMessage('TStandaClass.Create: Error ''' + IntToStr(iError) + ''' from "LoadLibAndFuncs"'); |
||
191 | end else |
||
192 | begin |
||
193 | bDllLoadOK := true; |
||
194 | end; |
||
195 | end; |
||
196 | |||
197 | destructor TStandaClass.Destroy; |
||
198 | var |
||
199 | iError: Integer; |
||
200 | begin |
||
201 | iError := UnLoadLibAndFuncs; |
||
202 | if iError <> 0 then |
||
203 | begin |
||
204 | // ShowMessage('TStandaClass.Destroy: Error from "UnLoadLibAndFuncs"'); |
||
205 | end; |
||
206 | inherited Destroy; |
||
207 | end; |
||
208 | |||
209 | |||
210 | function TStandaClass.LoadLibAndFuncs : Integer; |
||
211 | begin |
||
212 | Result := 0; |
||
213 | |||
214 | try |
||
215 | HandleStandaDLL := LoadLibrary(pChar('USMCDLL.dll')); |
||
216 | |||
217 | if HandleStandaDLL <> 0 then |
||
218 | begin |
||
219 | @USMC_Init := GetProcAddress(HandleStandaDLL, 'USMC_Init'); |
||
220 | @USMC_GetLastErr := GetProcAddress(HandleStandaDLL, 'USMC_GetLastErr'); |
||
221 | @USMC_GetState := GetProcAddress(HandleStandaDLL, 'USMC_GetState'); |
||
222 | @USMC_GetStartParameters := GetProcAddress(HandleStandaDLL, 'USMC_GetStartParameters'); |
||
223 | @USMC_Start := GetProcAddress(HandleStandaDLL, 'USMC_Start'); |
||
224 | @USMC_Stop := GetProcAddress(HandleStandaDLL, 'USMC_Stop'); |
||
225 | @USMC_GetParameters := GetProcAddress(HandleStandaDLL, 'USMC_GetParameters'); |
||
226 | @USMC_SetParameters := GetProcAddress(HandleStandaDLL, 'USMC_SetParameters'); |
||
227 | @USMC_GetMode := GetProcAddress(HandleStandaDLL, 'USMC_GetMode'); |
||
228 | @USMC_SetMode := GetProcAddress(HandleStandaDLL, 'USMC_SetMode'); |
||
229 | @USMC_SaveParametersToFlash := GetProcAddress(HandleStandaDLL, 'USMC_SaveParametersToFlash'); |
||
230 | @USMC_SetCurrentPosition := GetProcAddress(HandleStandaDLL, 'USMC_SetCurrentPosition'); |
||
231 | @USMC_GetEncoderState := GetProcAddress(HandleStandaDLL, 'USMC_GetEncoderState'); |
||
232 | @USMC_Close := GetProcAddress(HandleStandaDLL, 'USMC_Close'); |
||
233 | |||
234 | if @USMC_Init = nil then Result := Result + 1; |
||
235 | if @USMC_GetLastErr = nil then Result := Result + 2; |
||
236 | if @USMC_GetState = nil then Result := Result + 4; |
||
237 | if @USMC_GetStartParameters = nil then Result := Result + 8; |
||
238 | if @USMC_Start = nil then Result := Result + 16; |
||
239 | if @USMC_Stop = nil then Result := Result + 32; |
||
240 | if @USMC_GetParameters = nil then Result := Result + 64; |
||
241 | if @USMC_SetParameters = nil then Result := Result + 128; |
||
242 | if @USMC_GetMode = nil then Result := Result + 256; |
||
243 | if @USMC_SetMode = nil then Result := Result + 512; |
||
244 | if @USMC_SaveParametersToFlash = nil then Result := Result + 1024; |
||
245 | if @USMC_SetCurrentPosition = nil then Result := Result + 2048; |
||
246 | if @USMC_GetEncoderState = nil then Result := Result + 4096; |
||
247 | if @USMC_Close = nil then Result := Result + 8192; |
||
248 | |||
249 | end else |
||
250 | begin |
||
251 | Result := ErrNotLoadDLL; |
||
252 | end; |
||
253 | except |
||
254 | on EExternalException do |
||
255 | Result := Result + 100000; |
||
256 | else |
||
257 | Result := Result + 200000; { unexpected } |
||
258 | end; |
||
259 | end; {LoadLibAndFuncs} |
||
260 | |||
261 | function TStandaClass.UnLoadLibAndFuncs : Integer; |
||
262 | var |
||
263 | bOK : Boolean; |
||
264 | begin |
||
265 | Result := 0; |
||
266 | |||
267 | if HandleStandaDLL <> 0 then |
||
268 | begin |
||
269 | bOK := FreeLibrary(HandleStandaDLL); |
||
270 | if bOK = true then |
||
271 | begin |
||
272 | HandleStandaDLL := 0; |
||
273 | |||
274 | USMC_Init := nil; |
||
275 | USMC_GetLastErr := nil; |
||
276 | USMC_GetState := nil; |
||
277 | USMC_GetStartParameters := nil; |
||
278 | USMC_Start := nil; |
||
279 | USMC_Stop := nil; |
||
280 | USMC_GetParameters := nil; |
||
281 | USMC_SetParameters := nil; |
||
282 | USMC_GetMode := nil; |
||
283 | USMC_SetMode := nil; |
||
284 | @USMC_SaveParametersToFlash := nil; |
||
285 | @USMC_SetCurrentPosition := nil; |
||
286 | @USMC_GetEncoderState := nil; |
||
287 | @USMC_Close := nil; |
||
288 | end else |
||
289 | begin |
||
290 | // further: exact info by 'GetLastError()' |
||
291 | Result := 1; |
||
292 | end; {if bOK = true then} |
||
293 | end; {if HandleStandaDLL <> 0 then} |
||
294 | end; {UnLoadLibAndFuncs} |
||
295 | |||
296 | |||
297 | end. |