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 .]
|