The need for overloading would be my first guess. I don’t agree with it being a reason to hold out on the feature. If engineers are eager to learn and build interesting stuff, let them. For everyone else, the baked-in functions should suffice.
MOV, for example, is actually several distinct functions that are called depending on the types of parameters passed.
There’s code behind each of these that behave in different ways:
MOV(REAL, REAL);
MOV(INT literal, DINT);
MOV(DINT, SINT);
MOV(DINT, DINT);
… and so on. It’s also why MOV(BOOL, DINT) isn’t a thing - it just wasn’t defined. Could someone overload it to provide a working form? Sure.
What we have to settle for are creating or encountering AOIs like “DINT_to_REAL(…)” and on and on.
If one were to write their own version of ADD(), they’d have a bit of work ahead of them to handle type combinations, testing, etc. They would however also be to do neat stuff like ADD(UDT1, UDT1).
But then you’ve got the modern hotshot C++ programmer that wants to template every little thing and then they’d suddenly want template support for every little thing in Logix. I say that as a C++ engineer wanting more language features in Logix.