Skip to content

PLC Writer

Class: PLCWriterBlockV1

Source: inference.enterprise.workflows.enterprise_blocks.sinks.plc.v1.PLCWriterBlockV1

The PLC Writer block writes a single tag value to a PLC. To write several tags, add one PLC Writer block per tag (each is its own request to the PLC).

This block can reach the PLC three ways, selected by Connection mode in the advanced section:

  • Roboflow PLC Relay (default): sends tags to the on-device PLC Relay service over HTTP. The relay owns the protocol (Allen-Bradley, Modbus, or Siemens S7), the device IP, and the tag schema, so the same Workflow runs unchanged across devices. Tags are sent in a single batch request per frame over a persistent keep-alive connection (high FPS).
  • Direct (EtherNet/IP): connects straight to the PLC with pylogix. Tags are addressed by name (e.g. Program:MainProgram.Tag1).
  • Direct (Modbus TCP): connects straight to the PLC with pymodbus. Tags are addressed as area:address (holding:100, coil:0, input:5, discrete:2); a bare number defaults to a holding register.

Address is the relay host in relay mode, or the PLC's IP address in either direct mode. The advanced section exposes the relevant extras per mode (relay port, processor slot, Modbus port / unit id).

On any failure the error is logged and that tag's entry in the output is set to "ReadFailure" / "WriteFailure"; error_status is True if any tag failed.

Type identifier

Use the following identifier in step "type" field: roboflow_core/plc_writer@v1to add the block as as step in your workflow.

Properties

Name Type Description Refs
name str Enter a unique identifier for this step..
tag str The single PLC tag to write. Relay and Direct (EtherNet/IP) modes use a tag name (e.g. camera_fault); Direct (Modbus TCP) mode uses area:address (holding:100, coil:0; a bare number is a holding register, and only holding registers and coils are writable, not the read-only input / discrete areas). To write several tags, add one PLC Writer block per tag..
value Union[bool, float, int, str] The value to write to the tag. May be a fixed value or a reference to a workflow input or a previous step's output. Must be a boolean, integer, or float, except Direct (EtherNet/IP) mode, which also accepts strings (for Logix STRING tags)..
ip_address str Address of the PLC Relay (relay mode) or of the PLC itself (direct modes). A bare host/IP is accepted; in relay mode a full URL may also be given..
connection_mode str How to reach the PLC: through the on-device PLC Relay, or directly over EtherNet/IP or Modbus TCP..
relay_port int Port of the PLC Relay service (relay mode)..
request_timeout int Read timeout in seconds for each request to the PLC Relay service (relay mode). This must cover the relay's synchronous PLC batch transaction, which can run for seconds against a slow or disconnected PLC (especially Modbus / S7); if it is exceeded the request is abandoned and every tag in the batch is reported as a failure. Raise it for slow or flaky PLCs. (Connecting to the relay itself uses a separate short timeout, so a down relay still fails fast.).
processor_slot int EtherNet/IP processor slot of the PLC (direct EtherNet/IP mode)..
modbus_port int Modbus TCP port of the PLC (direct Modbus mode)..
modbus_unit_id int Modbus unit / slave id of the PLC (direct Modbus mode)..
disable_sink bool If True, skip the write to the PLC and return an empty result..

The Refs column marks possibility to parametrise the property with dynamic values available in workflow runtime. See Bindings for more info.

Available Connections

Compatible Blocks

Check what blocks you can connect to PLC Writer in version v1.

Input and Output Bindings

The available connections depend on its binding kinds. Check what binding kinds PLC Writer in version v1 has.

Bindings
  • input

    • tag (string): The single PLC tag to write. Relay and Direct (EtherNet/IP) modes use a tag name (e.g. camera_fault); Direct (Modbus TCP) mode uses area:address (holding:100, coil:0; a bare number is a holding register, and only holding registers and coils are writable, not the read-only input / discrete areas). To write several tags, add one PLC Writer block per tag..
    • value (*): The value to write to the tag. May be a fixed value or a reference to a workflow input or a previous step's output. Must be a boolean, integer, or float, except Direct (EtherNet/IP) mode, which also accepts strings (for Logix STRING tags)..
    • depends_on (*): Optional reference to a step this write should run after, for when the write order matters but the tag/value are not themselves derived from that step. Dependencies are otherwise inferred from selector-valued tag / value, so this is not needed for input- or step-driven writes..
    • ip_address (string): Address of the PLC Relay (relay mode) or of the PLC itself (direct modes). A bare host/IP is accepted; in relay mode a full URL may also be given..
    • relay_port (integer): Port of the PLC Relay service (relay mode)..
    • request_timeout (integer): Read timeout in seconds for each request to the PLC Relay service (relay mode). This must cover the relay's synchronous PLC batch transaction, which can run for seconds against a slow or disconnected PLC (especially Modbus / S7); if it is exceeded the request is abandoned and every tag in the batch is reported as a failure. Raise it for slow or flaky PLCs. (Connecting to the relay itself uses a separate short timeout, so a down relay still fails fast.).
    • processor_slot (integer): EtherNet/IP processor slot of the PLC (direct EtherNet/IP mode)..
    • modbus_port (integer): Modbus TCP port of the PLC (direct Modbus mode)..
    • modbus_unit_id (integer): Modbus unit / slave id of the PLC (direct Modbus mode)..
    • disable_sink (boolean): If True, skip the write to the PLC and return an empty result..
  • output

    • write_result (string): String value.
    • error_status (boolean): Boolean flag.
Example JSON definition of step PLC Writer in version v1
{
    "name": "<your_step_name_here>",
    "type": "roboflow_core/plc_writer@v1",
    "tag": "camera_fault",
    "value": true,
    "depends_on": "$steps.some_previous_step",
    "ip_address": "127.0.0.1",
    "connection_mode": "relay",
    "relay_port": 8007,
    "request_timeout": 10,
    "processor_slot": 0,
    "modbus_port": 502,
    "modbus_unit_id": 1,
    "disable_sink": false
}