Kombination Analoges und Digitales Signal

Für Themen rund um das Prozessabbild des RevPi Core
Post Reply
col-panic
Posts: 8
Joined: 19 May 2026, 17:08

Kombination Analoges und Digitales Signal

Post by col-panic »

Ich habe einen RevolutionPi mit mehreren AIO und DIO Modulen.

Es gibt den analogen Messwert

Code: Select all

IV1_IN__p-1-ai__
Dazu gibt es einen digitalen Messwert

Code: Select all

IV1_IN__p-1-di__
Wenn beim digitalen Messwert 1 anliegt, ist der analoge Messwert gültig. Liegt am digitalen Messwert 0 an ist der analoge Messwert nicht gültig. (i.e. Indikator dass Messwert-Aufnahme fehlerhaft ist)

Ich möchte mit dem geringsten Aufwand einen Kombinationswert erhalten in der Art

Code: Select all

IF (IV1_IN__p-1-di__ == 1) THEN
    OUTPUT = IV1_IN__p-1-ai__
ELSE
    OUTPUT = -1
END IF
Derzeit lese ich die Werte über OPC UA aus.

Kann ich eine solche Logik einfach direkt auf dem RevPi konfigurieren? Es ist ja möglich auf analogen Werten den Output zu skalieren
https://revolutionpi.com/de/docs/revpi- ... %A4nge_mem. Hier kann ich mich aber nicht auf dritt-werte beziehen und auch die Formel ist fixiert.

Welchen Ansatz sollte ich hier am ehesten verfolgen?
col-panic
Posts: 8
Joined: 19 May 2026, 17:08

Re: Kombination Analoges und Digitales Signal

Post by col-panic »

Ok, ich habe eine Lösung gefunden:

Ich habe in pictory ein virtuelles Device angelegt und über SPS folgenden Code raufgeladen

Code: Select all

import revpimodio2
import time

rpi = revpimodio2.RevPiModIO(autorefresh=True)


def set_validity_value(di_input, ai_input, vi_output):
    """Set validity value based on digital input state.

    If digital input is 0 (VALID!), set validity output to analog input value.
    Otherwise, set it to 0 (invalid).

    Args:
        di_input: Digital input signal
        ai_input: Analog input signal
        vi_output: Validity output signal to set
    """
    if di_input.value == 0:
        vi_output.value = ai_input.value
    else:
        vi_output.value = 0


while True:
    set_validity_value(
        rpi.io["IV1_IN__p-1-di__"],
        rpi.io["IV1_IN__p-1-ai__"],
        rpi.io["IV1_IN__p-1-vi__"]
    )

    time.sleep(0.1)
Interessant sind zwei Punkte, die mir vielleicht jemand beantworten kann:
  • Code: Select all

    IV1_IN__p-1-vi__
    muss ein OUT auf dem Virtual Device sein, weil IN nicht geschrieben werden kann. Wofür ist dann IN da?
  • Code: Select all

    vi_output.value = 0
    führt zu einem real-wert von 1 (über OPC UA gelesen) - wieso 1? Kann 0 hier nicht abgebildet werden?
Post Reply