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