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

strjoin will cell char oder string haben obwohl es cell hat

 

lovobo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 26.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2023, 11:43     Titel: strjoin will cell char oder string haben obwohl es cell hat
  Antworten mit Zitat      
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.

es geht speziell um die beiden zeilen:
Code:
[~, value{i}] = LabJack.LJM.eReadName(handle, inputsToLog{i}, 0);


der fehler tritt selbst tritt dann hier auf:
Code:
fprintf(fileID,'%s,%3.6f\n',time,strjoin((value),'\t'));


der gesamte code sieht so aus:
Code:
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));

for i = 1:length(inputsToLog)

    [~, value{i}] = LabJack.LJM.eReadName(handle, inputsToLog{i}, 0);
    time=char(datetime("now",'Format', 'yyyy-MM-dd_HH-mm-ss.SSS'));

    t_end = toc(t_start);
end


%[error, value] = LabJack.LJM.eReadName(handle, inputsToLog{1}, 0);


% Log the values to file
fprintf(fileID,'%s,%3.6f\n',time,strjoin((value),'\t'));

% Plot the values
if ii > n_data
    plot(t_end, value(1),'*r')
    xlim([(ii-n_data)*scanInterval ii*scanInterval])

else
    plot(t_end, value(1), 'bo')
end

drawnow
scan_time = toc(loop);
% Wait for the next scan
pause(scanInterval-scan_time)

end


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.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2023, 22:37     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
lovobo
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 26.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2023, 08:09     Titel:
  Antworten mit Zitat      
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'];

scanInterval = 0.5; % Second
measurements = 10;
n_data = 200;

% Set up the graph
figure
xlabel('Time (s)')
ylabel('Pressure (bar)')
title('Pressure vs Time')
hold on

temp = true;

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'));

t_start = tic;

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));

for i = 1:length(inputsToLog)

    [~, value(i)] = LabJack.LJM.eReadName(handle, inputsToLog{i}, 0);
    time=char(datetime("now",'Format', 'yyyy-MM-dd_HH-mm-ss.SSS'));

    t_end = toc(t_start);
end

% Log the values to file
fprintf(fileID, '%s,%f\n', time, sprintf('%f\t', value));

% Plot the values
if ii > n_data
    plot(t_end, value(1),'*r')
    xlim([(ii-n_data)*scanInterval ii*scanInterval])

else
    plot(t_end, value(1), 'bo')
end

drawnow
scan_time = toc(loop);
% Wait for the next scan
pause(scanInterval-scan_time)

end
 


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.

Code:
Timestamp   AIN0   AIN0_EF_READ_A      
2023-05-02_07-50-31.950   48        
0.000159   29.819977      2023-05-02_07-50-32.453   48
0.000161   29.839417      2023-05-02_07-50-32.965   48
0.000161   29.819977      2023-05-02_07-50-33.474   48
0.00016   29.839417      2023-05-02_07-50-33.988   48
0.000165   29.917206      2023-05-02_07-50-34.494   48
0.000161   29.839417      2023-05-02_07-50-34.999   48
0.000165   29.819977      2023-05-02_07-50-35.494   48
0.000162   29.800537      2023-05-02_07-50-36.009   48
0.000161   29.878326      2023-05-02_07-50-36.514   48
0.000164   29.800537

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 hoffe das ich das jetzt besser gemacht habe Smile'

grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2023, 10:45     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
lovobo
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 26.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2023, 11:53     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2023, 16:23     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
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.