IOW24 mit FreePascal unter Linux

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
cgaertner
Posts: 13
Joined: Sun Mar 29, 2020 2:17 am

IOW24 mit FreePascal unter Linux

Post by cgaertner »

Liebe Alle,

ich darf euch um eure Hilfe bzw. Ratschläge bitten.

Ich habe einen IO-Warrior 24, der über einen Lichtschranken die Anzahl von Impulsen pro Zeiteinheit zählt.

Unter Windows habe ich mit FreePascal ein Programm geschrieben, das die "iowkit.dll" verwendet und tadellos funktioniert. Jetzt möchte ich mein Programm auch unter Linux kompilieren - was mit FreePascal und entsprechend vorausschauender Programmierung auch kein Problem sein sollte.

Ich habe dazu die "libiowkit.so" laut Anleitung im SDK kompiliert und in meinem Programmverzeichnis (und sicherheitshalber auch noch unter /usr/lib) abgelegt. Grundsätzlich funktioniert es, denn ich habe mir folgendes kleines Python-Programm zum Testen geschrieben:

Code: Select all

import ctypes

iowkit = ctypes.CDLL("./libiowkit.so")

iowkit.IowKitOpenDevice.restype = ctypes.c_voidp
iowkit.IowKitGetNumDevs.restype = ctypes.c_ulong
iowkit.IowKitGetProductId.argtypes = [ctypes.c_voidp]
iowkit.IowKitGetProductId.restype = ctypes.c_ulong
iowkit.IowKitGetRevision.argtypes = [ctypes.c_voidp]
iowkit.IowKitGetRevision.restype = ctypes.c_ulong
iowkit.IowKitGetSerialNumber.argtypes = [ctypes.c_voidp, ctypes.c_voidp]
iowkit.IowKitGetSerialNumber.restype = ctypes.c_bool
iowkit.IowKitCloseDevice.argtypes = [ctypes.c_voidp]
iowkit.IowKitVersion.restype = ctypes.c_char_p

rc = iowkit.IowKitVersion()
print "Library:       " + str(rc)
ioHandle = iowkit.IowKitOpenDevice()
if ioHandle != 0:
  print "Handle:        " + str(ioHandle)
  rc = iowkit.IowKitGetNumDevs()
  print "Devices:       " + str(rc)
  rc = iowkit.IowKitGetProductId(ioHandle)
  print "Product ID:    " + str(rc)
  rc = iowkit.IowKitGetRevision(ioHandle)
  print "Revision:      " + str(rc)
  rc = ctypes.create_string_buffer(18, '000000000000000000')
  iowkit.IowKitGetSerialNumber(ioHandle, rc)
  print "Serial Number: " + rc[0] + rc[2] + rc[4] + rc[6] + rc[8] + rc[10] + rc[12] + rc[14]
else:
  print "No IO-Warrior found!"
iowkit.IowKitCloseDevice(ioHandle)
Allerdings - und damit kommen wir zu meinem Problem - bekomme ich nur dann eine sinnvolle Ausgabe, wenn ich das Programm mit sudo starte:

Code: Select all

Library:       IO-Warrior Kit V1.7.0.21
Handle:        3085807872
Devices:       1
Product ID:    5377
Revision:      4144
Serial Number: 000070E9
Ohne sudo bekomme ich von IowKitOpenDevice kein Handle zurück und damit schlägt alles andere fehl. Ich habe den aktuellen Benutzer in die Gruppe "dialout" hinzugefügt, damit sollte er doch theoretisch USB-Geräte ansprechen können? Nützt aber nichts ...

Dann habe ich mir unter Freepascal zum Testen ein Kommandozeilen-Programm geschrieben (nach der hilfreichen Anleitung hier
http://forum.codemercs.com/viewtopic.ph ... 47c122baef). Wenn ich das im Terminal starte, habe ich den gleichen Effekt: mit sudo bekomme ich eine Verbindung zu IO-Warrior und alle Daten (Seriennummer, ...), ohne sudo nicht.

Und meine grafische FreePascal-Anwendung funktioniert nun ebenfalls nicht, da sie nicht mit Root-Rechten läuft, sondern mit den Rechten des angemeldeten Benutzers.

Jetzt mal ganz blauäugig in die Runde gefragt: was mache ich falsch? Wo habe ich meinen Denkfehler? Wie kann ich als normaler Benutzer mit einem GUI-Programm auf den IO-Warrior zugreifen?

Und zum Schluß noch drei Fragen zu der Library unter Linux (sorry, ich bin linuxmäßig kein Profi):

1) Wenn ich mein fertig kompiliertes FreePascal-Programm weitergebe, muß dann jeder Anwender die "libiowkit.so" aus dem SDK selbst kompilieren? Oder kann ich die (wie eine Windows DLL) einfach dazugeben? Wenn ja, was sind die Einschränkungen bei verschiedenen Systemen? 32 Bit / 64 Bit ist mir klar, aber ich kann ja nicht für jede Linux-Distribution eine eigene Version kompilieren und ausliefern. Wenn ich sie z.B. unter Debian 10 (32 Bit) kompiliere, werden auch Ubuntu-Benutzer etwas damit anfangen können? Wird die unter einem 32 Bit Linux kompilierte Library auch unter einem 64 Bit Linux laufen (so wie ein 64 Bit Windows auch 32 Bit Programme ausführen kann)?

