
Communication between CPU’s can be done in different ways, we’ve already covered Put/Get. BSEND/BRCV gives you a little more control over when you want to receive information and when the sender wants to update information.
🎯What’s In This Post?
↗️BSEND Interface

The interface for the BSEND function block is not too dissimilar to the PUT function block:
- REQ – On positive edge, sends the data in SD_1 to the partner located at ID
- R – When
True, resets the connection between the partner CPU - ID – The ID of the partner
- R_ID – The ID of the Pairing between a BSEND/BRCV
- SD_1 – Pointer to the data that is to be sent (in this example, we’re just using a single variable)
- LEN – The length of the data to be sent. This allows for partial sending of structures for example. (If 0, all data is sent)
↘️BRCV Interface

he interface for the BRCV function block is not to dissimilar to the GET function block:
- EN_R – Enable receiving of Data when
True - ID – The ID of the partner
- R_ID – The ID of the Pairing between a BSEND/BRCV
- RD_1 – Pointer to the receiving area in which the data will be placed
- LEN – The length of the data received
🔒Additional Tip
[membership level=”4,1″]

It’s a good idea, when using the R_ID field, to start your pairing numbers at the same number as the ID.
In this example, our ID is 16#100 and our R_ID is 16#100. If we wanted to add a secondary paring of information for this PLC setup (between the same CPUs), we could then use 16#101 as the next R_ID.
If we wanted 1 of the CPUs to talk to a 3rd PLC, we could use the ID of 16#200 and repeat the process using a pairing (R_ID) if 16#200.
This approach helps save confusion over what the R_ID is used for and keeps it relative to the pairing
[/membership]
🧠BSEND/BRCV Logic
BSEND/BRCV work in pairs. Without a corresponding pairing, no information will be sent or received.
Because of this pairing, both sides of the communication setup can decide whether or not Sending / Receiving is possible at any one particular time.
For example, in the below short video, we can see that the GET_DATA.Counter variable is incrementing in PLC_1, and the SEND_Required variable is True on the REQ interface of the BSEND function block, but the information is not being received in PLC_2.
This is because the EN_R (Enable Receive) interface in PLC_2‘s BRCV function block is set to False
However…

REQ interface set to True, and BRCV’s EN_R set to True, but no update to the RD_1 Value….Even when we then set EN_R to True in PLC_2, no update occurs to the GET_DATA.Counter variable in PLC_2 (on the RD_1) interface…
This is because the BSEND‘s REQ interface is triggered on a Rising Edge Only. You must set it to False again between requests to send information.
Once the REQ is set to False and then back to True, the information updates

Note: The PLC is scanning and updating the value all the time, hence a small discrepancy between the two PLCs
We can see that the GET_DATA.Counter in PLC_2 has now updated.

