I'm just going to repackage stuff that's already been said. I hope it helps.
The single most important difference between MOV and COP is that MOV performs data type conversion and COP does not. This applies to the SLC, PLC5, MicroLogix and ControlLogix equally. The functionality is the same.
As an example, we will use MOV to move F8:0 to N7:0. F8:0 has a value of 5.2. N7:0 will end up with a value of 5. The processor took the floating point value and moved it to the integer data location while converting it from a floating point number (32-bit value with a 24-bit mantissa and an 8-bit exponent) to an integer (16-bit number) and enforcing it's specific rounding rules. If the number wouldn't fit in the integer (like a value of 100,000), the processor will put a specific value in the integer location (I believe in this case it would be 32,767) and set specific status file flags to indicate the value was too big as part of the range checking that comes along with the MOV instruction. MOV works very well if you are either moving values between the same type of data element (integer to integer, float to float, etc) or if you are moving a float that you know will be in a certain range into an integer, for example to display on an HMI.
COP doesn't perform type conversion. So if you always copy source data to like destination data (integer to integer, float to float, etc) then COP is nothing more than a multiple word MOV as far as you are concerned. However, the wild power of COP is when it operates on dissimilar data types. It just takes the byte pattern from the source and copies it into the destination. So after a copy, while source may have made sense before, the destination value may not make sense. Keep in mind that a floating point number is not just an integer with pre-specified formatting. It is a completely different way of representing numbers. So a bit pattern that defines a specific integer will NOT give you the same floating point number but with a moved decimal point.
Data transfers via DeviceNet are a good example of this. As far as DeviceNet is concerned you can only transfer integers. The data just come in in a big block and you need to sort them out. However, some devices, motion controllers for example, may need to transfer floating point data. How does the motion controller transfer the floating point value and how you get this value back on the plc side? The COP command is the easiest way. For example, assume a floating point number is coming into the PLC in the first two integers of a DeviceNet transfer. Keep in mind that the first two integers contain the total bit pattern for the one floating point value you are transferring (16 bits per integer versus 32 bits per float). We will further specify that the DeviceNet data block starts at N7:0 and we want the float to appear in F8:0. If you try to MOV N7:0 to F8:0, all you will get is the integer value in N7:0 as a float in F8:0. We know this can't be right because we know that the true float, being 32 bits, is contained in both N7:0 AND N7:1. So we use COP:
COP(#N7:1, #F8:0, 1)
This will take the byte pattern from N7:0 and N7:1 and copy them directly into the byte locations for F8:0. No type conversion. No range checking. Just a raw byte-for-byte transfer. Most importantly for us we now have the desired byte pattern correctly displayed in a data type we can use.
Like I said, this is just repackaged info from before. If you are not using dissimilar data types in your COP instructions none of this will matter. However, if you are mixing data types you need to know this stuff.
Keith