A subroutine is a block of code that doesn't have to return a value. A function is a subroutine (a block of code) that does return a value.
Say you have a program with some subroutine:
stuff;
call the subroutine;
more stuff;
So the program is going to do stuff, and then the subroutine is called. It's going to jump to the subroutine and run that block of code. Once it's done going through the subroutine, it'll jump back to the program and do more stuff.
Lets say that our subroutine is now a function. Returning a value means that means that once the program is done running the subroutine code, when it's jumping back to the program, it's also going to pass a value back to the program. The program will then be able to use this value.
Say we have some function temperature() defined, and it returns an integer value. If we were to define a variable as aVariable = temperature(parameter1, parameter2), it's value would be set to whatever integer that function returned. Or if you had something like 'print temperature(parameter1, parameter2)', then it would print the integer value that the function returned.
There's also the built-in functions of programming languages that you've probably been using too, which also return values. An example of a built-in function might be something that you pass an array to, and then it will count and return the number of elements in that array.
Study design wise, this comes under the dot point "processing features of programming languages, including instructions, procedures, methods, functions and control structures". Note that a procedure is a synonym for a subroutine.