Anschließen der KELLER-Sensoren an MATLAB

Einführung


KELLER stellt hochpräzise Sensoren mit digitalem Ausgang her, die mit einer proprietären Software zur Anzeige und Akkumulation von Messwerten verbunden sind. Oft muss der Benutzer Sensoren in seine eigenen Überwachungs- und Steuerungssysteme integrieren. In dieser Arbeit zeigen wir am Beispiel des hochpräzisen Drucksensors PR-33X die Verbindung von KELLER-Sensoren mit der integrierten MATLAB-Umgebung, die ursprünglich für die Analyse und Synthese von Steuerungssystemen entwickelt wurde und über leistungsstarke Tools zur Verarbeitung und Anzeige von Signaldaten verfügt.

Kurze Spezifikation des Druckmessumformers KELLER PR 33X


Standarddruckbereich (VPI), bar 30
Genauigkeit der Druckmessung, insgesamt (10 ... 40 ° C) 0,025% des VPI
RS 485 Ausgang
Baudrate 9600 oder 115200 Baud
Versorgungsspannung (U) 8 ... 28 V.
Lebensdauer 10 Millionen Zyklen 0 ... 100% VPI

Der Druckmessumformer enthält auch einen integrierten Temperatursensor.

Schnittstelle


Alle KELLER-Produkte mit Index X verfügen über eine digitale Schnittstelle (RS485-Halbduplex), die die Protokolle MODBUS RTU und Keller Bus unterstützt.

Der Anschluss an einen PC erfolgt über einen RS485-USB-Konverter. Für eine optimale Kompatibilität empfiehlt das Unternehmen die Verwendung des Keller-Konverters K-114.

Software


Zum Konfigurieren und Aufzeichnen von Sensorwerten wird die kostenlose CCS30-Software verwendet, deren Schnittstelle in Abbildung 1 dargestellt ist.

Bild
Abbildung 1. Die Erfassung und Anzeige von grafischen und tabellarischen Daten durch das CCS30-Programm [3].

PC-Verbindung


Der PR-33X-Drucksensor wurde mit einem USB-zu-RS-232/422/485-MOXA-USB-Seriell-Port-Konverter an einen PC angeschlossen (siehe Abbildung 2).

Bild
Abbildung 2. Anschlussdiagramm des Druckmessumformers PR-33X an einen PC und eine 12-V-Stromversorgung. Bei einer Stromversorgung unter 5,69 V (bis zu 4,95 V) erhöhen sich die Sensorwerte. Bei einer Stromversorgung unter 4,95 V werden keine Daten übertragen (der Sensor funktioniert nicht).

Nach der Installation des Treibers und dem Anschließen des MOXA-Konverters an den PC wird der COM-Anschluss in der Liste der Geräte-Manager angezeigt Bild und Adapter Bild . Auf der Registerkarte (Abbildung 3) des letzten Geräts unserer Version wird die RS-485-Schnittstelle mit einem Zweidraht-Verbindungsschema ausgewählt.

Bild
Abbildung 3. Konfigurieren des MOXA-Konverters für die RS-485 2W-Schnittstelle.

Übertragungsformate


Der Datenaustausch zwischen dem Computer (Steuergerät) und dem Sensor (Slave-Gerät) erfolgt gemäß den Modbus-Protokollnachrichten, die die folgenden Felder enthalten [2].

Bild

Zuerst sendet der Computer eine Anforderungsnachricht an den Sensor, dann sendet der Sensor als Antwort eine eigene Nachricht mit einer eigenen Prüfsumme, wenn die angeforderte Aktion erfolgreich ist, oder sendet eine Funktion mit Code 1, wenn ein Fehler auftritt (ungültige Funktion oder Datenadresse usw.).

Die Antwort (Antwort) des Sensors wird erst ausgegeben, nachdem eine Anforderung vom Steuergerät empfangen wurde.

