McePosTableRecalcQA

0.5.0

Recalculate the Queuing Amount.

Version history

0.5.0

  deGroot

Changes

Changed:
  • rename NR_OF_INSTANCES to POSTABLE_CMDS_UBOUND for consistency
show full history

0.4.1

  Rioual

Changes

Fixed:
  • rename NR_OF_INSTANCES in INSTANCES_UBOUND (only relevant for Siemens)

0.4.0

  Rioual

Changes

Changed:
  • conditions are passed as an input instead of in_out
  • Use conditionsOK instead of hasCondition for waiting at the next entry

0.3.0

  Rioual

Changes

Added:
  • If the next valid entry has conditions, the current entry is a standstill

0.2.0

  Rioual

Changes

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

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
inputconditionsARRAY [0..GVL.CONDITIONS_UBOUND] OF BOOLbits used as start conditions for a PosTable entry
inputloadIndexINTindex for loading next motion(s)
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_outwaitBeforeNextEntryBOOLnext valid entry has start conditions
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.

conditions

ARRAY [0..GVL.CONDITIONS_UBOUND] OF BOOL

Bits used as start conditions for a PosTable entry.

If a PosTable entry has one or more bits in startConditions set to TRUE then the motion for that entry will not be started until the start conditions are satisfied.

  • Conditions are only checked for the TRUE state
  • If you need a condition to be checked for the FALSE state, you need to invert the connected signal outside of PosTable

loadIndex

INT

Index of the last loaded motion.

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.

waitBeforeNextEntry

BOOL

True if the next valid entry of the PosTable has start conditions.

index

INT

The PosTable index is updated by this function.

Source code

Declarations

(*Recalculate the Queuing Amount*)
FUNCTION McePosTableRecalcQA

(*
 * -----------------------------------------------------------------------------
 * Name               : McePosTableRecalcQA
 * Version            : 0.5.0
 * Date               : 2025-11-12
 * Author             : deGroot
 * 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*)
  conditions : ARRAY [0..GVL.CONDITIONS_UBOUND] OF BOOL; (*bits used as start conditions for a PosTable entry*)
  loadIndex : INT; (*index for loading next motion(s)*)
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*)
  waitBeforeNextEntry : BOOL; (*next valid entry has start conditions*)
  index : INT; (*PosTable index for current motion*)
END_VAR

VAR
  nPosTableSize : INT; (*number of entries*)
  nEntriesRemaining : INT; (*number of entries remaining*)
  i : DINT; (*index for FOR loops*)
  stConditionResult : McePosTableConditions; (*state if the next motion condition are satisfied*)
  nNextIndex : INT; (*next valid entry*)
END_VAR

VAR CONSTANT
  QA_MAX : INT := LIMIT(1, GVL.POSTABLE_CMDS_UBOUND, 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,
                                                  loadIndex := loadIndex,
                                                  posTableSize := nPosTableSize,
                                                  rollOver := NOT stopAfterLastEntry,
                                                  conditions := conditions,
                                                  posTable := posTable);


// -----------------------------------------------------------------------------
// bitstatus last entry / stop entry
// -----------------------------------------------------------------------------
lastEntry := FALSE;
stopEntry := FALSE;
waitBeforeNextEntry := FALSE;
IF (nEntriesRemaining <= 0) THEN
  MEMUtils.MemSet(pbyBuffer := ADR(stConditionResult), byValue := 0, dwSize := SIZEOF(stConditionResult));

  nNextIndex := McePosTableFindEntry(index, 1, nPosTableSize, NOT stopAfterLastEntry, posTable);
  IF nNextIndex >= 0 THEN
    stConditionResult := McePosTableCheckConditions(
      index := nNextIndex,
      posTableSize := nPosTableSize,
      conditions := conditions,
      posTable := posTable);
    waitBeforeNextEntry := NOT stConditionResult.bConditionsOk;
  ELSE
    waitBeforeNextEntry := FALSE;
  END_IF;
  
  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 );
  ELSIF NOT waitBeforeNextEntry THEN
    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 := , 
  conditions := , 
  loadIndex := , 
  posTable := , 
  QA := , 
  lastEntry := , 
  stopEntry := , 
  waitBeforeNextEntry := , 
  index := );

Pages built with Hugo - 14 Nov 2025 17:46 CET