next up previous
Next: Neues über Maple und Up: Interaktive Blöcke mit Simulink Previous: Digital-Taste

Mehrfach-Umschalter

Das letzte Beispiel ist ein Taster, der bei Doppelklick jeweils den nächsten aus einer vorgegebenen Liste von Werten ausgibt. Dabei soll der aktuelle Wert auch angezeigt werden. Der Aufbau selbst ist wieder ganz einfach:

Die Liste der Werte wird als vektorwertige Konstante in einem Constant-Block untergebracht, ein weiterer Constant-Block nimmt den aktuellen Index auf. Der Multiport Switch benutzt den Steuereingang als Index in den Eingangsvektor und gibt den entsprechenden Wert aus. Die folgende Open Function erhöht den Index bei Doppelklick (zyklisch) um eins:

function [] = multitast

% get current index value
blk = gcbh;
index_h = find_system(blk, 'LookUnderMasks', 'on', 'Name', 'Index');
idx = get_param(index_h, 'Value');
val = str2num(idx);

% get array values
values_h = find_system(blk, 'LookUnderMasks', 'on', 'Name', 'Values');
arr = eval(get_param(values_h, 'Value'));   

% increment the index (modulo len)
val = val + 1;
len = length(arr);
if val > len, val=1; end
set_param(index_h, 'Value', int2str(val));

% set value for mask
out = arr(val);
set_param(gcbh, 'output', int2str(out));

Die Arbeitsweise ist wie in den vorigen Beispielen: Mit find_system werden die benötigten Unterblöcke lokalisiert, mit get_param/set_param ihre Parameter gelesen bzw. geschrieben. Dabei ist etwas Aufwand nötig zur Typkonversion: get_param liefert den Wertevektor als String, der mit eval in ein Array verwandelt wird. Zur Ausgabe mit set_param werden die Werte mit int2str wieder in Strings konvertiert.

Um den aktuellen Wert des Ausgangs im Block anzuzeigen, muß dieser maskiert werden. Dazu werden im Masken-Editor folgende Einstellungen vorgenommen: Im Initialisierungs-Teil wird eine Variable output eingeführt. Sie dient zur Kommunikation mit der Open Function, die hier mit set_param den anzuzeigenden Wert out im Block hinterlegt. Mit dem Kommando disp(output); im Icon-Teil wird sie im Block angezeigt.

Beachten muß man noch, daß find_system normalerweise maskierte Blöcke nicht weiter untersucht. Die Parameter 'LookUnderMasks', 'on' erlauben auch den Zugang zu maskierten Subsystemen.

Die Liste der zu durchlaufenden Werte ist hier etwas umständlich zu erreichen. Da ja beim Doppelklick kein Parameterfeld zur direkten Eingabe aufgeht, muß man sich etwas anderes überlegen, wenn man häufige Änderungen an den Werten vornehmen möchte. Man könnte z.B. den Wertevektor aus dem maskierten Block herausnehmen und durch einen Inport ersetzen oder über den Matlab-Workspace gehen. Wie immer erlaubt einem das mächtige Instrument Simulink eine Vielzahl von Lösungsmöglichkeiten. Ich hoffe, diese Beispiele haben das eigene Repertoire dazu etwas erweitert.

Peter Junglas, Tel.: 3193


next up previous
Next: Neues über Maple und Up: Interaktive Blöcke mit Simulink Previous: Digital-Taste
cb
6/14/1999