Die an den Sensor gesendete Nachricht enthält einen der folgenden Funktionscodes.

Bild

Bild
Abbildung 4. Format der gesendeten und empfangenen Nachrichten gemäß dem Modbus RTU-Standard [1].

Adressen der verwendeten Sensorregister PR-33X


Bild

Beispiele für Modbus-Meldungen (Lesen des integrierten Druck- und Temperatursensors) [2]


Bild

Konvertieren Sie die Sensorwerte in das Gleitkommaformat IEEE754


Das empfohlene Verfahren zum Konvertieren der vier empfangenen Bytes der Sensorablesungen in eine Gleitkommazahl ist in Abbildung 5 dargestellt. Das Beispiel verwendet die in der obigen Tabelle gezeigten Daten [2].

Bild
Abbildung 5. Regeln zum Konvertieren von Vier-Byte-Sensorwerten in eine Gleitkommazahl.

MATLAB-Programm zum Lesen und Anzeigen von Druck- und Temperatursensoren PR-33X


Das Lese- und Anzeigeprogramm für den PR-33X-Sensor umfasst ein Hauptmodul und drei Unterprogramme. Der Konverter arbeitet mit 115200 Baud. Druck- und Temperaturdaten werden auf Anfrage ausgelesen.

Die Programmeingabedaten sind die COM-Port-Adresse Ihres Geräts (Com_Port = Variable) und die Adresse Ihres Konverters. Wenn nur ein Konverter angeschlossen ist, ist in der Regel Device_Addr = 1.

Die Anzahl der Messwerte wird durch die Schleifenkonstante festgelegt (im Beispiel Schleife = 1000;).

Das Hauptmodul:

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 zur Erzeugung von Modbus RTU-Anforderungen


 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 

Berechnungsroutine für die Modbus RTU-Sequenzprüfsumme


 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 

Unterprogramm zum Konvertieren von vier Bytes der Sensorwerte in eine Gleitkommazahl


 % 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 

Beispiele für Druck- und Temperaturdiagramme des PR-33X, die vom obigen Programm gelesen wurden, sind in Abbildung 6 dargestellt.

Bild
Abbildung 6. Die Ausgabe des PR-33X-Konverters, die von dem in MATLAB entwickelten Programm empfangen wurde. Das Programm liest in 9 Sekunden 1000 Druckwerte bei 115200 Baud. Das Programm liest in 17 Sekunden 1000 Druckwerte und 1000 Temperaturwerte (separat) bei 115200 Baud.

MATLAB Programmumschaltung Datenübertragungsgeschwindigkeit des Konverters


Um auf eine neue Frequenz umzuschalten, müssen Sie im Programm die COM-Port-Adresse Ihres Geräts (Com_Port = Variable) und die erforderliche Frequenz des Konverters (BR_Rate = 9600; oder BR_Rate = 115200;) einstellen.

ACHTUNG Um nach dem Setzen des Nullbits des Registers des UART-Wandlers auf eine neue Datenübertragungsfrequenz umzuschalten, muss der Wandler ausgeschaltet (stromlos) und dann wieder eingeschaltet werden.

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

Bibliografische Liste


  1. Dr. Bob Davidov. Kommunikation mit industriellen Netzwerkgeräten. portalnp.ru/wp-content/uploads/2013/08/12.02_Discrete-IO-unit_-MK110-_RS-485-ModBus-RTU-_-ASCII-DCON-OVEN__Ed3.pdf
  2. Beschreibung der Kommunikationsprotokolle. Für Druckmessumformer der Serien KELLER 30 und 40. Class.Group = 5.20 Class.Group = 5.21. Version 3.2 (auf Russisch). www.izmerkon.ru .
  3. Control Center Series 30. Benutzerhandbuch. Für CCS30 Version 1.1. www.izmerkon.ru
  4. Dr. Bob Davidov. Computersteuerungstechnologien in technischen Systemen portalnp.ru/author/bobdavidov

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


All Articles