McePosTableRecalcQA

0.2.0

Recalculate the Queuing Amount.

Version history

0.2.0

  Rioual

Changes

Changed:
  • Replace posTableMode by allowQueuing
  • Replace nQAmax by QA_MAX as a constant
show full history

0.1.0-beta

  Rioual

Changes

Added:
  • initial version

Overview

kindnametypedefaultcomment
inputallowQueuingBOOLallow queuing the next motions
inputfirstMoveBOOLcalc first move after system was reset
inputstopAfterLastEntryBOOLcontinue to the start of PosTable when searching for the next Index and LoadIndex
in_outposTableMcePosTableDatatrajectory to be processed by PosTable
in_outQAINTallowed Queueing Amount; number of motions to queue (for smooth motion)
in_outlastEntryBOOLlast entry in process
in_outstopEntryBOOLentry with robot standstill (ActionID > 0) in process
in_outindexINTPosTable index for current motion

Details

allowQueuing

BOOL

Allow queuing the next motions.

valueexplanation
0QA is decreased at the end of each motion until 0
1QA is updated depending on the number of remaining entries until standstill

firstMove

BOOL

Must be True when calculating the first motion of the PosTable.

False otherwise.

stopAfterLastEntry

BOOL

Continue to the start of PosTable when searching for the next Index and LoadIndex if False.

Trajectory to be processed by PosTable.

QA

INT

The Queueing Amount is the number of motions allowed to be queued.

Queueing motion in advance is necessary for smooth motion.

lastEntry

BOOL

True if the last valid entry of the PosTable is in process.

stopEntry

BOOL

True if the current entry of the PosTable ends in a standstill. This means that an ActionID will be performed at the end of motion.

index

INT

The PosTable index is updated by this function.

Source code

Declarations

(*Recalculate the Queuing Amount*)
FUNCTION McePosTableRecalcQA

(*
 * -----------------------------------------------------------------------------
 * Name               : McePosTableRecalcQA
 * Version            : 0.2.0
 * Date               : 2024-02-29
 * Author             : Rioual
 * Family             : YaskawaMce
 * Organisation       : github.com/YaskawaEurope/mlx-examples
 * 
 * -----------------------------------------------------------------------------
 * Recalculate the Queuing Amount
 * -----------------------------------------------------------------------------
 *)

VAR_INPUT
  allowQueuing : BOOL; (*allow queuing the next motions*)
  firstMove : BOOL; (*calc first move after system was reset*)
  stopAfterLastEntry : BOOL; (*continue to the start of PosTable when searching for the next Index and LoadIndex*)
END_VAR

VAR_IN_OUT
  posTable : McePosTableData; (*trajectory to be processed by PosTable*)
  QA : INT; (*allowed Queueing Amount; number of motions to queue (for smooth motion)*)
  lastEntry : BOOL; (*last entry in process*)
  stopEntry : BOOL; (*entry with robot standstill (ActionID > 0) in process*)
  index : INT; (*PosTable index for current motion*)
END_VAR

VAR
  nPosTableSize : INT; (*number of entries*)
  nEntriesRemaining : INT; (*number of entries remaining*)
END_VAR

VAR CONSTANT
  QA_MAX : INT := LIMIT(1, GVL.NR_OF_INSTANCES - 1, 20); (*max Queueing Amount; max number of motions which can be queued*)
END_VAR

Logic

nPosTableSize := UINT_TO_INT(SIZEOF(posTable) / SIZEOF(posTable.stEntry[0]));

// -----------------------------------------------------------------------------
// calculate remaining entries until standstill
// -----------------------------------------------------------------------------
nEntriesRemaining := McePosTableRemainingEntries( index := index,
                                                  posTableSize := nPosTableSize,
                                                  rollOver := NOT stopAfterLastEntry,
                                                  posTable := posTable);


// -----------------------------------------------------------------------------
// bitstatus last entry / stop entry
// -----------------------------------------------------------------------------
lastEntry := FALSE;
stopEntry := FALSE;
IF (nEntriesRemaining <= 0) THEN
  IF (posTable.stEntry[index].nActionID > 0) THEN
    stopEntry := TRUE;
    // special case: the stopEntry is also the lastEntry
    lastEntry := (McePosTableFindEntry(index, 1, nPosTableSize, FALSE, posTable) = - 1 );
  ELSE
    lastEntry := TRUE;
  END_IF;
END_IF;


// -----------------------------------------------------------------------------
// calculate Queueing Amount (allowed number of motions to be queued)
// -----------------------------------------------------------------------------
// scenario 1; reduce QA till zero now
IF NOT allowQueuing THEN
  QA := QA - 1;
ELSE
  // scenario 2; reduce QA till zero by synchronizing to nEntriesRemaining
  IF (nEntriesRemaining < QA_MAX) THEN
    QA := nEntriesRemaining;
  // scenario 3; use max QA
  ELSE
    QA := QA_MAX;
  END_IF;
END_IF;

IF firstMove OR (QA < 0) THEN
  QA := 0;
END_IF;

Implementation

Snippet of the function call:
McePosTableRecalcQA(
  allowQueuing := , 
  firstMove := , 
  stopAfterLastEntry := , 
  posTable := , 
  QA := , 
  lastEntry := , 
  stopEntry := , 
  index := );

Pages built with Hugo - 23 Apr 2024 11:54 CEST