Borrar filtros
Borrar filtros

Problem with call back function

2 visualizaciones (últimos 30 días)
DEYIRE UMAR
DEYIRE UMAR el 28 de Ag. de 2018
Comentada: Geoff Hayes el 30 de Ag. de 2018
Guys, I have a program which obtains some data from UR5 robot via TCP/IP. I want to implement a call back function to enable it continuously obtaining this data if possible upto 10hours because it stops at some point (like 10minutes). But the call back is new to me and what I have also stops after the first reading of the specified bytes. Here are the programs:
CALLBACK FUNCTION
function urcallback(obj, event)
global t;
pause(t);
t = 0;
ur5_sample = fread(obj, 2216, 'uint8');
timestamp = now;
raw_data = uint8(ur5_sample');
X = typecast(fliplr(raw_data(445:452)), 'double');
Y = typecast(fliplr(raw_data(453:460)), 'double');
Z = typecast(fliplr(raw_data(461:468)), 'double');
Rx = typecast(fliplr(raw_data(469:476)), 'double');
Ry = typecast(fliplr(raw_data(477:484)), 'double');
Rz = typecast(fliplr(raw_data(485:492)), 'double');
Gripper_state = raw_data(1045);
timestring = datestr(timestamp,'HH:MM:SS.FFF');
[~,~,~,hours,minutes,seconds] = datevec(timestring);
Time = 1000*(3600*hours + 60*minutes + seconds);
global log_table;
table_row = table(Time, Gripper_state, X, Y, Z, Rx, Ry, Rz);
log_table = [log_table; table_row];
ACTUAL PROGRAM % Initialize variables % Unprocessed data global log_table log_table = table();
global t
t = 5;
% Setup connection to UR5
UR5_ADDRESS = '192.168.233.3';
UR5_PORT = 30003;
s = tcpip(UR5_ADDRESS, UR5_PORT, 'NetworkRole', 'client', 'Timeout', 10);
s.InputBufferSize = 102400;
s.BytesAvailableFcnCount = 1108;
s.BytesAvailableFcnMode = 'byte';
s.BytesAvailableFcn = {@urcallback};
fopen(s);
pause(5);
fclose(s);
delete(s);
clear s; % Close connection
filename = strcat('log_table.csv');
writetable(log_table, filename);
Find attached, the result obtained after 1108 byte was read. Your help is welcomed please?
  6 comentarios
Geoff Hayes
Geoff Hayes el 30 de Ag. de 2018
Deyire's answer moved here
I still wonder why this program which is without the callback but using While loop, due stop after some minutes of running.
raw_data = [];
host = '10.53.106.139';
port = 30003;
s = tcpip(host, port,'NetworkRole', 'client', 'Timeout', 10);
% Setup connection to UR5
s.InputBufferSize = 102400;
iteration = 0;
T = table();
MASK0 = 1;
fopen(s);
s.ReadAsyncMode = 'continuous';
while (exist('.//lock.txt', 'file') == 2)
ur5_sample = fread(s, 1108, 'uint8');
timestamp = now;
raw_data = uint8(ur5_sample');
X = typecast(fliplr(raw_data(445:452)), 'double')*1000;
Y = typecast(fliplr(raw_data(453:460)), 'double')*1000;
Z = typecast(fliplr(raw_data(461:468)), 'double')*1000;
Rx = typecast(fliplr(raw_data(469:476)), 'double')* 180 / 3.1459;
Ry = typecast(fliplr(raw_data(477:484)), 'double')* 180 / 3.1459;
Rz = typecast(fliplr(raw_data(485:492)), 'double')* 180 / 3.1459;
digit_out= typecast(fliplr(raw_data(1045:1052)), 'double');
Gripper_state = bitand(digit_out, MASK0);
if (Gripper_state == MASK0)
Gripper_state = 1;
else
Gripper_state = 0;
end
timestring = datestr(timestamp,'HH:MM:SS.FFF');
[~,~,~,hours,minutes,seconds] = datevec(timestring);
Time1 = 1000*(3600*hours + 60*minutes + seconds);
iteration = iteration + 1;
% fprintf('Time = %d sec Gripper_state =%d X = %f mm Y = %f mm Z = %f mm Rx = %f deg Ry = %f deg Rz = %f deg \n',Time, Gripper_state, X, Y, Z, Rx, Ry, Rz);
T = [T; table(Time1,Gripper_state, X, Y, Z, Rx, Ry, Rz)];
tcp_coordinates = T;
end
writetable(T,'robotData.csv','Delimiter',',');
fclose(s);
delete(s);
clear s; % Close connection
And displays this error:
Warning: The specified amount of data was not returned within the Timeout period.
'tcpip' unable to read all requested data. For more information on possible reasons, see TCPIP
Read Warnings.
Index exceeds array bounds.
Error in ur_data_acquisition (line 25)
X = typecast(fliplr(raw_data(441:448)), 'double')*1000;
Geoff Hayes
Geoff Hayes el 30 de Ag. de 2018
Is this your line of code?
X = typecast(fliplr(raw_data(441:448)), 'double')*1000;
If so, then the warning and error messages are telling you what is wrong - not enough data was returned before the timeout expired and then you tried to access more data than what was available in the (presumably) raw_data array. You may need to check the size of raw_data before trying to extract data from it...

Iniciar sesión para comentar.

Respuestas (0)

Categorías

Más información sobre Data Type Identification en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by