Forum: PC-Programmierung C, Matlab, CAN


von Poseidonius (Gast)


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

von Wolfram (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.