22 KiB
Vetromeccanica Remote Format Changeover Process
This document describes the remote format changeover functionality as implemented in the FormatManagementQE1_G
function block (FC800) on the Vetromeccanica Q1 PLC for the TL2x line. The Q1s PLC coordinates the changeover process, interacting with an operator via HMI, the master line PLC (Henkel), other Vetromeccanica machines on the line, and external systems like AUTEFA and Alpla.
General Concept
The process is managed by a state machine controlled by the FormatChangeCycle
variable. The Q1 PLC acts as a local coordinator for its section of the line (including Merger and Guides) and synchronizes with the overall line state via signals from a supervisory PLC.
Prerequisites
For the remote changeover to be initiated, the following conditions must be met:
- Remote Mode Enabled: The operator must select remote format change on the HMI, which sets the
"FormatManagementQE1_D".RemoteSelector
flag toTRUE
. - Line Ready for Emptying: The supervisory PLC (Henkel) must signal that the current production batch is finished by sending
0
in the"ComSV".TL25_WriteToSv.FromHenkel.SignalExchange.Filler.CalculatedBottlesRemainingToFill
variable. - Next SKU Information: Information about the next product (
"FormatManagementQE1_D".NextSku
) must be available from the Alpla system via the supervisor.
To enable the Remote change-over we need to enable on the following page:
State Machine Workflow
Vetromeccanica PLC internal sequence (FC800)
-
Remote mode activation (
FormatChange_Enabled
)- The operator enables "Remote Format Change" on the HMI (
RemoteSelector = TRUE
). - Vetromeccanica waits for Henkel to send
CalculatedBottlesRemainingToFill = 0
.
- The operator enables "Remote Format Change" on the HMI (
-
Line clearance request (
FormatChange_Emptying
)- Entry condition: remaining bottles counter = 0.
- Vetromeccanica displays
PopUp_EmptyStart
2001 asking the operator to confirm the emptying. - If the answer is YES:
EmptyingStart := TRUE
.MachineEmpty
is sent to local machines andToAutefa.dw0.x[1] = TRUE
.- If the answer is NO, it returns to the previous state.
-
Line empty verification
- Waits for confirmation of
MachineEmpty
andFromAutefa.dw0.x[24] = TRUE
(Changeover In Progress). - Vetromeccanica displays
PopUp_EmptyEnd
2002 so the operator can confirm the line is empty.
- Waits for confirmation of
-
Format change execution (
FormatChange_InProgress
)- With
STW.di0.x[0] = TRUE
(Changeover Request) Vetromeccanica triggersRt_LoadRemoteRecipe
(Job 70). - Monitors the HMI result (
DBW_36 = 4
OK /DBW_36 = 12
Error). - Keeps the change-in-progress flag towards Henkel and AUTEFA.
- With
-
Line ready (
FormatChange_Done
/NotNecessary
)- When
EndFormatManagement.Q
andAp_LifterGuideInPosition
are TRUE. - Vetromeccanica displays
PopUp_LineReady
2000; after operator confirmation it sendsChangeover Complete
and updatesBatchLast
.
- When
-
Counter reset
- Henkel sets
STW.di0.x[1] = TRUE
. FC_TT_Devices
resets the counters using the correct index[1]
.
- Henkel sets
-
Production restart
- Henkel sends new
CalculatedBottlesRemainingToFill > 0
. - Vetromeccanica clears its internal flags and sends the
Production Ready
signal (STW.di0.x[2]
).
- Henkel sends new
-
Error handling (
FormatChange_Error
)- Recipe error (
DBW_36 = 12
) or machine timeout. - Raises alarms
A371_23_0
/A371_23_1
; requiresTT_Run.IN_PB_Reset
.
- Recipe error (
Key signals
Signal | Description | Direction |
---|---|---|
SignalExchange.Filler.CalculatedBottlesRemainingToFill |
Bottles remaining counter | Henkel → Vetromeccanica |
ToAutefa.dw0.x[1] |
Start changeover request | Vetromeccanica → AUTEFA |
FromAutefa.dw0.x[24] |
Changeover in progress | AUTEFA → Vetromeccanica |
PopUp_EmptyStart 2001 |
Confirm emptying | Vetromeccanica HMI |
PopUp_EmptyEnd 2002 |
Confirm line empty | Vetromeccanica HMI |
PopUp_LineReady 2000 |
Line ready | Vetromeccanica HMI |
The core logic resides in a state machine. The main states and their functions are:
State 1: FormatChange_Enabled
- The system enters this state once Remote Mode is active.
- It continuously monitors
CalculatedBottlesRemainigToFill
. - When this value becomes
0
, the PLC reads the current and next batch information (SKU, IDH, PO numbers) from the supervisory PLC. - It then transitions to State 2 (
FormatChange_Emptying
).
State 2: FormatChange_Emptying
- The PLC compares the current bottle type (
"DB HMI Recipe Bottle".number_set_data
) with the next scheduled one ("FormatManagementQE1_D".NextSku.ProdFamily
). - If the format is the same: It determines a change is not required, shows a
PopUp_LineReady
(2000) message, and moves to State 5 (FormatChange_NotNecessary
). - If the format is different:
- A pop-up (
PopUp_EmptyStart
- 2001) is displayed on the HMI, asking the operator to confirm the start of the line emptying process. - Upon operator confirmation (
HMI_PopUp.Yes
):- The PLC sets the
"FormatManagementQE1_D".EmptyingStart
flag. - It sends
MachineEmpty
commands to the relevant machinery (e.g., Merger). - A new pop-up (
PopUp_EmptyEnd
- 2002) is shown to signal that the emptying process has begun.
- The PLC sets the
- Once the line machines confirm they are empty, and the operator confirms via the
PopUp_EmptyEnd
dialog, the system transitions to State 3 (FormatChange_InProgress
). - The Transport to carry on also need #"Line Empty" memory that is all photocells clear set on the FC380 -> "ComSV".TL25_WriteToSv.ToSV.STW.QE1.MachineEmpty.
- A pop-up (
State 3: FormatChange_InProgress
- This is the main state where the physical changeover occurs.
- The PLC triggers the loading of the new remote recipe by activating
"Rt_LoadRemoteRecipe"
. This sends a command (Job70
) to the HMI system. - It signals to AUTEFA that a changeover is active (
"ComSV".TL25_WriteToSv.ToAutefa.dw0.x[] := TRUE
). - It monitors the status of the recipe download (
"DB HMI".DBW_36
). A value of4
indicates success, while12
indicates an error. - It waits for confirmations from all local machines that the changeover is complete (e.g.,
"FormatManagementQE1_D".EndFormatManagement.Q
,"Ap_LifterGuideInPositon"
). - On Success: When all machines are ready and in position for the new format, it shows a
PopUp_LineReady
(2000) message and awaits final operator confirmation. - On Failure: If there's a recipe load error or a machine fails to complete its changeover, it moves to State 6 (
FormatChange_Error
).
State 4: FormatChange_Done
- After the final operator confirmation in State 3, the system enters this
Done
state. - It sends the
BatchLast
information to the Alpla system. - It signals to the Henkel PLC that the line is ready for production (
LineStatus.di0.x[]
). - It resets internal flags and awaits a new
CalculatedBottlesRemainigToFill
value to transition back to State 1 for the next changeover.
State 5: FormatChange_NotNecessary
- Entered when the current and next SKU are identical.
- It displays a
PopUp_LineReady
message. - Upon operator confirmation, it moves to the
FormatChange_Done
state to finalize the (skipped) cycle.
State 6: FormatChange_Error
- This state is entered if any error occurs during the process (e.g., recipe load failure, machine timeout).
- Specific alarms are raised (e.g.,
A371_23_0
for recipe error,A371_23_1
for machine error). - The operator must acknowledge the error via a
Reset
button ("DB TT Run".TT_Run.IN_PB_Reset
). - Depending on the error, the system may attempt to retry the operation by transitioning back to State 3 (
FormatChange_InProgress
) or require further manual intervention.
Important Signals From HENKEL - Vetro - AUTEFA
FromHenkel : Data_From_EbConvey[0].0 : Request Signal To Start ChangeOver FromHenkel : Data_From_EbConvey[0].1 : Reset Signal To Restart all Counter FromHenkel : Data_From_EbConvey[0].2 : ChangeOver Complete FromHenkel : Data_From_EbConvey[0].3 : Production Ready
ToHenkel : Data_From_EbConvey[0].0 : Line is busy with ChangeOver ToHenkel : Data_From_EbConvey[0].1 : ChangeOver is finished and ready ToHenkel : Data_From_EbConvey[0].2 : IDH_BTL_NEXT Proper: 1 = Found / 0 = Not Found
ToAutefa: x[0] : Reset ToAutefa: x[1] : Request Signal To Start Changeover
Flow on Q1 PLC:
@startuml
title Remote Format Change – Main Steps (Vetromeccanica PLC)
hide footbox
skinparam ArrowHeadColor none
skinparam NoteBackgroundColor #F0F0F0
skinparam NoteBorderColor #999999
skinparam ParticipantPadding 100
skinparam BoxPadding 6
skinparam WrapWidth 250
!pragma teoz true
' ==== Re-usable styles ====
!define VAR(x) <back:#F0F0F0><color:#7F6000><b>x</b></color></back>
!define SIG(x) <back:#F0F0F0><color:#005A9E><b>x</b></color></back>
!define FROM(x) <back:#FFAAAA><color:#000000><b>x</b></color></back>
!define TO(x) <back:#AAFFFF><color:#000000><b> x</b></color></back>
!definelong Nota($where, $text)
note over $where
$text
end note
!enddefinelong
!definelong NotaParalela($where, $text)
/ note over $where
$text
end note
!enddefinelong
!definelong Variable($where, $text)
hnote right $where #AAFFFF
$text
end note
!enddefinelong
!definelong VariableRojo($where, $text)
hnote right $where #FFBBBB
$text
end note
!enddefinelong
!definelong VariableIzquierda($where, $text)
hnote left $where #AAFFFF
$text
end note
!enddefinelong
!definelong VariableCentro($where, $text)
hnote over $where #AAFFFF
$text
end note
!enddefinelong
!definelong VariableParalelo($where, $text)
/ hnote right $where #AAFFFF
$text
end note
!enddefinelong
participant Henkel as H
participant Vetromeccanica as V
participant AUTEFA as U
participant Alpla as A
== Preconditions ==
Nota(V,"Initial state: Remote Format Change <b>disabled</b> \nState = FORMAT_CHANGE_DISABLED")
H -> V : Send VAR(CalculatedBottlesRemainingToFill) (>0)
== Step 1 – Enable Remote Format Change ==
Nota(H,"Operator activates <b>Remote Format Change</b> selector")
H -> V : Set SIG(RemoteSelector)
Nota(V,"State ➜ FORMAT_CHANGE_ENABLED")
== Step 2 – Need Evaluation ==
V -> V : Compare current vs next SKU
Nota(V,"Is change really required?")
Nota(V,PopUp_LineReady)
== Step 3 – Request to Empty Line ==
H -> V : VAR(CalculatedBottlesRemainingToFill)=0
Nota(V,"Show Pop-up <b>Empty Start</b> asking for confirmation")
VariableCentro(V,#PopUp_EmptyStart)
Operator -> V : Confirm (Yes)
Nota(V,"State ➜ FORMAT_CHANGE_EMPTYING")
== Step 4 – Emptying Sequence ==
V -> U : Set TO(ChangeoverInProgress)
Nota(V,"Wait until <b>MachineEmpty</b> from all equipment")
U --> V : FROM(MachineEmpty)
NotaParalela(V,"When empty – show Pop-up <b>Empty End</b>")
Variable(V,#PopUp_EmptyEnd)
Operator -> V : Confirm (Yes)
== Step 5 – Changeover In Progress ==
V -> V : Trigger SIG(Load Remote Recipe)
Nota(V,"Load recipe in Henkel Filler and update conveyors/merger\nState ➜ FORMAT_CHANGE_IN_PROGRESS")
V -> A : Request new recipe parameters
A --> V : Recipe data / AV / Family
== Step 6 – Line Ready ==
V -> V : Detect EndFormatManagement & FormatChangeQE
Nota(V,"All machines report ready & recipe loaded")
Nota(V,"Show Pop-up <b>Line Ready</b>")
Variable(V,#PopUp_LineReady)
Operator -> V : Confirm (Yes)
== Step 7 – Changeover Done ==
V -> H : TO(ChangeoverDone)
V -> U : TO(ChangeoverDone)
NotaParalela(V,"Transfer BatchLast data to Alpla")
V -> A : Send BatchLast information
Nota(V,"State ➜ FORMAT_CHANGE_DONE")
== Step 8 – Resume Production ==
H -> V : VAR(CalculatedBottlesRemainingToFill) > 0
NotaParalela(V,"Reset internal flags, clear pop-ups\nProduction resumes")
== Error / Reset ==
Nota(V,"Any Load Recipe or machine mismatch sets FORMAT_CHANGE_ERROR. Requires operator RESET before restart")
@enduml
Change Over STEPs
@startuml
title Changeover STEPs
hide footbox
skinparam ArrowHeadColor none
skinparam NoteBackgroundColor #F0F0F0
skinparam NoteBorderColor #999999
skinparam ParticipantPadding 100
skinparam BoxPadding 6
skinparam WrapWidth 250
!pragma teoz true
' ==== Estilos reutilizables ====
!define VAR(x) <back:#F0F0F0><color:#7F6000><b>x</b></color></back>
!define SIG(x) <back:#F0F0F0><color:#005A9E><b>x</b></color></back>
!define FROM(x) <back:#FFAAAA><color:#000000><b>x</b></color></back>
!define TO(x) <back:#AAFFFF><color:#000000><b> x</b></color></back>
!definelong Nota($donde, $text)
note over $donde
$text
end note
!enddefinelong
!definelong NotaParalela($donde, $text)
/ note over $donde
$text
end note
!enddefinelong
!definelong Variable($donde, $text)
hnote right $donde #AAFFFF
$text
end note
!enddefinelong
!definelong VariableRojo($donde, $text)
hnote right $donde #FFBBBB
$text
end note
!enddefinelong
!definelong VariableIzquierda($donde, $text)
hnote left $donde #AAFFFF
$text
end note
!enddefinelong
!definelong VariableCentro($donde, $text)
hnote over $donde #AAFFFF
$text
end note
!enddefinelong
!definelong VariableParalelo($donde, $text)
/ hnote right $donde #AAFFFF
$text
end note
!enddefinelong
participant HENKEL as H
participant Alpla as A
participant Vetromeccanica as V
participant AUTEFA as U
== Before Changeover ==
H -> A : Send VAR(IDH_BTL_NEXT) number to be validated
Nota(A,Validate VAR(IDH_BTL_NEXT) and send acknowledge)
Variable(A,Data_From_EbConvey[0].2)
& A -> H : VAR(IDH_BTL_NEXT) validated
== Step 1 ==
Nota(H,Operator manually selects "Line Clearance" (?) and send signal "0" on VAR(CalculatedBottlesRemainingToFill).)
VariableCentro(H,Data_To_EbConvey[23])
H -> V : Send VAR(CalculatedBottlesRemainingToFill) = 0
== Step 2 ==
NotaParalela(V,Show Popup to Start Empting Line and Mergers)
Variable(U,TG10 Send 0 in Bottles for Actual Batch)
& V -> U : Send 0 in Bottles for Actual Batch
Nota(A,Stops taking bottles out of trays and sends what is already on the tables and conveyors.)
NotaParalela(U,Stops taking bottles out of trays and sends what is already on the tables and conveyors.)
== Step 3 ==
Nota(H,Operator verifies line is empty and sends "changeover request" signal after last bottle goes through filler.)
Variable(V,Data_To_EbConvey[0].0)
& H -> V : Send Changeover Request
== Step 4 ==
Nota(V,'Operator verifies line is empty and sends "line is busy with changeover",confirming on Popup screen')
Variable(V,Data_From_EbConvey[0].0)
& V -> H : Line is busy with changeover
== Step 5 ==
Nota(V,Starts changeover)
NotaParalela(U,Starts changeover)
VariableIzquierda(V,..FromAutefa.dw0.x[24])
& U -> V : Line is busy with changeover
Variable(V,Data_From_EbConvey[0].0)
& V -> H: Send Changeover Request
Variable(U,Data_From_EbConvey[0].0)
& U -> H: Send Changeover Request
== Step 6 ==
Nota(V,Ends changeover)
NotaParalela(U,Ends changeover)
Variable(V,Data_From_EbConvey[0].1)
& V o-> H: Send Changeover Complete
Variable(U,Data_From_EbConvey[0].1)
& U o-> H: Send Changeover Complete
== Step 7 ==
Variable(V,Data_To_EbConvey[0].1)
& H -> V : Reset Counters
Nota(V,Reset Counters)
== Step 8 ==
Nota(H,Send new value on VAR(CalculatedBottlesRemainingToFill))
Variable(V,Data_To_EbConvey[23])
& H -> V : VAR(CalculatedBottlesRemainingToFill > 0)
== Step 9 ==
Nota(H,Send Changeover Complete. To be considered "Production Ready")
Variable(V,Data_To_EbConvey[0].2)
& H -> V : Changeover Complete
NotaParalela(V,Finish Changeover Cycle - Start Line)
NotaParalela(A,Starts conveying bottles.)
NotaParalela(U,Starts conveying bottles.)
@enduml
Current changeover process
@startuml
skinparam rectangle {
FontSize 14
Padding 4
Margin 5
roundCorner 25
}
skinparam defaultTextAlignment center
' We use the Business Process sprite (simple ArchiMate style)
sprite $bProcess jar:archimate/application-service
sprite $aOperator jar:archimate/actor
sprite $aMaintOp jar:archimate/technology-device
sprite $aEvent jar:archimate/event
sprite $aColaboration jar:archimate/communication-path
' === BLOCKS ===
rectangle "Henkel tank reaches\n5 feet of liquid" as A <<$aEvent>> #ff0000
rectangle "Henkel operator notifies\nby radio to Alpla to collect\nchange form" as B <<$aColaboration>> #8CD96B
rectangle "Henkel tank empties" as C <<$aEvent>> #ff0000
rectangle "Henkel operator calls\nto put TLO in manual" as D <<$aOperator>> #ff0000
rectangle "Henkel runs out of product\non the line" as E <<$aEvent>> #ff0000
rectangle "Alpla operator moves\nremaining pallets manually" as F <<$aOperator>> #8CD96B
rectangle "Operator changes AVID\nand requests new pallets" as G <<$aOperator>> #8CD96B
rectangle "Operator calls maintenance\nto adjust Vetro to new format" as H <<$aColaboration>> #8CD96B
rectangle "Operator accepts new AVID\nin rotators 1 and 2" as I <<technology-device>> #8CD96B
rectangle "Operator changes format parts\nin rotators 1 and 2" as J <<$aOperator>> #8CD96B
rectangle "Operator notifies by radio that\nHenkel Alpla is ready" as K <<$aOperator>> #8CD96B
rectangle "Operator puts line in automatic\nat Henkel's request" as L <<$aMaintOp>> #8CD96B
rectangle "Maintenance starts change\nVetro conveyors" as M <<$aMaintOp>> #FFC933
rectangle "Maintenance changes\nKeyence camera" as N <<$aMaintOp>> #FFC933
rectangle "Maintenance verifies complete\nchange of conveyors" as O <<$aMaintOp>> #FFC933
' === FLOW UP TO E (left->right by default) ===
A -right-> B
B -right-> C
C -down-> D
D -left-> E
' === FROM E: FORCE TOP-DOWN ===
E -down-> F
F -left-> G
G -left-> H
H -down-> I
I -down-> J
J -down-> K
K -down-> L
' === MAINTENANCE: lateral and vertical branch ===
H -down-> M
M -down-> N
N -down-> O
@enduml
Current auto batch handling change over process
@startuml
skinparam rectangle {
FontSize 14
Padding 4
Margin 5
roundCorner 25
}
skinparam defaultTextAlignment center
' Sprites (mismos que en tu ejemplo)
sprite $bProcess jar:archimate/application-service
sprite $aOperator jar:archimate/actor
sprite $aMaintOp jar:archimate/technology-device
sprite $aEvent jar:archimate/event
sprite $aColaboration jar:archimate/communication-path
' === BLOCKS (diagram translation) ===
' Initial event
rectangle "Henkel tank reaches\n0 ft" as A <<$aEvent>> #ff0000
' System reaction (top)
rectangle "TLO automatically stops\nsending bottles" as B1 <<$bProcess>> #0B5FA5
rectangle "Henkel line runs out\nof product (run-out)" as C1 <<$aEvent>> #ff0000
' Change request (below initial)
rectangle "Change request sent\nto Alpla HMI" as B2 <<$bProcess>> #0B5FA5
rectangle "Alpla operator accepts\nnew AVID from Henkel in SCO" as C2 <<$aOperator>> #8CD96B
rectangle "Alpla operator selects\nwhich TLO will run the new AVID" as D2 <<$aOperator>> #8CD96B
rectangle "Alpla operator walks\nto the TLO" as E2 <<$aOperator>> #8CD96B
rectangle "Alpla operator moves\nremaining trays to\nthe empty conveyor" as F2 <<$aOperator>> #8CD96B
rectangle "Alpla operator accepts\nthe new AVID in the TLO\nand requests stacks" as G2 <<$aOperator>> #8CD96B
' Maintenance branch
rectangle "Operator calls maintenance\nto adjust Vetro conveyor\nto new format" as H2 <<$aColaboration>> #8CD96B
rectangle "Maintenance accepts\nnew AVID in Vetro HMI\nand begins conveyor change" as M1 <<$aMaintOp>> #FFC933
rectangle "Maintenance performs\nKeyence camera change" as M2 <<$aMaintOp>> #FFC933
rectangle "Maintenance verifies\nVetro conveyor change\ncompleted" as M3 <<$aMaintOp>> #FFC933
' Rotator adjustments
rectangle "Operator accepts new AVID\nin rotators 1 and 2" as I2 <<$aOperator>> #8CD96B
rectangle "Operator changes format parts\nin rotators 1 and 2" as J2 <<$aOperator>> #8CD96B
rectangle "Operator notifies by radio that\nHenkel/Alpla is ready to\nsend bottles" as K2 <<$aOperator>> #8CD96B
rectangle "At Henkel's request, operator\nputs line in automatic" as L2 <<$aMaintOp>> #8CD96B
' === FLOWS ===
' Upper branch (event -> system)
A -up-> B1
B1 -right-> C1
' Main branch (event -> request -> TLO actions)
A -right-> B2
B2 -right-> C2
C2 -right-> D2
D2 -right-> E2
E2 -down-> F2
F2 -left-> G2
G2 -left-> H2
' Lateral maintenance branch
H2 -left-> M1
M1 -down-> M2
M2 -down-> M3
' Rotator adjustments and closure
H2 -down-> I2
I2 -down-> J2
J2 -right-> K2
K2 -right-> L2
@enduml
Desired auto batch process:
@startuml
skinparam rectangle {
FontSize 14
Padding 4
Margin 5
roundCorner 25
}
skinparam defaultTextAlignment center
' Sprites (mismos que antes)
sprite $bProcess jar:archimate/application-service
sprite $aOperator jar:archimate/actor
sprite $aMaintOp jar:archimate/technology-device
sprite $aEvent jar:archimate/event
sprite $aColaboration jar:archimate/communication-path
' === BLOCKS ===
' Henkel events/states
rectangle "Henkel tank reaches\n0 remaining bottles" as A <<$aEvent>> #ff0000
rectangle "Henkel runs out of\nproduct on the line" as E <<$aEvent>> #ff0000
' Systems (blue)
rectangle "TLO automatically stops\nsending bottles" as B <<$bProcess>> #0B5FA5
rectangle "Change request sent\nto Alpla HMI" as C <<$bProcess>> #0B5FA5
rectangle "Vetro conveyor and Keyence\ncamera initiate format change" as V1 <<$bProcess>> #0B5FA5
rectangle "Autefa system removes trays/\nexcess stacks from TLO" as S1 <<$bProcess>> #0B5FA5
rectangle "Autefa system requests new\nbottles from warehouse" as S2 <<$bProcess>> #0B5FA5
rectangle "Henkel sends signal to Autefa\nto release bottles" as Z <<$bProcess>> #0B5FA5
' Alpla operation (green)
rectangle "Alpla operator accepts the\nnew AVID from Henkel in SCO\nand defines which TLO will run it" as D <<$aOperator>> #8CD96B
rectangle "Alpla operator changes format\nparts in rotators 1 and 2" as F1 <<$aOperator>> #8CD96B
rectangle "Alpla operator verifies\ncomplete format change\nin all systems" as F2 <<$aOperator>> #8CD96B
' === FLOWS ===
A -down-> B
B -right-> E
A -right-> C
C -right-> D
E -right-> V1
' Autefa branch and format adjustment
D -right-> S1
S1 -down-> S2
S2 -down-> F1
F1 -down-> F2
F2 -right-> Z
' Vetro/Keyence branch towards final verification
D -down-> V1
V1 -down-> F2
@enduml