Instructions
How FASTory Line Works?
In FASTory line there are 12 work stations, each work station contains one conveyor and one robot, for each conveyor there are several zones and each zone has one presence sensor to detect the presence of the pallet, one stopper to stop the pallet in the zone and each entrance zone for each work station has an RFID reader for pallet recognition. Figure 1 shows the conveyors and zones for each work station. A legend in the interface show the symbols which used to present sensors, stoppers and RFIDs.
a) | b) | c) |
Figure 1: a) zones for WS7, b) zones for WS1 and c) zones for WS2-6, 8-12 |
The production starts in WS7 by LoadPallet, after that the pallet must reach WS1 to get paper by LoadPaper, then the pallet goes to WS2-6, 8-12 for drawing mobile phone on it, the drawing has three parts; Frame, Screen and Keyboard (see Figure 2). Each part can have red, green or blue colour and each part has recipe number (1-9). After that the pallet must go again to WS1 for removing the paper by UnloadPaper and finally pallet goes to WS7 for Unloading the pallet. this is one cycle of production life but pallet can stay in the line to get new paper for other product.
a) | b) | c) |
Figure 2: a) Keyboard variations, b) Frame variations and c) Screen variations |
What do RTUs Mean?
RTU (Remote Terminal Unit) refers to each element in production unit which can host web services, the link in the navigation menu is linked to the back stage state of RTUs in the simulator. these RTUs are present using JSON notification language. from there user can get all informations about RTUs (services, events and data). these RTUs informations can be also queried by RESTful client with GET method.
Simulator Services
The simulator meant to copy all functionalities of real line. Fastory line works with RESTful services, the user can invoke services for physical world using RESTful client. also the user can get notifications about events occur in the line by subscribing to certain events. all URLs for services, events and data can be found in RTUs link in the navigation bar.
Here all services events and data can be found in the following tables
Services
Services are the processes that user can invoke in order to process something in the line. As show in the table below, some of these services require a body with "destUrl" element. This feature is used allows the user to know if the services which he/she invoked is finished or not. this feature added to help orchestration tools to track the services invocations. "destUrl" element is necessary and it must respond with empty body
# | Service ID | RTU ID | Method | Service URL | Service Body | Service Response | Service description |
---|---|---|---|---|---|---|---|
1 | LoadPaper | SimROB1 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB1/services/LoadPaper | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | load paper to the pallet in zone3 of WS1 |
2 | UnloadPaper | SimROB1 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB1/services/UnloadPaper | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | unload paper from the pallet in zone3 of WS1 |
3 | LoadPallet | SimROB7 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB7/services/LoadPallet | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | load pallet to zone3 of WS7 |
4 | UnloadPallet | SimROB7 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB7/services/UnloadPallet | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | unload the pallet in zone3 of WS7 |
5 | ChangePenRED | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/services/ChangePenRED | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | changes the pen color used in the work station to red, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
6 | ChangePenGREEN | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/services/ChangePenGREEN | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | changes the pen color used in the work station to green, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
7 | ChangePenBLUE | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/services/ChangePenBLUE | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | changes the pen color used in the work station to blue, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
8 | GetPenColor | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/services/GetPenColor | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | to get the pen color which is in use in the workstation, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
9 | Draw** | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/services/Draw** | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | draws the part on the paper, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12. ** can be replaced with 1, 2, 3, 4, 5, 6, 7, 8, or 9 |
10 | TransZone12 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/TransZone12 | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | move the pallet from zone1 to zone2, * can be replaced with 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12. |
11 | TransZone23 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/TransZone23 | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | move the pallet from zone2 to zone3, * can be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12. |
12 | TransZone35 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/TransZone35 | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | move the pallet from zone3 to zone5, * can be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12. |
13 | TransZone14 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/TransZone14 | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | move the pallet from zone1 to zone4, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12. |
14 | TransZone45 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/TransZone45 | {"destUrl":"http://hostname"} | 202 if operations accepted, 404 if it is forbidden | move the pallet from zone4 to zone5, * can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12. |
15 | Z1 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/Z1 | {} | {PalletID:" ** "} | get the pallet Id in zone1,* can be replaced with 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12. ** is -1 if no pallet |
16 | Z2 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/Z2 | {} | {PalletID:" ** "} | get the pallet Id in zone2,* can be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12. ** is -1 if no pallet |
17 | Z3 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/Z3 | {} | {PalletID:" ** "} | get the pallet Id in zone3,* can be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12. ** is -1 if no pallet |
18 | Z4 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/Z4 | {} | {PalletID:" ** "} | get the pallet Id in zone4,* can be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12. ** is -1 if no pallet |
19 | Z5 | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/services/Z5 | {} | {PalletID:" ** "} | get the pallet Id in zone1,* can be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12. ** is -1 if no pallet |
20 | Reset | N/A | POST | http://escop.rd.tut.fi:3000/RTU/reset | {} | {} | reset all simulator and delete all event subscriptions |
Event
For events, The user should subscribe to the event that he/she would like to be notify once this event occur in the simulator. The subscription done using POST method to the event URL. table below shows the information about subscribing to events. The table below shows the events which user can subscribe.
# | Event ID | RTU ID | Method | Event URL | Event Body | Event description |
---|---|---|---|---|---|---|
1 | PaperLoaded | SimROB1 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB1/events/PaperLoaded/notifs | {"destUrl":"http://hostname"} | to subscribe to the PaperLoaded event, this event occur once the robot complete loading the paper to pallet in zone3. "destUrl" is the listening link which the user will use to get notification. |
2 | PaperUnloaded | SimROB1 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB1/events/PaperUnloaded/notifs | {"destUrl":"http://hostname"} | to subscribe to the PaperUnloaded event, this event occur once the robot complete unloading the paper from pallet in zone3. "destUrl" is the listening link which the user will use to get notification. |
3 | PalletLoaded | SimROB7 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB7/events/PalletLoaded/notifs | {"destUrl":"http://hostname"} | to subscribe to the PalletLoaded event, this event occur once the robot complete loading the pallet to zone3. "destUrl" is the listening link which the user will use to get notification. |
4 | PalletUnloaded | SimROB7 | POST | http://escop.rd.tut.fi:3000/RTU/SimROB7/events/PalletUnloaded/notifs | {"destUrl":"http://hostname"} | to subscribe to the PalletUnloaded event, this event occur once the robot complete unloading the pallet in zone3. "destUrl" is the listening link which the user will use to get notification. |
5 | PenChanged | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/events/PenChanged/notifs | {"destUrl":"http://hostname"} | to subscribe to the PenChanged event, this event occurs once the robot changes the pen color. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
6 | DrawStartExecution | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/events/DrawStartExecution/notifs | {"destUrl":"http://hostname"} | to subscribe to the DrawStartExecution event, this event occur once the robot starts drawing process. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
7 | DrawEndExecution | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/events/DrawEndExecution/notifs | {"destUrl":"http://hostname"} | to subscribe to the DrawEndExecution event, this event occur once the robot completes drawing process. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
8 | LowInkLevel | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/events/LowInkLevel/notifs | {"destUrl":"http://hostname"} | to subscribe to the LowInkLevel event, this event occurs once the level of ink is low. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
9 | OutOfInk | SimROB* | POST | http://escop.rd.tut.fi:3000/RTU/SimROB*/events/OutOfInk/notifs | {"destUrl":"http://hostname"} | to subscribe to the OutOfInk event, this event occurs once the robot run out of ink. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
10 | Z1_Changed | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/events/Z1_Changed/notifs | {"destUrl":"http://hostname"} | to subscribe to the Z1_Changed event, this event occur once the pallet Id in zone1 changes. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
11 | Z2_Changed | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/events/Z2_Changed/notifs | {"destUrl":"http://hostname"} | to subscribe to the Z2_Changed event, this event occur once the pallet Id in zone2 changes. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
12 | Z3_Changed | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/events/Z3_Changed/notifs | {"destUrl":"http://hostname"} | to subscribe to the Z3_Changed event, this event occur once the pallet Id in zone3 changes. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
13 | Z4_Changed | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/events/Z4_Changed/notifs | {"destUrl":"http://hostname"} | to subscribe to the Z4_Changed event, this event occur once the pallet Id in zone4 changes. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
14 | Z5_Changed | SimCNV* | POST | http://escop.rd.tut.fi:3000/RTU/SimCNV*/events/Z5_Changed/notifs | {"destUrl":"http://hostname"} | to subscribe to the Z5_Changed event, this event occur once the pallet Id in zone5 changes. "destUrl" is the listening link which the user will use to get notification. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
The following is an example of the response for subscribing to "Z1_Changed" in SimCNV2:
{nez11:
{
id: "nez11",
links:
{
self: "http://127.0.0.1:3000/RTU/SimCNV2/events/Z1_Changed/notifs/nez11"
},
class: "eventNotification",
eventID: "Z1_Changed",
destUrl: "http://127.0.0.1:3000/fmw"
}
}
where,
nez11: notification ID.
links.self: notification link, this link is used to unsubscribe of the event using DELETE method with {} request.
the following table shows the message body of the notifications for each event
# | Event ID | Notification Body |
---|---|---|
1 | PaperLoaded | { id: 'PaperLoaded',senderID: 'SimROB1', lastEmit: '2015-08-21T08:11:54.861Z',payload: {} } |
2 | PaperUnloaded | { id: 'PaperUnloaded', senderID: 'SimROB1', lastEmit: '2015-08-21T08:12:03.281Z', payload: {} } |
3 | PalletLoaded | { id: 'PalletLoaded', senderID: 'SimROB7', lastEmit: '2015-08-21T08:12:49.234Z', payload: { PalletID: 1440144769228 } } |
4 | PalletUnloaded | { id: 'PalletUnloaded', senderID: 'SimROB7', lastEmit: '2015-08-21T08:13:06.879Z', payload: {} } |
5 | PenChanged | { id: 'PenChanged', senderID: 'SimROB8', lastEmit: '2015-08-21T08:13:30.686Z', payload: { PenColor: 'BLUE' } } |
6 | DrawStartExecution | { id: 'DrawStartExecution', senderID: 'SimROB8', lastEmit: '2015-08-21T08:13:54.616Z', payload: { Recipe: '2' } } |
7 | DrawEndExecution | { id: 'DrawEndExecution', senderID: 'SimROB8', lastEmit: '2015-08-21T08:13:58.637Z', payload:{ PalletID: 1440143790832, Recipe: '2', ManufacturingID: 'ROB81440144838637', Color: 'BLUE' } } |
8 | LowInkLevel | {id : 'LowInkLevel', senderID : 'SimROB8', lastEmit : '2015-08-21T08:13:58.637Z', payload : {Color: 'BLUE'}} |
9 | OutOfInk | {id : 'OutOfInk', senderID : 'SimROB8', lastEmit : '2015-08-21T08:13:58.637Z', payload : {Color: 'BLUE'}} |
10 | Z4_Changed | { id: 'Z4_Changed', senderID: 'SimCNV10', lastEmit: '2015-08-21T08:11:41.520Z', payload: { PalletID: -1 } } |
Data
Data represents IOs of the RTUs. here the user can read the IOs values of the simulator. the following table shows the available IOs which the user can read
# | Data ID | RTU ID | Method | Data URL | Response Body | Data description |
---|---|---|---|---|---|---|
1 | S1 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/S1 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
2 | S2 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/S2 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
3 | S3 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/S3 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
4 | S4 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/S4 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
5 | P1 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/P1 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
6 | P2 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/P2 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
7 | P3 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/P3 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 or 12 |
8 | P4 | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/P4 | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
9 | RFID | SimCNV* | GET | http://escop.rd.tut.fi:3000/RTU/SimCNV*/data/RFID | {"v":" ", "q":" ", "t": " "} | S represent the stopper in zone1. v is the value of the IO, it can be 1 for ON and 0 for OFF. q is the quality of the of the value. t is the time of reading the IO. * could be replaced with 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 or 12 |
How Interface works?
Figure 3: Simulator interface
As shown in figure 3, the interface has two parts, animation part which shows animated simulation of real line. In the upper right corner there is legend shows the symbols that are used to represent sensors, stoppers and RFIDs. The second part is the control part which allows the user to invoke services to the line. Each work station has a panel contains the status of the RTUs. Also it has buttons to invoke the available services.
For TransZone services, there are buttons show from which zone the pallet will be transferred to which zone it will reach (according to FASTory layout, some services are not available). Next there are three colored buttons, these buttons allow the user to choose the color which this work stations will use. Then there are 9 buttons for drawing parts. F,S and K represents Frame, Screen and Keyboard respectively. For WS1 and WS7 there are buttons show the operation name. Last panel to the right is used to control the simulator, first button (Reset All) is used to reset all simulator including animation all backstage variables. It will remove all subscriptions as well once the user press this button.