Conexión de sensores KELLER a MATLAB

Introduccion


KELLER fabrica sensores de alta precisión con salida digital, que están conectados a software patentado para visualización y acumulación de lecturas. A menudo, el usuario necesita integrar sensores en sus propios sistemas de monitoreo y control. En este trabajo, utilizando el sensor de presión de alta precisión PR-33X como ejemplo, mostramos la conexión de los sensores KELLER al entorno integrado MATLAB, desarrollado originalmente para el análisis y síntesis de sistemas de control, que tiene herramientas poderosas para procesar y mostrar datos de señales.

Breve especificación del transmisor de presión KELLER PR 33X


Rango de presión estándar (VPI), bar 30
Precisión de medición de presión, total (10 ... 40 ° C) 0.025% de VPI
Salida RS 485
Velocidad de baudios 9600 o 115200 baudios
Tensión de alimentación (U) 8 ... 28 V
Vida útil 10 millones de ciclos 0 ... 100% VPI

El transmisor de presión también incluye un sensor de temperatura integrado.

Interfaz


Todos los productos KELLER con índice X tienen una interfaz digital (RS485 half duplex) que admite los protocolos MODBUS RTU y Keller Bus.

La conexión a una PC se realiza mediante un convertidor RS485-USB. Para una mejor compatibilidad, la compañía recomienda usar el convertidor Keller K-114.

Software


Para configurar y registrar las lecturas del sensor, se utiliza el software CCS30 gratuito, cuya interfaz se muestra en la Figura 1.

imagen
Figura 1. La acumulación y visualización de datos gráficos y tabulares por el programa CCS30 [3].

Conexión a PC


El sensor de presión PR-33X se conecta a una PC mediante un convertidor de puerto serie USB a puerto RS-232/422/485 MOXA USB de acuerdo con el diagrama de la Figura 2.

imagen
Figura 2. Diagrama de conexión del transmisor de presión PR-33X a una PC y una fuente de alimentación de 12 V. Cuando se alimenta por debajo de 5,69 V (hasta 4,95 V), las lecturas del sensor aumentan. Cuando se alimenta por debajo de 4,95 V, los datos no se transmiten (el sensor no funciona).

Después de instalar el controlador y conectar el convertidor MOXA a la PC, el puerto COM aparece en la lista de administrador de dispositivos imagen y adaptador imagen . En la pestaña (Figura 3) del último dispositivo para nuestra versión, se selecciona la interfaz RS-485 con un esquema de conexión de dos hilos.

imagen
Figura 3. Configuración del convertidor MOXA a la interfaz RS-485 2W.

Formatos de transmisión


El intercambio de datos entre la computadora (dispositivo de control) y el sensor (dispositivo esclavo) se lleva a cabo de acuerdo con los mensajes del protocolo Modbus que contienen los siguientes campos [2].

imagen

Primero, la computadora envía un mensaje de solicitud al sensor, luego el sensor en respuesta envía su propio mensaje con su propia suma de verificación cuando la acción solicitada es exitosa, o envía una función con el código 1 cuando ocurre un error (función no válida o dirección de datos, etc.).

La respuesta (respuesta) del sensor se emite solo después de recibir una solicitud del dispositivo de control.

El mensaje enviado al sensor contiene uno de los siguientes códigos de función.

imagen

imagen
Figura 4. Formato de los mensajes transmitidos y recibidos de acuerdo con el estándar Modbus RTU [1].

Direcciones de registros de sensores usados ​​PR-33X


imagen

Ejemplos de mensajes Modbus (lectura del sensor integrado de presión y temperatura) [2]


imagen

Convierta las lecturas del sensor al formato de coma flotante IEEE754


El procedimiento recomendado para convertir los cuatro bytes recibidos de las lecturas del sensor en un número de coma flotante se muestra en la Figura 5. El ejemplo utiliza los datos [2] que se muestran en la tabla anterior.

imagen
Figura 5. Reglas para convertir las lecturas del sensor de cuatro bytes en un número de coma flotante.

Programa MATLAB para leer y visualizar sensores de presión y temperatura PR-33X


El programa de lectura y visualización del sensor PR-33X incluye un módulo principal y tres subrutinas. El convertidor funciona a 115200 baudios. Los datos de presión y temperatura se leen a pedido.

Los datos de entrada del programa son la dirección del puerto COM de su dispositivo (Com_Port = variable) y la dirección de su convertidor. Si solo hay un convertidor conectado, entonces, como regla, Device_Addr = 1.

La constante de bucle establece el número de lecturas (en el ejemplo, bucle = 1000;).

El módulo principal:

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 

Rutina de generación de solicitudes 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 secuencia rutina de cálculo de suma de comprobación


 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 

Subrutina para convertir cuatro bytes de las lecturas del sensor a un número de coma flotante


 % 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 

En la Figura 6 se muestran ejemplos de gráficos de presión y temperatura PR-33X leídos por el programa anterior.

imagen
Figura 6. La salida del convertidor PR-33X recibido por el programa desarrollado en MATLAB. El programa lee 1000 lecturas de presión a 115200 baudios en 9 segundos. El programa lee 1000 lecturas de presión y 1000 lecturas de temperatura (por separado) a 115200 baudios en 17 segundos.

Programa MATLAB que cambia la velocidad de transferencia de datos del convertidor


Para cambiar a una nueva frecuencia, es necesario en el programa configurar la dirección del puerto COM de su dispositivo (Com_Port = variable) y la frecuencia requerida del convertidor (BR_Rate = 9600; o BR_Rate = 115200;)

ATENCION Para cambiar a una nueva frecuencia de transmisión de datos después de configurar el bit cero del registro del convertidor UART, es necesario APAGAR (desenergizar) y luego encender el convertidor nuevamente.

 %      (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 

Lista bibliográfica


  1. Dr. Bob Davidov. Comunicación con dispositivos de red industrial. portalnp.ru/wp-content/uploads/2013/08/12.02_Discrete-IO-unit_-MK110-_RS-485-ModBus-RTU-_-ASCII-DCON-OVEN__Ed3.pdf
  2. Descripción de los protocolos de comunicación. Para transmisores de presión KELLER de las series 30 y 40. Class.Group = 5.20 Class.Group = 5.21. Versión 3.2 (en ruso). www.izmerkon.ru .
  3. Control Center Series 30. Guía del usuario. Para CCS30 Versión 1.1. www.izmerkon.ru
  4. Dr. Bob Davidov. Tecnologías de control informático en sistemas técnicos portalnp.ru/author/bobdavidov

Source: https://habr.com/ru/post/440966/


All Articles