The SEND/RECEIVE communication is a communication between two blocks on both sides.
A calls SEND to send a data-buffer to B.
B receives the data with RECEIVE, and writes it into the specified data-area. The data-area is specified by B.
A calls WRITE to send a data-buffer to B, it says write it to data-area XY.
B calls only a WRITE passive. The data-area is specified by A.
With FETCH/WRITE the partner who is calling the active blocks can read / write any data area from / to the partner. With SEND/RECEIVE both partners have full control which data can be accessed.
If you have to access many different data areas (DB, M, I, Q), you can use FETCH/WRITE, or you can use SEND/RECEIVE, and pack the data together into a single datablock.