Aktuelle Zeit: 28.03.2017 23:39

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Messgeräte und USBTMC
BeitragVerfasst: 18.03.2017 11:57 
Offline

Registriert: 19.12.2014 11:22
Wohnort: Wien
Ich habe PureBasic schon vor einiger Zeit gekauft, beschäftige mich aber ernsthaft erst seit drei Wochen damit.
Der Grund war, dass ich mit Xojo nicht mehr zufrieden bin. Der Umstieg war gewöhnungsbedürftig, es ist doch vieles anders. Bin jedoch relativ begeistert von der IDE und der Sprache. Ich verwende nur mehr Windows 7 und XP, damit komme ich am besten zurecht.

In Xojo habe ich die libusb-1.0 verwendet und das USBTMC-Protokoll programmiert. Ebenso das RPC/VXI-Protokoll für das Netzwerk, um Messgeräte steuern zu können.
In PureBasic ist das USBTMC-Protokoll fast fertig. Es ist als Pseudoklasse angelegt, die auch mit Threads funktioniert. Mit der libusb hat man nichts zu tun, darum kümmert sich die erstellte Instanz der Klasse. Für die Geräte muss allerdings der WinUSB-Treiber installiert werden. Mit der NI/VISA Software funktioniert es nicht.
Ob ich das RPC/VXI-Protokoll auch noch nachprogrammiere, weiß ich noch nicht.

Für eigene kleine Projekte, habe ich das USBTMC-Protokoll in mikroC für einen PIC18F[2|4]550 programmiert. Grundlage war das Buch ‘USB in der Messtechnik’ von Henry Bruhns.

Vielleicht hat jemand Interesse an dem Thema, und kann mit Ideen für Funktionen, Programmoberfläche und dergleichen beitragen. Ich würde den Code auch gerne weitergeben, wenn es etwas Rückmeldung dazu gibt.

Peter

Die Xojo-Versionen sind hier:
http://peter.dreisiebner.at/rigol-bildschirmkopie-lan/
http://peter.dreisiebner.at/rigol-dsa815/

