Code covered by the BSD License  

Highlights from
Rheodyne valve RS232 communications

Rheodyne valve RS232 communications

by

Geoffrey Akien

 

Commands for communicating with Rheodyne valves via RS232

rheodyne232objcomm(serialObject, command)
function output = rheodyne232objcomm(serialObject, command)
% RHEODYNE232OBJCOMM Reads and writes data from Rheodyne valves
% rheodyne232objcomm(serialObject, command) reads or writes
% information from Rheodyne valves connected via serial port. serialObject
% is the serial port object, and command is the command (as a string). If
% reading a value, responds with the value or a horizontal array of values
% if successfully carried out. When sending commands to be written (e.g. a
% valve position change), waits for confirmation from the device, which is
% not sent until the device has finished turning (quite slow) - use
% fastcomm if this confirmation is not required.

% Normal usage:

% e.g. rheodyne232objcomm(serialObject, 'S') for the current valve status.

% Range:

% serialObject = valid serial object
% command = string


% checks the number of arguments
error(nargchk(2, 2, nargin))

% error handling
if ~isa(serialObject, 'serial') || ~isvalid(serialObject) || ~strcmp(serialObject.Status, 'open')
    % errors
    error('serialObject must be a valid open serial object.')

% checks the command is a valid string    
elseif ~ischar(command) || (~isvector(command) && ~isscalar(command))
    % errors
    error('Command must be a string.')
end

% flushes out anything in the buffer
fread(serialObject);

% sends command
fprintf(serialObject, command, 'async')

% leaves a short pause to ensure the communication works (this may not be
% strictly necessary)
pause(0.2)

% while the data is not what we expected (maximum 10 goes before giving up)
for m = 1:10
    % gets the data
    response = fetchData(serialObject);

    % if its '*' or empty, then go round again, otherwise...
    if ~isequal(response, '*') || ~isempty(response)
        % escape
        break
    end
end

% defines the possible error codes
statusCodes = { 99, 'Valve failure (valve cannot be homed.';...
                88, 'Non-volatile memory error';...
                77, 'Valve-configuration error or command mode error;...'
                66, 'Valve positioning error';...
                55, 'Data integrity error';...
                44, 'Data CRC error'};

% defines the numeric version of the response
numResponse = str2double(char(response));

% tries to match it
statusIndex = find(cell2mat(statusCodes(:, 1)) == numResponse);

% if its empty, it is information (the valve position in this case)
if ~isempty(statusIndex)
    % then error
    error(['Valve error: ', statusCodes{2, statusIndex}])
end

% if the response is empty, errors
if isempty(response)
    % errors
    error('No response from Rheodyne.')
    
elseif isequal(response, '*')
    % errors
    error('Rheodyne was busy and command was not executed.')
    
elseif isequal(response, 13)
    % don't need to do anything - this is the acknowledge of a successful
    % command
    
elseif isnan(numResponse)
    % error
    error('NaN response from the Rheodyne.')
    
else
    % assign the output
    output = numResponse;
end


function output = fetchData(serialObject)
% checks response - this is also an automatic check for being able to
% send the next command - if it has understood the command and has sent a
% response - its certainly ready for another command

% reads response
output = fread(serialObject)';

% if the response is larger than one, it has useful information
if numel(output) > 1
    % remove the carriage return, and return the rest
    output = output(1:end - 1);
end

Contact us