Forum: Projekte & Code Tcl-Ansteuerung des HTRONIC HB627 Messmoduls


von Peter Kämpf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei ein Musterprogramm, um dem Modul HB627 seine Daten zu entlocken, 
ohne in die Abgründe von VB zu versinken. Mit Tcl ist eine sehr einfache 
Ansteuerung möglich, die ohne DLLs auskommt. Der wesentliche Trick ist, 
die Bitordnung der vom HB627 gemeldeten Bytes richtig zu interpretieren.

Bitte Tcl 8.6 oder zumindest 8.5.12 verwenden. Link: 
http://www.activestate.com/activetcl/downloads

Leider läuft es derzeit nur auf Windows. Für OSX muss manuell der 
richtige USB-Port eingetragen werden, und bei Linux sollte es ähnlich 
laufen. Prinzipiell sollte das Programm auf allen Plattformen 
funktionieren, wenn man das Portöffnen anpasst.
1
#
2
# HB627_Testprogramm
3
#
4
# (c) Peter Kämpf 2012
5
#
6
#
7
# Kommunikation starten:
8
#  n = Portnummer des virtuellen COM-Ports
9
#
10
proc Kanal_auf { n } {
11
    global Code
12
    global Kanal
13
#
14
# alten Kanal schließen
15
#
16
    if {[string length $Kanal] > 0} {
17
        close $Kanal
18
    }
19
#
20
    if {[catch {open com$n [list RDWR BINARY]} Ergebnis]} {
21
        tk_messageBox -type ok -icon error \
22
             -message [encoding convertfrom $Code "Fehler beim Öffnen des Ports COM$n"] \
23
             -detail "Offizielle Fehlermeldung:\n $Ergebnis"
24
        set Kanal ""
25
    } else {
26
        set Kanal $Ergebnis
27
#        chan configure $Ergebnis -blocking false -buffering full \
28
#            -mode 256000,n,8,1 -translation binary
29
    }
30
}
31
32
#
33
# Die Spannungen der einzelnen Meßstellen abfragen
34
#
35
proc SignalLesen { Kanal } {
36
    global Pruefsumme
37
#
38
    if {[catch {read $Kanal 17} Antwort]} {
39
        return
40
    }
41
#
42
# Auslesen der 8 2-Byte Antworten + 1 Byte Prüfsumme. Wichtig: Big endian!
43
#
44
    binary scan $Antwort S8c Ergebnis Pruefsumme
45
    for {set i 0} {$i < 8} {incr i} {
46
        set Messwert($i) [lindex $Ergebnis $i]
47
    }
48
#
49
    .nb.ft.t insert end "$Messwert(0) | $Messwert(1) | $Messwert(2) | $Messwert(3) \
50
        | $Messwert(4) | $Messwert(5) | $Messwert(6) | $Messwert(7) | $Pruefsumme \n"
51
    .nb.ft.t yview moveto 1.0
52
}
53
54
#
55
# Einrichten des Datenfensters mit den Meßwerten
56
#
57
proc Textfenster { base } {
58
#
59
# Ein Rahmen, alles für den Text:
60
#
61
    ttk::scrollbar $base.vsb -orient vertical \
62
        -command [list $base.t yview]
63
    text $base.t -autoseparators 1 -maxundo 0 -undo 1 -wrap word \
64
        -yscrollcommand [list $base.vsb set]
65
#
66
# Die Elemente im Plotrahmen verteilen
67
#
68
    grid rowconfigure    $base 0 -weight 1
69
    grid columnconfigure $base 0 -weight 3
70
    grid columnconfigure $base 1 -weight 0
71
    grid $base.t   -row 0 -column 0 -sticky nsew
72
    grid $base.vsb -row 0 -column 1 -sticky ns
73
}
74
75
#
76
# Endlos-Schleife für Abfragen etwa alle Zehntelsekunde
77
#
78
proc Durchlauf {} {
79
    global Kanal
80
    global Pruefsumme
81
#
82
# Da die Prüfsumme maximal 255 groß wird (1 Byte!), wird sie auf
83
# einen unmöglichen Wert gesetzt, damit sie sich auch bestimmt ändert,
84
# wenn gelesen worden ist und das vwait beendet werden kann.
85
#
86
    set Pruefsumme 999
87
#
88
# Anfrage für den Meßwert aller 8 Kanäle.
89
#
90
    puts -nonewline $Kanal "c09"
91
    catch {flush $Kanal}
92
#
93
# Abarbeitung zugunsten des Event Loops anhalten, bis sich Pruefsumme ändert.
94
#
95
    vwait Pruefsumme
96
#
97
# Ein paar Millisekunden übrig lassen, bevor der nächste Durchlauf startet.
98
#
99
    after 90 Durchlauf
100
}
101
102
#
103
# Hauptprogramm
104
#
105
proc main {} {
106
    global Code
107
    global Kanal
108
#
109
    encoding system cp1252
110
    set Code cp1252
111
#
112
#   Hauptfenster mit Notebook und Menüleiste.
113
#
114
    wm title . "HB627 Ausgabe"
115
    ttk::notebook .nb -width 800 -height 480 -padding 5
116
#
117
# COM-Port öffnen. Hier einstellen, was in der Systemsteuerung angezeigt wird.
118
#
119
    Kanal_auf 6
120
#
121
# Eine Seite mit der Liste der Meßwerte.
122
#
123
    .nb add [ttk::frame .nb.ft] -state normal -sticky nsew -text "Textliste"
124
    Textfenster .nb.ft
125
    update
126
#
127
# Event für die Rückmeldungen einbauen:
128
#
129
    fileevent $Kanal readable "SignalLesen $Kanal"
130
#
131
# Endlosschleife starten:
132
#
133
    Durchlauf
134
}
135
136
#
137
# JETZT endlich wird das Hauptprogramm aufgerufen und es geht wirklich los:
138
#
139
console hide
140
main
141
wm geom . [wm geom .]