Hier ist eine kurze Beschreibung der vorhandenen Funktionen der PureBasic USBTMC-Klasse:
Code:
;  1. GetNewInstance()     - Zuerst muss eine neue Instanz erstellt werden.
;  2. GetTmcDeviceList()   - Geräte dürfen nur aus der abgefragten Liste verwendet werden.
;                            Ausnahme wenn der LibUsb Context der Instanzen identisch ist.
;  3. SetTmcDevice()       - Das ausgewählte Gerät von der abgefragten Liste der Instanz zuweisen.
;  4. GetCapabilities()    - Wenn benötigt, die zusätzlichen Eigenschaften und Fähigkeiten des Geräts abfragen.
;                            Die Capabilities werden automatisch bei SetTmcDevice() in der Instanz gespeichert.
;  5. SetTimeout()         - Die Standardwerte für die Kommunikation ändern.
;     SetTerminationChar()   Standard ist 5 Sekunden Zeitüberschreitung, und $0A als Terminierungszeichen ohne fRequestEnabled.
;  6. PrepareData()        - Die Daten vorbereiten, für das Senden an das Gerät.
;                            Die Daten bleiben erhalten und können mehrmals gesendet werden.
;  7. SendData()           - Die vorbereiteten Daten an das Gerät senden.
;  8. RequestData()        - Wenn nach dem Senden eine Antwort vom Gerät erwartet wird, diese Daten anfordern.
;                            Das Terminierungszeichen wird von den zurückgegebenen Daten automatisch entfernt.
;  9. DeleteInstance()     - Die Instanz löschen. Die Ressourcen und die LibUsb werden automatisch aufgeräumt.
;
; Die Kommunikation mit dem USB-Gerät, kann auch in einem Thread durchgeführt werden.
;
; 10. SendRequestThreadData() - Die erforderlichen Daten per Struktur uThreadData übergeben.
;                               Mit BindEvent das Ereignis #eCustomEventUsbTmcThreadData mit der Instanznummer auswerten.
; 11. GetThreadEvent()        - In der Ereignisprozedur die stattgefundenen Ereignisse abfragen und auswerten.
;                               Es werden auch die Anzahl der aktuell gesendeten oder empfangenen Bytes übergeben.
; 12. GetThreadData()         - Bei den Ereignissen fSend-, fRequest- oder fThreadFinished, können die Daten verarbeitet werden.
; 13. SetThreadStatus()       - Für das Abbrechen der Kommunikation, oder Beenden des Threads.
;
; Die zurückgegebenen Daten bzw. Speicher, von RequestData() und SendRequestThreadData(), müssen wieder freigegeben werden.
;
;
; Ein USBTMC-USB488-kompatibles Gerät muss die folgenden Device Request innerhalb 500 ms ausführen.
;  -. SetTimeoutControlTransfer()   - Den Standardwert von 500 ms für die Kommunikation ändern.
;
; USBTMC Device Requests.
; Die erste Ergänzung der Standard Device Requests sind die geräteabhängigen Requests,
; die gemäß dem USBTMC-Standard vorgeschrieben sind. Sie gehören in die Gruppe der Class specific Requests.
;  -. InitiateAbortBulkOut()
;  -. InitiateAbortBulkIn()
;  -. CheckAbortBulkOutStatus()
;  -. CheckAbortBulkInStatus()
;  -. InitiateClear()
;  -. CheckClearStatus()
;  -. IndicatorPulse()
;
; USB488 Subclass Device Requests.
; Diese Unterklasse ist wie die USBTMC Device Requests in die Gruppe der Class specific Requests eingeordnet.
; Diese Requests beziehen sich auf Gerätefunktionen, die sich am Standard IEEE 488.1 orientieren.
; Sie beeinflussen direkt die Schnittstellenfunktion des Test- oder Messgeräts.
;  -. InterruptTransfer()
;  -. ReadStatusByte()
;  -. RemoteEnableControl()
;  -. LocalLockout()
;  -. GoToLocal()

Und hier ist ein Screenshot von dem Testprogramm:
http://peter.dreisiebner.at/temp/usbtmc.png


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Messgeräte und USBTMC
BeitragVerfasst: 22.03.2017 16:04 
Offline

Registriert: 19.12.2014 11:22
Wohnort: Wien
Ein Test mit fünf Geräten gleichzeitig, und über 100.000 Bildschirmkopien nach drei Stunden, hat heute ohne Fehler oder Speicherlecks funktioniert.
Hier ist ein Screenshot vom Bildschirm (116 KB, Full-HD):
http://peter.dreisiebner.at/temp/usbtmc2.png

Die fünf Bildschirmkopien sind Instanzen von einem Testfenster bzw. Modul. Es wurde jeweils eine Instanz der USBTMC-Klasse bzw. Moduls verwendet. Die Klasse kommunizierte in einem Thread mit dem ausgewählten Gerät, und die Ereignisse wurden per PostEvent() an das Fenster gesendet. In der BindEvent-Ereignisprozedur des Fensters wurden die empfangenen Daten von der Klasse angefordert, und hier als Bild angezeigt.

Der eine Fehler im Log-Fenster stammt vom Spektrumanalyser. Wenn der sich kalibriert wird die Kommunikation einfach abgebrochen. Aber die USBTMC-Klasse kann damit umgehen und gibt eine Fehlerbeschreibung weiter.

Es funktioniert auch das Schließen des Programms ohne die Verbindungen einzeln zu beenden. Man muss nur die Instanzen der USBTMC-Klasse löschen. Die aktuellen Übertragungen werden richtig abgebrochen, und erst nach einer Zeitüberschreitung ein Thread gekillt.

Als nächstes werde ich doch noch das RPC/VXI-Protokoll für das Netzwerk programmieren. Für eine gescheite Oberfläche fehlt mir noch die Übung mit PureBasic, das war mit Xojo einfacher.

Peter


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye