WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Performance-Problem durch S-Function in Simulink!

 

Feder1805
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 18.02.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2019, 08:31     Titel: Performance-Problem durch S-Function in Simulink!
  Antworten mit Zitat      
Guten Morgen euch allen!

Ich stehe aktuell vor folgendem Problem: Ich verwende MATLAB / Simulink (R2018b Update 2) und einen Arduino Due, auf welchem ich meine Steuerung (und später meine Regelung) für mein mechatronisches System laufen lassen möchte.

Aktuell steuere ich vier Schrittmotoren über vier Schrittmotor-Treiber (mit je einem Step-, Direction-, Mode und Digital-Current-Eingang), lese vier inkrementelle Encoder (mit A- und B-Phase) ein und habe zusätzlich noch zwei Taster in Verwendung. Diese werden alle direkt über das Simulink Modell angesteuert und eingelesen. Die Sample-Time, bei der das System noch einwandfrei läuft, beträgt dabei 200µs (Solver: discrete). Ich würde die Sample-Time natürlich auch sehr gerne noch weiter runter setzen, damit ich höhere Drehzahlen erzeugen kann (Rechtecksignal mit kleinerer Periodendauer -> siehe Bild: Rechtecksignal) und diese auch noch sicher über die Encoder einlesen kann (eingebunden über vier MATLAB-Functions -> siehe folgender Code und Bild: Encoder). Jedoch wird das System sehr langsam, sobald ich Ts noch kleiner mache. Im External-Mode sowie mit generiertem Code auf dem Due.

Code:
function [counter, mm] = EncoderLinearachse(CA,CB,PA,PB,Pcounter)

if CA ~= PA
    if CB ~= CA
        counter = Pcounter - 1;
    elseif CB == CA
        counter = Pcounter + 1;
    else
        counter = Pcounter;
    end
elseif CB ~= PB
    if CA ~= CB
        counter = Pcounter + 1;
    elseif CA == CB
        counter = Pcounter - 1;
    else
        counter = Pcounter;
    end
else
    counter = Pcounter;
end

mm =  fix(2.5*counter)/1000;

end



Jetzt kommt aber das eigentliche Problem: über zwei S-Functions habe ich einen Wägezellenverstärker (HX711) und vier Temperatursensoren (DS18B20) in meinem Simulink Modell implementiert. Betreibe ich jeweils eine der S-Functions in einem separaten Modell, gibt es keinerlei Verzögerungen. Wird jedoch nur eine S-Function in mein Gesamtmodell eingefügt, wird das System extrem langsam oder die Sensoren werden erst gar nicht mehr ausgelesen.

Die S-Functions sehen wie folgt aus:

HX711:

Language: C++
Number of discrete states:1
Sample mode: Discrete
Sample-time value: 0.1

Code:
%Libraries (Includes):

#include <math.h>
#ifndef MATLAB_MEX_FILE
#include <Arduino.h>
#define ARDUINO 100
#include "HX711.h"
#include "HX711.cpp"

HX711 scale;

#endif


%Outputs:

if(xD[0] == 1)
{
    #ifndef MATLAB_MEX_FILE
   
    measured_force[0] = scale.get_units();
   
    #endif
}


%Update:

if(xD[0] != 1)
{
    #ifndef MATLAB_MEX_FILE
   
    scale.begin(39, 41);                    // HX711.DOUT - pin #39, HX711.PD_SCK - pin #41
   
    scale.set_scale(calibration_factor[0]);   // this value is obtained by calibrating the scale with known weights; see the README for details
    scale.tare();                             // reset the scale to 0
   
    #endif
   
    xD[0] = 1;                              //done with initialization
}


DS18B20:

Language: C++
Number of discrete states:1
Sample mode: Discrete
Sample-time value: 1

Code:
%Libraries:

#include <math.h>
#ifndef MATLAB_MEX_FILE
#include <Arduino.h>
#define ARDUINO 100
#include "OneWire.h"
#include "OneWire.cpp"
#include "DallasTemperature.h"
#include "DallasTemperature.cpp"

#define ONE_WIRE_BUS_1 35
#define ONE_WIRE_BUS_2 37
#define ONE_WIRE_BUS_3 36
#define ONE_WIRE_BUS_4 34

OneWire oneWire_1(ONE_WIRE_BUS_1);
OneWire oneWire_2(ONE_WIRE_BUS_2);
OneWire oneWire_3(ONE_WIRE_BUS_3);
OneWire oneWire_4(ONE_WIRE_BUS_4);

DallasTemperature TempSens1(&oneWire_1);
DallasTemperature TempSens2(&oneWire_2);
DallasTemperature TempSens3(&oneWire_3);
DallasTemperature TempSens4(&oneWire_4);

#endif

%Outputs:

if(xD[0] == 1)
{
    #ifndef MATLAB_MEX_FILE
   
    TempSens1.requestTemperatures();
    TempSens2.requestTemperatures();
    TempSens3.requestTemperatures();
    TempSens4.requestTemperatures();
   
    measured_temperature_M1L[0] = TempSens1.getTempCByIndex(0);
    measured_temperature_M1D[0] = TempSens2.getTempCByIndex(0);
    measured_temperature_M2L[0] = TempSens3.getTempCByIndex(0);
    measured_temperature_M2D[0] = TempSens4.getTempCByIndex(0);
   
    #endif
}

%Update:

if(xD[0] != 1)
{
    #ifndef MATLAB_MEX_FILE
   
    TempSens1.begin();
    TempSens2.begin();
    TempSens3.begin();
    TempSens4.begin();
   
    #endif
   
    xD[0] = 1;                              //done with initialization
}


Habt ihr die Lösung bzw. einen Tipp für mich, um die Sample-Time möglichst niedrig zu halten und trotzdem mein Programm inkl. den S-Functions ohne Verzögerungen lauffähig zu machen?

Vielen Dank schon Mal!

Encoder.JPG
 Beschreibung:
Einbinden der vier MATLAB-Functions

Download
 Dateiname:  Encoder.JPG
 Dateigröße:  50.05 KB
 Heruntergeladen:  486 mal
Rechtecksignal.JPG
 Beschreibung:
Erzeugung des Rechtecksignals

Download
 Dateiname:  Rechtecksignal.JPG
 Dateigröße:  57.31 KB
 Heruntergeladen:  427 mal
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.