Verfasst am: 27.04.2023, 10:43
Titel: strjoin will cell char oder string haben obwohl es cell hat
hallo,
ich bekomme die fehlermeldung das stjoin als ersten input ein cell array, string array oder char vector sein muss. ich hatte es erst mit num2cell probiert und es dann generell auf cell geändert.
function[t_end]=messung(scanInterval,n_data,ii,fileID,t_start,handle,inputsToLog) % Read the inputs and convert the values
loop = tic;
value = cell(1,numel(inputsToLog));
zur erklärung des ganzen, ich nehme daten von sensoren mittels labjack auf plotte die und speicher die auch gleich. einen teil habe ich nun in eine lokale funktion ausgelagert, da ich das ganze als for schleife und while schleife habe.
ich habe auch gesehen das der plot zB den zweiten wert noch gar nicht plotten würde, wollte ein problem nach dem anderen angehen.
in der jetzigen Form ist das schwierig nachzuvollziehen.
strjoin will ein Cell mit einem Char haben. Was steht denn in dem Cell value drin?
Wenn du eine .mat-Datei mit den beteiligten Variablen anhängst, wäre das einfacher.
Zitat:
ich habe auch gesehen das der plot zB den zweiten wert noch gar nicht plotten würde,
Welcher zweite Wert denn? Je nach ii und n_data wird doch nur ein plot-Befehl ausgeführt?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
den fehler bekomme ich nun nicht mehr. values ist keine cell mehr. keine ahnung warum ich das probiert hatte.
dafür drehe ich mich nun aber im kreis beim schreiben der daten.
zuerst mal das ganze skript:
Code:
clc% Clear the MATLAB command window clear variables % Clear the MATLAB variables
% Make the LJM .NET assembly visible in MATLAB
ljmAsm = NET.addAssembly('LabJack.LJM');
% Creating an object to nested class LabJack.LJM.CONSTANTS
t = ljmAsm.AssemblyHandle.GetType('LabJack.LJM+CONSTANTS');
LJM_CONSTANTS = System.Activator.CreateInstance(t);
cd("C:\Users\bFC_32\Documents\MATLAB\Lambjack\")
handle = 0;
try % Any device, Any connection, Any identifier [ljmError, handle] = LabJack.LJM.OpenS('LJM_dtT7', 'LJM_ctUSB', 'ANY', handle);
catch e
showErrorMessage(e)
LabJack.LJM.CloseAll();
return end
% Set the inputs to log and write to file
inputsToLog = {'AIN0'};
logFileName = ['log_' char(datetime("now",'Format', 'yyyy-MM-dd_HH-mm-ss')) '.csv'];
if temp == true
AIN0_EF_INDEX = 22; % feature index for type K thermocouple
AIN0_EF_CONFIG_A = 1; % solution in °C
AIN0_EF_CONFIG_B = 60052; % Set the CJC source (the address for device % temperature sensor). 60052 is TEMPERATURE_DEVICE_K
AIN0_EF_CONFIG_D = 1.0; % slope for CJC reading
AIN0_EF_CONFIG_E = 0.0; % offset for CJC reading
AIN0_RANGE = 0.1; % set range to -0.1 to 0.1 V
inputsToLog = {'AIN0','AIN0_EF_READ_A'};
ylabel('Temperature (°C)') title('Temperature vs Time') end
% Start logging data to file
fileID = fopen(logFileName, 'w');
fprintf(fileID, 'Timestamp,%s\n', strjoin(inputsToLog, '\t'));
for ii=1:measurements
[t_end]=messung(scanInterval,n_data,ii,fileID,t_start,handle,inputsToLog);
end
mean_time = (t_end+scanInterval)/ii
% Close the file and device handle fclose(fileID);
[error] = LabJack.LJM.Close(handle);
function[t_end]=messung(scanInterval,n_data,ii,fileID,t_start,handle,inputsToLog) % Read the inputs and convert the values
loop = tic;
value = zeros(1, length(inputsToLog));
das skript dient mir dazu mich mit dem labjack t7 vertraut zu machen und am ende eine aufzeichnung von messwerten zu ermöglichen. gleichzeitig diese messwerte auch in einem diagramm darzustellen und gegebenenfalls davon die letzten 100 messwerte, oder wie viele messwerte man möchte.
das skript beginnt mit der initialisierung des labjacks, danach wir der eingang AIN0 als input festgelegt. der name der datei für die messwerte wird erstellt, basierend auf dem aktuellem datum und der uhrzeit.
danach kommt der messabstand in sekunden, anzahl messungen und die variable für die anzahl messergebnisse die als letztes angezeigt werden sollen.
danach habe ich noch mal etwas eingeschoben um die spannung des temperatursensors direkt in grad celsius auszugeben und das mit der variable "temp" ein oder aus zu schalten. ich wollte dabei auch gleichzeitig die spannung UND die umgerechnete temperatur plotten, um zwei ergebnisse zu haben, da ich bisher nur den einen sensor habe und noch keine zwei werte dargestellt bzw. abgespeichert hatte.
alles weitere danach ist schon bekannt.
mein problem ist jetzt, das die datei die geschrieben wird, nicht so aussieht wie ich dachte und ich hänge da schon länger dran als mir lieb ist.
ich habe das auch mal in code gesetzt damit die formatierung erhalten bleibt. ist einfacher zu lesen.
während der erste zeitpunkt noch korrekt ist, kommt direkt danach "48" und dann nächste zeile.
in der nächsten zeile geht es dann mit den messwerten weiter, gefolgt mit einem tab-abstand. danach wieder das datum und am ende wieder 48.
ich weiß nicht woher die 48 kommt. in vorherigen versuchen war auch immer wieder "50" dabei.
der plot der daten ist bisher noch nicht geändert das er beide werte auch anzeigt, sondern nur den ersten. das habe ich noch nicht gemacht.
ich vermute, dass es an der Schachtelung von fprintf und sprintf liegt. Insbesondere ist 48 der ASCII-Wert von 0, vermutlich wird das irgendwie umgewandelt.
Das Ergebnis von sprintf ist ja ein String. Dann solltest du m.E. bei fprintf dafür auch %s angeben:
fprintf(fileID, '%s,%s\n', time, sprintf('%f\t', value));
Deutlich einfacher wäre es meines Erachtens, wenn du die Daten innerhalb von MATLAB sammelst und dann writetimetable nutzt, um sie zu exportieren.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
stimmt, war darauf fixiert das es numbers sind ... nun funktioniert es
ja, das alles vorher zu speichern hatte ich anfangs auch überlegt. wenn es wirklich eine feste zahl an messungen ist, wie es die for schleife vermuten lässt wäre das sicherlich der bessere weg. das hatte ich jedoch zum test so gemacht, am ende wird es einfach eine whileschleife sein, die so lange messungen durchführt, bis man es beendet. das kann ein paar stunden sein, ein halber tag oder auch mehrere tage. da weiß ich dann nicht ob das alles im workspace zu haben so gut ist. es wären dann auch mehrere sensoren angeschlossen und diverse parameter die aufgenommen werden.
wenn die Messung lange ist und die Daten sammelt, steigt der Speicherbedarf und es ist ungünstig, dass die Variablen in jedem Schritt größer werden.
Umgekehrt ist fprintf vektorisiert, so dass es ungünstig ist, immer nur eine Zeile auf einmal zu schreiben.
Mein Vorschlag wäre:
- Daten für einen gewissen Zeitraum (z.B. 1 Minute, 10 Minuten, 1 Stunde) sammeln und entsprechend vorbelegen
- Am Ende der Stunde werden die Daten exportiert, und die Daten im Speicher werden gelöscht.
- Wird die Messung beendet, den nicht benötigten Teil abschneiden und dann exportieren
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
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
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.