1000 Simulinkrelais < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Hallo zusammen,
ich probiere gerade in MatLab/Simulink eine Preisach Hysterese zu programmieren.
Im Prinzip ist das relativ einfach. Ich muss nur viele Relay-Blöcke parallelschalten, die entsprechenden an/aus Werte eintragen, und die Ausgänge addieren.
Mit 6 relays klappt das auch schon wunderbar.
Mein Problem ist nun aber, dass ich um die Hysterese gut darstellen zu können, etwa 1000 relays brauche. Kann ich nun MAtlab/simulink irgendwie dazu bringen, mir aus tausend Messwerten (an/ausschalt-punkte) automatisch die entsprechenden relays zu bauen?
hat irgendjemand eine idee?
vielen dank schonmal im vorraus.
mfg
Hendrik
anbei ist mein simulinkmodell zur verdeutlichung
Dateianhänge: Anhang Nr. 1 (Typ: mdl) [nicht öffentlich]
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:46 Do 18.06.2009 | Autor: | Frasier |
Hallo Hendrik,
man müsste mit add_block, set_param und add_line sowas basteln können.
lg
F.
|
|
|
|
|
Danke schonmal für den tip.
Ich bin dabei das ganze auszuprobieren, habe aber noch probleme.
1. bei befehl add_line (...) kommt die fehlermeldung:
??? Error using ==> add_line
Invalid Simulink object specifier.
Error in ==> modellbuilder.m
On line 18 ==> add_line('hysterese/relais','relay','Gain')
was ist an:
add_line('hysterese/relais','Relay 1','Gain 1')
falsch?
bin für jeden tipp dankbar
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:01 Fr 19.06.2009 | Autor: | Frasier |
Hallo,
du musst dir die genauen Bezeichnungen aus der Hilfe holen.
Bei add_line fehlen die Port-Nummern.
Vielleicht kommst du mit meinem Beispiel weiter
1: | n=10;
| 2: | new_system('hendrik')
| 3: | open_system('hendrik')
| 4: | add_block('built-in/Inport','hendrik/in1','Position',[50 50 80 80]);
| 5: | add_block('built-in/OutPort','hendrik/out1','Position',[500 50 530 80]);
| 6: | add_block('built-in/Sum','hendrik/sum1','Position',[400 50 430 80+n*50],'Inputs',repmat('+',1,n));
| 7: | add_line('hendrik','sum1/1','out1/1');
| 8: | for k=1:n
| 9: | add_block('built-in/Relay',['hendrik/relay' num2str(k)],'Position',[150 50+k*50 180 80+k*50]);
| 10: | add_block('built-in/Gain',['hendrik/gain' num2str(k)],'Position',[270 50+k*50 300 80+k*50]);
| 11: | set_param(['hendrik/gain' num2str(k)],'Gain',num2str(1/6));
| 12: | add_line('hendrik',['relay' num2str(k) '/1'],['gain' num2str(k) '/1']);
| 13: | add_line('hendrik','in1/1',['relay' num2str(k) '/1'],'autorouting','on');
| 14: | add_line('hendrik',['gain' num2str(k) '/1'],['sum1/' num2str(k)],'autorouting','on');
| 15: | set_param(['hendrik/relay' num2str(k)],'OnSwitchValue',num2str(k));
| 16: | set_param(['hendrik/relay' num2str(k)],'OffSwitchValue',num2str(1/k));
| 17: | end |
Mit n steuerst du die Anzahl der Relay-Blöcke.
Wie du deren Parameter OffSwitchValue und OnSwitchValue in der Schleife berechnen kannst, musst du dir selbst überlegen.
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:50 Fr 19.06.2009 | Autor: | Frasier |
Ach, ich seh' gerade, dass du die OffSwitchValues und OnSwitchValues ja als Messwerte vorliegen hast. Am besten schon in Matlab in einem Vektor. Dann musst du in der Schleife ja nur die richtige Zuordnung hinbekommen.
|
|
|
|
|
ja, das klappt auch schon wunderbar.
die genauen bezeichnungen der blöcke und parameter habe ich auch gefunden.
das einzige, was ich immer noch nicht hinbekomme ist die verbindung mit linien. ich steh komplett auf dem schlauch wieso. meiner meinung nach mache ich alles genau wie du.
mein programm:
% systembuilder
%Variablen
a = [1 2];
b = [2 1];
k = length (a);
% subsystem relais erstellen
add_block('built-in/subsystem','hysterese/relais')
% relays und gains in subsystem erstellen
for n = 1:k
evalstring = ['add_block(''built-in/relay'',''hysterese/relais/relay ', num2str(n), ''',''Position'',[150 50+n*50 180 80+n*50],''onswitchvalue'', ''a' num2str(n),''',''offswitchvalue'', ''b' num2str(n),''',''OnOutputValue'', ''1'',''OffOutputValue'', ''0'');'];
eval(evalstring);
end
for n = 1:k
evalstring = ['add_block(''built-in/Gain'',''hysterese/relais/Gain ', num2str(n), ''',''Position'',[200 50+n*50 230 80+n*50],''gain'', ''1/k'');'];
eval(evalstring);
end
% Mux, In/Out und addierer erstellen
add_block('built-in/Inport','hysterese/relais/Inport','Position',[50 50 80 80]);
add_block('built-in/OutPort','hysterese/relais/OutPort','Position',[500 50 530 80]);
add_block('built-in/sum','hysterese/relais/sum','inputs','1','Position',[450 50 480 80]);
add_block('built-in/mux','hysterese/relais/mux','Position',[400 50 430 80],'inputs',num2str(k))
%bauteile verbinden
for n=1:k
add_line('hysterese',['relay' num2str(n) '/1'],['gain' ,num2str(n) ,'/1']);
add_line('hysterese','in1/1',['relay' num2str(n) '/1'],'autorouting','on');
add_line('hysterese',['gain' num2str(n) '/1'],['sum1/' num2str(n)],'autorouting','on');
end
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:21 Sa 20.06.2009 | Autor: | Frasier |
Was mir jetzt noch auf die Schnelle auffällt:
- Vermeide eval
- bei den Gains vermischt du Groß- und Kleinschreibung
- bei den relays vergisst du das Leerzeichen vor der Nummer
- du gibst nicht das Subsystem an
- du schreibst einmal sum und dann sum1
Wäre nicht schlecht, wenn du das Problem genauer bezeichnen würdest. Gibt es eine Fehlermeldung?
lg
F.
|
|
|
|
|
die fehlermeldung:
??? Error using ==> add_line
Invalid Simulink object specifier.
Error in ==> [mm] C:\Dokumente [/mm] und [mm] Einstellungen\buff\Eigene Dateien\diplomarbeit\matlab\modellbuilder.m
[/mm]
On line 42 ==> add_line('hysterese/relais',['relay ' num2str(n) '/1'],['gain ' num2str(n) '/1']);
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:46 Sa 20.06.2009 | Autor: | Frasier |
Beachte Punkt 2 meiner obigen Liste.
lg
F.
|
|
|
|
|
vielen dank!
es funktioniert.
mfg
Hendrik
|
|
|
|
|
Hallo nochmal,
ich habe doch noch eine Frage. Mein Programm läuft soweit, allerdings scheint die Anzahl der erstellbaren Blöcke begrenzt, und zwar exaxt 653. Danach kommt die Fehlermeldung:
Input bounds are out of range.
Das kommt mir persönlich ein wenig komisch vor, aber vielleicht hat ja jemand eine idee. kann man das durch einstellungen verändern?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:21 Di 21.07.2009 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 10:36 Mo 30.08.2010 | Autor: | mabbes |
Hallo,
ich soll derzeit ebenfalls mit Hilfe des Preisach-Modells eine Hysteresekurve nachbilden. Ich habe hierfür die Daten des zeitlichen Verhaltens einer Schwingung. Ich weiß, wie ich die Anschaltpunkte der Relays setzen muss, allerdings bin ich mir nicht im Klaren, wie ich aus meinen Daten die Ausschaltpunkte erhalte. Ich bin für jeden Denkanstoß dankbar.
Gruß
mabbes
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:20 Di 07.09.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|