Kithara »RealTime Suite«

Die »RealTime Suite« ist eine Echtzeiterweiterung für die Windows-Betriebssysteme. Damit realisieren Sie auf einfache Weise industrielle Anwendungen für Automatisierungs-, Steuerungs- und Regelungstechnik in Echtzeit.
Voraussetzung zur Erreichung von "harten" Echtzeiteigenschaften ist die Ausführung Ihres Anwendungcodes auf der Kernel-Ebene des Systems. Die dazu erforderlichen Mechanismen werden von uns bereitgestellt. Einige Eckdaten:
- Hochgenaue Echtzeit-Timer für Frequenzen > 1 kHz
- Prioritätsbasiertes preemptives Echtzeit-Multitasking
- Echtzeit-Automatisierung mit eigenem EtherCAT Master
- Profibus Master für Hardware von Hilscher Systemautomation
- industrielle Bildverarbeitung mit GigE Vision in Echtzeit
- Ereignisgesteuerte UDP- und TCP-Kommunikation in Echtzeit über Fast Ethernet (100 MBit/s) und Gigabit-Ethernet (1 GBit/s)
- Echtzeit-CAN mit herstellerunabhängigem API für Karten von esd, EMS, IXXAT, Kvaser und Peak (Weitere folgen)
- Hardwarenahe Programmierung: I/O-Ports, phys. Memory, Interrupts
- Unterstützung von PCI- und PCMCIA-Karten, USB-Geräten, seriellen COM-Schnittstellen
- Code-Ausführung auf der Kernel-Ebene unterstützt C/C++ und Delphi (Win32)
- Windows 7 - Windows Vista (x86) - Windows XP (Embedded) - Windows Server 2003 - Windows 2000
- keine Dongle-Anbindung, keine Netzfreischaltung, ect.
- Beschreibung
- Eigenschaften
- Beispiele
- FAQ
- Hardware
Das Base Module ist die Grundlage der gesamten »RealTime Suite«.
Erzeugen Sie alle benötigten Ressourcen, die zum Beispiel für die Kommunikation zwischen Anwendung und Kernel-Ebene sorgen!
Das Base Module stellt Funktionen zur Verwaltung des Kernel-Treibers bereit. Die »RealTime Suite« kann dabei von mehreren Programmen gleichzeitig verwendet werden.
Das Base Module enthält Funktionen zur Erzeugung und Verwaltung folgender Ressourcen:
- Shared Memory
- Daten- und Message-Pipes für schnellen Datenaustausch
- Event-Objekte
- CallBack-Funktionen
- Threads
- Quick-Mutexe
Im Base Module befinden sich mehrere Funktionen, die dem Absetzen von Meldungen an den »Kernel Tracer« dienen. Das erleichtert die Fehlersuche und ist auch für Profiling-Aufgaben einsetzbar.
Beachten Sie auch das Kernel Module, das weitere allgemein gültige Funktionen bereitstellt und für den Zugang zur Kernel-Ebene unverzichtbar ist.
Das Base Module ist immer erforderlich.
- Allgemeine Funktionen
- Öffnen/Schließen des Kernels
- Versionskontrolle, Treiber-Konfiguration
- Threads
- Erzeugen von Threads
- Ermitteln/Setzen beliebiger Stufen der absoluten Thread-Priorität
- Shared Memory
- Shared Memory speziell für Datenaustausch
- geschützt vor Festplatten-Auslagerung (fest im Speicher)
- mehrere Bereiche mit jeweils bis zu über 60 MByte
- Pipes
- Lock-freie und schnelle Daten- und Message-Pipes
- ermöglicht komfortablen und synchronisierten Datenaustausch in beliebiger Richtung zwischen Kernel und Anwendung
- keine weitere Synchronisation benötigt (auch auf Multi-Core-CPUs)
- Signalisierung
- Event-Objekte: Setzen, Rücksetzen und Pulsen aktiviert Anwendungs-Thread
- Callback-Ausführung von Anwendercode auf Kernel- oder Anwendungsebene
- Versenden von Windows-Messages
- Quick-Mutexe
- Schnelle Synchronisation ("Mutex" = Mutual Exclusion)
- Multiprozessortauglich
- Device-Information
- Ermittlung der Geräteinformationen von PCI-, USB-, COM-, HID-Devices etc.
- Debug-Unterstützung
- Absetzen formatierter Text-Meldungen von der Kernel-Ebene aus
- Kompatibel zum »Kernel Tracer« für Profiling und Fehlersuche
Das Base Module stellt vielfältige Werkzeuge bereit, z.B. Shared Memory für den Datenaustausch zwischen Anwendung und Kernel:
err = KS_createSharedMem(
&pAppPtr, // Application-Adresse
&pSysPtr, // Systemadresse des Speichers
"MySharedMem", // Global gültiger Name
40 * MegaBytes, // Länge in Bytes
0); // Flags, hier 0
Zur Vereinfachung für regelmäßigen Datenaustausch ist eine Daten-Pipe ideal, die intern ebenfalls auf Shared Memory basiert:
err = KS_createPipe(
&hPipe, // Adresse des Pipe-Handles
"MyValuePipe", // Name der Pipe
2, // Datengröße (z.B. Messwerte)
1000000, // max. Anzahl Datenelemente
NULL, // reserviert
0); // Flags, hier 0
Nun kann z.B. der Kernel ermittelte Messwerte in der Pipe ablegen:
err = KS_putPipe(
hPipe, // Pipe-Handle
valueBuffer, // Zeiger auf Datenpuffer
valueCount, // Anzahl der Messwerte
NULL, // hier nicht benutzt
0); // Flags, hier 0
Die Anwendung kann nun die Messwerte aus der Pipe lesen:
err = KS_getPipe(
hPipe, // Pipe-Handle
buffer, // Zeiger auf Datenpuffer
bufferSize, // max. Größe des Puffers
&filledSize, // wieviel Werte gelesen?
0); // Flags, hier 0
Daten mit variabler Länge (z.B. Messages) lassen sich optimal mit einer Message-Pipe verarbeiten. Diese ist sehr ähnlich zu verwenden.
- Welche Voraussetzungen müssen allgemein erfüllt sein?
- Unterstützung von Single- oder Dual-Core-, Multi-Core-CPUs, Hyperthreading, SMP etc.
- Unterstützung von Standard-PIC oder APIC, ACPI
- optimal ist ein moderner Dual-/Quad-Core-PC (mit APIC + ACPI)
- Unterstützung von Windows 2000, Windows XP (Embedded), Windows Server 2003, Windows Vista (x86)
- Programmierung der Kernel-Ebene in C/C++ und Delphi (Win32)
- Welche Besonderheiten ergeben sich beim Umgang mit Shared Memory?
- wird nicht auf die Festplatte ausgelagert und ist daher immer verfügbar (auch innerhalb der RealTime-Umgebung)
- ist sowohl von der Anwendungsebene als auch vom Kernel aus ansprechbar
- ist nur einmalig vorhanden und kann daher auch dem Datenaustausch zwischen verschiedenen Anwendungen dienen (es ist jedoch in jedem Programm einmal KS_createSharedMem zu rufen)
- ist anfangs mit 0 initialisiert – durch einen Zähler lässt sich ermitteln, ob der Speicher bereits zuvor von anderen Programmen verwendet wurde
- Zugriffe auf den Speicher sind nicht automatisch synchronisiert (für synchronisierten Zugriff empfehlen wir Daten- und Message-Pipes)
- 32-Bit-CPU
- max. 8 logische Prozessoren (Chips * Kerne * Threads), darüber auf Anfrage
Echtzeitfähigkeit wird nur auf der Kernel-Ebene erzielt.
Bringen Sie Ihren Anwendercode auf die Kernel-Ebene und schaffen Sie sich dadurch den Zutritt zur Echtzeit-Welt unter Windows!
Benötigt werden hierzu C/C++-Compiler oder das Entwicklungstool Delphi (Win32), um nativen x86-Code erzeugen zu können. Beachten Sie jedoch, dass z.B. auch die .NET-Umgebung mit C# unterstützt wird, indem eine native C++- oder Delphi-DLL für den Kernel-Zugang sorgt. Entsprechende sofort compilierbare Projekte befinden sich in jeder Software-Lieferung.
Es gibt zwei verschiedene Wege, um Ihren Anwendercode auf die Kernel-Ebene zu bringen:
- Befehlsweise Relozierung einer Callback-Funktion und ihrer Subroutinen in den Kernel-Adressraum
- Laden einer DLL direkt auf die Kernel-Ebene
Während die erste Methode für kleinere Projekte durchaus Vorteile besitzt, bietet die zweite Variante wesentlich mehr Möglichkeiten und erlaubt z.B. auch die einfachere Erzeugung von Debug-Meldungen, die sich im »Kernel Tracer« für Fehlersuche und Optimierung auswerten lassen.
Außerdem realisieren Sie damit komplexe Steuerungsanwendungen, deren grafische Oberfläche z.B. mit Java oder C#.NET erstellt wird, während nur die zeitkritischen Code-Teile der DLL im Kernel-Modus laufen.
Das Kernel Module ist Voraussetzung, um Anwendercode auf der Kernel-Ebene ausführen zu können.
- Relokation von Callback-Funktionen und deren Subroutinen
- Direktes Laden einer DLL in den Kernel
- DLL zu erstellen mit C/C++ oder Delphi (Win32)
- Callback-Funktionen werden direkt in Interrupt Service Routine (ISR) oder im Echtzeit-Timer-Kontext ausgeführt
- Alle wichtigen Funktionen der »RealTime Suite« auch von der Kernel-Ebene aus aufrufbar, z.B.:
- I/O-Port-Zugriffe
- Zugriffe auf physischen Speicher
- Zeitmessung, genaue Kurzzeitverzögerung
- Senden und Empfangen bei Daten- und Message-Pipes
- Senden und Empfangen bei seriellen Schnittstellen
- Senden und Empfangen bei Ethernet-Controllern
- EtherCAT-Datenaustausch
- Setzen, Rücksetzen, Pulsen von Events
- Ereignisse von Kernel-Ebene: Events und Windows-Messages
- Schneller Datenaustausch zwischen Anwendung und Kernel über Shared Memory oder lock-freie Daten- und Message-Pipes
Angenommen, Ihre Callback-Funktion für den Echtzeit-Timer sieht so aus:
int __stdcall myTimerCallback(
void* pArgs, // Adresse der Referenzdaten
void* pContext); // Adresse der Kontextdaten
Es gibt nun zwei Wege, um den Anwendercode auf die Kernel-Ebene zu bekommen:
err = KS_createCallBack(
&hCallBack, // Adresse des Handles
myTimerCallback, // Adresse der Funktion
pSysAddrOfMyData, // Referenzparameter
KSF_KERNEL_EXEC, // auf der Kernel-Ebene!
0); // Anwendungspriorität, hier 0
Auf diese Weise wird die Funktion in den Kernel-Speicher geladen.
Alternativ lässt sich eine ganze DLL in den Kernel laden:
err = KS_loadKernel(
&hKernel, // Adresse des Handles
"mykernel.dll", // Dateiname der Kernel-DLL
"myInitFunction", // Name der Init-Routine
pArgs, // Referenzparameter
KSF_KERNEL_EXEC); // Flags, in Kernel laden
Einmal in den Kernel geladen, kann nun ganz ähnlich ein Kernel-Callback erzeugt werden:
err = KS_createKernelCallBack(
&hCallBack, // Adresse des Handles
hKernel, // Kernel-Handle
"myTimerCallback", // Name der Funktion
pSysAddrOfMyData, // Referenzparameter
KSF_KERNEL_EXEC, // auf der Kernel-Ebene!
0); // Anwendungspriorität, hier 0
Die Callback-Handles lassen sich nun als Timer oder Interrupt-Handler anmelden oder z.B. zur Echtzeit-Signalisierung bei eintreffenden Ethernet-Frames.
Hinweis: Vollständige Projekte, die eine Rahmenanwendung in einer der Sprachen C++, C# oder Delphi sowie eine in den Kernel geladene DLL in C++ oder Delphi enthalten, sind Bestandteil jeder Software-Lieferung.
- Wie kann der Kernel mit der Anwendung kommunizieren?
- Shared-Memory-Bereiche für nicht synchronisierten Datenaustausch
- Daten- und Message-Pipes basierend auf Shared Memory (Lock-frei, daher sind die lesende und die schreibende Seite gegeneinander synchronisiert)
- Kernel kann Event-Objekte setzen, um Anwendungs-Threads zu aktivieren
- Anwendungsebene kann die Ausführung von Funktionen im Kernel auslösen
- Windows-Messages
- Wie lässt sich Code für die Kernel-Ebene debuggen?
- Anwendercode lässt sich innerhalb der Entwicklungsumgebung debuggen:
- Callback-Funktion wird durch spezielles Flag auf der Anwendungsebene ausgeführt
- Kernel-DLL wird durch spezielles Flag auf die Anwendungsebene geladen
- Shared Memory, Events, Zugriffe auf I/O-Ports und physischen Speicher etc. sind in beiden Kontexten verwendbar
Keine speziellen Hardware-Anforderungen
Das IoPort Module ermöglicht den Zugriff auf I/O-Register des Computers.
Greifen Sie mit dem IoPort Module auf die I/O-Ports des Computers direkt aus der Anwendung heraus zu!
Sowohl bei eingebauten Hardware-Baugruppen als auch Mezzanin- und PC-Einsteckkarten erfolgt die Ansteuerung in den meisten Fällen mittels Zugriffen auf die I/O-Register von Controllern. Hierfür stehen Funktionen für 8-, 16- und 32-Bit-Zugriffe zur Verfügung.
Das IoPort Module ist auch erforderlich, um die Hardware-Ressourcen (z.B. Speicheradressen oder Interrupt-Leitungen) zu ermitteln, die vom Plug&Play-Manager von Windows dynamisch zugewiesen wurden.
Mit dem Begriff "I/O-Ports" sind hier übrigens nicht COM-Ports oder LPT-Ports gemeint, sondern die insgesamt 65536 über I/O-Maschinenbefehle ansprechbaren I/O-Adressen des Systems. Damit lassen sich natürlich auch die I/O-Register der COM- und LPT-Controller ansprechen.
Ergänzen Sie Ihren Custom Driver um das Memory Module, wenn die Hardware, die Sie ansprechen wollen, einen Speicherzugriff bietet.
- I/O-Port-Zugriffe
- Freigabe des Direktzugriffs auf I/O-Ports möglich
- I/O-Zugriffe aus Anwendungsprogramm ohne Kontextwechsel möglich
- Zugriffsschutz des Betriebssystems auf andere als die freigegebenen Adressen weiterhin intakt und aktiv
- Nur eigene Anwendung erhält Zugriff auf Adressen
- Keine Beeinträchtigung des Systems
- Funktionen für direkten und indirekten I/O-Zugriff
- 8-, 16- und 32-Bit-Zugriffe, lesend oder schreibend
- Funktionen kompatibel zu (unter DOS) bekannten C-Makros
- Ressourcen-Ermittlung
- Ermittlung der vom Plug&Play-Manager zugewiesenen Ressourcen (Basisadressen, IRQs)
- Lesen und Schreiben des PCI-Konfigurationsblockes
Wenn der direkte I/O-Port-Zugriff genutzt werden soll, ist zunächst der I/O-Bereich für den Direktzugriff freizuschalten:
err = KS_enableIoRange(
myBaseAddress, // Basisadresse der Hardware
8, // Anzahl der I/O-Register
KSF_SIZE_8_BIT); // Flags, hier byte-weise
Nun können die freigegebenen Hardware-Register direkt adressiert werden:
byte value = KS_inpb(
myBaseAddress + 2); // Adresse, 1 Byte lesen
... // Byte auswerten
KS_outpb(
myBaseAddress + 4, // Adresse, 1 Byte schreiben
value); // Byte schreiben
Wenn die I/O-Basisadresse einer PCI-Karte vom Plug&Play-Manager dynamisch vergeben wurde, kann diese ganz leicht ermittelt werden, indem entweder alle PCI-Baugruppen durchsucht werden, bis die gewünschte (anhand Vendor- und Device-ID) gefunden wird:
err = KS_getBusData(
&pciData, // Adresse der PCI-Struktur
busNumber, // Bus-Nummer
slotNumber, // Gerätenummer und Funktion
0); // Flags, hier 0
if (pciData.vendorID == XXXX && pciData.deviceID == YYYY)
...
Oder es wird sofort die gewünschte ID-Kombination gesucht:
err = KS_getRessourceInfo(
"PCI\\VENxxxx&DEVyyyy", // ID-Kombination
&resourceInfo); // Adresse der Resourcen-Info
Die erhaltenen Datenstrukturen enthalten nun die benötigten Angaben über Interrupt-Leitung und benutzte I/O- oder Speicher-Basisadressen.
- Wie können die vom PCI-Plug&Play dynamisch zugewiesenen Ressourcen ermittelt werden?
- entweder mit 'KS_getBusData': Iterieren über alle im System befindlichen PCI-Geräte, bis anhand der Parameter (Vendor-Id, Device-Id, etc.) das gesuchte Gerät gefunden wurde
- oder mit 'KS_getResourceInfoEx': Übergabe der Parameter des gesuchten Gerätes und Auswertung der beschreibende Datenstruktur
- mit 'KS_getResourceInfo' lassen sich auch die Daten anderer Schnittstellen ermitteln, z.B. serielle ("COM") oder parallele ("LPT") Schnittstellen, Netzwerkkarten ("NET") für das Packet Module sowie USB-Geräte ("USB")
Keine speziellen Hardware-Anforderungen
Das Memory Module dient dem Zugriff auf physischen Speicher.
Greifen Sie auf externen Speicher von Einsteckkarten zu oder stellen Sie internen RAM für den Hardware-Zugriff zur Verfügung!
Das Memory Module ermöglicht die Verwendung von physischem Speicher sowohl von Ihrer Anwendung, als auch von externer Hardware aus. Dafür gibt es zwei verschiedene Arten von Speicherbereichen:
- externe Speicherbereiche von Einsteckkarten (sogenannter Dual-Port-RAM) sollen auch von der Anwendung aus adressierbar sein
- Speicherbereiche aus dem internen Hauptspeicher sollen der externen Hardware zur Verfügung gestellt werden (sogenanntes DMA-Memory)
Das Ergebnis ist in beiden Fällen gleich: Sowohl die Anwendung (und auch die Kernel-Ebene) als auch die externe Hardware (z.B. auf dem PCI-Bus) haben Zugriff auf den Speicher. Dieser wird in den Adressraum der Anwendung eingeblendet – auf diese Weise finden keinerlei unnötige Kopieroperationen statt, was die Eignung für zeitkritische Anwendungen begründet.
Dies kann für bestimmte Applikationen entscheidend sein, da Zugriffe über I/O-Ports in der Regel künstlich stark ausgebremst werden, um Kompatibilität zu älteren Hardware-Komponenten zu wahren (teilweise ? 1 µs!). Bevorzugte Anwendungen sind daher: Messwerterfassung, Kommunikation, Framegrabber für die Bildverarbeitung etc., also alle Applikationen, bei denen große Datenmengen schnell transportiert werden müssen.
Das Memory Module beschränkt sich auf reine Speicherzugriffe. Für die Adressierung von I/O-Ports beachten Sie bitte auch das IoPort Module.
- Externer Speicher
- Einblenden von externem Dual-Port-RAM in den Adressraum der Anwendung
- Getrennte Adressen für Anwendung und Kernel-Ebene
- Direkter Zugriff – keine Software-Emulation oder Kopieroperation
- Interner Speicher
- Bereitstellen von internem Hauptspeicher für externe Hardware auf ISA- oder PCI-Bus
- Physikalisch zusammenhängender Speicher
- Physikalische Adresse kann der externen Hardware auf geeignete Weise übermittelt werden
- Zur Erhöhung allokierbarer Blockgrößen ist Anforderung des Speichers bereits zum Bootzeitpunkt möglich
Das Einblenden externer Speicherbereiche (Dual-Port-RAM) einer PCI-Karte in den Adressraum der Anwendung und des Kernels erfolgt so:
err = KS_mapPhysMem(
&pAppPtr, // Application-Adresse
&pSysPtr, // Systemadresse des Speichers
externalPhysAddr, // physikalische Adresse
externalSize, // Länge des Speicherbereichs
KSF_PCI_BUS); // Flags, hier PCI-Bus
Das Allokieren interner Speicherbereiche des PC-RAM für Zugriffe durch die externe Hardware (sogenanntes "Bus-Master-DMA") einer PCI-Karte erfolgt so:
err = KS_allocPhysMem(
&pAppPtr, // Application-Adresse
&pSysPtr, // Systemadresse des Speichers
&externalPhysAddr, // physikalische Adresse
externalSize, // Länge des Speicherbereichs
KSF_PCI_BUS); // Flags, hier PCI-Bus
Die physikalische Adresse kann nun auf geeignete Weise an die Hardware übermittelt werden, damit diese über den PCI-Bus auf den Speicher zugreifen kann.
Beide Methoden führen dazu, dass sowohl die Anwendung, der Kernel und die externe Hardware direkt (ohne Emulation oder Kopieroperationen) auf den selben Speicher zugreifen können.
- Wie groß ist der maximal zu mappende Bereich externen Speichers?
- im Prinzip so groß wie der externe Speicher ist; es sollte keine Beschränkung geben
- Wie groß ist der maximal zu allokierende Bereich internen Speichers?
- Speicher muss physisch zusammenhängend sein, daher umso geringer, je länger das System läuft. Es sollte daher so früh wie möglich nach dem Boot-Vorgang der Speicher angefordert werden. Der Systemspeicher wird vom Betriebssystem sehr schnell "zerstückelt".
- Memory Module enthält Mechanismen zur Allokation von Speicherbereichen bereits zum Boot-Zeitpunkt, die später von der Anwendung abgefordert werden können
- Außerdem können eher mehrere kleinere statt eines größeren Bereichs allokiert werden. Es bietet sich daher eine sogenannte "Scatter/Gather"-Verwaltung des Speichers an.
Keine speziellen Hardware-Anforderungen
Das Clock Module ermöglicht hochgenaue Zeitmessung.
Ermitteln Sie die genaue Systemzeit in verschiedenen Formaten oder realisieren Sie exakte Kurzzeitverzögerungen!
Für verschiedene Zwecke ist in hardwarenahen Anwendungen eine genaue Systemzeit zu ermitteln. Das Clock Module stellt dafür Funktionen bereit, mit denen die Systemzeit in verschiedenen Formaten geliefert wird. Dazu gehören relative (seit dem Systemstart) und absolute Zeitangaben sowie selbst definierbare Zeitformate für spezifische Anforderungen.
Die Zeitmessung basiert auf verschiedenen, auswählbaren, im jeweiligen System vorhandenen Zeitgebern (z.B. Time Stamp Counter (TSC), PC-Timer, PM-Timer, APIC-Timer, HPET-Timer). Interne Überläufe bei der Umrechnung sind durch 64- und 96-Bit-Berechungen praktisch auch nach Jahren kontinuierlicher Laufzeit ausgeschlossen.
Für hardwarenahe Programmierung werden oft exakte zeitliche Verzögerungen benötigt. Auch dies leistet das Clock Module.
Das Clock Module ist Voraussetzung für das RealTime Module und ist stets eine wertvolle Ergänzung für verschiedene Aufgaben.
- Zeitmessung
- Systemzeit basierend auf verschiedenen internen Zeitgebern
- Interne Berechnungen mit hochoptimierten 64- und 96-Bit-Algorithmen
- Relative Zeitformate seit dem Systemstart
- Absolute Zeitformate in üblichen Formaten:
- Zehntel-Mikrosekunden seit 1.1.1601 (Windows-Systemzeit)
- Mikrosekunden seit 1.1.1970 (Unix-Systemzeit)
- Millisekunden seit 1.1.1980 (DOS-Systemzeit)
- Absolute Zeitangaben nach lokaler Zeitzone oder UTC
- Alle Zeitgeber bei Systemstart gegeneinander kalibriert
- Nutzerspezifische Zeitformate einfach definierbar
- 2-Phasen-Zeitmessung (1. zunächst Erfassung, 2. spätere Umrechnung) für extrem zeitkritische Applikationen
- Kurzzeitverzögerung
- Hochgenaue Kurzzeitverzögerungen, in Zehntel-Mikrosekunden programmierbar
- Aufwändige Kalibrierung beim Systemstart ermöglicht Genauigkeit im Nanosekundenbereich (auf der Kernel-Ebene)
Das Clock Module stellt zwei verschiedene Mechanismen bereit – Zeitmessung und Kurzzeitverzögerung.
Die meist benutzte Funktion zur Zeitmessung liefert 100-ns-Einheiten seit dem Start des Systems:
UInt64 time;
err = KS_getClock(
&time, // Adresse der Variablen
KS_CLOCK_MACHINE_TIME); // 100-ns seit Systemstart
Diese können auch zur einfacheren Weiterverarbeitung in 64-Bit-Werte umgewandelt werden:
__int64 time64 = time.hi;
time64 <<= 32;
time64 += time.lo;
printf("%Ld Mikrosekunden seit dem Systemstart.\n", time64 / 10);
Statt der (Systemstart-) relativen Zeit ist auch der absolute Zeitpunkt seit dem 1.1.1601 ermittelbar:
err = KS_getClock(
&time, // Adresse der Variablen
KS_CLOCK_ABSOLUTE_TIME); // 100-ns seit 1.1.1601
Der erhaltene Wert lässt sich leicht mit Windows-Funktionen weiterverarbeiten.
Die Kurzzeitverzögerung realisiert hochgenaue Verzögerungen, programmierbar in 100-ns-Schritten und mit einer Abweichung von nur wenigen Nanosekunden (auf der Kernel-Ebene):
err = KS_microDelay(
38); // hier 3,8 Mikrosekunden
Dies ist oftmals sehr nützlich beim Zugriff auf Hardware, wenn zeitliche Bedingungen einzuhalten sind.
- Welche Voraussetzungen müssen allgemein erfüllt sein?
- Unterstützung von Single- oder Dual-Core-, Multi-Core-CPUs, Hyperthreading, SMP etc.
Keine speziellen Hardware-Anforderungen
Das System Module meldet besondere System-Ereignisse.
Lassen Sie sich über das Starten und Stoppen von Anwendungen oder kritische Situationen benachrichtigen!
Mit dem System Module ist es möglich, eine Benachrichtigungsfunktion für bestimmte kritische Systemereignisse anzumelden, die dann gerufen wird, wenn die besondere Situation eintritt. In diesem Fall kann zum Beispiel bei einem "Absturz" des Anwendungsprogrammes reagiert werden, um z.B. eine angeschlossene Hardware in den sicheren Ruhezustand zu versetzen.
Die Reaktion erfolgt grundsätzlich auf der Kernel-Ebene.
Erfordert das Kernel Module.
- Anmeldung von Callback-Funktionen für die Kernel-Ebene
- Aufruf der Callback-Funktion bei Eintreten spezieller Ereignisse z.B.:
- Start von anderen Anwendungen, die den Kernel-Treiber ebenfalls benutzen
- Beenden von Anwendungen (sowohl bei regulärem als auch fehlerhaftem Programmende)
- Erfassung von Programmabbrüchen im Debugger, Task Manager oder bei Programmabstürzen
- Signalisierung bei BSOD
Auf einfache Weise können Sie sicherstellen, dass bei einem eventuellen Fehler Ihres Anwendungsprogrammes das System in einen sicheren Zustand überführt werden kann. Erstellen Sie eine Callback-Funktion für die Kernel-Ebene, um dies zu erreichen:
int __stdcall myEmergencyCallback(
void* pArgs, // Adresse der Referenzdaten
void* pContext); // Adresse der Kontextdaten
Hierfür wird nun ein Callback-Objekt erzeugt:
err = KS_createCallBack(
&hCallBack, // Adresse des Handles
myEmergencyCallback, // Adresse der Funktion
pSysAddrOfMyData, // Referenzparameter
KSF_DIRECT_EXEC, // auf der Kernel-Ebene!
0); // Anwendungspriorität, hier 0
Diese Callback-Funktion wird nun als System-Handler angemeldet:
err = KS_installSystemHandler(
KS_SYSTEM_PROCESS_ABORT, // bei Programmabbruch
hCallBack, // Callback-Handle
0); // Flags, hier 0
Falls nun ein unerwarteter Programmabbruch erfolgt, ohne vorher die benutzten Ressourcen ordnungsgemäß abzumelden, wird auf der Kernel-Ebene die Emergency-Callback-Funktion gerufen.
"Unerwartete Programmabbrüche" sind z.B. ein Programmabsturz oder auch das Abbrechen durch den Task Manager oder den Debugger der Entwicklungsumgebung.
- Wie wird sichergestellt, dass die Emergency-Funktion noch gerufen wird, auch wenn die Anwendung nicht mehr existiert?
- Die Emergency-Funktion muss natürlich alle erforderlichen Daten zur Verfügung haben, wenn dieser Fall eintritt. Sämtliche Incodeionen sind also schon vorher vorzubereiten und im Shared Memory zu übergeben. Beim Aufruf der Funktion wird auf Anwendungsdaten oder -code nicht mehr zugegriffen.
Keine speziellen Hardware-Anforderungen
Das Device Module stellt das Windows-Device-API bereit.
Ermöglichen Sie vorhandenen ("Legacy"-) Anwendungen den Zugriff über Windows-Schnittstelle für Geräte, einschließlich "virtuelle COM-Ports"!
Mit dem Device Module melden Sie Callback-Funktionen an, die auf der Kernel-Ebene gerufen werden, wenn eine Fremdanwendung eine bestimmte Geräteschnittstelle öffnet, schließt, Daten liest oder schreibt oder die Einstellungen der Schnittstelle verändert. Dahinter verbergen sich die Windows-Funktionen CreateFile, CloseHandle, ReadFile, WriteFile und DeviceIoControl. Diese 5 Funktionen bilden das sogenannte Device-API, das auch in anderen Betriebssystemen der Ansteuerung von Geräten dient.
Fangen Sie alle Aktionen auf der Kernel-Ebene ab und realisieren Sie Ihre eigene Treiber-Implementierung für USB- oder PCI-Baugruppen. Mit dem Device Module ist auch die Realisierung von "virtuellen COM-Ports" einfach zu gestalten. Dadurch erhält die Fremdanwendung eine serielle Schnittstelle, die von einer physikalischen nicht zu unterscheiden ist.
Für die Manipulation eines seriellen Datenstromes sowie weiter gehende Möglichkeiten an "virtuellen COM-Ports" beachten Sie bitte auch das Filter Module.
Erfordert das Kernel Module.
- Abfangen der Funktionsaufrufe CreateFile, CloseHandle, ReadFile, WriteFile und DeviceIoControl
- Reaktion auf der Kernel-Ebene erlaubt sofortige Reaktion
- Für Datenaustausch mit der Applikation empfehlen sich z.B. die komfortablen Daten- oder Message-Pipes
- Festlegung beliebiger Namen für die Geräteschnittstelle
- "Virtuelle COM-Ports" können einfach erzeugt werden
Für die Realisierung eines "virtuellen COM-Ports" erstellen Sie verschiedene Callback-Routinen für die Ereignisse CREATE, CLOSE, READ, WRITE und CONTROL. Zum Beispiel für CONTROL:
int __stdcall myControlCallback(
void* pArgs, // Adresse der Referenzdaten
void* pContext) // Adresse der Kontextdaten
{ ...
if (pContext->controlCode == SERIAL_SET_BAUD_RATE)
...
Für alle Routinen werden nun Callback-Objekte erzeugt:
err = KS_createCallBack(
&functions.hOnControl, // Adresse des Handles
myControlCallback, // Adresse der Funktion
pSysAddrOfMyData, // Referenzparameter
KSF_DIRECT_EXEC, // auf der Kernel-Ebene!
0); // Anwendungspriorität, hier 0
Anschließend kann das "virtuelle COM-Port" erzeugt werden:
err = KS_createDevice(
&pAppPtr->hDevice_, // Addresse des Handles
"COM77", // Device-Name
&functions, // Struktur mit Callback-Handles
KSF_SERIAL_PORT); // Flags, "virtueller COM-Port"
Damit steht anderen Anwendungen eine weitere serielle Schnittstelle unter dem Namen "COM77" zur Verfügung, die sich von "echten" Schnittstellen nicht unterscheidet. Sie können damit oftmals vorhandene Anwendungen weiter betreiben, ohne diese neu programmieren zu müssen.
- Welche Anwendungen sind mit dem Device Module realisierbar?
- Zum einen dient das Device Module der Bereitstellung einer Programmierschnittstelle für andere Anwendungsentwickler, z.B. für Ihren USB- oder PCI-Treiber. Sie können damit ein Interface anbieten, das sich mit den Funktionen des Win32-API einfach ansprechen lässt. Die Dokumentation des API lässt sich dadurch vereinfachen.
- Zum anderen ist es möglich, eine sogenannte "virtuelle COM-Schnittstelle" bereitzustellen, die von vorhandenen Anwendungsprogrammen aus geöffnet und behandelt werden kann, als ob es sich um ein reales COM-Port handeln würde.
Keine speziellen Hardware-Anforderungen
Tastatureingaben abfangen, manipulieren, simulieren.
Bestimmen Sie selbst, welche PS/2-Tastatureingaben erlaubt sind!
Das Keyboard Module erlaubt die Kontrolle über PS/2-Tastaturen. Es lassen sich zum Beispiel Tastatureingaben einfach sperren (z.B. Ctrl-Alt-Del), die für den Bediener einer Maschine unzulässig sind.
Durch die Registrierung einer Callback-Funktion ist es auch möglich, eine Tastenbetätigung abzufangen und in einen anderen Code umzuwandeln oder eine Tasteneingabe zu simulieren.
Erfordert das Kernel Module.
- Sperren von bestimmten Tastatureingaben, z.B. Ctrl-Alt-Del, Alt-Tab, Ctrl-Esc etc.
- Ändern von Tastencodes
- Simulation von Tastatureingaben
- Ausschließlich in Verbindung mit PS/2-Tastaturen
An einer PS/2-Tastatur ist es einfach möglich, spezielle Tastencodes für eine besondere Kernel-Funktion zu vereinbaren. Angenommen, es soll eine spezielle Behandlung für Ctrl-Shift-Alt-F1 erfolgen:
int __stdcall myKeyboardCallBack(
void* pArgs, // Adresse der Referenzdaten
void* pContext) // Adresse der Kontextdaten
{ ...
if ((pUserContext->modifier & KSF_KEY_SHIFT) != 0 &&
(pUserContext->modifier & KSF_KEY_CTRL) != 0 &&
(pUserContext->modifier & KSF_KEY_ALT) != 0 &&
(pUserContext->key == 0x3B))
specialF1Handler(); // Spezielle F1-Routine
...
Diese Funktion kann nun als Handler angemeldet werden:
err = KS_createKeyHandler(
KSF_KEY_FUNCTION, // nur Funktionstasten abfangen
hSpecialF1CallBack, // Handler, hier Callback
0); // Flags, hier 0
In industriellen Anlagen ist es oftmals erwünscht, spezielle Sondertasten für den Bediener zu sperren. Dazu gehören z.B. die Windows-Tasten, Ctrl-Alt-Del, Ctrl-Esc, Alt-Esc und Alt-Tab. Um diese alle zu sperren, genügt folgender Funktionsaufruf:
err = KS_createKeyHandler(
KSF_KEY_SYSTEM, // Alle Systemtasten
NULL, // Kein Handler benötigt
KSF_IGNORE_KEY); // Tasten sind zu ignorieren
- Welche Arten von Tastaturen lassen sich mit dem Keyboard Module behandeln?
- Derzeit werden ausschließlich Keyboards unterstützt, die über PS/2-Adapter angeschlossen werden.
Keine speziellen Hardware-Anforderungen
Filterung serieller Datenströme mit dem Filter Module.
Protokollieren oder ändern Sie den Datenstrom an seriellen Schnittstellen!
Mit dem Filter Module lässt sich protokollieren, welche Daten über eine serielle (COM-) Schnittstelle übertragen werden. Es erlaubt auch die weit reichende Filterung (Änderung) des gesamten Datenstromes an den seriellen COM-Schnittstellen.
Sie können die Daten auf andere Schnittstellen umlenken, z.B. über eine Netzwerkschnittstelle senden. Auch die Simulation ganzer Geräte ist möglich – beispielsweise zu Testzwecken – oder der vollständige Ersatz, der durch die Leistungfähigkeit des PCs möglich wird.
Ziel ist es, vorhandene, auf eine serielle (COM-) Schnittstelle ausgelegte, Programme weiter zu nutzen, wo sich vielleicht keine COM-Schnittstelle mehr befindet. Dieser Eingriff ist für vorhandene Anwendung vollkommen transparent, da alle Daten und Ereignisse des Datenstromes an den von Ihnen installierten Handler weitergereicht werden.
Beachten Sie für passive Anwendungen auch das Device Module, das ebenfalls die Erzeugung virtueller COM-Ports erlaubt.
Erfordert das Kernel Module.
- Synchroner oder asynchroner Eingriff in den Datenstrom auf der Kernel-Ebene
- "Virtueller COM-Port" zur Vortäuschung von realen COM-Schnittstellen mitgeliefert
- Request- und Complete-Ereignisse getrennt erfassbar
- Mögliche Ereignisse: Open, Close, Read, Write, Control
- Datenpakete lassen sich vollständig verwerfen oder simulieren
Es ist ein Datenstrom an einer seriellen Schnittstelle zu beobachten und zu protokollieren. Dazu müssen alle WRITE-Request- und alle READ-Complete-Aufrufe erfasst werden. Die Daten werden über Message-Pipes geleitet:
int __stdcall mySerialFilterCallBack(
void* pArgs, // Adresse der Referenzdaten
void* pContext) // Adresse der Kontextdaten
{ ...
if ((pUserContext->ctxType == KS_FILTER_WRITE_REQUEST)
err = KS_putPipe(
pData->hWrPipe, // Pipe-Handle
pContext->pBytes, // Daten
pContext->length, // Länge
NULL, 0);
if ((pUserContext->ctxType == KS_FILTER_READ_COMPLETE)
err = KS_putPipe(
pData->hRdrPipe, // Pipe-Handle
pContext->pBytes, // Daten
pContext->length, // Länge
NULL, 0);
...
Ein Filter wird erzeugt, wobei die Schnittstelle noch nicht geöffnet sein darf:
err = KS_createFilter(
&hFilter, // Adresse d. Filter-Handles
"COM1", // Name des Ports
0); // Flags, hier 0
Die Funktion kann nun als Handler angemeldet werden:
err = KS_installFilterHandler(
hFilter, // Filter-Handle
KS_FILTER_WRITE_REQUEST, // Ereignis
hSerialFilterCallBack, // Handler, hier Callback
0); // Flags, hier 0
err = KS_installFilterHandler(
hFilter, // Filter-Handle
KS_FILTER_READ_COMPLETE, // Ereignis
hSerialFilterCallBack, // Handler, hier Callback
0); // Flags, hier 0
- Welche Anwendungen lassen sich mit dem Filter Module realisieren?
- "Virtuelle COM-Ports" bereitstellen (beachten Sie hierfür auch das Device Module, das sich einfacher handhaben lässt)
- Datenverkehr über vorhandene Schnittstellen protokollieren
- Vorhandenen Datenstrom manipulieren
Keine speziellen Hardware-Anforderungen
Das Interrupt Module ermöglicht die Behandlung von Hardware-Interrupts.
Realisieren Sie Handler für Hardware-Interrupts von ISA- und PCI-Bus-Baugruppen unmittelbar in der Anwendungs-Programmierumgebung!
Bei der hardwarenahen Programmierung, beispielsweise der Entwicklung von Gerätetreibern, sind häufig auch Ereignisse der Hardware-Baugruppe in Form von Interrupts auszuwerten. Das Interrupt Module erlaubt die Anmeldung von Interrupt-Handlern für Einsteckkarten am ISA- und PCI-Bus sowie für interne Baugruppen.
Die Interrupt-Behandlung kann im Kernel oder auf der Anwendungsebene erfolgen. PCI-Interrupts sind allerdings bereits auf der Kernel-Ebene zu quittieren. Dafür können auch mehr als ein Handler für einen Interrupt registriert werden – beispielsweise eine kleinere Funktion für die Quittierung des IRQs auf der Kernel-Ebene und zusätzlich eine weitere Funktion auf der Anwendungsebene für die eigentliche Auswertung des Interrupts.
Zum Ansprechen von USB-Hardware beachten Sie bitte auch das USB Module.
Erfordert das Kernel Module.
- Anmeldung von Interrupt-Handlern für ISA- und PCI-Interrupts
- Behandlung auf Anwendungs- oder Kernel-Ebene (Quittierung von PCI-IRQs im Kernel)
- Unterstützung aller PCI-Bustypen einschließlich PCIexpress
- Aufruf der Kernel-Funktionen unmittelbar im Kontext der Interrupt Service Routine (ISR)
- Unterstützung von ACPI-, PIC-, APIC- und Multiprozessor-Computern (Dual-Core, Quad-Core etc.)
- Vorübergehende Sperrung der Interrupt-Behandlung möglich
- Kernel-Treiber der »RealTime Suite« kann selbst als WDM-Treiber für PCI-Plug&Play konfiguriert werden.
Angenommen, es soll folgende Callback-Funktion als Interrupt-Handler fungieren:
int __stdcall myInterruptHandler(
void* pArgs, // Adresse der Referenzdaten
void* pContext); // Adresse der Kontextdaten
Hiermit erstellen Sie ein Callback-Objekt (siehe Kernel Module) mit dem Flag KSF_DIRECT_EXEC.
Zur Anmeldung des Interrupt-Handlers sind zunächst die Ressourcen-Informationen zu ermitteln:
KSResourceInfoEx info;
err = KS_getResourceInfoEx(
"PCI\\VEN_10ec&DEV_8139",// Hardware-ID der PCI-Karte
&info); // Zu füllende Info-Struktur
Damit lässt sich nun der Interrupt-Handler anmelden:
err = KS_createDeviceInterrupt(
&hInterrupt, // Adresse des Handles
&info, // Info-Struktur
hCallBack, // Callback-Handle
KSF_ACCEPT_PENDING |
KSF_PCI_INTERRUPT); // Flags, hier PCI
Es lassen sich auch mehrere Handler beim selben IRQ anmelden, z.B. eine Callback-Funktion für die Kernel-Ebene und eine weitere innerhalb des Anwendungskontexts.
- Wie erfolgt die Unterstützung von Plug&Play-Mechanismen?
- Der jeweilige Treiber der »RealTime Suite« lässt sich selbst als Plug&Play-Treiber verwenden. Hierzu ist die mitgelieferte Installations-Textdatei (*.INF) lediglich um einen Eintrag mit der Spezifikation der PCI-Karte oder des UDB-Gerätes zu erweitern.
- Wie lässt sich ermitteln, welche Interrupt-Leitung verwendet wird (Plug&Play)?
- Die vom PCI-Plug&Play-Manager dynamisch zugeordneten Ressource-Informationen lassen sich einfach ermitteln. Siehe IoPort Module.
Keine speziellen Hardware-Anforderungen
Das Serial Module bietet serielle Kommunikation in Echtzeit.
Realisieren Sie umfassende serielle Kommunikationsprotokolle unter Windows!
Das Serial Module unterstützt zwei verschiedene Betriebsarten: Entweder serielle Kommunikation über alle COM-Schnittstellen des PCs ohne Echtzeit oder serielle Kommunikation in Echtzeit und direkte Hardware-Ansteuerung über UART-16550 oder höher.
Mit dem Serial Module lassen sich Kommunikations-Anwendungen für die seriellen COM-Schnittstellen auf einfache Weise realisieren. Gegenüber dem Windows-API ist es einfacher, zwischen verschiedenen Arten der Signalisierung zu unterscheiden: Blockierung des Aufrufers bis zum Abschluss des Sende- oder Empfangsauftrages, Signalisierung durch Callback oder Event – ein Konzept, das auch in anderen Modulen zu finden ist.
In der Echtzeit-Betriebsart erlaubt das Serial Module die Realisierung nahezu beliebiger, auch komplexer industrieller Kommunikationsprotokolle. Durch Einsatz eines effizienten Kernel-Treibers wird die zeitlich genaue Reaktion auf alle Schnittstellen-Ereignisse und die direkte Beeinflussung der Hardware auf der Kernel-Ebene möglich. Das API beider Betriebsarten ist ansonsten identisch.
Für die Erzeugung sogenannter "virtueller COM-Ports" beachten Sie auch das Device Module, über das vorhandene ("Legacy"-)Anwendungen völlig transparent auf nicht vorhandene serielle Schnittstellen zugreifen können.
Erfordert das Kernel Module.
- Serielle Kommunikation über alle COM-Schnittstellen des PCs über Windows-Mechanismen oder in Echtzeit durch UART-Hardware-Unterstützung von 16450 bis 16950
- Flexible Reaktion auf eintreffende Daten und Ereignisse durch Blockierung, Callback oder Event
- Auflisten aller COM-Schnittstellen im PC (im Base Module)
- Schnelle Reaktion auf eintreffende Daten und Ereignisse
- Direkte Ansteuerung der Handshake-Leitungen
- Handler für alle Ereignisse, z.B. Byte-Handler, LSR-, MSR-Change, Break, Error
- Erkennung von "transmit empty" (z.B. für RS485-Richtungsumschaltung oder 9-Bit-Modus)
- Automatische RS485-Richtungsumschaltung programmierbar
- Endlos-Modus für direktes Senden aus Anwender-Puffer und andere spezielle Szenarien
- Automatische Timeout-Überwachung zuschaltbar
- Automatische Leitungsfehler-Überwachung programmierbar
- Maximale Baudrate detektierbar
- Senden und Empfang sind voneinander unabhängig
- Empfangene Daten werden automatisch im Hintergrund gepuffert
- Überbrückung des Empfangs über mehrere Sekunden
- Liste der unterstützten Zusatzkarten hier
- Unterstützung weiterer Karten kostengünstig zu implementieren
Verwenden Sie folgende Funktion, um alle COM-Ports aufzulisten:
err = KS_enumDevices(
"COM", // nach COM-Ports suchen
i, // Zähler, mit 0 beginnend
portNameBuf, // Puffer für COM-Port-Namen
0); // Flags, hier 0
Die Schnittstelle lässt sich dann wie folgt öffnen:
KSResourceInfoEx info;
err = KS_openSerialPort(
&hPort, // Adresse des Handles
portNameBuf, // Name des Ports (z.B. "COM1")
"9600,n,8,1", // Initialisierung
KSF_KERNEL_EXEC); // Kernel-Implementierung
So senden wir Daten, z.B. eine Messwertanforderung an eine Gerät:
err = KS_xmitPort(
hPort, // Port-Handle
NULL, // Signalisierung (Post Mode)
message, // Pufferadresse
0, // Länge, zu senden (auto)
NULL, // Länge, gesendet
KSF_DONT_WAIT); // Flags: ohne Blockierung
Jederzeit lässt sich ermitteln, wie viele Zeichen bereits empfangen wurden:
err = KS_getPortState(
hPort, // Port-Handle
&state, // Adresse der Status-Struktur
0); // Flags: here 0
printf("Es wurden %d Zeichen empfangen.\n", state.recvAvail);
Der Empfang kann folgendermaßen aussehen (im Wait-Mode auf der Anwendungsebene):
err = KS_recvPort(
hPort, // Port-Handle
NULL, // Signalisierung (Wait Mode)
pBuffer, // Adresse des Datenpuffers
state.recvAvail, // Länge, zu empfangen
&received, // Länge, empfangen
KSF_USE_TIMEOUTS); // Flags: Timeout-Überwachung
- Was ist die "normale" Betriebsart des Serial Modules?
- Flag KSF_USER_EXEC beim Öffnen des Ports
- basiert auf Windows-Treibermechanismen
- unterstützt alle COM-Schnittstellen im System (auch "virtuelle Schnittstellen", z.B. USB-nach-COM-Adapter)
- keine Echtzeit
- Was zeichnet die Kernel-Betriebsart aus?
- Flag KSF_KERNEL_EXEC beim Öffnen des Ports
- Hardware wird mit speziellem Treiber direkt angesteuert
- erfordert UART-16550-kompatible Hardware
- Reaktion auf alle Schnittstellen-Ereignisse innerhalb der Interrupt-Service-Routine
- Welche sind die Voraussetzungen für den Kernel-Modus?
- Schnittstellen-Hardware kompatibel zum UART-16550
- Ressourcen (Interrupt und I/O-Basisadresse) ermittelbar
- entweder eingebaute COM-Ports oder unterstützte Zusatzkarten
- Unterstützung weiterer Karten kostengünstig zu implementieren
- Werden auch höhere Baudraten unterstützt?
- ja, höhere Standard-Baudraten werden automatisch erkannt
- spezielle Baudraten lassen sich vorgeben
- wir realisieren gerne in Ihrem Auftrag eine Erweiterung des Treibers
Das Serial Module erfordert im Kernel-Modus spezielle Hardware.
Um eine hohe Reaktionsfähigkeit zu erreichen, muss der langsame Windows-Treiber der seriellen Schnittstelle ersetzt werden. Aus diesem Grund werden nur bestimmte serielle Schnittstellenbaugruppen unterstützt. Diese Einschränkung gilt nur im Kernel-Modus, da hier eine UART-16550-kompatible Hardware angesprochen werden muss. Dazu gehören:
Standard-Schnittstellen
- Alle im PC eingebauten RS232-Schnittstellen, solche auf ISA-PnP-Karten, PC-Card-Module (PCMCIA 16-Bit)
PCI-Bus
- MOXA: IndustIo CP-132 (2xSER, RS-422/485)
- MOXA: IndustIo CP-114 (4xSER, RS-422/485)
- MOXA: SmartIo C104H/PCI (4xSER)
- MOXA: SmartIo C168H/PCI (8xSER)
- ADDI-DATA: APCI-73xx (1xSER)
- ADDI-DATA: APCI-74xx (2xSER)
- ADDI-DATA: APCI-75xx (4xSER)
- Brainboxes: PCI 4 Port Serial Card (z.B. CC-268) (4xSER)
- TCL: DataBooster (4xSER/8xSER) (über IoPort-Zugriff)
- SUNIX: 4088A/4089A (2xSER,2xPAR)
- LINDY: 70585 (2xSER)
- LINDY: 70616 (2xSER,2xPAR)
- EXSYS: EX-41051 (1xSER)
- EXSYS: EX-41052 (2xSER)
- Wiesemann & Theis: 13812 (2*SER, RS-232, 1kV isolated)
CardBus 32-Bit
- QUATECH: Serial I/O PC Card SSP-100 (1xSER)
- SOCKET: Serial I/O PC Card (1xSER)
Wenn Sie Fragen zur Hardware-Unterstützung haben, kontaktieren Sie uns! Die Unterstützung anderer externer Schnittstellen lässt sich in der Regel leicht hinzufügen. Falls Sie die Funktionstüchtigkeit mit anderen Einsteckkarten getestet haben, würden wir uns über eine entsprechende Information sehr freuen.
Das USB Module erlaubt die Entwicklung von USB-Gerätetreibern.
Erstellen Sie komfortabel USB-Treiber für Windows, ohne sich in die aufwändige Kernel-Programmierung einzuarbeiten!
Mit dem USB Module lassen sich nicht nur USB-Treiber für Windows komfortabel erstellen, sondern auch vorhandene USB-Geräte ansprechen, um eine spezielle Ansteuerung zu realisieren.
Das USB Module enthält einen generischen Treiber für USB-Geräte, der einfach durch einen Eintrag in der mitgelieferten INF-Datei des Treibers konfiguriert wird. Dadurch wird der Treiber aktiviert, sobald der Windows-Plug&Play-Manager den Anschluss des betreffenden USB-Gerätes erkennt.
Kombinieren Sie das USB Module mit dem Device Module, um anderen Anwendungen das USB-Gerät in Form eines "virtuellen COM-Ports" bereitzustellen.
Erfordert das Kernel Module.
- Kommunikation mit USB Geräten über USB 1.1 und USB 2.0 von der Anwendungs- oder Kernel-Ebene
- Unterstützung von Low-, Full-, High-Speed
- Control-, Bulk-, Interrupt-, Isochron-Transfer
- Unterstützt Geräte mit mehreren Interfaces und mehreren Konfigurationen
- Reaktion auf alle Plug&Play und Power-Management-Ereignisse
- Reaktion auf eintreffende Daten direkt auf der Kernel-Ebene möglich
- Sende- und Empfangsroutinen können direkt aus Echtzeitkontext heraus gerufen werden
- Auflisten aller USB-Devices im PC
Verwenden Sie folgende Funktion, um alle USB-Geräte aufzulisten:
err = KS_enumDevices(
"USB", // nach USB-Geräten suchen
i, // Zähler, mit 0 beginnend
deviceNameBuf, // Puffer für Gerätenamen
0); // Flags, hier 0
Mit dem erhaltenen Namen lässt sich der Config-Deskriptor ermitteln, um z.B. nach einem bestimmten HID-Gerätetyp zu suchen:
err = KS_execUsbCommand(
deviceNameBuf, // Gerätename
KS_USB_GET_CONFIG_DESCRIPTOR,
0, // Index des Deskriptors
pBuf, // Puffer
64000, // Puffergröße
KSF_ALTERNATIVE); // Flags
Ein bereits vorhandener Treiber kann ersetzt werden:
strcpy(infPath+GetSystemDirectory(infPath,256),"\\Kdemo.inf");
err = KS_updateDriver(
deviceNameBuf, // Gerätename
infPath, // INF-Datei
0); // Flags, hier 0
Das gefundene Gerät kann nun geöffnet werden. Wenn es bekannt ist, können Sie hier aber auch den Gerätenamen direkt angeben:
err = KS_openUsbDevice(
&hDevice, // Adresse des Handles
"USB\\VID_10CF&PID_5500",// Gerätename
0); // Flags, hier 0
Die eigentliche Kommunikation erfolgt über sogenannte Endpoints. Es gibt bis 15 Sende- und 15 Empfangs-Endpunkte zu einem Gerät:
err = KS_getUsbPort(
hDevice, // Device-Handle
&hPort, // Adresse des Handles
endpointAddress, // Nummer des Endpoints
KSF_INTERRUPT_TRANSFER); // Flags: Transferart
Die Kommunikation selbst erfolgt nun ähnlich der seriellen Kommunikation im Serial Module.
- Sind die USB-Funktionen auch auf der Kernel-Ebene nutzbar?
- Ja. Obwohl die USB-Ankopplung nicht echtzeitfähig ist, können Sie z.B. Sende- oder Empfangs-Aufträge auch aus einer Echtzeit-Timer-Funktion heraus auslösen.
- Wie kann zur Ausnutzung der verfügbaren Bandbreite ein möglichst kontinuierlicher Datenstrom gewährleistet werden?
- mehrere Jobs gleichzeitig möglich, um Bandbreite auszunutzen
- maximale Anzahl gleichzeitiger Jobs einstellbar
Keine speziellen Hardware-Anforderungen
Mit dem Timer Module sind Timer in Millisekundenauflösung realisierbar.
Programmieren Sie anwenderspezifische Timer-Funktionen zur Steuerung und Überwachung des Prozesses!
Für die vielfältigsten Aufgaben sind in Steuerungsanwendungen zyklische Timer zu programmieren. Als auszuführende Aktion kann über ein Event-Objekt ein Anwendungs-Threads aktiviert als auch eine Callback-Funktion auf der Anwendungsebene oder im Kernel gerufen werden.
Die Timer sind ca. in Millisekundenschritten programmierbar. Obwohl die Timer auf den vom jeweiligen Betriebssystem angebotenen Mechanismen beruhen, ist die erreichbare Genauigkeit für viele Überwachungszwecke ausreichend. Um trotzdem eine möglichst hohe Genauigkeit zu erzielen, können Sie auf der Anwendungsebene die Thread-Priorität heraufsetzen und erhalten so Vorrang vor anderen Anwendungen. Eine wesentlich höhere Genauigkeit erzielen Sie mit dem RealTime Module.
Beachten Sie auch das RealTime Module, das hochgenaue Echtzeit-Timer unter Windows bereitstellt.
Erfordert das Kernel Module.
- Timer in Millisekunden-Schritten programmierbar
- Callback- oder Event-Objekte zur Signalisierung
- Callbacks auf der Anwendungs- oder der Kernel-Ebene möglich
- Basierend auf Mechanismen des Betriebssystem-Kerns
- Einmalige oder zyklische Timer
- Theoretisch unbegrenzte Anzahl von Timern
Wenn Sie eine Callback-Funktion erzeugt haben (siehe Kernel Module), können Sie diese als Timer-Callback wie folgt anmelden:
const int ms = 10000; // Millisekunden
err = KS_createTimer(
&hTimer, // Adresse des Handles
period * ms, // Timerperiode in 100 ns
hTimerCallBack, // Callback-Handle
KSF_DONT_START); // Flags: noch nicht starten
Der Timer lässt sich nun für zyklische Ausführung starten:
err = KS_startTimer(
hTimer, // Timer-Handle
0, // Flags, hier 0
period * ms); // Timerperiode in 100 ns
…und jederzeit wieder stoppen:
err = KS_stopTimer(
hTimer); // Timer-Handle
…oder auch erneut starten, z.B. für einmaligen Aufruf:
err = KS_startTimer(
hTimer, // Timer-Handle
KSF_ONE_SHOT, // Flags, einmalig
period * ms); // Timerdauer in 100 ns
Ein laufender Timer kann jederzeit abgebrochen werden, was sich sehr gut für Watchdog-Anwendungen eignet:
err = KS_cancelTimer(
hTimer); // Timer-Handle
In dem Fall beginnt bei zyklischen Timern die Wartezeit erneut.
- Lassen sich mehrere Timer gleichzeitig anmelden?
- ja, Anzahl der Timer praktisch nicht begrenzt
- keine Priorisierung zwischen den Timern, jede Timer-Routine wird abgeschlossen, bevor andere ausgeführt wird
- Welche Genauigkeit ist erreichbar?
- Timer basieren auf Mechanismen des Betriebssystem-Kernels
- Timer daher nicht echtzeitfähig, siehe RealTime Module
- auf Anwendungsebene lässt sich erzielbare Genauigkeit durch Anhebung der absoluten Priorität des Timer-Threads erhöhen
Keine speziellen Hardware-Anforderungen
Das RealTime Module ermöglicht hochgenaue Echtzeit-Timer.
Realisieren Sie genaue Echtzeit-Timer-Funktionen auf der Kernel-Ebene mit mehreren Kilohertz und einer Ungenauigkeit von nur wenigen Mikrosekunden!
Das RealTime Module bildet die Grundlage für die Realisierung vielfältiger Steuerungsanwendungen.
Mit dem RealTime Module erstellen Sie Timer-Funktionen mit folgenden Eigenschaften:
- hohe Frequenzen von mehreren Kilohertz (z.B. 10 Kilohertz oder höher)
- hohe Genauigkeit, Abweichungen betragen nur wenige Mikrosekunden
Die Echtzeiteigenschaften werden auf der Kernel-Ebene erreicht, indem die Timer-Funktionen als Callback mit der höchsten Systempriorität ausgeführt werden. Ihr Anwendercode wird hierzu auf die Kernel-Ebene verlagert.
NEU! Jetzt auch Echtzeit-Timer auf Rechnern mit dynamisch angepasstem CPU-Takt, z.B. Notebooks!
NEU! Jetzt auch High-Precision-Modus mit NMI (nur auf APIC-Systemen): maximales Jitter typisch ca. 2…3 µs, Frequenzen mit > 100 kHz möglich
Dieses Modul ersetzt und erweitert das Timer Module.
Erfordert das Kernel Module sowie das Clock Module.
- Timer in hoher Auflösung programmierbar (Größenordnung ca. 10 kHz oder mehr)
- Einmalige oder zyklische Timer
- Hohe Genauigkeit mit Callback-Funktionen auf der Kernel-Ebene erzielbar
- Basierend auf Hardware-Timern des Systems
- Timer haben höchste Systempriorität und sind daher preemptiv gegenüber allen anderen Systemfunktionen
- Callback- oder Event-Objekte zur Signalisierung
- Callbacks auf der Anwendungs- oder der Kernel-Ebene möglich
- Theoretisch unbegrenzte Anzahl von Timern
Wenn Sie eine Callback-Funktion erzeugt haben (siehe Kernel Module), können Sie diese als Timer-Callback wie folgt anmelden:
const int ms = 10000; // Millisekunden
err = KS_createTimer(
&hTimer, // Adresse des Handles
period * ms, // Timerperiode in 100 ns
hTimerCallBack, // Callback-Handle
KSF_DONT_START); // Flags: noch nicht starten
Der Timer lässt sich nun für zyklische Ausführung starten:
err = KS_startTimer(
hTimer, // Timer-Handle
0, // Flags, hier 0
period * ms); // Timerperiode in 100 ns
…und jederzeit wieder stoppen:
err = KS_stopTimer(
hTimer); // Timer-Handle
…oder auch erneut starten, z.B. für einmaligen Aufruf:
err = KS_startTimer(
hTimer, // Timer-Handle
KSF_ONE_SHOT, // Flags, einmalig
period * ms); // Timerdauer in 100 ns
Ein laufender Timer kann jederzeit abgebrochen werden, was sich sehr gut für Watchdog-Anwendungen eignet (die Wartezeit beginnt erneut):
err = KS_cancelTimer(
hTimer); // Timer-Handle
Zum Betrieb des Timers auf der Kernel-Ebene in Echtzeit ist zunächst der Hardware-Timer zu initialisieren:
const int us = 10; // Mikrosekunden
err = KS_setTimerResolution(
resolution * us, // Timerperiode in 100 ns
KSF_HIGH_PRECISION); // Flags, hier High-Prec.
NEU! Auf APIC-Systemen ist jetzt auch der High-Precision-Modus verwendbar.
Nun kann der Echtzeit-Timer angemeldet werden:
err = KS_createTimer(
&hTimer, // Adresse des Handles
period * us, // Timerperiode in 100 ns
hTimerCallBack, // Callback-Handle
KSF_REALTIME_EXEC); // Flags: Echtzeit-Timer
Damit wird beinahe jegliches Jitter vermieden!
- Lassen sich mehrere Timer gleichzeitig anmelden?
- ja, mehrere Timer sind möglich
- keine Priorisierung zwischen Timern, jede Timer-Routine wird abgeschlossen, bevor andere ausgeführt wird
- Welche Genauigkeit ist erreichbar?
- Timer besitzen die höchste Systempriorität
- verdrängen dadurch zuverlässig alle anderen Systemfunktionen
- erreichbares Jitter je nach System und Betriebsmodus maximal wenige Mikrosekunden
- Beispiel: AMD Dual-Core 2 GHz, ACPI, APIC, Overclocking 200 kHz, max. Jitter ca. 5 µs im High-Precision-Mode
- Welcher PC-Aufbau eignet sich am besten für anspruchsvolle Echtzeit?
- PC mit ACPI (Advanced Configuration and Power Interface)
- PC mit APIC (Advanced Programmable Interrupt Controller)
- Dual-Core-/Quad-Core-CPUs je nach Leistungsanforderung der Anwendung
- Was passiert, wenn meine Funktion bis zum nächsten Timer-Takt noch nicht abgeschlossen ist?
- keine Verschachtelung möglich
- Timer-Tick fällt einfach aus
Keine speziellen Hardware-Anforderungen
Das MultiTasking Module stellt eine Echtzeit-Multitasking-Umgebung bereit.
Arbeiten Sie wie die Profis! – Realisieren Sie verschiedene prioritätsgesteuerte Tasks!
Viele Steuerungs- und Automatisierungsanwendungen sind nur durch ein komplexes Modell der Abläufe zu formulieren. Sie erfordern daher entsprechend leistungsfähige Mittel zur Umsetzung. Kaum ein Ansatz ist dafür besser geeignet, als ein prioritätsgesteuertes, preemptives Multitasking-System.
Realisieren Sie Tasks mit bis zu 255 Prioritätsstufen, die zuverlässig dafür sorgen, dass jeweils nur die am höchsten priorisierte Task ausgeführt wird (preemptiv). Die RealTime-Umgebung stellt sicher, dass Ihre Echtzeit-Tasks ausgeführt werden, solange mindestens eine solche ausführbar ist. Sämtliche Betriebssystem-Mechanismen haben eine niedrigere Priorität.
Die Echtzeit-Tasks können übrigens auch von Echtzeit-Timern mit mehreren Kilohertz oder von Hardware-Interrupts Ihrer Einsteckkarten ausgelöst werden!
Sie können auch mehrere Tasks je Prioritätsstufe anmelden oder die Priorität der Tasks dynamisch anpassen. Wenn eine blockierte Task wieder frei wird, reiht sie sich einfach hinter die anderen Tasks der gleichen Prioritätsstufe ein. Als Synchronisationsobjekte stehen Semaphoren zur Verfügung. Sollte eine höher priorisierte Task ein Semaphore anfordern, dass gerade eine niedriger priorisierte Task besitzt, "erbt" die niedrigere Task vorübergehend die hohe Priorität. Dadurch ist die sogenannte "Prioritätsinversion" ausgeschlossen.
Beachten Sie auch das RealTime Module, das hochgenaue Echtzeit-Timer unter Windows bereitstellt sowie das Interrupt Module, mit dessen Mitteln die Hardware-Interrupts als Echtzeit-Task ausführbar sind.
Erfordert das RealTime Module.
- Prioritätsgesteuertes, preemptives Echtzeit-Multitasking
- Bis zu 255 Prioritätsstufen
- Vorrang vor allen anderen Windows-Mechanismen
- Tasks von Echtzeit-Timern oder Hardware-Interrupts auslösbar
- max. 255 Prioritätsstufen, davon 191 für Anwender nutzbar
- mehrere Tasks je Prioritätsstufe
- dynamische Anpassung der Priorität möglich
- Synchronisationsobjekte (Semaphore)
- korrekte Vererbung der Priorität zur Vermeidung der Prioritätsinversion
- Tasks können erneut "getriggert" werden (KS_triggerTask)
- Tasks können sich selbst von überall abbrechen (KS_exitTask)
- Tasks können von außen abgebrochen werden (KS_killTask)
- Zeitverzögerungen im Timer-Raster der Task-Umgebung möglich (KS_sleepTask)
- Timer-Raster der Task-Umgebung einstellbar
- Gleitkomma-Verarbeitung innerhalb Task-Code erlaubt
- Task-Funktionen: suspend, resume, exit, kill, trigger, sleep, setPrio
- Reserviert nur eine CPU, andere CPUs (bei Dual-Core, Quad-Core) sind vollständig für das System frei
- Erfordert APIC-PC
Zunächst ist die Echtzeit-Umgebung zu aktivieren (siehe RealTime Module). Danach können Tasks erzeugt werden:
err = KS_createTask(
&hTask, // Adresse des Handles
hCallBack, // Callback-Handle
250, // Prioritätsstufe (64-255)
KSF_DONT_START); // Flags, noch nicht starten
Das Flag KSF_DONT_START legt fest, dass die Task noch nicht zu starten ist – sie ist suspendiert. Ein Starten erfolgt über:
err = KS_resumeTask(
hTask); // Task-Handle
Um die Task nochmals an der Ausführung zu hindern, kann sie wiederum suspendiert werden:
err = KS_suspendTask(
hTask); // Task-Handle
Wenn eine Task sich selbst unterbrechen soll (um später von einer anderen wieder aufgeweckt zu werden), kann sie ebenfalls diese Funktion rufen:
err = KS_suspendTask(
NULL); // Diese Task
Die Task lässt sich auch direkt als Timer-Task starten:
err = KS_createTimer(
&hTimer, // Adresse des Handles
50 * us, // Timer-Periode in 100 ns
hTask, // Handle der Timer-Task
KSF_REALTIME_EXEC); // Flags, Echtzeit-Ausführung
Nun wird die Task zyklisch mit einer Periode von 50 µs (20 kHz) bei jedem Timer-Takt aktiviert.
Wenn eine Task beendet werden soll, kann sie jederzeit die folgende Funktion rufen:
err = KS_exitTask(
exitCode); // Beendigungswert der Task
- Was ist eine Prioritätsvererbung?
- Schutz vor der sogenannten "Prioritätsinversion"
- wenn eine niedriger priorisierte Task ein Semaphore besitzt und eine höher priorisierte Task dieses belegen möchte, muss die höhere auf die niedrigere Task warten. So weit so gut. Im Normalfall wartet sie nur so lange, bis die niedriger priorisierte Task den Zugriff auf die gemeinsame Ressource beendet hat und das Semaphore wieder freigibt. Wenn nun jedoch ein mittlere Task hinzukäme, würde diese (da sie höher liegt) die Task mit der niedrigen Priorität verdrängen und damit die noch höher priorisierte Task ebenfalls an der Ausführung hindern – die Priorität hätte sich umgekehrt
Keine speziellen Hardware-Anforderungen
Fast-Ethernet-Kommunikation in Echtzeit mit dem Packet Fast Module.
Realisieren Sie Ethernet-Kommunikation in Echtzeit über ausgewählte Fast-Ethernet-Controller!
Das Packet Fast Module erlaubt die Kommunikation über Fast-Ethernet-Netzwerkkarten (100 MBit/s). Die sofortige Reaktion auf eintreffende Datenpakete in der Interrupt Service Routine des Netzwerk-Adapters ermöglicht die Realisierung von Echtzeit-Protokollen.
Das Packet Fast Module unterstützt Controller vom Typ Intel/Pro-100 oder RealTek 8139.
Sämtliche Kopieroperationen werden vermieden, um höchste Übertragungsraten bei minimalen Reaktionszeiten zu ermöglichen. Der Anwender liest oder beschreibt die gleichen Speicherbereiche, wie der Netzwerk-Controller.
Es können beliebige Ethernet-Frames übertragen werden, einschließlich IP. Multicast, Broadcast, Promiscuous-Mode und automatische Adressermittlung durch ARP werden unterstützt.
Beachten Sie auch das Packet Gigabit Module, das Echtzeit-Ethernet auch mit Gigabit-Netzwerk-Controllern ermöglicht.
Das Socket Module stellt zudem spezielle Funktionen zur UDP- und TCP-Kommunikation bereit.
Erfordert das Kernel Module.
- Ethernet-Frames in Echtzeit übertragen
- Verzögerungsfreies Senden & sofortige Reaktion beim Empfang
- Senden und Empfangen auf der Kernel-Ebene möglich
- Unterstützte Hardware: Intel-Pro/100 oder RealTek 8139
(siehe Hardware-Kompatibilitätsliste) - IP- und MAC-Multicast, Broadcast, Promiscuous-Mode für Empfang aller Pakete
- Empfang von Datenpaketen entweder durch Callback-Funktion direkt im Interrupt-Kontext oder im Polling-Betrieb
- Sende- und Empfangsroutinen direkt aus dem Echtzeitkontext aufrufbar
- Priorisierung von zu sendenden Paketen in 4 Stufen möglich
- Automatische Adressermittlung durch ARP-Unterstützung
- Funktionen für CRC-Berechnung und Byteorder-Wandlung enthalten
- Im Socket Module finden Sie Funktionen zur UDP- und TCP-Kommunikation
Zuerst wird der Netzwerkadapter geöffnet, wobei dessen Hardware-ID anzugeben ist:
err = KS_openAdapter(
&hAdapter, // Adresse des Handles
"VEN8086&DEV1226", // Hardware-ID des Adapters
100, // RecvPool-Länge
100, // SendPool-Länge
0); // Flags, hier 0
Zum Senden ist zunächst ein Paket aus dem Pool anzufordern und zu befüllen:
err = KS_requestPacket(
hAdapter, // Adapter-Handle
&pPacket, // Zeiger auf Ethernet-Paket
KSF_IP_PACKET); // Flags, hier IP-Paket
... // Paket füllen
err = KS_sendPacket(
hAdapter, // Adapter-Handle
pPacket, // Adresse des Ethernet-Pakets
KSF_IP_PACKET); // Flags, hier IP-Paket
Beim Empfang ist der Ablauf umgekehrt: Zuerst wird ein Paket abgerufen und nach der Auswertung der Daten wieder freigegeben:
err = KS_recvPacket(
hAdapter, // Adapter-Handle
&pPacket, // Zeiger auf Ethernet-Paket
KSF_IP_PACKET); // Flags, hier IP-Paket
... // Paket auslesen
err = KS_releasePacket(
hAdapter, // Adapter-Handle
pPacket, // Adresse des Ethernet-Pakets
KSF_IP_PACKET); // Flags, hier IP-Paket
Sie können auch eine Callback-Funktion zum Echtzeitempfang registrieren:
err = KS_installPacketHandler(
hAdapter, // Adapter-Handle
KS_PACKET_RECV, // bei Paketempfang aufrufen
hRecvCallback, // Handle des Callback-Objekts
0); // Flags, hier 0
- Auf welche Weise kann der Empfang erfolgen?
- abfrageorientiert durch zyklisches Polling
- ereignisorientiert durch Anmeldung eines Empfangs-Handlers auf der Kernel-Ebene
- empfangene Datenpakete werden ohne Kopieroperation bereitgestellt
- Ist die Datenauswertung auch auf der Anwendungsebene möglich?
- ja, auch hier keine Kopieroperation nötig
- Welche Datentransferrate ist erreichbar?
- maximale Transferrate des Netzwerk-Controllers
- nominal 100 MBit bei Fast-Ethernet
- Mein Rechner hat keinen Intel-Pro- bzw. Realtec-Chip, was kann ich tun?
- wir empfehlen grundsätzlich für Echtzeit eine andere Schnittstelle zu verwenden, als für die normale Netzwerkkommunikation (z.B. zur Vernetzung der Steuerung mit den höheren Ebenen)
- bitte rüsten Sie eine weitere Netzwerkkarte nach
- um sicher zu gehen, bieten wir Ihnen getestete und kompatible Netzwerkkarten an, kontaktieren Sie uns!
Das Packet Gigabit Module erfordert spezielle Hardware.
Um Echtzeitfähigkeit zu erreichen, muss der langsame Windows-Treiber der Netzwerkkarte ersetzt werden. Aus diesem Grund werden nur Netzwerkadapter mit speziellen Controllern unterstützt. Dazu gehören:
Fast-Ethernet-Controller (100 MBit/s)
Intel-Pro/100
- 8255x
- 82562
RealTek 8139
- 8139B, 8139C, 8139D
Hardware-Auswahl
- D-Link DFE-538TX, Fast Ethernet PCI Adapter
- Allnet ALL0119B 32-Bit PCI Fast Ethernet
- D-Link DFE-538TX+, Fast Ethernet PCI Adapter
- DIGITUS Fast Ethernet PCI Card 10/100Mbit 1xRJ-45 Realtek 8139 DIGITUS DN-1001J
- Intellinet Fast Ethernet NIC (Realtek 8139 Chipsatz)
- Ultron Nek ultron PCI UNE110TX 100 MBit Realtek retail
- Unex ND012C (NexNIC)
- Ultron Nek ultron PCMCIA Ethernet 100MBit/32Bit retail
Wenn Sie Fragen zur Hardware-Unterstützung haben, kontaktieren Sie uns!
Senden und empfangen Sie beliebige Ethernet-Frames in Echtzeit!
Realisieren Sie Automatisierungslösungen, schnelle Messwerterfassung oder industrielle Bildverarbeitung auf Ethernet-Basis unter Windows in Echtzeit!
Das Packet Gigabit Module unterstützt Netzwerk-Adapter mit verschiedenen gängigen Controllern. Dazu gehören sowohl Fast-Ethernet- als auch Gigabit-Ethernet-Controller.
Es können alle Ethernet-basierten Protokolle übertragen werden (einschließlich IP). Funktionen für CRC-Berechnung und Byteorder-Wandlung werden bereitgestellt.
Anders als sonst oftmals in Betriebssystemen üblich werden bei dieser Implementierung jegliche Kopieroperationen vermieden. Sowohl beim Senden als auch beim Empfang benutzen Sie den gleichen Speicher wie der Netzwerk-Controller. Sie erreichen dadurch höchstmögliche Übertragungsraten und kürzeste Reaktionszeiten.
Dieses Modul ersetzt und erweitert das Packet Fast Module.
Beachten Sie auch das Socket Module, das spezielle Routinen zur UDP- und TCP-Kommunikation enthält, die auf den Packet-Funktionen aufsetzen.
Erfordert das Kernel Module.
- Ethernet-Frames in Echtzeit übertragen
- Verzögerungsfreies Senden & sofortige Reaktion beim Empfang
- Senden und Empfangen auf der Kernel-Ebene möglich
- Unterstützte Hardware: Intel, RealTek (bis zu Gigabit)
(siehe Hardware-Kompatibilitätsliste) - Jumbo-Frames bis 16128 Byte je nach NIC
- IP- und MAC-Multicast, Broadcast, Promiscuous-Mode für Empfang aller Pakete
- Empfang von Datenpaketen entweder durch Callback-Funktion direkt im Interrupt-Kontext oder im Polling-Betrieb
- Sende- und Empfangsroutinen direkt aus dem Echtzeitkontext aufrufbar
- Priorisierung von zu sendenden Paketen in 4 Stufen möglich
- Automatische Adressermittlung durch ARP-Unterstützung
- Funktionen für CRC-Berechnung und Byteorder-Wandlung enthalten
- Im Socket Module finden Sie Funktionen zur UDP- und TCP-Kommunikation
Die Möglichkeiten des Packet Fast Modules gelten auch hier. Zusätzlich werden auch Gigabit-Ethernet-Controller unterstützt (siehe Hardware-Kompatibilitätsliste).
Zuerst wird der Netzwerkadapter geöffnet, wobei dessen Hardware-ID anzugeben ist:
err = KS_openAdapter(
&hAdapter, // Adresse des Handles
"VEN8086&DEV1226", // Hardware-ID des Adapters
100, // RecvPool-Länge
100, // SendPool-Länge
0); // Flags, hier 0
Zum Senden ist zunächst ein Paket aus dem Pool anzufordern und zu befüllen:
err = KS_requestPacket(
hAdapter, // Adapter-Handle
&pPacket, // Zeiger auf Ethernet-Paket
KSF_IP_PACKET); // Flags, hier IP-Paket
... // Paket füllen
err = KS_sendPacket(
hAdapter, // Adapter-Handle
pPacket, // Adresse des Ethernet-Pakets
KSF_IP_PACKET); // Flags, hier IP-Paket
Beim Empfang ist der Ablauf umgekehrt: Zuerst wird ein Paket abgerufen und nach der Auswertung der Daten wieder freigegeben:
err = KS_recvPacket(
hAdapter, // Adapter-Handle
&pPacket, // Zeiger auf Ethernet-Paket
KSF_IP_PACKET); // Flags, hier IP-Paket
... // Paket auslesen
err = KS_releasePacket(
hAdapter, // Adapter-Handle
pPacket, // Adresse des Ethernet-Pakets
KSF_IP_PACKET); // Flags, hier IP-Paket
Sie können auch eine Callback-Funktion zum Echtzeitempfang registrieren:
err = KS_installPacketHandler(
hAdapter, // Adapter-Handle
KS_PACKET_RECV, // bei Paketempfang aufrufen
hRecvCallback, // Handle des Callback-Objekts
0); // Flags, hier 0
- Auf welche Weise kann der Empfang erfolgen?
- abfrageorientiert durch zyklisches Polling
- ereignisorientiert durch Anmeldung eines Empfangs-Handlers auf der Kernel-Ebene
- empfangene Datenpakete werden ohne Kopieroperation bereitgestellt
- Ist die Datenauswertung auch auf der Anwendungsebene möglich?
- ja, auch hier keine Kopieroperation nötig
- Welche Datentransferrate ist erreichbar?
- maximale Transferrate des Netzwerk-Controllers
- nominal 100 MBit bei Fast-Ethernet (Intel Pro/100, RealTek 8139)
- nominal 1000 MBit bei Gigabit-Ethernet (Intel Pro/1000, RealTek 8169 etc.)
- Netzwerk-Controller kann permanent mit Daten versorgt werden
- Mein Rechner hat keinen Intel-Pro- bzw. Realtec-Chip, was kann ich tun?
- wir empfehlen grundsätzlich für Echtzeit eine andere Schnittstelle zu verwenden, als für die normale Netzwerkkommunikation (z.B. zur Vernetzung der Steuerung mit den höheren Ebenen)
- bitte rüsten Sie eine weitere Netzwerkkarte nach
- um sicher zu gehen, bieten wir Ihnen getestete und kompatible Netzwerkkarten an, kontaktieren Sie uns!
Das Packet Gigabit Module erfordert spezielle Hardware.
Um Echtzeitfähigkeit zu erreichen, muss der langsame Windows-Treiber der Netzwerkkarte ersetzt werden. Aus diesem Grund werden nur Netzwerkadapter mit speziellen Controllern unterstützt. Dazu gehören:
Fast Ethernet controller (100 MBit/s)
Intel-Pro/100
- 8255x
- 82562
RealTek 8139
- 8139B, 8139C, 8139D
Gigabit Ethernet controller (1000 MBit/s)
Intel-Pro/1000
- 82540, 82541, 82544, 82545, 82546, 82547
- 82571, 82572, 82573
RealTek
- 8100E, 8101E, 8102E, 8110S,
- 8168B/8111B, 8168C/8111C, 8168CP/8111CP, 8168D/8111D,
- 8169, 8169S, 8169SB/8110SB, 8169SC/8110SC
Wenn Sie Fragen zur Hardware-Unterstützung haben, kontaktieren Sie uns!
Das Socket Module bietet TCP- und UDP-Kommunikation in Echtzeit.
Nutzen Sie IP-Socket-Mechanismen mit den Protokollen TCP und UDP!
Das Socket Module stützt sich auf die Echtzeit-Eigenschaften eines der Packet Module und erweitert diese um TCP- und UDP-Kommunikation.
Damit ist sowohl eine verbindungslose (Datagramm-), als auch eine verbindungsorientierte (Stream-)Übertragung realisierbar. Aufgrund der Echtzeit-Eigenschaften des zugrunde liegenden Packet Modules ist eine sofortige Reaktion auf eintreffende Daten sichergestellt.
Die Reaktion auf empfangene Daten kann sowohl abfrageorientiert als auch ereignisorientiert erfolgen!
Erfordert entweder das Packet Fast Module oder das Packet Gigabit Module. Damit wird auch das Kernel Module benötigt.
- TCP/IP- und UDP-Kommunikation in Echtzeit
- Verzögerungsfreies Senden & sofortige Reaktion beim Empfang
- Reaktion auf empfangene Daten sowohl abfrageorientiert als auch ereignisorientiert
- Senden und Empfangen auf der Kernel-Ebene möglich
- Alle Eigenschaften des jeweiligen Packet Modules
- Auf welche Weise kann der Empfang erfolgen?
- abfrageorientiert durch zyklisches Polling
- ereignisorientiert durch Anmeldung eines Empfangs-Handlers auf der Kernel-Ebene
- sowohl UDP als auch TCP ereignisorientiert!
Keine speziellen Hardware-Anforderungen
Das EtherCAT Base Module ermöglicht Automatisierung mit EtherCAT.
Realisieren Sie Automatisierungslösungen auf der Basis des Echtzeit-Ethernet-Standards EtherCAT!
Das EtherCAT Base Module ist der zentrale Baustein eines EtherCAT Masters für PC-basierte Steuerungslösungen, mit dem echtzeitfähige Automatisierungs-Applikationen unter Windows auf einfache Weise realisiert werden können. Die Ethernet-basierte Echtzeit-Automatisierung erfordert vor allem zwei Dinge:
- Sofortiges Senden und unmittelbare Reaktion beim Empfang am Netzwerk-Adapter (realisiert durch eines der Packet Module)
- Zyklische Bearbeitung der Steuerungsroutine mit minimalem Jitter von wenigen Mikrosekunden (realisiert durch RealTime Module)
Gegenüber herkömmlichen Lösungen realisieren Sie EtherCAT-Automatisierung – wie von der einfach handhabbaren »RealTime Suite« bekannt – in Ihrer gewohnten Hochsprache (C/C++ oder Delphi) und erstellen damit Automatisierungslösungen aus einem Guss statt mit einer schwerfälligen Black-Box.
Das EtherCAT Base Module ermöglicht Entwicklern damit ohne hohen Einarbeitungsaufwand den schnellen und unkomplizierten Einstieg in die Entwicklung eigener Automatisierungsanwendungen auf EtherCAT-Basis. Zur Entwicklung der Steuerungssoftware bleiben Sie in der gewohnten Programmierumgebung auf der Anwenderebene. Die Ausführung der Steuerungsapplikation erfolgt dann später in Echtzeit auf der Kernel-Ebene.
Erfordert entweder das Packet Fast Module oder das Packet Gigabit Module. Damit wird auch das Kernel Module benötigt.
Echtzeit-Timer für zyklische Steuerungsroutinen finden Sie im RealTime Module.
Der Kithara EtherCAT Master ist das optimale Funktionswerkzeug für vielfältige Automatisierungslösungen.
- Automatische Abfrage der EtherCAT-Slaves
- Management der EtherCAT-Slave-Zustände
- Prozessdaten-Kommunikation (zyklischer I/O-Datenaustausch) in Echtzeit
- Mailbox-Kommunikation
- Distributed Clock (DC)
- CANopen over EtherCAT (CoE)
- Zykluszeiten bis hinab zu ca. 50 Mikrosekunden
Zuerst muss die Netzwerkverbindung geöffnet werden (siehe Packet Module). Damit wird der EtherCAT-Master geöffnet:
err = KS_openEcatMaster(
&hMaster, // Adresse des Handles
hAdapter, // Netzwerk-Adapter-Handle
&pMasterDescApp, // Master-Deskriptor (Anwendung)
&pMasterDescSys, 0); // Master-Deskriptor (Kernel)
Die Deskriptor-Struktur beschreibt die EtherCAT-Topologie vollständig:
name = pMasterDescApp->slaves[5]->objs[0]->vars[1].name;
Für den Prozessdatenaustausch ist zunächst ein Dataset zu erzeugen:
err = KS_createDataSet(
&hDataset, 0); // Adresse des Handles
Diesem Dataset werden nun die gewünschten Slaves (z.B. I/O-Klemmen) oder Prozessdatenobjekte hinzugefügt:
err = KS_assignDataSet(
hDataset, // Dataset-Handle
NULL, NULL, NULL, // Objektadressen
pMasterDescApp->slaves[slaveIndex], 0); // Deskriptor
Es ist hier auch möglich, bereits die Speicheradressen der Variablen zurückliefern zu lassen. Auch Servicedatenobjekte (SDO) lassen sich schreiben und lesen, z.B. der Wandlungsbereich einer Analog-Eingangsklemme auswählen:
err = KS_postDataObj(
pMasterDescApp->slaves[sdo4], // SDO-Deskriptor
pDataBuffer, 0); // zu schreibende Daten
Nun wollen wir den State wechseln, um den Prozessdatenaustausch zu starten:
err = KS_changeState(
pMasterDescApp, // Master-Deskriptor
KS_STATE_OP, 0); // State (OPERATIONAL)
Beim zyklischen Prozessdatenaustausch nehmen Sie vermutlich in einer Echtzeit-Timer-Funktion eine Berechnung vor und senden neue Solldaten an die Slaves:
err = KS_postDataSet(
pData->hDataset, 0); // Dataset-Handle
Der Datentransport zu den Slaves erfolgt im Hintergrund. Beim nächsten Timertakt übernehmen Sie die empfangenen Daten wieder in das Dataset:
err = KS_readDataSet(
pData->hDataset, 0); // Dataset-Handle
Der Zugriff auf die einzelnen Variablen erfolgt mit KS_readDataObj oder direkt über die in den Deskriptoren gespeicherten Adressen im Shared Memory.
- Wie wird die angeschlossene EtherCAT-Topologie in die Programmierung umgesetzt?
- EtherCAT-Topologie wird beim Öffnen des EtherCAT Master gescannt
- Deskriptor-Struktur beschreibt alle angeschlossenen EtherCAT-Slaves, -Objekte und -Variablen
- Deskriptor-Struktur enthält Adresszeiger auf Prozessdatenabbild
- Vergleich mit festgelegter Topologie über XML-Datei möglich
- Initialisierung der angeschlossenen Slaves über XML-Datei möglich
- Erstellung der XML-Dateien mit »Master Monitor«
- Welche Rolle spielen die "Data-Sets"?
- erlauben Festlegung der Zugehörigkeit von Prozessdaten (PDO)
- nur in einem Dataset enthaltene Prozessdaten werden ausgetauscht
- auch mehrere Datasets realisierbar
- damit unterschiedliche Aktualisierung von Teilen des Prozesses möglich
- ermöglicht z.B. Optimierung hinsichtlich Zykluszeit
- Prozessdatenaustausch vollständig vom Anwender kontrolliert
Keine speziellen Hardware-Anforderungen
Automatisierung und Steuerung mit dem CAN Module in Echtzeit.
Realisieren Sie CAN-Kommunikation in Echtzeit unter Windows über ein herstellerunabhängiges API!
Das CAN Module bildet mit seinem Satz an wenigen, einfach anwendbaren Funktionen dennoch die gesamte Funktionalität von CAN-Controllern ab und erlaubt damit die Realisierung auch komplexer Steuerungslösungen für Automatisierung und Maschinenbau.
- Realisierung von Automatisierungsaufgaben auf dem bewährten Feldbus CAN (Protokoll CAN 2.0B kompatibel)
- CAN-Module realisiert hersteller-unabhängiges API zur CAN-Hardware, verschiedene Anbieter unterstützt
- Echtzeit-Reaktion: Sofortiges Senden und unmittelbare Bearbeitung eintreffender Nachrichten möglich
- Sofortige Behandlung von Fehlersituationen in eigenen Callback-Handlern
- Vermeidung von Datenverlusten durch Sende- und Empfangspuffer, selbst bei schnellen Baudraten und hoher Buslast
- Eigene Filter-Routinen lassen sich erstellen, die unmittelbar zur Empfangszeit ausgeführt werden
- "Listen Only"-Modus wird für Analyseaufgaben unterstützt
- Je nach eingesetztem CAN-Controller "Error Code Capture"-Register lesbar
Gegenüber den mit den CAN-Karten mitgelieferten Windows-Treibern können Sie mit dem Kithara CAN Module wirkliche Echtzeit-Anwendungen realisieren. Sie erhalten die sofortige Reaktion auf alle CAN-Nachrichten und können so auch Regelungsaufgaben umsetzen und jegliche Ausnahmesituationen schnell erfassen. Ihre gewohnte Hochsprache (C/C++ oder Delphi) wird unterstützt und mit C# wird auch die .NET-Welt erschlossen.
Die Steuerungsapplikation kann je nach Anforderung entweder in einer Echtzeit-Multitasking-Umgebung auf der Kernel-Ebene ablaufen oder auch bequem auf der Anwenderebene. Das CAN Module ermöglicht Entwicklern dadurch mit einem schlanken Satz an Funktionen die Realisierung beliebiger – auch höherer – CAN-basierter Feldbus-Protokolle.
Erfordert das Kernel Module.
Echtzeit-Timer für zyklische Steuerungsroutinen finden Sie im RealTime Module.
Mit dem Kithara Kernel Tracer steht Ihnen ein leistungsfähiges Werkzeug zur Beobachtung und Kontrolle des CAN-Datenverkehrs zur Verfügung.
Das CAN Module besitzt die folgenden Eigenschaften:
- unterstützt CAN-Kommunikation in Echtzeit
- kann aus dem User-Mode getestet werden (Anwendungsebene = keine Echtzeit)
- kann im Kernel-Mode verwendet werden (Echtzeit-Timer-Callback mit höchster Priorität)
- hat ein einfach anwendbares und intuitives API
- kann CAN-Nachrichten senden und empfangen einschließlich RTR
- interne Pipes zur Pufferung einer großen Zahl von CAN-Nachrichten (Senden/Empfang)
- Empfang in speziell angemeldetem Handler in Echtzeit oder durch Polling
- spezielle Kommandos für RESET-Mode, Leeren der Pipes etc.
- Fehler-Handler kann installiert werden (Pufferüberlauf, Bus-Off-Zustand)
- anwenderspezifische Filterung in Echtzeit
- passive Busanalyse durch "Listen only"-Modus möglich
- hersteller-unabhängiges API
- unterstützt verschiedene 1-, 2- und 4-Kanal-CAN-Karten (auf PCI, PCIe, CPCI etc.)
- zurzeit passive CAN-Karten mit SJA1000
- derzeit 3 verschiedene Anbieter von CAN-Produkten (PEAK, EMS, IXXAT), nach Bedarf erweiterbar
Als erstes wird immer ein Port einer CAN-Hardware geöffnet:
err = KS_openCan(
&hCan, // Adresse des CAN-Port-Handle
pDeviceName, // Gerätename der CAN-Karte
port, // Port-Nummer auf der Karte
KS_CAN_BAUD_500K, 0); // Baudrate
Nach diesem Schritt ist es möglich, Nachrichten zu senden und zu empfangen:
KSCanMsg msg;
msg.identifier = 0x124;
msg.msgType = KS_CAN_MSGTYPE_STANDARD;
msg.dataLength = 2;
msg.msgData[0] = 0x4B; // Sende ein 'K'
msg.msgData[1] = 0x49; // Sende ein 'I'
Die CAN-Nachricht wird gesendet:
err = KS_xmitCanMsg(
hCan, // Handle des CAN-Ports
&msg, 0); // Adresse des KSCanMsg-Objekts
Wir prüfen, ob eine CAN-Nachricht am Empfang vorliegt:
err = KS_recvCanMsg(
hCan, // Handle des CAN-Ports
&canMsg, 0); // Adresse des KSCanMsg-Objekts
Um eine Echtzeit-Reaktion zu erreichen, können wir eine Callback-Funktion anmelden, die auf der Kernel-Ebene im Kontext der Interrupt Service Routine sofort gerufen wird, wenn eine CAN-Nachricht eintrifft. Wie Sie bei gegebener Callback-Funktion ein Callback-Handle erzeugen, sehen Sie im Kernel Module.
err = KS_installCanHandler(
hCan, // Handle des CAN-Ports
KS_CAN_RECV, // Ereignis-Code (hier bei Empfang)
hRecvCallBack, 0); // Handle des Callback-Objektes
Die Callback-Funktion selbst wird nun in Echtzeit gerufen, sobald eine CAN-Nachricht eintrifft. Auch bei verschiedenen anderen Ereignissen (z.B. Filter, RTR, Fehlerzustand) kann ein Callback gerufen werden.
Für eine passive Busanalyse muss der CAN-Controller in den "Listen Only"-Modus geschaltet werden. Dies geschieht so:
err = KS_execCanCommand(
hCan, // Handle des CAN-Ports
KS_SET_LISTEN_ONLY, null, 0); // Setze "Listen Only"-Modus
- Welche Baudraten werden unterstützt?
- Von 10 kBit/s bis ein 1 MBit/s sind alle Baudraten möglich.
- Derzeit implementiert: 10, 20, 50, 100, 125, 250 und 500 kBit/s sowie 1 MBit/s.
- Wir realisieren gerne in Ihrem Auftrag eine Erweiterung des Treibers.
- Können CAN-Nachrichten verloren gehen?
- Durch die Sende- und Empfangspuffer ist es weitestgehend ausgeschlossen, dass Nachrichten verloren gehen können. Dabei kommt es jedoch auch ein wenig auf die Implementierung der Applikation an.
- Wie können auf der Kernel-Ebene empfangene Daten der Anwendungsebene zugänglich gemacht werden?
- Durch die im Base Module bereitgestellten Mechanismen der Daten-Pipes und Shared-Memory kann dies auf einfachste Weise erfolgen. Näheres dazu finden Sie beim Base Module.
Das CAN Module unterstützt derzeit PCI-basierten Karten mit 1, 2 oder 4 Kanälen von Peak, IXXAT, Kvaser, EMS Dr. Wünsche und esd.
Peak System
- PCAN-PCI Einkanal
- PCAN-PCI Zweikanal
- PCAN-PCI Einkanal optoentkoppelt
- PCAN-PCI Zweikanal optoentkoppelt
- PCAN-PCI Express Einkanal
- PCAN-PCI Express Zweikanal
- PCAN-PCI Express Einkanal optoentkoppelt
- PCAN-PCI Express Zweikanal optoentkoppelt
- PCAN-miniPCI Einkanal
- PCAN-miniPCI Zweikanal
- PCAN-miniPCI Einkanal optoentkoppelt
- PCAN-miniPCI Zweikanal optoentkoppelt
- PCAN-cPCI Zweikanal optoentkoppelt
- PCAN-cPCI Vierkanal optoentkoppelt
- PCAN-USB
- PCAN-USB optoentkoppelt
- PCAN-USB Hub
IXXAT
- PC-I 04/PCI (Zweikanal)
EMS Dr. Thomas Wünsche
CPC-CPI, CPC-PCIe und CPC-104P
- CAN-Einsteckkarte CPC-PCIe (Ein- und Zweikanal)
- CAN-Einsteckkarte CPC-PCIe (Ein-, Zwei- und Vierkanal)
mit einem SJA1000
Kvaser Advanced CAN Solutions
PCIcan HS
- PCIcan HS (Einkanal)
- PCIcan HS/HS (Zweikanal)
- PCIcan 4xHS (Vierkanal)
PCIcanx HS
- PCIcanx HS (Einkanal)
- PCIcanx HS/HS (Zweikanal)
- PCIcanx 4xHS (Viekanal)
PCIEcan HS
- PCIEcan HS (Einkanal)
- PCIEcan HS /HS (Zweikanal)
esd - electronic system design CAN-PCI
CAN-PCI
- CAN-PCI/200 optoentkoppelt (Ein- und Zweikanal)
- CAN-PCI/266 optoentkoppelt (Ein- und Zweikanal)
CAN-PCIe
- CAN-PCIe/200 optoentkoppelt (Ein- und Zweikanal)
CAN-PCI-104
- CAN-PCI-104/200 optoentkoppelt (Ein- und Zweikanal)
CPCI-CAN
- CPCI-CAN/200 optoentkoppelt (Ein- und Zweikanal)
PMC-CAN
- PMC-CAN/266 optoentkoppelt (Ein- und Zweikanal)
Custom Driver
Stellen Sie mit Hilfe des RealTime-Konfigurator den Funktionsumfang selbst zusammen oder lassen Sie sich von unseren Profis kostenlos beraten. Der Custom Driver bietet Ihnen die höchste Flexibilität und hat folgende Eigenschaften:
- Funktionsmodule sind beliebig wählbar (geringe Abhängigkeiten bestehen)
- Sie können für die Entwickler- und Runtime-Dateien einen eigenen Namen festlegen
- Vereinfachte Installation (keine Registry-Eintragung)
- Keine Anpassung bei neuen Versionen erforderlich
- Mit dem Erwerb der Module erhalten Sie automatisch eine Entwickler-Lizenz
- Günstige Staffel-Konditionen für die Runtime-Lizenzen je nach Bedarf
- Immer auf dem neuesten Stand der Software durch vierteljährliche Updates auf CD
- Jederzeit um zusätzliche Module erweiterbar
- Basisversion des »Kernel Tracer« kostenlos
Unser qualifiziertes Support-Team garantiert Ihnen den bestmöglichen Service bei der Einbindung der Software in Ihr Projekt und unterstützt Sie durch unseren Entwickler-Support (auch über unsere Software hinaus)!
Stellen Sie hier die gewünschten Module zusammen!
Die oben aufgeführten Module stehen derzeit in der »RealTime Suite« zur Verfügung.
[Interessierende Module auswählen für weitere Informationen]
Plattformen
Echtzeitfähigkeit wird nur auf der Kernel-Ebene erzielt. Dazu werden C/C++ oder Delphi (Win32) benötigt. Dennoch unterstützt die »RealTime Suite« verschiedene Plattformen, wie z.B. auch die .NET-Umgebung:
- C++Builder (Borland/CodeGear) mit VCL-Oberfläche
- Microsoft Visual C++ 6 mit MFC-Oberfläche
- Visual Studio 2005/2008 C++ mit MFC-Oberfläche
- Delphi (Object Pascal) Win32 mit VCL-Oberfläche
- Visual Studio 2005 C# mit WPF-Oberfläche
Die Lösung besteht darin, den zeitkritischen Code in eine DLL zu verlagern, die mit den Funktionen der »RealTime Suite« direkt auf die Kernel-Ebene geladen wird und dadurch in den Echtzeit-Kontext gelangt.
Sofort verwendbare Programmgerüste für die genannten Plattformen befinden sich in jeder Software-Lieferung.
Systemvoraussetzungen
Die Produkte der »RealTime Suite« unterstützen eine breite Palette von Hardware- und Software-Kombinationen:
- CPU: AMD (ab Athlon) oder Intel (ab Pentium 2)
- Single- oder Multi-Core, Hyperthreading, SMP mit insgesamt bis zu 8 CPU-Kernen (darüber auf Anfrage)
- ACPI (Advanced Control and Power Interface) unterstützt, (A)PIC (Advanced Programmable Interrupt Controller) unterstützt (einige Funktionen erfordern APIC-PC)
- Betriebssystem: Windows 2000 (bis SP4), Windows XP (bis SP3), Windows Server 2003 (bis SP1), Windows Vista (SP1), Betrieb bei neueren Service Packs ohne Gewähr
- Compiler für Kernel-Ebene: Microsoft: Visual C++/Visual Studio, CodeGear (Borland): C++Builder, Delphi Win32
Bei Fragen zur Systemunterstützung kontaktieren Sie uns bitte!
»RealTime Suite«

