Jump to content

leonhard.pleuger

Members
  • Gesamte Inhalte

    5
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von leonhard.pleuger

  1. Hallo, 

    wir haben den Fehler gefunden. Schuld waren die letzten vier Zeichen "\r\n", die Matlab im ASCII Befehl falsch interpretiert hat. 

    Die Nachricht darf also nicht die folgende Form haben: ':9003015E00020C\r\n'

    Wenn der write Befehl folgendermaßen aussieht, wird das gewünschte Ergebnis ausgegeben. 

    cr = sprintf('\r'); %carriage return
    lf = newline; %line feed
    rs485.write([':9003015E00020C', cr, lf]);

    Der Terminatior muss also extra angehängt werden. 

    Sehr vielen Dank für die Hilfe. :-) 

  2. Hi, 

    das fasst die Situation gut zusammen. Es macht allerdings keinen Unterschied, in welcher Reihenfolge Brickviewer und Matlab gestartet werden. es kommt immer das gleiche Ergebnis raus.

    Versuche, die Hardware neu zu starten, den BrickViewer zu beenden oder Pausen in das Programm einzubauen, haben nicht zum gewünschten Ergebnis geführt.

    Wir haben mal ein Oszilloskop angeschlossen und dann Anfragen gestellt. Es erscheint dasselbe Signal, unabhängig davon, ob Matlab oder der Brickviewer anfragt. Allerdings konnten wir nur die Anfragen und nicht die Antworten sehen.  

    Ich würde sagen, dass das das Problem darauf einschränkt, dass Matlab die Antwort des Sensors nicht auslesen kann.  

  3. Hallo, 

    vielen Dank für die schnelle Antwort. Die 7 Bit Wordlength ist schon richtig, da vom Schlauchwaagenherrsteller so vorgegeben. (bei 8 Bit kommt nur Kauderwelsch raus). 

    Bis jetzt habe ich ausschließlich im RS485 Modus gearbeitet, sowohl im Brickviewer, als auch in Matlab. Im Modbus Master Modus bekomme ich bis jetzt einen "Request Timeout". 

    Wenn ich jetzt deine Hinweise umsetze, bekomme ich ein Exception Code: -1, also einen Timeout und keinerlei Daten für "e.holdingRegisters".

     

    clc
    clear all
    
    
        global expected_request_id;
        global counter;
        global data;
    
        import com.tinkerforge.IPConnection;
        import com.tinkerforge.BrickletRS485;
    
        HOST = 'localhost';
        PORT = 4223;
        UID = 'DKf'; % Change XYZ to the UID of your RS485 Bricklet
    
        input('Press key to start\n', 's');
        
        counter = 0;
        
        ipcon = IPConnection(); % Create IP connection
        rs485 = handle(BrickletRS485(UID, ipcon), 'CallbackProperties'); % Create device object
    
        ipcon.connect(HOST, PORT); % Connect to brickd
        % Don't use device before ipcon is connected
    
        % Set operating mode to Modbus RTU master
        rs485.setMode(BrickletRS485.MODE_MODBUS_MASTER_RTU);
    
        % Modbus specific configuration:
        % - slave address = 1 (unused in master mode)
        % - master request timeout = 1000ms
        rs485.setModbusConfiguration(144, 3000)
        
         % Configuration
        rs485.setRS485Configuration(9600, BrickletRS485.PARITY_EVEN, ...
                                    BrickletRS485.STOPBITS_1, BrickletRS485.WORDLENGTH_7, ...
                                    BrickletRS485.DUPLEX_HALF);
        
        % Register Modbus master write single register response callback to function
        % cb_modbus_master_write_single_register_response
        set(rs485, 'ModbusMasterReadHoldingRegistersResponseCallback', ...
                @(h, e) cb_modbus_master_read_holding_register_response(e));
            
       % Write 65535 to register 42 of slave 17                    17,42,65535
        expected_request_id = rs485.modbusMasterReadHoldingRegisters(144, 350, 2);  %SW144 register 350;351
    
        
        input('Press key to exit\n', 's');
        ipcon.disconnect();
        
    
    % Callback function for Modbus master write single register response callback
    function cb_modbus_master_read_holding_register_response(e)
        global expected_request_id;
        global counter;
        global data
        
        tmp_t = now;
       % counter = counter + 1;
        fprintf('Request ID: %i\n', e.requestID);
        fprintf('Expected Request ID: %i\n', expected_request_id);
        fprintf('Exception Code: %i\n', e.exceptionCode);
        fprintf('Holding Registers: %i\n', e.holdingRegisters);
    
        B = convertCharsToStrings(e.holdingRegisters);
        C = [tmp_t; B];
        data = [data, C];
        
        if e.requestID ~= expected_request_id
            fprintf('Error: Unexpected request ID\n');
        end
    end

     

    Demo_Modbus_PC_HS_Serie.pdf

  4. Hallo zusammen,


    ich möchte über das "RS485-Bricklet" vier Schlauchwaagengefäße ansteuern und den Hydrostatischen Druck über die Funktion "Read Holding Registers" mit einer Frequenz von 2 Hz auslesen.
    Für einen ersten Test habe ich Anfragen über den "Brick Viewer" geschickt und die gewünschte Antwort bekommen.

    Nun ist es aber erforderlich, dass ich diese Anfragen automatisiert über Matlab stelle.
    Es ist mir möglich auf Grundlage des Beispielcodes "Loopback" eine Verbindung herzustellen, allerdings ist es mir nicht möglich über den "write"-Befehl eine einzelne oder sich wiederholende Anfrage zu stellen.
    Bei aktiver Verbindung zwischen Matlab und dem RS485-Bricklet kann ich parallel über den Brickviewer einen Input geben, dessen Output mir dann sowohl im Brickviewer, als auch in Matlab angezeigt wird.

    Was mache ich momentan noch falsch? Wäre Super, wenn mir da jemand weiterhelfen könnte. :)

    Beste Grüße
    Leonhard

     

    clc
    clear all
    
    global data
    
        
        import com.tinkerforge.IPConnection;
        import com.tinkerforge.BrickletRS485;
        import java.lang.String;
    
        % For this example connect the RX+/- pins to TX+/- pins on the same Bricklet
        % and configure the DIP switch on the Bricklet to full-duplex mode
    
        HOST = 'localhost';
        PORT = 4223;
        UID = 'DKf'; % Change XYZ to the UID of your RS485 Bricklet
    
        input('Press key to start\n', 's');
        
        ipcon = IPConnection(); % Create IP connection
        rs485 = handle(BrickletRS485(UID, ipcon), 'CallbackProperties'); % Create device object
    
        ipcon.connect(HOST, PORT); % Connect to brickd
        % Don't use device before ipcon is connected
    
         % Set Mode to RS485
        rs485.setMode(BrickletRS485.MODE_RS485);
        
        % Enable full-duplex mode
        rs485.setRS485Configuration(9600, BrickletRS485.PARITY_EVEN, ...
                                    BrickletRS485.STOPBITS_1, BrickletRS485.WORDLENGTH_7, ...
                                    BrickletRS485.DUPLEX_HALF);                        
                         
        % Register read callback to function cb_read
        set(rs485, 'ReadCallback', @(h, e)cb_read(e));
        
        % Enable read callback
        rs485.enableReadCallback();
        
        
       % Write "ASCII" string (Adresse und Befehl)
       rs485.write(String(':9003015E00020C\r\n').toCharArray()); %SWA 144
       
       rs485.write(String(':8E03015E00020E\r\n').toCharArray()); %SWB 142
       
       rs485.write(String(':8D03015E00020F\r\n').toCharArray()); %SWC 141
        
       rs485.write(String(':8F03015E00020D\r\n').toCharArray()); %SWD 143
    
        input('Press key to exit\n', 's'); %Alternative für input
        ipcon.disconnect();
    
       
    % Callback function for read callback
    function cb_read(e)
        global data
    
        tmp_t = now;
        % fprintf('Message: "%s"\n', e.message);
        fprintf(e.frameCount);
        
        B = convertCharsToStrings(e.message);
        C = [tmp_t; B];
        data = [data, C];
    end

     

×
×
  • Neu erstellen...