I just copied the code-block (right click on Tokenize task in my Project Browser to bring up context menu, selected Copy Code Block), then pasted it below. I would definitely recommend IMPORTING this into a NEW PROJECT (File->Import->Project) and then tweaking it, then copy/pasting it into YOUR project.
For example, I use SS1 as the "Line" (the input to the Tokenize function). You may want to use a different source STRING element. It's a little heavy on documentation, but that's a good thing.

This includes symbolic constants (e.g. NEVER_YIELD is the decimal constant 65,535) They're still a constant, but have a human readable name). There's also a nickname for an array index (V100).
Also, my Tokens block of STRINGs is STRING32, meaning they are up to 32 characters long, so no single token can be longer than 32 characters. You may want to tweak that.
So, before you do ENTASK Tokenize from the "calling" code-block with an edge-triggered, just stick the "line" into SS1. Then look at Tokenize.Done (it probably will take multiple scans) and look at V100 to see how many tokens there are in the Tokens STRING data-block, then look at Tokens0 thru Tokens[V100-1] (although you can't do negative offsets, just positive offsets, e.g. R[V10+6]), so you'll need to "calculate" the last index (V100-1) and stick that in another V.
Let me know if you have any problems importing it or if you have any questions on its behavior.
// Do-more Designer Clip Source Project: C:\Do-more Designer\Projects\~DmD11 Format: Do-more Designer 2.00+ DO-MORE Ladder
PLC H2-DM1E
$TSK Tokenize
#BEGIN COMMENT
"Support AT RUNTIME an unknown maximum number of tokens (see Tokens STRING data block)."
""
"Copy command line string to a ""working"" RemainderOfLine string which we will extract tokens from."
""
"Initialize our loop index (index to Tokens array)"
""
"Initialize our LoopToggle bit to ON (necessary in order to process EDGE-TRIGGED instructions from INSIDE a LOOP within the SAME LADDER SCAN)."
""
"Clear the White Space Found/Not Found flags."
#END
STRCLEAR Tokens0 D99
MEMCOPY SS1 SS99 0x20000 1
MOVE 0 V100
SET C1
RSTR C98 C99
#BEGIN COMMENT
"Just in case somebody has messed with this task's .TimeSlice member value and made me NEVER yield, let me yield every 100 micro seconds during this ""time consuming"" string manipulation/tokenization code."
#END
STRE Tokenize.TimeSlice NEVER_YIELD
MOVE 100 Tokenize.TimeSlice
#BEGIN COMMENT
"This looks like an infinite loop, but the loop termination logic is INSIDE the loop (look for BREAK statement)"
#END
WHILE ST1
#BEGIN COMMENT
"If there's no more tokens to process, we're done."
"Or if the number of tokens in this line exceeds our capacity, we're done too."
#END
STRE SS99.Length 0
ORGE V100 D99
BREAK
#BEGIN COMMENT
"Because we're dealing with edge-triggered instructions inside a loop (this is the cause of all those PROGRAM CHECK WARNINGS!), just do this work ""every other time"" through the loop. The LoopToggle bit makes this a little easier."
#END
STR C1
MOVE 0 D97
STRFIND SS99 0x2 D97 C99 C98 """ $09$0D$0A"""
#BEGIN COMMENT
"If we found whitespace, extract everything up to (but not including) the space and put it in the current Token."
""
"Since we're only executing REAL logic ""every other time"" through this loop because of the edge-triggered instructions, actively CLEAR the White Space Found flag."
""
"Now remove the extracted token from the line. We also don't want the found White Space to be included, so increment the White Space Index value to move PAST the white space character, then use that as the ""starting point"" of the ""remainder of the line""."
""
"Conditionally, we want to ONLY use tokens that are NOT empty (e.g. a line with 5 spaces together, we need to ""eat"" those). So, if the extacted token is empty, do NOT bother incremementing our ""current token"" index. Code-wise, that means if we DO have a token string (i.e. its length is > 0), go ahead and increment the current index of our Tokens array."
#END
STR C99
STRSUB SS99 0 0x0 D97 Tokens[V100]
RST C99
INC D97
STRSUB SS99 D97 0x0 -1 SS99
ANDGT Tokens[V100].Length 0
INC V100
#BEGIN COMMENT
"If White Space was NOT found, that means that we're on the last token, all the way to the end of the line. So just put the Remainder of the Line into the current Token."
""
"One of our termination conditions is that there's no more work to do (Remainder of Line is empty), since we know we just processed our last token, just clear the Remainder of Line string!"
""
"For completeness, reset the White Space NOT Found flag."
""
"Even though we found no white space, we don't want to count empty tokens in our token count, so again, for completeness-sake, increment the token count if there is something in the current token."
#END
STR C98
STRPRINT Tokens[V100] 0x0 "SS99"
STRCLEAR SS99 1
RST C98
ANDGT Tokens[V100].Length 0
INC V100
#BEGIN COMMENT
"Toggle our Loop Toggle bit!"
#END
STRN C1
OUT C1
WEND
#BEGIN COMMENT
"Edge Triggered TASKs are like subroutines, once the program counter reaches the bottom, the task is done! No EXIT to call. Even this END statement is optional (if END does not exist, the end is the last non-NOP). But the END coil can be used to divide logic between ""used vs. unused code"". Here, I needed it so I could have this rung comment (you should not put rung comments on trailing NOP rungs since they technically do not exist)."
#END
END
$TSKEND Tokenize
#BEGIN MEM_CONFIG
Tokens STRING32 decimal 10 -1
Tokenize TASK 0
#END
#BEGIN ELEMENT_DOC
"C98","WSNotFound","",""
"SS99","RemainderOfLine","",""
"C99","WSFound","",""
"D97","WSIndex","",""
"V100","TokenizeIndex0","",""
"SS1","Line","",""
"D99","MaxNumTokens","",""
"C1","LoopToggle","",""
"SK","NEVER_YIELD","65535",""
#END