Files
revpimodio2/docs/basics.rst
T
akira 3294c5e980 docs: Update documentation for improved clarity and consistency
Revised various sections across multiple documentation files to reflect
updated methods (`run_plc` replacing manual setup with `cycleloop`) and
adjust for new default parameters (e.g., `autorefresh`). Enhanced
descriptions for timers, Cycletools usage, and new method explanations.
Removed outdated or redundant examples and updated system requirements.

Signed-off-by: Sven Sager <akira@narux.de>
2026-02-17 12:05:58 +01:00

6.7 KiB

<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <style type="text/css"> /* :Author: David Goodger (goodger@python.org) :Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } .subscript { vertical-align: sub; font-size: smaller } .superscript { vertical-align: super; font-size: smaller } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { overflow: hidden; } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title, .code .error { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin: 0 0 0.5em 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left, .figure.align-left, object.align-left, table.align-left { clear: left ; float: left ; margin-right: 1em } img.align-right, .figure.align-right, object.align-right, table.align-right { clear: right ; float: right ; margin-left: 1em } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } table.align-center { margin-left: auto; margin-right: auto; } .align-left { text-align: left } .align-center { clear: both ; text-align: center } .align-right { text-align: right } /* reset inner alignment in figures */ div.align-right { text-align: inherit } /* div.align-center * { */ /* text-align: left } */ .align-top { vertical-align: top } .align-middle { vertical-align: middle } .align-bottom { vertical-align: bottom } ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font: inherit } pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } pre.code .literal.string, code .literal.string { color: #0C5404 } pre.code .name.builtin, code .name.builtin { color: #352B84 } pre.code .deleted, code .deleted { background-color: #DEB0A1} pre.code .inserted, code .inserted { background-color: #A3D289} span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic, pre.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } /* "booktabs" style (no vertical lines) */ table.docutils.booktabs { border: 0px; border-top: 2px solid; border-bottom: 2px solid; border-collapse: collapse; } table.docutils.booktabs * { border: 0px; } table.docutils.booktabs th { border-bottom: thin solid; text-align: left; } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } </style> </head>

Basics

Core concepts and fundamental usage of RevPiModIO.

Programming Paradigms

RevPiModIO supports two complementary programming approaches:

Cyclic Programming - Execute a function at regular intervals, similar to PLC programming.

  • Best for deterministic timing, state machines, and time-critical control

  • Runs your function every cycle (typically 20-50ms)

  • See :doc:`cyclic_programming` for details

    System Message: ERROR/3 (<stdin>, line 20); backlink

    Unknown interpreted text role "doc".

Event-Driven Programming - Register callbacks triggered by hardware state changes.

  • Best for user interactions, sporadic events, and system integration

  • Consumes CPU only when events occur

  • See :doc:`event_programming` for details

    System Message: ERROR/3 (<stdin>, line 26); backlink

    Unknown interpreted text role "doc".

Both approaches can be combined in a single application. See :doc:`advanced` for examples.

System Message: ERROR/3 (<stdin>, line 28); backlink

Unknown interpreted text role "doc".

Getting Started

Basic Instantiation

Create a RevPiModIO instance to access your hardware:

import revpimodio2

rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Your code here

rpi.exit()

Configuration Parameters

rpi = revpimodio2.RevPiModIO(
    autorefresh=True,    # Auto-sync process image (recommended)
    monitoring=False,    # Read-only mode
    syncoutputs=True,    # Load output values on init
    debug=False          # Enable debug messages
)

autorefresh - Automatically reads inputs and writes outputs. Set to True for most applications.

monitoring - Read-only mode. Use when monitoring without controlling hardware.

syncoutputs - Load current output values on startup. Prevents outputs from resetting.

debug - Enable debug logging for troubleshooting.

Cycle Timing

Default update rates depend on your hardware:

  • Core 1: 40ms (25Hz)
  • Core3/Connect: 20ms (50Hz)
  • NetIO: 50ms (20Hz)

Adjust cycle time to match your needs:

rpi = revpimodio2.RevPiModIO()
rpi.cycletime = 100  # Set to 100ms
rpi.autorefresh_all()

Important: Faster cycle times consume more CPU. Choose the slowest cycle time that meets your requirements. Default values will fit most needs.

Error Handling

Configure I/O error threshold:

maxioerrors = 10  # Raise exception after 10 errors

# Check error count
if rpi.core.ioerrorcount > maxioerrors:
    print("Warning: I/O errors detected")

Core Objects

rpi.io - Input/Output Access

Access all configured IOs from piCtory:

# Direct attribute access
value = rpi.io.button.value
rpi.io.led.value = True

# String-based access
rpi.io["button"].value

# Check existence
if "sensor" in rpi.io:
    print(rpi.io.sensor.value)

# Iterate all IOs
for io in rpi.io:
    print(f"{io.name}: {io.value}")

IO Properties

Each IO object has these properties:

  • .name - IO name from piCtory
  • .value - Current value (read/write)
  • .address - Byte address in process image
  • .type - IO type (INPUT=300, OUTPUT=301, MEMORY=302)
  • .defaultvalue - Default value from piCtory

rpi.core - System Control

Access Revolution Pi system features:

LED Control

# Using constants
rpi.core.A1 = revpimodio2.GREEN
rpi.core.A2 = revpimodio2.RED
rpi.core.A3 = revpimodio2.OFF

# Individual colors
rpi.core.a1green.value = True
rpi.core.a1red.value = False

System Status

# CPU information
temp = rpi.core.temperature.value
freq = rpi.core.frequency.value

# piBridge status
cycle_time = rpi.core.iocycle.value
errors = rpi.core.ioerrorcount.value

Watchdog

# Toggle watchdog
rpi.core.wd_toggle()

# Watchdog IO object
rpi.core.wd.value = True

See :doc:`advanced` for complete watchdog management examples.

System Message: ERROR/3 (<stdin>, line 179); backlink

Unknown interpreted text role "doc".

rpi.device - Device Access

Access specific hardware devices:

# By name
dio = rpi.device.DIO_Module_1

# By position
first = rpi.device[0]

# Iterate
for device in rpi.device:
    print(device.name)

Signal Handling

Graceful Shutdown

Handle SIGINT and SIGTERM for clean program termination:

rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Enable signal handling
rpi.handlesignalend()

# Run main loop
rpi.mainloop()

Custom Signal Handler

Implement custom cleanup logic:

def cleanup(signum, frame):
    print("Shutting down...")
    rpi.setdefaultvalues()
    rpi.exit()

rpi.handlesignalend(cleanup)
rpi.mainloop()

Simple Examples

Read Input, Control Output

import revpimodio2

rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Read input and control output
if rpi.io.button.value:
    rpi.io.led.value = True
else:
    rpi.io.led.value = False

rpi.exit()

LED Control

import revpimodio2

rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Control status LEDs
rpi.core.A1 = revpimodio2.GREEN
rpi.core.A2 = revpimodio2.RED

rpi.exit()

Iterate All IOs

import revpimodio2

rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Print all IOs and their values
for io in rpi.io:
    print(f"{io.name}: {io.value}")

rpi.exit()

Best Practices

Use Descriptive IO Names

Configure descriptive names in piCtory:

# Good - Clear intent
if rpi.io.emergency_stop.value:
    rpi.io.motor.value = False

# Poor - Generic names
if rpi.io.I_15.value:
    rpi.io.O_3.value = False

Always Clean Up

Always call rpi.exit() to clean up resources:

rpi = revpimodio2.RevPiModIO(autorefresh=True)

try:
    # Your code here
    pass
finally:
    rpi.exit()

Check IO Existence

Verify IOs exist before accessing:

if "optional_sensor" in rpi.io:
    value = rpi.io.optional_sensor.value
else:
    print("Sensor not configured")

See Also

  • :doc:`cyclic_programming` - Cyclic programming patterns

    System Message: ERROR/3 (<stdin>, line 329); backlink

    Unknown interpreted text role "doc".

  • :doc:`event_programming` - Event-driven programming patterns

    System Message: ERROR/3 (<stdin>, line 330); backlink

    Unknown interpreted text role "doc".

  • :doc:`advanced` - Advanced topics and best practices

    System Message: ERROR/3 (<stdin>, line 331); backlink

    Unknown interpreted text role "doc".

  • :doc:`api/index` - API reference

    System Message: ERROR/3 (<stdin>, line 332); backlink

    Unknown interpreted text role "doc".

</html>