von Peter Kämpf (Gast)


Angehängte Dateien:

Lesenswert?

Hmm - ich kann wohl nicht mehr den ersten Eintrag editieren. Eine Zeile 
muss noch im Hauptprogramm ergänzt werden, damit die Variable Kanal 
existiert:

set Kanal ""

am besten nach "set Code cp1252" einfügen.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

ich bin mir zwar nicht ganz sicher, was eigentlich deine Frage ist, aber 
ich vermute mal, du möchtest ein OS-unabhängiges Tcl-Script 
schreiben...?

Es geht um diese Zeile?
1
open com$n [list RDWR BINARY]

Ich würde com$n auf eine globale Variable auslagern.

Dann würde ich mir mal das Tcl-interne Array tcl_platform anschauen 
(http://wiki.tcl.tk/1649). Mit Hilfe dessen bekommt man raus, wie die 
Plattform aussieht, auf der das Script läuft. Den Rest kannst du dir 
dann sicherlich denken..., ...je nach OS Com-Variable setzen...

Grüße Uwe

PS.: nebenbei, ich würde "Durchlauf" nicht in "main" aufrufen, sondern 
ganz unten nach "main" und ganz am Ende (zur Sicherheit):
1
vwait forever

sieht schicker und logischer aus, zumal "main" in deinem Script ja nur 
ein Initialisieren verschiedener Dinge ist...

von Uwe B. (boerge) Benutzerseite


Lesenswert?

...achso, noch eine kleine Anmerkung: globale Variablen sollte man auch 
global vorbelegen, also am Anfang des Scripts, um genau solchen 
Problemchen wie mit "Kanal" aus dem Weg zu gehen.

Grüße Uwe

von Peter Kämpf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Uwe,

die globalen Variablen nach vorne zu verlegen ist in der Tat besser. 
Beim vwait ist das mit der nicht existenten Variablen forever ja 
neckisch, aber meine Implementierung halte ich für leichter verständlich 
und korrekter - immerhin ändert sich ja Pruefsumme bei jedem Lesen.

Jeder so, wie er es mag. Anbei eine Version für OSX und Windows, wobei 
man bei OSX im Verzeichnis /dev selber schauen muß, wie der richtige 
USB-Kanal heißt.

Ach ja - eine Frage hatte ich gar nicht gestellt. Aber Danke für die 
Antwort!

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.