2) Wo liegt der Unterschied, ob ich die Library in /usr/lib habe (wie nach dem "make install") oder im Programmverzeichnis und sie mit "./libiowkit.so" in das Programm einbinde?

3) Ich habe auf einigen Seiten im Internet gesehen, daß ich nach dem "make install" ich die Libary nicht mit "./libiowkit.so", sondern mit "iowkit" einbinden soll - warum?

Danke und viele Grüße aus Wien,
Christian
cgaertner
Posts: 13
Joined: Sun Mar 29, 2020 2:17 am

Re: IOW24 mit FreePascal unter Linux

Post by cgaertner »

Liebe Alle,

die Geschichte mit dem zwingend erforderlichen "sudo" hat sich insofern ein wenig weiter entwickelt, als ich nach langer Suche auf die Information gestoßen bin, daß die Gerätedateien zu wenig Berechtigungen haben, nämlich "crw-------". Wenn man das mit einem "sudo chmod 0666 /dev/usb/io*" ändert, funktionieren meine Testprogramme anschließend auch ohne "sudo".

Allerdings sind die Berechtigungen bei jedem erneuten Anschließen des IO-Warrior wieder zu restriktiv gesetzt, sodaß nach jedem Anschließen der oben erwähnte Befehl notwendig wäre. Das ist von einem Endanwender, der mein Programm einsetzt, kaum zu verlangen - somit bleibt meine Frage von meinem gestrigen Beitrag aufrecht, wie ich die Library vernünftig mit meinem Programm ausliefern kann.

LG Christian
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW24 mit FreePascal unter Linux

Post by Christoph Jung »

Hallo Christian,

vorab, der IOW24 wird nicht mehr hergestellt und ist auch nicht mehr verfügbar. Das erwähne ich nur, falls mal der Chip nicht mehr tut oder daraus ein Produkt wird. Als Ersatzt gibts den IOW28 (alle 1ms ein Report), der ist auch schneller als der IOW24 (alle 8ms ein Report).

Mit Freepascal kenne ich mich so überhaupt nicht aus, daher kann ich spezifisch dazu nicht helfen.

1. Was die libiowkit.so betrifft glaube ich, dass man die min. im Programmpfad haben muss. Bin mir aber gerade nicht sicher und habe auch kein frisches Linux da zum testen. Ich schau mal ob ich da was testen kann. Es sollte auch keinen Unterschied machen mit welcher Distri das erstellt ist und
worauf es später läuft. Unterschiede gibt es nur evtl. in dern Kernel-Treibern, ob die aktuell sind. Die IOW24 sind eigentlich allen bekannt, der IOW28 noch nicht allen. Der ist im Kernel eingepflegt, aber evtl. noch nicht verteilt. Ich glaube eine 32 Bit Anwendung läuft nicht unter einem 64 Bit Linux, weil die Lib da ausschlaggebend ist beim kompilieren. Aber 32 Bit ist bei Linux eigenltich nicht mehr Stand der Technik (außer auf dem Raspi).

2. unter /usr/lib/ ist die für alle Programme auffindbar, die die lib benötigen.

3. Das habe ich bisher noch nicht gelesen. Ist das Kompilieren gemeint?


Zur Problematik mit den Rechten unter Linux:
In unserem SDK sollte eine rules-Datei liegen, die auf das System kopiert werden sollte. Die sorgt dafür, dass alle IO-Warrior
automatisch Rechte bekommen und kein sudo mehr benötigt wird. Das ist auf allen Systemen notwendig, auf denen das Programm laufen soll.
Am besten via Makefile eine Art Setup bauen, die alles da hin kopiert, wo es benötigt wird.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
cgaertner
Posts: 13
Joined: Sun Mar 29, 2020 2:17 am

Re: IOW24 mit FreePascal unter Linux

Post by cgaertner »

Hallo Christoph,

danke für den Hinweis mit dem IOW24 - meine Software unterstützt ein bereits vorhandenes Hardware-Produkt (mit einem IOW24) mit mehr Funktionen als die ursprünglich beiliegende Software. Insofern bin ich dann auch gespannt, was der Hersteller macht, wenn ihm die IOW24 ausgehen (oder ob er ohnehin noch sooo viele auf Lager hat ...).

Ich habe bei meinen Linux-Gehversuchen Ubuntu 20 in einer virtuellen Maschine laufen, weil ich die nach irgendwelchen Tests schnell in den Installations-Zustand versetzen kann. Stimmt, das gibt es nue mehr in 64 Bit, aber Debian wird in der aktuellen Version (Anfang August 2020) auch noch in 32 Bit angeboten. Aber um nicht zu viele Baustellen gleichzeitig zu haben, konzentriere ich mich mal auf Ubuntu 20 (64 Bit).

Danke auch für den Hinweis mit der rules-Datei, das werde ich testen und habe ich offenbar übersehen. Ganz grundsätzlich stehe ich im Moment leider etwas an, weil ich nicht weiß, wie ich mit FreePascal unter Linux ein alleine lauffähiges Programm erstelle. Unter Windows ist das kein Problem, da werden alle Libriaries mitkompiliert und ich habe dann eine einzelne exe-Datei, die ohne Installation unter Windows XP, 7, 8, 10 läuft. Unter Linux habe ich tonnenweise externe Abhängigkeiten - da habe ich wohl noch eine steile Lernkurve vor mir. :-(

Viele Grüße,
Christian
Post Reply