Connexion des capteurs KELLER à MATLAB

Présentation


KELLER fabrique des capteurs de haute précision à sortie numérique, qui sont connectés à un logiciel propriétaire pour l'affichage et l'accumulation des lectures. Souvent, l'utilisateur doit intégrer des capteurs dans ses propres systèmes de surveillance et de contrôle. Dans ce travail, en utilisant le capteur de pression de haute précision PR-33X comme exemple, nous montrons la connexion des capteurs KELLER à l'environnement intégré MATLAB, développé à l'origine pour l'analyse et la synthèse des systèmes de contrôle, qui dispose d'outils puissants pour le traitement et l'affichage des données de signal.

Brève description du transmetteur de pression KELLER PR 33X


Plage de pression standard (VPI), bar 30
Précision de la mesure de pression, totale (10 ... 40 ° C) 0,025% de VPI
Sortie RS 485
Débit en bauds 9600 ou 115200 bauds
Tension d'alimentation (U) 8 ... 28 V
Durée de vie 10 millions de cycles 0 ... 100% VPI

Le transmetteur de pression comprend également un capteur de température intégré.

Interface


Tous les produits KELLER avec index X ont une interface numérique (RS485 half duplex) qui prend en charge les protocoles MODBUS RTU et Keller Bus.

La connexion à un PC s'effectue à l'aide d'un convertisseur RS485-USB. Pour une meilleure compatibilité, l'entreprise recommande d'utiliser le convertisseur Keller K-114.

Logiciels


Pour configurer et enregistrer les lectures des capteurs, un logiciel CCS30 gratuit est utilisé, dont l'interface est illustrée à la figure 1.

image
Figure 1. Accumulation et affichage de données graphiques et tabulaires par le programme CCS30 [3].

Connexion PC


Le capteur de pression PR-33X est connecté à un PC à l'aide d'un convertisseur de port série USB vers RS-232/422/485 MOXA conformément au schéma de la figure 2.

image
Figure 2. Schéma de connexion du transmetteur de pression PR-33X à un PC et à une alimentation 12 V. Lorsqu'ils sont alimentés en dessous de 5,69 V (jusqu'à 4,95 V), les lectures du capteur augmentent. Lorsqu'il est alimenté en dessous de 4,95 V, les données ne sont pas transmises (le capteur ne fonctionne pas).

Après avoir installé le pilote et connecté le convertisseur MOXA au PC, le port COM apparaît dans la liste du gestionnaire de périphériques image et adaptateur image . Dans l'onglet (Figure 3) du dernier appareil de notre version, l'interface RS-485 avec un schéma de connexion à deux fils est sélectionnée.

image
Figure 3. Configuration du convertisseur MOXA vers l'interface RS-485 2W.

Formats de transmission


L'échange de données entre l'ordinateur (appareil de contrôle) et le capteur (appareil esclave) s'effectue selon les messages du protocole Modbus contenant les champs suivants [2].

image

Tout d'abord, l'ordinateur envoie un message de demande au capteur, puis le capteur en réponse envoie son propre message avec sa propre somme de contrôle lorsque l'action demandée réussit, ou envoie une fonction avec le code 1 en cas d'erreur (fonction ou adresse de données non valide, etc.).

La réponse (réponse) du capteur n'est émise qu'après réception d'une demande du dispositif de commande.

Le message envoyé au capteur contient l'un des codes de fonction suivants.

image

image
Figure 4. Format des messages transmis et reçus selon la norme Modbus RTU [1].

Adresses des registres de capteurs utilisés PR-33X


image

Exemples de messages Modbus (lecture du capteur de pression et de température intégré) [2]


image

Convertir les lectures des capteurs au format à virgule flottante IEEE754


La procédure recommandée pour convertir les quatre octets reçus des lectures du capteur en un nombre à virgule flottante est illustrée à la figure 5. L'exemple utilise les données [2] indiquées dans le tableau ci-dessus.

image
Figure 5. Règles de conversion des relevés de capteur à quatre octets en nombre à virgule flottante.

Programme MATLAB pour lire et afficher les capteurs de pression et de température PR-33X


Le programme de lecture et d'affichage du capteur PR-33X comprend un module principal et trois sous-programmes. Le convertisseur fonctionne à 115200 bauds. Les données de pression et de température sont lues sur demande.

Les données d'entrée du programme sont l'adresse du port COM de votre appareil (Com_Port = variable) et l'adresse de votre convertisseur. Si un seul convertisseur est connecté, alors, en règle générale, Device_Addr = 1.

Le nombre de lectures est défini par la constante Loop (dans l'exemple, Loop = 1000;).

Le module 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 

Routine de génération de requête 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 

Routine de calcul de la somme de contrôle de séquence 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 

Sous-programme pour convertir quatre octets des lectures du capteur en nombre à virgule flottante


 % 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 

Des exemples de graphiques de pression et de température du PR-33X lus par le programme ci-dessus sont illustrés à la figure 6.

image
Figure 6. Sortie du convertisseur PR-33X reçue par le programme développé dans MATLAB. Le programme lit 1000 lectures de pression à 115200 bauds en 9 secondes. Le programme lit 1000 lectures de pression et 1000 lectures de température (séparément) à 115200 bauds en 17 secondes.

Vitesse de transfert des données de commutation du programme MATLAB du convertisseur


Pour passer à une nouvelle fréquence, il est nécessaire dans le programme de définir l'adresse du port COM de votre appareil (Com_Port = variable) et la fréquence requise du convertisseur (BR_Rate = 9600; ou BR_Rate = 115200;)

ATTENTION Pour passer à une nouvelle fréquence de transmission de données après avoir réglé le bit zéro du registre du convertisseur UART, il est nécessaire de TURN OFF (hors tension) puis de rallumer le convertisseur.

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

Liste bibliographique


  1. Dr. Bob Davidov. Communication avec les périphériques réseau industriels. portalnp.ru/wp-content/uploads/2013/08/12.02_Discrete-IO-unit_-MK110-_RS-485-ModBus-RTU-_-ASCII-DCON-OVEN__Ed3.pdf
  2. Description des protocoles de communication. Pour les transmetteurs de pression des séries KELLER 30 et 40. Class.Group = 5.20 Class.Group = 5.21. Version 3.2 (en russe). www.izmerkon.ru .
  3. Control Center Series 30. Guide de l'utilisateur. Pour CCS30 version 1.1. www.izmerkon.ru
  4. Dr. Bob Davidov. Technologies de contrôle informatique dans les systèmes techniques portalnp.ru/author/bobdavidov

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


All Articles