You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -23,19 +23,14 @@ It is recommended, but not required, to declare Movers as an array.
23
23
Mover :ARRAY [1..GVL.NUM_MOVERS] OF Mover;
24
24
```
25
25
26
-
Movers must also be added to the Mediator object. By default, this is handled already in the MAIN.Initialize ACTION.
26
+
Movers must also be added to the Mediator object. By default, this is handled automatically.
27
27
28
28
```javascript
29
29
// Example implementation
30
30
Mediator.AddMover( Mover[1] );
31
31
```
32
32
33
33
34
-
!!! note
35
-
36
-
Prior to 1.4.0, it was necessary to cyclically call two methods: *Mover.Cyclic()* and *Mover.CyclicTrack()*. This process is now handled implicitly by the Mediator object, along with all other Objective cyclic calls.
37
-
38
-
39
34
## Methods
40
35
41
36
### ActivateTrack
@@ -44,8 +39,9 @@ Mediator.AddMover( Mover[1] );
44
39
45
40
> Updates the mover's logical track.
46
41
47
-
This method is used with track management to change the track that the mover is assigned to. Two conditions should be considered when changing tracks.
48
-
- A mover will stop immediately when ActivateTrack is called. It's recommended to only change tracks when the mover is in a stopped position.
42
+
This method is used with track management to change the track that the mover is assigned to. Two conditions should be considered when changing tracks:
43
+
44
+
- A mover will stop immediately when ActivateTrack is called. It's recommended to only change tracks when the mover is in standstill
49
45
- A mover's position can change when calling ActivateTrack. This will happen if the zero point for the current track and new track are different.
50
46
51
47
A track change takes several PLC and NC scans. Issuing a motion command while this change is in progress will cause the mover to throw an error. To check if the track change is complete monitor the `Mover.IsTrackReady` property.
@@ -201,13 +197,13 @@ To determine what type of movement ReissueCommand() will repeat, see Mover prope
201
197
```javascript
202
198
// Issue a primary command
203
199
IF xInitialCommand THEN
204
-
Mover[1].SetVelocity(500 );
200
+
Mover[1].MotionParameters.Velocity:=500; // mm/s
205
201
Mover[1].MoveToPosition( 1000 );
206
202
xInitialCommand :=FALSE;
207
203
208
204
// Reissue the primary command, but with a new velocity parameter
209
205
ELSIF xUpdateCommand THEN
210
-
Mover[1].SetVelocity(750 );
206
+
Mover[1].MotionParemeters.Velocity:=750; // mm/s
211
207
Mover[1].ReissueCommand();
212
208
xUpdateCommand :=FALSE;
213
209
END_IF
@@ -223,11 +219,6 @@ END_IF
223
219
224
220
The mover's error properties will be cleared, and if and Axis error continues to exist after the reset, the error properties will continue to reflect this.
225
221
226
-
```javascript
227
-
// mover has an error
228
-
IF Mover[1].ErrorTHEN
229
-
Mover[1]
230
-
```
231
222
232
223
### SetAcceleration
233
224
@@ -244,6 +235,9 @@ IF xCommandHighAccel THEN
244
235
END_IF
245
236
```
246
237
238
+
!!! note "Notice"
239
+
This method implicitly calls .ReissueCommand() in the background in order for the updated dynamics to take effect immediately. If this is not the intent, consider modifying the *Mover[x].MotionParameters* property instead.
240
+
247
241
248
242
### SetDeceleration
249
243
@@ -259,7 +253,8 @@ IF xCommandLowDecel THEN
259
253
xCommandLowDecel :=FALSE;
260
254
END_IF
261
255
```
262
-
256
+
!!! note "Notice"
257
+
This method implicitly calls .ReissueCommand() in the background in order for the updated dynamics to take effect immediately. If this is not the intent, consider modifying the *Mover[x].MotionParameters* property instead.
263
258
264
259
### SetDirection
265
260
@@ -269,8 +264,8 @@ END_IF
269
264
270
265
> Updates the Mover's internal Motion Parameter for Direction and immediately reissues any currently executing motion blocks so that the parameter update takes effect immediately
271
266
272
-
!!! Caution
273
-
This method should only be used with care, and an understanding that a mover enroute can immediately reverse course and execute a motion command in the opposite direction when this method is called.
267
+
!!! warning "Caution"
268
+
This method implicitly calls .ReissueCommand() in the background in order for the updated dynamics to take effect immediately. If this is not the intent, consider modifying the *Mover[x].MotionParameters* property instead. This method should only be used with care, and an understanding that a mover enroute can immediately reverse course and execute a motion command in the opposite direction when this method is called.
274
269
275
270
```javascript
276
271
// For supported directions, see Infosys
@@ -288,7 +283,7 @@ END_IF
288
283
289
284
> Sets the collision avoidance gap for the specified mover in mm. This takes effect immediately.
290
285
291
-
!!! Caution
286
+
!!! warning "Caution"
292
287
This method can cause unexpected motion. If setting a larger gap for a mover that currently has movers within the new gap distance (on either side of the mover). Each affected mover will immediately attempt to adjust for the new gap which may result in movers moving forwards or backwards.
293
288
294
289
When increasing the gap between movers it's recommended to do this one mover at a time only when the space in front of the mover is clear for at least the new gap distance. This can be accomplished with either a PositionTrigger or Zone.
This method implicitly calls .ReissueCommand() in the background in order for the updated dynamics to take effect immediately. If this is not the intent, consider modifying the *Mover[x].MotionParameters* property instead.
341
338
342
339
343
340
### SetVelocity
@@ -354,6 +351,9 @@ IF xCommandSlowMode THEN
354
351
xCommandSlowMode :=FALSE;
355
352
END_IF
356
353
```
354
+
!!! note "Notice"
355
+
This method implicitly calls .ReissueCommand() in the background in order for the updated dynamics to take effect immediately. If this is not the intent, consider modifying the *Mover[x].MotionParameters* property instead.
356
+
357
357
358
358
### SyncToAxis
359
359
@@ -555,7 +555,7 @@ It is recommended that all evaluations are nested inside IF checks for .IsSynced
555
555
> Defines a structure containing the dynamics settings for the Mover. Any new motion commands issued will utilize these values.
556
556
557
557
!!! Note
558
-
Despite listing this value as a Property here in the documentation, MotionParameters are actually defined as a regular Input to the Mover object. This allows component access to the members of the STRUCT, which is not possible for Properties.*
558
+
Despite listing this value as a Property here in the documentation, MotionParameters are actually defined as a regular Input to the Mover object. This allows component access to the members of the STRUCT, which is not possible for Properties.
559
559
560
560
```javascript
561
561
STRUCT
@@ -569,7 +569,9 @@ STRUCT
569
569
END_STRUCT
570
570
```
571
571
572
-
It is also possible to alter motion paramaters with mover methods such as `.SetVelocity()` or `.SetAcceleration()` and others.
572
+
Modifying a mover's Motion Parameters will not affect the current dynamics of a mover enroute. Updated dynamics properties will only take effect when the next motion command is issued.
573
+
574
+
It is also possible to alter motion paramaters with mover methods such as `.SetVelocity()`, `.SetAcceleration()` and others. These methods implicitly call .ReissueCommand() and therefore take effect immediately.
573
575
574
576
### .NextMover
575
577
@@ -642,7 +644,7 @@ END_IF;
642
644
> Returns information provided by MC_ReadTrackPositions for use with track management.
643
645
644
646
!!! Note
645
-
Despite listing this value as a Property here in the documentation, TrackInfo is actually defined as a regular Output from the Mover object. This allows component access to the members of the STRUCT, which is not possible for Properties.*
647
+
Despite listing this value as a Property here in the documentation, TrackInfo is actually defined as a regular Output from the Mover object. This allows component access to the members of the STRUCT, which is not possible for Properties.
646
648
647
649
| Member | Type | Description |
648
650
|---|---|---|
@@ -652,12 +654,3 @@ END_IF;
652
654
| PartPosition | LREAL | Position of the mover measured from the zero point of the part the mover is physically on|
653
655
654
656
655
-
## Extra Examples
656
-
657
-
Below are simple examples of different operations utilizing the Mover object:
Copy file name to clipboardExpand all lines: Documentation/docs/CodeReference/Objects/MoverList.md
+27-8Lines changed: 27 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,7 @@
3
3
4
4
> The Mover List object provides a way to group Movers together and issue commands to every Mover in the list. Alternatively, commands can be sent to individual movers within the list based on their geographic proximity to a track position.
5
5
6
-
Many of the methods and properties below are are based on corresponding methods available and documented in the [Mover](./Mover.md) object.
6
+
Many of the methods and properties below are group commands based on corresponding methods available and documented in the singular[Mover](./Mover.md) object.
7
7
8
8
## Setup & Execution
9
9
@@ -114,7 +114,7 @@ Filtering a mover list by station can be helpful when workings with several move
114
114
115
115
> Returns a reference to a singular mover from the Mover List, based on it's geographic location relative to a fixed track position.
116
116
117
-
**Index** specifies the number of movers that should lie between the selection and the Position input. Therefore Index = 0 would be the closest mover to the input position (in a given direction), Index = 1 would be the second closest, Index = 2 would be the third closest, etc.
117
+
**Index** specifies the number of movers that should lie between the selection and the Position input. Therefore Index = 1 would be the closest mover to the input position (in a given direction), Index = 2 would be the second closest, Index = 3 would be the third closest, etc.
118
118
119
119
**Position** specifies the target around which mover proximity should be considered.
120
120
@@ -125,13 +125,13 @@ Filtering a mover list by station can be helpful when workings with several move
125
125
// Which is the first closest mover to position 900
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
294
+
281
295
### SetAllJerk
282
296
283
297
*SetAllJerk( DesiredJerk : LREAL )*
@@ -288,6 +302,9 @@ MoverListA.Gap( 65.0 );
288
302
MoverListA.SetAllJerk( 1e5 );
289
303
```
290
304
305
+
!!! note
306
+
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
307
+
291
308
292
309
### SetAllVelocity
293
310
@@ -299,6 +316,8 @@ MoverListA.SetAllJerk( 1e5 );
299
316
MoverListA.SetAllVelocity( 2000 );
300
317
```
301
318
319
+
!!! note
320
+
This method causes new motion commands to be issued for the dynamics to take effect immediately- potentially triggering a large number of motion commands to execute on the same scan. See the individual Mover command and consider the ramifications for your application.
Stations also automatically *unregister* movers that have been redirected with another move command, even if that command's destination is the same as the Station.
37
+
Stations also automatically *unregister* movers that have been redirected with another move command, even if that command's destination is the same location as the Station.
38
38
39
39
```javascript
40
40
Mover[2].MoveToStation( Station[3] );
41
41
Mover[2].MoveToPosition( Station[3].Position );
42
42
```
43
43
44
-
Here, the Station will not report *MoverInPosition*.
44
+
Here, the Station will not report *MoverInPosition* when it arrives because the original command is interrupted by one where the *CurrentMoveType* is not `MOVETYPE_STATION`.
45
45
46
46
47
47
## Methods
@@ -90,6 +90,14 @@ When no mover is present in the Station, .CurrentMover is an invalid reference.
90
90
91
91
It is recommended that all evaluations are nested inside IF checks for [.MoverInPosition](#moverinposition).
92
92
93
+
### .Description
94
+
95
+
*STRING*
96
+
97
+
> A text description of the station that is passed to the visualization tools. It's also visible within within the TwinCAT debugging tools for easier identification of stations.
98
+
99
+
This value can be changed at runtime and will update on the visualization. This offers the opportunity to put dynamic data on the XTS visualization such as a station part count.
100
+
93
101
### .GroupSize
94
102
95
103
*DINT*
@@ -115,7 +123,6 @@ This value is only used to help calculate throughput `.Statistics` on the mover
115
123
!!! Note
116
124
This property is part of [Objective](./Objective.md#trackedmovercount) but is frequently used with stations and can be accessed as part of the Station object.
117
125
118
-
119
126
### .Position
120
127
121
128
*LREAL*
@@ -146,12 +153,22 @@ This value is also used to place a marker on the visualization tools representin
146
153
| ThrottledThreshold | LREAL | A high throttled threshold (Blocked to Empty ratio) indicates a potential bottleneck station |
147
154
| ProcessedMoverCount | UDINT | Total number of movers processed by this station |
148
155
149
-
####.Track
156
+
### .Track
150
157
151
158
*REFERENCE TO Track*
152
159
153
160
> Track that the station is assigned to when using track management. See the [Track](Track.md) object.
154
161
162
+
### .TrackId
163
+
164
+
*DINT*
165
+
166
+
> The numeric id of the track that this station is assigned to.
167
+
168
+
This value is read-only. Use the method `.SetTrack()` to set the station's assigned track.
169
+
170
+
171
+
155
172
156
173
## Extra Examples
157
174
@@ -175,6 +192,6 @@ FOR i := 0 TO Station[0].TrackedMoverCount-1 DO
175
192
targetMover^.MoveToStation( Station[1] );
176
193
END_FOR
177
194
```
178
-
# Station Labeling In Viewing Tools
195
+
###Station Labeling In Viewing Tools
179
196
180
197
See [Visualization](../../GettingStarted/Visualization.md)
0 commit comments