ВВЕДЕНИЕ
Компания KELLER www.keller-druck.com производит высокоточные датчики с цифровым выходом, которые подключаются к фирменному программному обеспечению для отображения и накопления показаний. Зачастую, пользователю необходимо интегрировать датчики в собственные системы мониторинга и управления. В этой работе на примере высокоточного датчика давления PR-33X показано подключение датчиков KELLER к интегрированной среде MATLAB, первоначально разработанной для анализа и синтеза систем управления, имеющей мощные средства обработки и отображения сигнальных данных.
Краткая спецификация преобразователя давления KELLER PR 33X
Стандартный диапазон давлений (ВПИ), бар 30
Точность измерения давления, суммарная (10…40 °C) 0,025 % ВПИ
Выходной сигнал RS 485
Скорость передачи данных 9600 или 115200 бод
Напряжение питания (U) 8…28 V
Срок службы 10 млн. циклов 0…100 %ВПИ
Преобразователь давления содержит и встроенный датчик температуры.
Интерфейс
Все продукты компании KELLER с индексом X имеют цифровой интерфейс (RS485 полудуплекс), который поддерживает протоколы MODBUS RTU и Keller Bus.
Подключение к ПК осуществляется посредством RS485-USB конвертера. Для обеспечения наилучшей совместимости, компания рекомендует использовать конвертер K-114 от Keller.
Программное обеспечение
Для настройки и записи показаний датчика используется бесплатное ПО CCS30, интерфейс которого показан на Рисунок 1.
Рисунок 1. Накопление и отображение графических и табличных данных программой CCS30 [3].
Подключение к ПК
Подключение датчика давления PR-33X к ПК выполнено с использованием преобразователя USB в RS-232/422/485 MOXA USB Serial Port по схеме Рисунок 2.
Рисунок 2. Схема подключения преобразователя давления PR-33X к ПК и источнику питания 12 В. При питании ниже 5,69 В (до 4.95В) показания датчика растут. При питании ниже 4.95В данные не передаются (датчик не работает).
После установки драйвера и присоединении преобразователя МОХА к ПК в списке диспетчера устройств появляются СОМ порт и адаптер . В закладке (Рисунок 3) последнего устройства для нашего варианта выбран интерфейс RS-485 с двухпроводной схемой подключения.
Рисунок 3. Настройка преобразователя MOXA на интерфейс RS-485 2W.
Форматы передаваемых данных
Обмен данными между компьютером (управляющее устройство) и датчиком (подчиненное устройство) осуществляется по протоколу Modbus сообщениями, содержащими следующие поля [2]:
Сначала компьютер посылает запрос-сообщение датчику, затем датчик в ответ высылает собственное сообщение с собственной контрольной суммой при успешном выполнении запрашиваемого действия или высылает функцию с кодом 1 при возникновении ошибки (недопустимая функция или адрес данных и др.).
Ответ (отклик) датчика выдается только после получения им запроса управляющего устройства.
Передаваемое датчику сообщение содержит один из следующих кодов функций.
Рисунок 4. Формат передаваемых и принимаемых сообщений по стандарту Modbus RTU [1].
Адреса используемых регистров датчика PR-33X
Примеры сообщений Modbus (чтение показаний встроенного датчика давления и температуры) [2]
Преобразование показаний датчика в формат с плавающей точкой IEEE754
Рекомендуемый порядок перевода четырех принятых байт показаний датчика в число в формате с плавающей точкой показан на Рисунок 5. В примере используются данные [2] приведенные в таблице выше.
Рисунок 5. Правила перевода четырехбайтных показаний датчика в число с плавающей точкой.
Программа MATLAB чтения и отображения показаний датчиков давления и температуры преобразователя PR-33X
Программа чтения и отображения показаний датчика PR-33X включает основной модуль и три подпрограммы. Преобразователь работает на частоте 115200 бод. Данные давления и температуры считываются по собственным запросам.
Входными данными программы являются адрес СОМ порта вашего устройства (переменная Com_Port =) и адрес вашего преобразователя. Если подключен только один преобразователь то, как правило, Device_Addr = 1.
Количество считываемых показаний задается константой Loop (в примере Loop = 1000;).
Основной модуль:
Подпрограмма формирования Modbus RTU запроса
Подпрограмма вычисления контрольной суммы Modbus RTU последовательности
Подпрограмма перевода четырех байт показаний датчика в число с плавающей точкой
Примеры графического отображения давления и температуры преобразователя PR-33X, считываемые вышеприведенной программой, показаны на Рисунок 6.
Рисунок 6. Выходные данные преобразователя PR-33X полученные программой, разработанной в MATLAB. Программа считывает 1000 показаний давления на скорости 115200 бод за 9 секунд. Программа считывает 1000 показаний давления и 1000 показаний температуры (отдельно) на скорости 115200 бод за 17 секунд.
Программа MATLAB переключения скорости передачи данных преобразователя
Для перехода на новую частоту необходимо в программе установить адрес СОМ порта вашего устройства (переменная Com_Port =) и требуемую частоту преобразователя (BR_Rate = 9600; или BR_Rate = 115200;)
ВНИМАНИЕ. Для перехода на новую частоту передачи данных после установки нулевого бита регистра преобразователя UART необходимо ВЫКЛЮЧИТЬ (обесточить) и, затем, снова ВКЛЮЧИТЬ преобразователь.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Dr. Bob Davidov. Связь с устройствами промышленных сетей. portalnp.ru/wp-content/uploads/2013/08/12.02_Discrete-IO-unit_-MK110-_RS-485-ModBus-RTU-_-ASCII-DCON-OVEN__Ed3.pdf
2. Описание коммуникационных протоколов. Для преобразователей давления KELLER 30-й и 40-й серий. Класс.Группа = 5.20 Класс.Группа = 5.21. Версия 3.2 (на русском). www.izmerkon.ru. Description of the Communication protocol for Series 30 and Series40 pressure transmitters from KELLER. Class.Group = 5.20 Class.Group = 5.21 Version 3.2 (на английском). www.keller-druck.com
3. Control Center Series 30. Руководство пользователя. Fur CCS30 Version 1.1. www.izmerkon.ru
4. Dr. Bob Davidov. Компьютерные технологии управления в технических системах portalnp.ru/author/bobdavidov
Компания KELLER www.keller-druck.com производит высокоточные датчики с цифровым выходом, которые подключаются к фирменному программному обеспечению для отображения и накопления показаний. Зачастую, пользователю необходимо интегрировать датчики в собственные системы мониторинга и управления. В этой работе на примере высокоточного датчика давления PR-33X показано подключение датчиков KELLER к интегрированной среде MATLAB, первоначально разработанной для анализа и синтеза систем управления, имеющей мощные средства обработки и отображения сигнальных данных.
Краткая спецификация преобразователя давления KELLER PR 33X
Стандартный диапазон давлений (ВПИ), бар 30
Точность измерения давления, суммарная (10…40 °C) 0,025 % ВПИ
Выходной сигнал RS 485
Скорость передачи данных 9600 или 115200 бод
Напряжение питания (U) 8…28 V
Срок службы 10 млн. циклов 0…100 %ВПИ
Преобразователь давления содержит и встроенный датчик температуры.
Интерфейс
Все продукты компании KELLER с индексом X имеют цифровой интерфейс (RS485 полудуплекс), который поддерживает протоколы MODBUS RTU и Keller Bus.
Подключение к ПК осуществляется посредством RS485-USB конвертера. Для обеспечения наилучшей совместимости, компания рекомендует использовать конвертер K-114 от Keller.
Программное обеспечение
Для настройки и записи показаний датчика используется бесплатное ПО CCS30, интерфейс которого показан на Рисунок 1.
Рисунок 1. Накопление и отображение графических и табличных данных программой CCS30 [3].
Подключение к ПК
Подключение датчика давления PR-33X к ПК выполнено с использованием преобразователя USB в RS-232/422/485 MOXA USB Serial Port по схеме Рисунок 2.
Рисунок 2. Схема подключения преобразователя давления PR-33X к ПК и источнику питания 12 В. При питании ниже 5,69 В (до 4.95В) показания датчика растут. При питании ниже 4.95В данные не передаются (датчик не работает).
После установки драйвера и присоединении преобразователя МОХА к ПК в списке диспетчера устройств появляются СОМ порт и адаптер . В закладке (Рисунок 3) последнего устройства для нашего варианта выбран интерфейс RS-485 с двухпроводной схемой подключения.
Рисунок 3. Настройка преобразователя MOXA на интерфейс RS-485 2W.
Форматы передаваемых данных
Обмен данными между компьютером (управляющее устройство) и датчиком (подчиненное устройство) осуществляется по протоколу Modbus сообщениями, содержащими следующие поля [2]:
Сначала компьютер посылает запрос-сообщение датчику, затем датчик в ответ высылает собственное сообщение с собственной контрольной суммой при успешном выполнении запрашиваемого действия или высылает функцию с кодом 1 при возникновении ошибки (недопустимая функция или адрес данных и др.).
Ответ (отклик) датчика выдается только после получения им запроса управляющего устройства.
Передаваемое датчику сообщение содержит один из следующих кодов функций.
Рисунок 4. Формат передаваемых и принимаемых сообщений по стандарту Modbus RTU [1].
Адреса используемых регистров датчика PR-33X
Примеры сообщений Modbus (чтение показаний встроенного датчика давления и температуры) [2]
Преобразование показаний датчика в формат с плавающей точкой IEEE754
Рекомендуемый порядок перевода четырех принятых байт показаний датчика в число в формате с плавающей точкой показан на Рисунок 5. В примере используются данные [2] приведенные в таблице выше.
Рисунок 5. Правила перевода четырехбайтных показаний датчика в число с плавающей точкой.
Программа MATLAB чтения и отображения показаний датчиков давления и температуры преобразователя PR-33X
Программа чтения и отображения показаний датчика PR-33X включает основной модуль и три подпрограммы. Преобразователь работает на частоте 115200 бод. Данные давления и температуры считываются по собственным запросам.
Входными данными программы являются адрес СОМ порта вашего устройства (переменная Com_Port =) и адрес вашего преобразователя. Если подключен только один преобразователь то, как правило, Device_Addr = 1.
Количество считываемых показаний задается константой Loop (в примере Loop = 1000;).
Основной модуль:
clear all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Input data
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Com_Port = 'COM9';
Device_Addr = 1; % Address of Sensor, 8 bit: 1..255
Function = 3; % 3 or 4 is read;
Pr_Rg_Addr = 2; % First address of two pressure data registers (4 bytes)
Temp_Rg_Addr = 8; % First address of two temperature data registers
Address_Range = 2; % Range of data address
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% End of Input data
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Make COM port connection
s=serial(Com_Port,'Baudrate',115200); % 9600 115200
fopen (s);
pause(0.1);
Loop = 1000;
pr(1:Loop) = 0; temp(1:Loop) = 0;
for i = 1:Loop
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Read pressure
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RTU_request = RTU_code(Device_Addr,Function,Pr_Rg_Addr,Address_Range);
fwrite(s, RTU_request);
%pause(0.01); % >=0.001s for PR-33X, for 115200 Baudrate
while ~(get(s,'BytesAvailable')>8)
end
BytesAvailable = get(s,'BytesAvailable');
Rx = fread(s,BytesAvailable)';
pr(i) = sensorOUT_to_float(Rx); % in bar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Read temperature
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RTU_request = RTU_code(Device_Addr,Function,Temp_Rg_Addr,Address_Range);
fwrite(s, RTU_request);
while ~(get(s,'BytesAvailable')>8)
end
BytesAvailable = get(s,'BytesAvailable');
% if BytesAvailable > 0
Rx = fread(s,BytesAvailable)';
temp(i) = sensorOUT_to_float(Rx); % in bar
end
% Close COM port
fclose (s);
delete (s);
figure (3)
clf('reset'); % Clear current figure window
[AX,H1,H2] = plotyy (1:length(pr),pr,1:length(temp),temp);
hold(AX(1));
hold(AX(2));
set(H1,'LineWidth',2);
grid(AX(2),'on');
xlabel('Sampling, num');
% Y1_max = max(get(AX(1),'ytick'));
% set(AX(1),'ytick',[0:Y1_max/10:Y1_max]);
% set(AX(2),'ytick',[0:0.2:2]);
set(get(AX(1),'Ylabel'),'String','Давление, бар');
set(get(AX(2),'Ylabel'),'String','Температура, град. С');
title(sprintf('Изменение давления и температуры'));
% End of m file
Подпрограмма формирования Modbus RTU запроса
function RTU_request = RTU_code(Device_Addr,Function,Data_First_Address,Address_Range)
% Device_Addr == Device Address 8 bit: 1..255
% Function == % 3 or 4 is read; 6 is write in one register; 16 - write in two registers,
% Data_First_Address == Address of first register data (2 bytes)
% Addrress_Range == Range of Addreses; %
Data_First_Address_Bytes = [floor(Data_First_Address/256) rem(Data_First_Address,256)];
Address_Range_Bytes = [floor(Address_Range/256) rem(Address_Range,256)];
% Master's Tx data without Check sum
Code = [Device_Addr Function Data_First_Address_Bytes Address_Range_Bytes];
Code_Char = dec2hex(Code);
if size(Code_Char,2)==1
Code_Char(:,2)=Code_Char(:,1);
Code_Char(:,1)='0';
end
Code_Char_line = [];
for I = 1:length(Code)
Code_Char_line = [Code_Char_line Code_Char(I,1:2)];
end
% Check sum calculation
Check_Sum = crc_calculator(Code_Char_line);
% Master's Tx data with Check sum
RTU_request = [Code hex2dec(Check_Sum(1:2)) hex2dec(Check_Sum(3:4))];
% End of m file
Подпрограмма вычисления контрольной суммы Modbus RTU последовательности
function output_hex_string = crc_calculator (Input_hex);
%Input_hex = 'F70302640008'; % <= 2 * 16 Char
F = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
xor_constant = [1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1];
for i = 1 : length (Input_hex) / 2;
A = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
if ~(i > length (Input_hex)/2)
A_hex = Input_hex ((i-1)*2+1:i*2); % Two HEX bytes
A_bin = dec2bin (hex2dec (A_hex));
length_A_bin = length (A_bin);
for j = 0 : length_A_bin - 1
A (16 - j) = str2num(A_bin (length_A_bin - j));
end
end
F = xor (F,A);
for ii = 1 : 8
if F(16) ==1
if xor_constant (1) == 0
F_shift (1) = 0;
else
F_shift (1) = 1;
end
for j = 2 : 16;
if xor_constant (j) == F (j-1);
F_shift (j) = 0;
else
F_shift (j) = 1;
end
end
else
F_shift = circshift(F',1)';
end
F = F_shift;
end
end
h = num2str(F);
h = h(1:3:length(h));
output_hex_string = num2str([dec2hex(bin2dec(h(9:12))) dec2hex(bin2dec(h(13:16))) dec2hex(bin2dec(h(1:4))) dec2hex(bin2dec(h(5:8)))]);
% End of m file
Подпрограмма перевода четырех байт показаний датчика в число с плавающей точкой
% Transmission Sensor’s output bytes to float value
function val = sensorOUT_to_float(Rx)
B(1) = Rx(4);
B(2) = Rx(5);
B(3) = Rx(6);
B(4) = Rx(7);
%1 bit of sign + 8 bits of exponent + 23 bits of mantis ( = 32 bits or 4x8 bytes)
v_res = [];
for i = 1:4
v_bit = dec2bin(B(i));
if length(v_bit)<8 % add zeros to get 8 bits
for j = 1:(8-length(v_bit))
v_bit = ['0' v_bit];
end
end
v_res = [v_res v_bit];
end
% Checking
% v_res = ['0' '10000010' '01010010000001011011110'] == 10.5631999969482421875 бар
s_mnt = bin2dec(v_res(1)); %sign of mantis
E = bin2dec(v_res(2:9)); %exponent
M = bin2dec(v_res(10:32)); % mantis
if s_mnt==0
val = (1+M/8388608)*2^(E-127); % 8388608 = 2^23
else
val = -(1+M/8388608)*2^(E-127);
end
% End of m file
Примеры графического отображения давления и температуры преобразователя PR-33X, считываемые вышеприведенной программой, показаны на Рисунок 6.
Рисунок 6. Выходные данные преобразователя PR-33X полученные программой, разработанной в MATLAB. Программа считывает 1000 показаний давления на скорости 115200 бод за 9 секунд. Программа считывает 1000 показаний давления и 1000 показаний температуры (отдельно) на скорости 115200 бод за 17 секунд.
Программа MATLAB переключения скорости передачи данных преобразователя
Для перехода на новую частоту необходимо в программе установить адрес СОМ порта вашего устройства (переменная Com_Port =) и требуемую частоту преобразователя (BR_Rate = 9600; или BR_Rate = 115200;)
ВНИМАНИЕ. Для перехода на новую частоту передачи данных после установки нулевого бита регистра преобразователя UART необходимо ВЫКЛЮЧИТЬ (обесточить) и, затем, снова ВКЛЮЧИТЬ преобразователь.
% ПЕРЕХОД НА НОВУ СКОРОСТЬ ОБМЕНА (9600 ИЛИ 115200 БОД) ВЫПОЛНЯЕТСЯ ПОСЛЕ УСТАНОВКИ UART РЕГИСТРА И ВЫКЛЮЧЕНИЯ-ВКЛЮЧЕНИЯ ПРЕОБРАЗОВАТЕЛЯ
clear all;
% Input data
Com_Port = 'COM9';
BR_Rate = 115200; % 9600 or 115200
% End of Input data
% Device_Addr = 1; % Address of Sensor, 8 bit: 1..255
% Function = 6; % Write;
% UART_Rg_Addr = 512; % First address of UART Rg (2 bytes)
% Data = 0 0; % Rate 9600 bod
% Data = 0 1; % Rate 115200 bod
% RTU_request = [Device_Addr Function UART_Rg_Addr Data Check_sum]
% RTU_request = [ 1 6 2 0 0 0 136 114]; % 9600 bod request in hex
% RTU_request = [ 1 6 2 0 0 1 73 178]; % 115200 bod request in hex
if BR_Rate == 9600 % 115200
s=serial(Com_Port,'Baudrate',115200);
fopen (s);
pause(0.1);
RTU_request =[ 1 6 2 0 0 0 136 114];
else
s=serial(Com_Port,'Baudrate',9600);
fopen (s);
pause(0.1);
RTU_request = [ 1 6 2 0 0 1 73 178];
end
fwrite(s, RTU_request);
pause(0.004); % >=0.001s for PR-33X, for 115200 Baudrate
BytesAvailable = get(s,'BytesAvailable');
if BytesAvailable > 0
Rx = fread(s,BytesAvailable)'
end
% close COM port
fclose (s);
delete (s);
% End of m file
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Dr. Bob Davidov. Связь с устройствами промышленных сетей. portalnp.ru/wp-content/uploads/2013/08/12.02_Discrete-IO-unit_-MK110-_RS-485-ModBus-RTU-_-ASCII-DCON-OVEN__Ed3.pdf
2. Описание коммуникационных протоколов. Для преобразователей давления KELLER 30-й и 40-й серий. Класс.Группа = 5.20 Класс.Группа = 5.21. Версия 3.2 (на русском). www.izmerkon.ru. Description of the Communication protocol for Series 30 and Series40 pressure transmitters from KELLER. Class.Group = 5.20 Class.Group = 5.21 Version 3.2 (на английском). www.keller-druck.com
3. Control Center Series 30. Руководство пользователя. Fur CCS30 Version 1.1. www.izmerkon.ru
4. Dr. Bob Davidov. Компьютерные технологии управления в технических системах portalnp.ru/author/bobdavidov