NEWS
PLCopen
PLCopen OPC UA
PLCopen starts
|
Subset of the
July 2005 Appendix A. Compliance Procedure and Compliance ListListed in this Appendix are the requirements for the compliance statement from the supplier of the Motion Control Function Blocks. The compliance statement consists of two main groups: supported data types (see Appendix A 2) and supported Function Blocks, in combination with the applicable inputs and outputs (see Appendix A 3 Overview of the Function Blocks and its paragraphs). The supplier is required fill out the tables for the used data types and Function Blocks, according to their product, committing their support to the specification.By submitting these tables to PLCopen, and after approval by PLCopen, the list will be published on the PLCopen website, www.plcopen.org , as well as a shortform overview, as specified in Appendix A 2 and Appendix A 3 Overview of the Function Blocks. In addition to this approval, the supplier is granted access and usage rights of the PLCopen Motion Control logo, as described in chapter Appendix A 4 The PLCopen Motion Control Logo and Its Usage. Data types The data type REAL listed in the Function Blocks and parameters (e.g. for velocity, acceleration, distance, etc.) may be exchanged to SINT, INT, DINT or LREAL without to be seen as incompliant to this standard, as long as they are consistent for the whole set of Function Blocks and parameters. Implementation allows the extension of data types as long as the basic data type is kept. For example: WORD may be changed to DWORD, but not to REAL. Function Blocks and Inputs and Outputs An implementation which claims compliance with this PLCopen specification shall offer a set of Function Blocks for motion control, meaning one or more Function Blocks, with at least the basic input and output variables, marked as B in the tables. These inputs and outputs have to be supported to be compliant. For higher-level systems and future extensions any subset of the extended input and output variables, marked as E in the tables can be implemented. Vendor specific additions are marked with V, and can be listed as such in the supplier documentation. - Basic input/output variables are mandatory Marked in the tables with the letter B - Extended input /output variables are optional Marked in the tables with the letter E - Vendor Specific additions Marked in the vendors compliance documentation with V All the vendor specific items will not be listed in the comparison table on the PLCopen website, but in the detailed vendor specific list, which also is published. All vendor specific in- and outputs of all FBs must be listed in the certification list of the supplier. With this, the certification listing from a supplier describes all the I/Os of the relevant FBs, including vendor-specific extensions, and thus showing the complete FBs as used by the supplier. Appendix A 1. Statement of Supplier
|
Supplier name |
Eckelmann AG |
Supplier address |
Berliner Straße 161 |
City |
Wiesbaden
|
Country |
Germany |
Telephone |
+49 (0)611-7103-0 |
Fax |
+49 (0)611-7103-133 |
Email address |
info@eckelmann.de |
Product Name |
EMC55 |
Product version |
V1.17 |
Release date |
October 2005
|
Defined datatypes with MC library:
|
Supported
|
If not supported, which datatype used
|
BOOL |
Yes |
|
INT |
Yes |
|
WORD |
Yes |
|
REAL |
No |
LREAL |
ENUM |
Yes |
|
Derived datatypes:
|
Where used
|
Supported
|
Which structure
|
Axis_Ref |
Nearly all FBs |
Yes |
TYPE AXIS_REF : WORD; END_TYPE |
MC_Direction (extended) |
MC_MoveAbsolute MC_MoveVelocity |
Yes |
TYPE MC_Direction :
( MD_NEGATIV_E := -1, MD_POSITIV_E := 1, MD_SHORTEST_WAY_E := 2 ); END_TYPE |
MC_TP_REF |
MC_PositionProfile |
Yes |
TYPE MC_TP_REF : STRUCT NoOfRows: DWORD; TP_TablePtr: DWORD; END_STRUCT END_TYPE TP_TablePtr is a pointer to the table of the following type: ARRAY{0..NoOfRows-1] OF MC_TP_TR TYPE MC_TP_TR : STRUCT delta_time: LREAL; position: LREAL; interpolation: MC_PROFILE_INT_ART; END_STRUCT END_TYPE TYPE MC_PROFILE_INT_ART : ( PROFILE_INT_ART_LINEAR_E:=0, PROFILE_INT_ART_KUB_SPLINE_E:=1, PROFILE_INT_ART_QUINTIC_SPLINE_E:=2 ); END_TYPE |
MC_TV_REF |
MC_VelocityProfile |
Yes |
TYPE MC_TV_REF : STRUCT NoOfRows: DWORD; TV_TablePtr: DWORD; END_STRUCT END_TYPE TV_TablePtr is a pointer to the table of the following type: ARRAY{0..NoOfRows-1] OF MC_TV_TR TYPE MC_TV_TR : STRUCT delta_time: LREAL; position: LREAL; interpolation: MC_PROFILE_INT_ART; END_STRUCT END_TYPE TYPE MC_PROFILE_INT_ART : ( PROFILE_INT_ART_LINEAR_E:=0, PROFILE_INT_ART_KUB_SPLINE_E:=1, PROFILE_INT_ART_QUINTIC_SPLINE_E:=2 ); END_TYPE |
MC_TA_REF |
MC_AccelerationProfile |
Yes |
TYPE MC_TA_REF : STRUCT NoOfRows: DWORD; TA_TablePtr: DWORD; END_STRUCT END_TYPE TA_TablePtr is a pointer to the table of the following type: ARRAY{0..NoOfRows-1] OF MC_TA_TR TYPE MC_TA_TR : STRUCT delta_time: LREAL; position: LREAL; interpolation: MC_PROFILE_INT_ART; END_STRUCT END_TYPE TYPE MC_PROFILE_INT_ART : ( PROFILE_INT_ART_LINEAR_E:=0, PROFILE_INT_ART_KUB_SPLINE_E:=1, PROFILE_INT_ART_QUINTIC_SPLINE_E:=2 ); END_TYPE |
MC_CAM_REF |
MC_CamTableSelect |
Yes |
TYPE MC_CAM_REF : STRUCT NoOfRows: DWORD; CamPosPtr: DWORD; END_STRUCT END_TYPE CamPosPtr is a pointer to the table of the following type: ARRAY[0..NoOfRows-1] OF MC_POS_TR TYPE MC_POS_TR : STRUCT master: LREAL; slave: LREAL; interpol: MC_CAM_INT_ART; END_STRUCT END_TYPE TYPE MC_CAM_ART . ( CAM_INT_ART_LINEAR_E:=0, CAM_INT_ART_KUB_SPLINE_E:=1, CAM_INT_ART_QUINTIC_SPLINE_E:=2, CAM_INT_ART_BEZIER_E:= 3 ); END_TYPE |
MC_CAM_ID (extended) |
MC_CamTableSelect MC_CamIn |
Yes |
TYPE MC_CAM_ID : WORD; END_TYPE |
MC_StartMode (extended) |
MC_CamIn |
Yes |
TYPE MC_StartMode : (
STARTMODE_ABSOLUTE_E :=0, STARTMODE_RELATIVE_E :=1, STARTMODE_RAMP_IN_E :=2 ); END_TYPE |
MC_BufferMode |
Buffered FBs |
Yes |
TYPE MC_BufferMode : (
BM_ABORTING_E :=0, BM_BUFFERED_E :=1, BM_BLENDING_LOW_E :=2, BM_BLENDING_PREVIOUS_E :=3, BM_BLENDING_NEXT_E :=4, BM_BLENDING_HIGH_E :=5, BM_MASTER_POSITION_E :=6 ); END_TYPE |
|
|
|
|
Single Axis Function Blocks
|
Supported Yes / No
|
Comments (<= 48 char.)
|
MC_MoveAbsolute |
Yes |
|
MC_MoveRelative |
Yes |
|
MC_MoveAdditive |
Yes |
|
MC_MoveSuperimposed |
Yes |
|
MC_MoveVelocity |
Yes |
|
MC_Home |
Yes |
|
MC_Stop |
Yes |
|
MC_Power |
Yes |
|
MC_ReadStatus |
Yes |
|
MC_ReadAxisError |
Yes |
|
MC_Reset |
Yes |
|
MC_ReadParameter |
Yes |
|
MC_ReadBoolParameter |
Yes |
|
MC_WriteParameter |
Yes |
|
MC_WriteBoolParameter |
Yes |
|
MC_ReadActualPosition |
Yes |
|
MC_PositionProfile |
Yes |
|
MC_VelocityProfile |
Yes |
|
MC_AccelerationProfile |
Yes |
|
|
|
|
Multi-Axis Function Blocks
|
Supported Yes / No
|
Comments (<= 48 char.)
|
MC_CamTableSelect |
Yes |
|
MC_CamIn |
Yes |
|
MC_CamOut |
Yes |
|
MC_GearIn |
Yes |
|
MC_GearOut |
Yes |
|
MC_Phasing |
Yes |
|
If Supported |
MC_MoveAbsolute |
Sup. Y/N |
Comments |
VAR_IN_OUT
|
|||
B |
Axis |
Yes |
|
VAR_INPUT
|
|||
B |
Execute |
Yes |
|
B |
Position |
Yes |
|
E |
Velocity |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
E |
Direction |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT
|
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_MoveRelative |
Sup. Y/N |
Comments |
VAR_IN_OUT
|
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
Distance |
Yes |
|
E |
Velocity |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT
|
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_MoveAdditive |
Sup. Y/N |
Comments |
VAR_IN_OUT
|
|||
B |
Axis |
Yes |
|
VAR_INPUT
|
|||
B |
Execute |
Yes |
|
B |
Distance |
Yes |
|
E |
Velocity |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_MoveSuperimposed |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
Distance |
Yes |
|
E |
VelocityDiff |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_MoveVelocity |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
E |
Velocity |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E
|
Jerk
|
Yes
|
|
E
|
Direction |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
InVelocity |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_Home |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
Position |
Yes |
|
E |
HomingMode |
Yes |
|
E |
BufferMode |
No |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
E |
Active |
No |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_Stop |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
E |
BufferMode |
No |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
E |
Active |
No |
|
E |
CommandAborted |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_Power |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Enable |
Yes |
|
E |
Enable_Positive |
No |
|
E |
Enable_Negative |
No |
|
E |
BufferMode |
No |
|
VAR_OUTPUT |
|||
B |
Status |
Yes |
|
E |
Busy |
No |
|
E |
Active |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_ReadStatus |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Enable |
Yes |
|
VAR_OUTPUT |
|||
B |
Valid |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
B |
Disabled |
Yes |
|
B |
Errorstop |
Yes |
|
B |
Stopping |
Yes |
|
B |
StandStill |
Yes |
|
B |
DiscreteMotion |
Yes |
|
B |
ContinuousMotion |
Yes |
|
E |
SynchronizedMotion |
Yes |
|
E |
Homing |
Yes |
|
E |
ConstantVelocity |
Yes |
|
E |
Accelerating |
Yes |
|
E |
Decelerating |
Yes |
|
If Supported |
MC_ReadAxisError |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
|
Enable |
Yes |
|
VAR_OUTPUT |
|||
B |
Valid |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
B |
ErrorID |
Yes |
|
If Supported |
MC_Reset |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
B |
ErrorID |
Yes |
|
If Supported |
MC_ReadParameter |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Enable |
Yes |
|
B |
ParameterNumber |
Yes |
|
VAR_OUTPUT |
|||
B |
Valid |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
B |
Value |
Yes |
|
If Supported |
MC_ReadBoolParameter |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Enable |
Yes |
|
B |
ParameterNumber |
Yes |
|
VAR_OUTPUT |
|||
B |
Valid |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
B |
Value |
Yes |
|
Name
|
B/E
|
R/W
|
Sup. Y/N
|
Comments
|
CommandedPosition |
B |
R |
Yes |
|
SWLimitPos |
E |
R/W |
Yes |
|
SWLimitNeg |
E |
R/W |
Yes |
|
EnableLimitPos |
E |
R/W |
Yes |
|
EnableLimitNeg |
E |
R/W |
Yes |
|
EnablePosLagMonitoring |
E |
R/W |
No |
|
MaxPositionLag
|
E
|
R/W
|
No
|
|
MaxVelocitySystem |
E |
R |
Yes |
|
MaxVelocityAppl |
B |
R/W |
Yes |
|
ActualVelocity |
B |
R |
Yes |
|
CommandedVelocity |
B |
R |
Yes |
|
MaxAccelerationSystem |
E |
R |
Yes |
|
MaxAccelerationAppl |
E |
R/W |
Yes |
|
E |
R |
Yes |
|
|
MaxDecelerationAppl |
E |
R/W |
Yes |
|
MaxJerk |
E |
R/W |
Yes |
|
If Supported |
MC_WriteParameter |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
ParameterNumber |
Yes |
|
B |
Value |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
E |
Buffered |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_WriteBoolParameter |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
ParameterNumber |
Yes |
|
B |
Value |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
E |
Buffered |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_ReadActualPosition |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
VAR_INPUT |
|||
B |
Enable |
Yes |
|
VAR_OUTPUT |
|||
B |
Valid |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
B |
Position |
Yes |
|
If Supported |
MC_PositionProfile |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
B |
TimePosition |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
TimeScale |
Yes |
|
E |
PositionScale |
Yes |
|
E |
Offset |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_VelocityProfile |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
B |
TimeVelocity |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
TimeScale |
Yes |
|
E |
VelocityScale |
Yes |
|
E |
Offset |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_AccelerationProfile |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Axis |
Yes |
|
B |
TimeAcceleration |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
TimeScale |
Yes |
|
E |
AccelerationScale |
Yes |
|
E |
Offset |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_CamTableSelect |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Master |
Yes |
|
B |
Slave |
Yes |
|
B |
CamTable |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
E |
Periodic |
Yes |
|
E |
MasterAbsolute |
Yes |
|
E |
SlaveAbsolute |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
E |
CamTableID |
Yes |
|
If Supported |
MC_CamIn |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Master |
Yes |
|
B |
Slave |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
E |
MasterOffset |
Yes |
|
E |
SlaveOffset |
Yes |
|
E |
MasterScaling |
Yes |
|
E |
SlaveScaling |
Yes |
|
E |
StartMode |
Yes |
|
E |
CamTableID |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
InSync |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
E |
EndOfProfile |
Yes |
|
If Supported |
MC_CamOut |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Slave |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_GearIn |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Master |
Yes |
|
B |
Slave |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
RatioNumerator |
Yes |
|
B |
RatioDenominator |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
InGear |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_GearOut |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Slave |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
No |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|
If Supported |
MC_Phasing |
Sup. Y/N |
Comments |
VAR_IN_OUT |
|||
B |
Master |
Yes |
|
B |
Slave |
Yes |
|
VAR_INPUT |
|||
B |
Execute |
Yes |
|
B |
PhaseShift |
Yes |
|
E |
Velocity |
Yes |
|
E |
Acceleration |
Yes |
|
E |
Deceleration |
Yes |
|
E |
Jerk |
Yes |
|
E |
BufferMode |
Yes |
|
VAR_OUTPUT |
|||
B |
Done |
Yes |
|
E |
Busy |
Yes |
|
E |
Active |
Yes |
|
E |
CommandAborted |
Yes |
|
B |
Error |
Yes |
|
E |
ErrorID |
Yes |
|