I see three solutions for your use case:
Use either Command Handler Template (NxCmdHandlerTemplate) or Exec Unit Template (NxExecUnitTemplate). Implement the device specific commands and manual functions. If you need it several times in your station, declare it as a subtree. If you need it several times in several stations, create an object with library.
Advantage: You can implement device specific commands and manual functions.
Disadvantage: You have to implement some things that are already included in the BasMove object.
Use the BasMove object and add your own manual function:
Advantage: Every programmer and service engineer directly sees that you have implemented something that does not use the default behaviour.
Disadvantage: You can't use the auto-generated HMI views and must create them manually.
Use the BasMove object and overwrite the method of the manual function (= your solution):
Advantage: Overwriting methods is real object orientated programming.
Disadvantage: Maybe only object developers understand whats happening in this case.
Regarding your source code of the manual function:
If BinIo._FakeOutput is connected to an BasMove parameter (OutBasePos/OutWorkPos), then you must not set this output manually in the PLC. Use the SetOutputs method according to documentation: If you directly set the output and enable the IO stability monitoring (parameter IoStableCheck), you will get an HMI event when manipulating an output manually.
_manStartTime must be set in step 0 (I have fixed this in your post in case somebody copies the source code). Instead of your own TON timer you could then just compare IF( ExecTimeMoveWorkPos >= T#2S ) ...
... View more