Function Block Diagram
A diagram builds logic from blocks joined by wires. Values flow left to right: tags in, functions in the middle, tags out.

When to use it
Use a diagram for a signal path: combine inputs, compare a value, time it. Each signal is a wire you can follow.
Use ladder for rungs that read like a wiring drawing, and a chart when the order matters most. All three can share tags in one program.
Create a diagram
- Stop the PLC.
- In Project Explorer, right-click a program or its Routines folder and choose New Routine…
- Type a name. Under Language, choose Function Block Diagram (FBD), then Create routine.
- Drag a block from the palette onto the grid, or focus it and press Enter. It arrives unbound, shown as
?. - Select the block and choose its tag.
- Drag from an output to an input to draw a wire. Select a wire and choose Disconnect to remove it.
Ladder instructions without a diagram block
- XIC (XIC)
- Use a READ block on the BOOL tag; the wire is the contact.
- XIO (XIO)
- Use a READ block on the BOOL tag followed by NOT.
- OTE (OTE)
- Use a WRITE block on the BOOL tag; it writes its input every evaluation, as a coil does.
- MOVE_VALUE (MOVE_VALUE)
- A wire from a READ block to a WRITE block is the move.
- CALL_ROUTINE (CALL_ROUTINE)
- Calling a routine from inside a diagram is not in FBD v1.
- STRING_LENGTH (STRING_LENGTH)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_EXTRACT_START (STRING_EXTRACT_START)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_EXTRACT_END (STRING_EXTRACT_END)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_EXTRACT_RANGE (STRING_EXTRACT_RANGE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_CONCATENATE (STRING_CONCATENATE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_INSERT_AFTER (STRING_INSERT_AFTER)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_DELETE_RANGE (STRING_DELETE_RANGE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_REPLACE_RANGE (STRING_REPLACE_RANGE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_FIND_FIRST (STRING_FIND_FIRST)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- CHAR_TO_STRING (CHAR_TO_STRING)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_FIRST_CHARACTER (STRING_FIRST_CHARACTER)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_READ_CHARACTER (STRING_READ_CHARACTER)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_WRITE_CHARACTER (STRING_WRITE_CHARACTER)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- STRING_CAPACITY (STRING_CAPACITY)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_SINT_DECIMAL (FORMAT_SINT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_SINT_DECIMAL (PARSE_SINT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_INT_DECIMAL (FORMAT_INT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_INT_DECIMAL (PARSE_INT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_DINT_DECIMAL (FORMAT_DINT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_DINT_DECIMAL (PARSE_DINT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_LINT_DECIMAL (FORMAT_LINT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_LINT_DECIMAL (PARSE_LINT_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_REAL_DECIMAL (FORMAT_REAL_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_REAL_DECIMAL (PARSE_REAL_DECIMAL)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_DINT_HEX (FORMAT_DINT_HEX)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_DINT_HEX (PARSE_DINT_HEX)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FORMAT_DINT_BINARY (FORMAT_DINT_BINARY)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PARSE_DINT_BINARY (PARSE_DINT_BINARY)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- CHARACTER_TO_CODE (CHARACTER_TO_CODE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- CODE_TO_CHARACTER (CODE_TO_CHARACTER)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- MASKED_EQUAL (MASKED_EQUAL)
- Not available in FBD v1.
- LIM (LIM)
- Not available in FBD v1.
- MODULO (MODULO)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- NEGATE (NEGATE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- ABSOLUTE_VALUE (ABSOLUTE_VALUE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- SQUARE_ROOT (SQUARE_ROOT)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- CLEAR (CLEAR)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- COMPUTE (COMPUTE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- BITWISE_AND (BITWISE_AND)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- BITWISE_OR (BITWISE_OR)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- BITWISE_XOR (BITWISE_XOR)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- BITWISE_NOT (BITWISE_NOT)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- INTEGER_TO_PACKED_BCD (INTEGER_TO_PACKED_BCD)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PACKED_BCD_TO_INTEGER (PACKED_BCD_TO_INTEGER)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- SCALE_LINEAR (SCALE_LINEAR)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- MASKED_MOVE (MASKED_MOVE)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- COPY_ARRAY (COPY_ARRAY)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- FILL_ARRAY (FILL_ARRAY)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- DISTRIBUTE_BITS (DISTRIBUTE_BITS)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- PID (PID_LOOP)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- LABEL (LABEL)
- Routine and class calls are not in FBD v1.
- JUMP_TO_LABEL (JUMP_TO_LABEL)
- Routine and class calls are not in FBD v1.
- CALL_ROUTINE_WITH_ARGUMENTS (CALL_ROUTINE_WITH_ARGUMENTS)
- Routine and class calls are not in FBD v1.
- ROUTINE_ENTRY (ROUTINE_ENTRY)
- Routine and class calls are not in FBD v1.
- RETURN_FROM_ROUTINE (RETURN_FROM_ROUTINE)
- Routine and class calls are not in FBD v1.
- MASTER_CONTROL (MASTER_CONTROL)
- Routine and class calls are not in FBD v1.
- END_PROGRAM_SCAN (END_PROGRAM_SCAN)
- Routine and class calls are not in FBD v1.
- MQTT (MQTT_PUBLISH)
- Not in FBD v1. A wire from a READ block to a WRITE block moves a value.
- NOP (NOP)
- Routine and class calls are not in FBD v1.
- AFI (AFI)
- Routine and class calls are not in FBD v1.
- SELECT_FIRST_IN_FIRST_OUT (SELECT_FIRST_IN_FIRST_OUT)
- Routine and class calls are not in FBD v1.
- SELECT_ROUND_ROBIN (SELECT_ROUND_ROBIN)
- Routine and class calls are not in FBD v1.
- SELECT_GREEDY (SELECT_GREEDY)
- Routine and class calls are not in FBD v1.
The diagram above, block by block
READ, OR, NOT, AND and WRITE make a motor that stays on after Start is released.
- Place READ blocks for
StartPB,MotorRunandStopPB. - Wire
StartPBandMotorRuninto OR. ReadingMotorRunholds the motor on. - Wire
StopPBinto NOT. - Wire OR and NOT into AND, and AND into a WRITE for
MotorRun. - Run. Press
StartPB:MotorRunstays on untilStopPB.
Good to know
- Each input takes one wire. An output can feed several inputs.
- The number in a block's corner is its order in the scan.