www.mikrocontroller.net

Forum: PC-Programmierung C, Matlab, CAN


Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe folgendes interessantes Problem:

Ein mechatronisches System, dass ueber mehrere Microcontroller
kontrolliert wird, die mit einem CAN Bus kommunizieren soll aus Matlab
gesteuert und geregelt werden. Unter Linux und C funktioniert die CAN
Kommunikation auch prima, nur wie verbinde ich das ganze nun mit
Matlab.

Zwei Moeglichkeiten schweben mir vor:

1. Ich binde in meinen Matlabcode entsprechende C basierte mex files
ein. Hier habe ich aber das Problem, dass ich dann ja die CAN
Kommunikation immer wieder anwerfen muss und drauf hoffen darf, genau
den Zeitpunkt zu treffen, zudem die Nachrichten unterwegs sind. Oder
gibt es sowas wie C Threads neben Matlab?

2. Ich bastle alles in C zusammen und nutze die Matlab-engine um
Matlabquasi aus C fernzusteuern.

3. Ich simuliere ohne die Rueckkopplung vom realen System und
uebersetze den ganzen Kram dann nach C und hoffe diesen Code dann
irgendwie auf die Atmel zu bekommen. Dabei weiss ich allerdings nicht
ob das ueberhaupt funktioniert.

Da das ganze System recht kompliziert ist moechte ich nicht auf die
Simulation unter Matlab verzichten und zB sofort irgendwelche
Algorithmen in C hacken.

Ihr habt doch sicher viel bessere Ideen!
Danke

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade die Steuerung eines XYTisches mit ADC in Matlab
realisiert. Matlab benutze ich nur zur Highlevelsteuerung. Also
Motor1 an position y etc. Lies ADCwert von Kanal ...
Die kommunkation mit dem PC ist über eine USBseriell Schnittstelle
auf PC Seite ist ein ActiveX(COM) Server der die Kommunikation mit dem
dem Tisch protokollmäßig macht. Matlab bekommt nur das COM-Object zu
sehen das es als Client benutzt.
Bsp:
XYTisch=actxserver('XYTischdll.XYTisch');
// erstelle das COMObject
XYTisch.Connect(4);
// Connect mit Tisch COMPort 4
ADC0=XYTisch.ADC(0)
// 1. ADC ist unter ADC0(mit 10 Kanälen) ansprechbar
for
I=1300:15:5800,XYTisch.Motor(0).Motorposition=I;while(XYTisch.Motor(0).M 
otorpositionAktuell~=I)end;A(uint16((I-1300)/15+1))=ADC0.Kanal(1);end;
scanne eine Linie von 1300 bis 5800 raster 15 und speicher die Werte
aus ADCkanal 1 in Array A

Das COM Objekt wurde in Visual C geschrieben. Da können dann auch
mehrere Threads drin laufen. Das stört in Matlab ja nicht weiter.
Das COM Object kann ich auch in jeder anderen Programmiersprache
verwenden und es kapselt die Steuerung vollständig.
unter Linux wird das allerdings nichts.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.