First off, if you want to use process flow to transport items from the racks you should deactivate the currently implemented 3d-logic. Otherwise you are likely going to end up with conflicting orders and errors.
Then you have to configure the process flow correctly.
Source:
The first three columns always denote the arrival time the name of the tokens and the quantity to create at that time. The name doesn't really matter here, the quantity should best be one (later more as to why) and the product quantity and type should be label columns, so the value get written to the tokens as labels.
In my opinion it's better to create one token with a product quantity label than multiple tokens with each representing a single item. This will make it easier to load multiple items at a time.
List:
The items need to actually be pushed to the list you are trying to pull them from. This could be done in the "On Entry" trigger of the racks or the "Send to Port" option. (Since you are replacing the 3d logic, this won't be needed for anything else.)
Pull From List:
The quantity you pull from the list can be given by a label on the token. Use the query field to only pull items of the correct type. Make sure that the label names you create on the token match the names you enter into these options. What "puller" refers to can be set in the respective field further down, in this case it's the token.
When pulling multiple entries from a list, the label you assign them to will become an array. You can refer to any value in the array with "token.pulled[index]". The number of entries can be read with "token.pulled.length".
Sub Flow:
Now you can run the load sub flow as many times as there are entries in this array (or you limit it by the capacity of the transport and loop back when there are more items to collect). Each sub flow token should be assigned a single item it's responsible for. This can be done at the bottom of the activity. "creationRank" is incremented for each sub flow token, so the first will have a rank of 1, the second 2 and so on, assigning each one a unique item from the array.

Finally, check if all task executer, item and destination references in the load, travel and move activities are correct and the logic should work.
Addendum:
To limit how many items a transport will load at a time the logic could look something like this:


"Math.min(...)" will return either 4 or the number of entries in the array label, whichever is smaller, effectively limiting the quantity to 4. "token.pulled.pop()" returns the last entry of the array and removes it at the same time. This way, items that are already accounted for will be removed from the array.
The unloading/moving is now also done in a sub flow. Because the items can't be referenced through the "pulled" label (we only load a subset and remove the entries from the label), you could instead simply use the number of number of loaded items ("token.montecargas.subnodes.length") to define the quantity and have each sub flow token move the last loaded item ("token.montecargas.last").


Then you can check if the array is empty or not later. If not, the token loops back to the sub flow.
