Page 2 of 2

Re: Einfache GUI für Python

Posted: 30 Jul 2018, 08:43
by krambambuli
Hallo Sven, hallo Volker!

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 :)

Re: Einfache GUI für Python

Posted: 03 Aug 2018, 16:19
by matt.s
volker 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

...
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 Fehlermeldung

Code: Select all

    AIValue = AnaInp1[0] + 256 * AnaInp1[2]  # oder mit struct auch:    AIValue = struct.unpack('h',AnaInp1)
IndexError: index out of range
Wenn ich die Indizes für AnaInp1, VirtInp1 und VirtInp2 von [2] auf [1] und die Zeile

Code: Select all

f.seek(Aout2)
auf

Code: Select all

f.seek(Aout1)
ändere, läuft das Ganze :)

Die Variante mit structs habe leider noch nicht zum laufen bekommen. Dieser Code

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)
gibt mir die Meldung

Code: Select all

    AOValue = a + b * AIValue
TypeError: can't multiply sequence by non-int of type 'tuple'
Was will mir Python damit sagen?

Re: Einfache GUI für Python

Posted: 06 Aug 2018, 13:21
by Eduard
Hallo matt.s,

erstmals möchte ich mich bei dir bedanken für deinen Beitrag. Sicherlich hat der Volker den Code runter geschrieben ohne diesen zu testen. Ich habe den von dir gefundenen Fehler im Beispiel Code vom Volker korrigiert.
Mit der letzten Fehlermeldung sagt dir der Python, dass eine Multiplikation zwischen ‚tuple‘ nicht möglich ist. Da die „struc.unpack“ Methode einen ‚tuple‘ als Rückgabewert hat, sind die Variablen b und AIValue vom Typ ‚tuple‘.

Der Code sieht korrigiert so aus:

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)
Gruß,
Eduard