PyFactoryIO is a Python library that provides a high-level, modular Modbus interface for interacting with Factory I/O. It allows you to easily connect your Python control logic to Factory I/O simulations, abstracting away the low-level Modbus TCP communication and mapping digital/register inputs and outputs by name.
- Easy Configuration: Map Factory I/O sensors and actuators using descriptive names instead of Modbus addresses.
- Event-Driven & Loop-Based Execution: Provides decorators to run callbacks on state changes, or a continuous control loop for cyclic execution.
- Auto-Mapping: Automatically handles Modbus coils, discrete inputs, holding registers, and input registers.
- Lightweight: Built on top of
pyModbusTCP.
You can install pyfactoryio directly via pip:
pip install pyfactoryioEnsure Factory I/O is configured to use the Modbus TCP Server driver. By default, PyFactoryIO listens on 127.0.0.1 port 5020.
Here is a simple example demonstrating how to read a sensor and trigger an actuator.
from pyfactoryio import FactoryIOServer
# Define your input and output names in the order they appear in Factory I/O
DI_NAMES = ["Sensor_1", "Start_Button"]
DO_NAMES = ["Conveyor", "Warning_Light"]
# Initialize the server
server = FactoryIOServer(
di_names=DI_NAMES,
do_names=DO_NAMES
)
# Example 1: Event-driven callback
@server.on_change("Start_Button")
def on_start_pressed(value):
if value:
print("Start button pressed!")
server.Conveyor = True
else:
print("Start button released!")
server.Conveyor = False
# Example 2: Continuous control loop
def my_logic(srv):
# This function is called continuously by run_loop
if srv.Sensor_1:
srv.Warning_Light = True
else:
srv.Warning_Light = False
if __name__ == "__main__":
# Start the event loop (e.g., at 10Hz)
server.run_loop(logic_func=my_logic, hz=10)A more advanced example demonstrating a robust state machine for a Two-Axis Pick & Place robot. It uses a retroreflective sensor to detect incoming items, a vision sensor to determine their color, and automatically feeds the conveyor belt while sorting items to the left or right belts.
See the full implementation in sorting_robot.py.
- di_names: Digital Inputs (Sensors, Buttons) - Read from Factory I/O via Coils.
- do_names: Digital Outputs (Conveyors, Lights) - Written to Factory I/O via Discrete Inputs.
- ri_names: Register Inputs (Analog Sensors) - Read from Factory I/O via Holding Registers.
- ro_names: Register Outputs (Analog Actuators) - Written to Factory I/O via Input Registers.
This project is licensed under the MIT License.