Vielen Dank für die ausführlichen Antworten! Hört sich klasse an!
Ich werde in den nächsten Tagen mal versuchen mir die Themen anzueignen

Vielen Dank für die Vorlage. Ich hatte jetzt endlich Gelegenheit dazu, das mal auf der Hardware zu testen. Wenn ich dein Beispiel unverändert ausführe, bekomme ich die Fehlermeldungvolker wrote: 19 Jul 2018, 12:39 Mit dem virtuellen Device bekommst Du zum Beispiel 32 Byte Inputs und 32 Byte Outputs im Prozessabbild reserviert. Alternativ kannst Du 16 Words Input und/oder 16 Words Output wählen. Entsprechend werden 2 x 32 oder 2 x 16 Prozessvariablen erzeugt. Deine Software kann diese Prozessvariablen (oder die Bytes im PA mit entsprechendem Offset) nun frei wie Variablen verwenden.
Wenn Du sehr schnell auf analoge Inputs reagieren willst, dann empfehle ich Dir, direkt mit piControl zu kommunizieren und die Werte z.B. so abzugreifen (Ain1 ist der Offset für den 16 Bit Wert des Analogeingangs, Aout1 entsprechend der Output 1 des AOI Moduls und Vin1 der Offset vom ersten Input Word eines virtuellen Moduls - ich habe hier die Zykluszeit auf >10 ms eingestellt, weil bei einem AIO-Modul das ganze nicht viel schneller gehen wird).
Code: Select all
...
Code: Select all
AIValue = AnaInp1[0] + 256 * AnaInp1[2] # oder mit struct auch: AIValue = struct.unpack('h',AnaInp1)
IndexError: index out of range
Code: Select all
f.seek(Aout2)
Code: Select all
f.seek(Aout1)
Code: Select all
import time
import struct
f=open("/dev/piControl0","wb+",0)
Ain1=11
Aout1=31
Vin1=100
Vin2=Vin1+2
while True:
f.seek(Ain1)
AnaInp1=f.read(2)
AIValue = struct.unpack('h',AnaInp1)
f.seek(Vin1)
VirtInp1=f.read(2)
a = struct.unpack('h',VirtInp1)
f.seek(Vin2)
VirtInp2=f.read(2)
b = struct.unpack('h',VirtInp2)
AOValue = a + b * AIValue
f.seek(Aout2)
AnaOut1 = struct.pack('h', AOValue )
f.write(AnaOut1)
time.sleep(0.01)
Code: Select all
AOValue = a + b * AIValue
TypeError: can't multiply sequence by non-int of type 'tuple'
Code: Select all
import time
import struct
f=open("/dev/piControl0","wb+",0)
Ain1=11
Aout1=31
Vin1=100
Vin2=Vin1+2
while True:
f.seek(Ain1)
AnaInp1=f.read(2)
AIValue = struct.unpack('h',AnaInp1)
f.seek(Vin1)
VirtInp1=f.read(2)
a = struct.unpack('h',VirtInp1)
f.seek(Vin2)
VirtInp2=f.read(2)
b = struct.unpack('h',VirtInp2)
AOValue = a[0] + b[0] * AIValue[0]
f.seek(Aout1)
AnaOut1 = struct.pack('h', AOValue )
f.write(AnaOut1)
time.sleep(0.01)