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)
Code: Select all
Library: IO-Warrior Kit V1.7.0.21
Handle: 3085807872
Devices: 1
Product ID: 5377
Revision: 4144
Serial Number: 000070E9
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