Overview
The XPU component serves as a wrapper to functions and classes provided by the Tc3_XTS_Utility library.
The intention for the component is to insulate the application programmer from the 'messy middle' of buffering movers, handling relationships between stations, group motion setup and maintenance, etc.
Consider an assembly machine utilizing XTS as a product transport mechanism. An assembly machine typically consists of multiple stations each performing a discrete operation on a part which is moved serially though the machine. Ideally a team of developers should be able to work on such a machine simultaneously, concerning themselves only with the logic and operations specific to a particular station. The passing of an XTS mover to and from a station should be secondary to the developer's efforts. Additionally, the locations of the stations on the machine base should be flexible and otherwise transparent to the developer.
The existing XTS configuration tools continue to be utilized. Station position(s) and number of movers required are parameterized in the XTS Configuration Tool via the Stations section. The XPU component will collect all of the configured parameters via the Tc3_XTS_Utility library.
At the application layer, a station need only implement a relatively lightweight interface I_XTS_ApplicationStation
and make itself known to the XPU component. During initialization, the XPU component will establish the necessary links and assign an instance of I_XTS_InfoStation
to the station. I_XTS_InfoStation
is the interface through which a station can request mover(s) from the XPU component.
Mover Exchange
The function blocks linked to the NC axes corresponding to XTS movers are contained within FB_Component_XPU
. They are each associated via interface pointer with only one InfoStation
at a time. The XPU component maintains a list of stations and their associated "neighbors"--one upstream and another downstream. ApplicationStations
and their specific logic dictates when they are done with/need another mover. They request a mover from their associated InfoStation
, which passes this request to the XPU for processing.
The movement of a mover's interface pointer from one InfoStation's buffer to another takes place in a single PLC scan.
An illustration of this exchange:
sequenceDiagram
participant DS as Downstream ApplicationStation
participant DI as Downstream InfoStation
participant X as XPU
participant UI as Upstream InfoStation
participant US as Upstream ApplicationStation
Note over DS,DI: Downstream Application Station and <br>Downstream InfoStation know about each other
DS ->> DI: Get a new mover
DI->>X: Give me a mover
Note over DI,X: InfoStation passes an interface to itself <br> as an argument to XPU
Note over X: XPU matches the interface to <br> its neighbor
X->>UI: Give Downstream InfoStation a mover
Note over X,UI: XPU passes interface to Downstream InfoStation
Note over US,UI: Upstream Station and Upstream <br>InfoStation know about each other
UI->US: Are you done with this thing?
US-->UI: Yeah go ahead and give it away
UI-->>DI: I heard you wanted a mover?
Note over UI, DI: Upstream InfoStation passes interface to its first mover in queue
DI -> DS: Are you sure you want this thing?
DS --> DI: Yep!
Note over DI: Enqueues the mover
DI -->> UI: Thanks I'll take it
Note over UI: Dequeues the mover
UI -->> X: It is done.
X -->> DI: Upstream gave you a mover
DI -->> DS: OK check your queue
Note over DS: Sends new mover to open station position
Class Diagram
For illustration only
classDiagram
NC --* CAGroup
NC --* Axis
Axis --* SoftDrive
XtsProcessingUnit -- Mover
XtsProcessingUnit -- Part
XtsProcessingUnit -- Track
FB_Component_XPU -- ApplicationStation
Part -- FB_Component_XPU
Track -- FB_Component_XPU
Mover -- FB_Component_XPU
CAGroup -- FB_Component_XPU
InfoStation -- FB_Component_XPU
XtsInfoServer -- InfoStation
InfoStation .. ApplicationStation
Axis -- Mover
SoftDrive -- Mover
Mover .. Part
Mover .. Track
Mover .. CAGroup
class FB_Component_XPU{
Parts[]
Tracks[]
Movers[]
InfoStations[]
}
class ApplicationStation{
InfoStation
MoverQueue
}
class InfoStation{
ApplicationStation
MoverQueue
StopPositions[]
GetMover()
GiveMover()
TakeMover()
}
class XtsProcessingUnit{
<<TcCom>>
Parts[]
Tracks[]
Movers[]
}
class XtsInfoServer {
<<TcCom>>
InfoStations[]
}
class NC{
<<System Manager>>
}