WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matlab und Modbus TCP

 

knuppel
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.11.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 23.01.2014, 23:07     Titel: Matlab und Modbus TCP
  Antworten mit Zitat      
Hallo, ich habe folgendes Beispiel im Internet gefunden:
http://blog.csdn.net/stevenking55/article/details/9735025

Mit

link = connect_create('192.168.2.177',502)

baue ich eine Verbindung auf,

mit

read_reg_one (link, 40001,1)

will ich Register 40001 auslesen.

Leider bekomme ich folgende Meldung:

Warning: Unsuccessful read: The specified amount of data was not returned within the
Timeout period.
Attempted to access out(6); index out of bounds because numel(out)=0.

Error in read_reg_one (line 47)
msg_back_num = out(6);

Angeschlossen habe ich einen Modbus slave (Arduino mit Ethernet und Modbus).

P.s.: Modbus auf dem Arduino funktioniert, habe es mit einem Labview Programm getestet.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.01.2014, 13:14     Titel: Re: Matlab und Modbus TCP
  Antworten mit Zitat      
Hallo knuppel,

Die zu diesem Programmteil gehörenden Kommentare sind Chinesisch, das ich leider nicht spreche. Aber Kommentare hätten ja genau den Zweck, mögliche Probleme zu erklären.

Vielleicht ist der TimeOut zu kurz gesetzt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
knuppel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.11.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 24.01.2014, 20:01     Titel:
  Antworten mit Zitat      
Code:
Funktion date = read_reg_one (Link, date_addr, date_num)  
% ************************************************* ****  
% SPS lesen Registerdaten (a)  
Vor dem Aufruf connect_create%-Link-Funktion zum Erstellen von Links  
% Date_addr 请求 数据 起始 地址 date_addr_high date_addr_low  
%  
% Beispiele:  
% Link = connect_create ( '10 .64.15.101 ' , 502)  
%  
Date_num% = 1          / / default lesen Sie ein Registerwert  
% Read_reg_one (Link, 30,1)  
% ************************************************* ****  
 
d  
% Verarbeitungsdaten  
% Minus eine Datenadresse  
d  
% Daten Adresse wird in Zwei-Byte-Hexadezimalzahl zerlegt  
date_addr_high = floor (date_addr/100);  
date_addr_low = mod (date_addr, 100);  
% Anzahl der Daten in zwei-Byte-Hexadezimalzahl zerlegt  
date_num_high = floor (date_num/100);  
d  
 
% Befehle senden  
fwrite (Link, 0, 'char' )% pro Transaktion Kennung 0x00  
fwrite (Link, 0, 'char' ) 0x00%  
fwrite (Link, 0, 'char' )% Protokoll-Kennung 0x00  
fwrite (Link, 0, 'char' ) 0x00%  
fwrite (Link, 0, 'char' )% 0x00 Byte Länge des Follow-up  
fwrite (Link, 6, 'char' ) 0x06%  
fwrite (Link, 255, 'char' )% Einheitskennung 0xff  
fwrite (Link, 3, 'uint8' )% Befehlswort 0x03  
fwrite (Link, date_addr_high, 'uint8' )%数据起始地址Hoch  
fwrite (Link, date_addr_low, 'uint8' )% Daten-Startadresse niedrig  
fwrite (Link, date_num_high, 'uint8' )%数据长度Hoch  
fwrite (Link, date_num_low, 'uint8' )%数据长度niedrig  
% Senden die Probe 00 00 00 00 00 06 FF 03 00 00 02 1D  
% Ertrag Daten 00 00 00 00 00 07 FF 03 04 00 00 00 00  
 
% Gibt die Länge der Daten ergab ersten neun Bytes Informationen  
% 3 mal gelesen  
% Lesen Sie zuerst sechs, erhalten die Länge der Follow-up-Informationen  
% Zweite Lesung anschließenden drei Bytes Bytes vom neunten auf die Länge der zurückgegebenen Daten geben  
% 3. hinter nur Daten lesen  
out = fread (Link, 6, 'char' );%第一次  
msg_back_num = out (6);  
out = fread (Link, 3, 'char' );%第二次  
d  
out = fread (Link, date_back_num, 'char' );%第三次  
 
% Anzeigen welche Daten  
%  
date = out (1) * 100 + aus (2);  


Vielleicht hilft das ein bisschen...

Wenn ich das Programm starte, dauert es ein paar Sekunden bis die Fehlermeldung kommt.

Wo/Wie setze ich den Time Out.
Private Nachricht senden Benutzer-Profile anzeigen
 
knuppel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.11.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 28.01.2014, 22:26     Titel:
  Antworten mit Zitat      
Meine Code:
Code:

function [s] = serialstart(opt)
% Funtion for initializing a serial interface in matlab for interfacing

% Functions using the serial port must be passed the serial port object
% s in order for the serial port to be acessable.  

port = 502;  
%   link = tcpip('127.0.0.1',502);  
%   link = tcpip('10.64.15.101',502);  
s = tcpip('192.168.2.177',port);  
%?????  
set(s, 'InputBufferSize', 3000000);

% Initialize serial port on specified com port
  date_addr   = 40001;
date_num=1;
 date_addr_high = floor(date_addr/100);  
date_addr_low = mod(date_addr,100);  
date_num_high = floor(date_num/100);  
date_num_low = mod(date_num,100);
%Open serial connection
fopen(s);

% Specify Terminator
s.terminator='CR/LF';

 
 

fwrite(s,0,'char')                      %Transactio identifier        0x00  
fwrite(s,0,'char')                      %  Transactio identifier                   0x00  
fwrite(s,0,'char')                      %    Protokol identifier      0x00  
fwrite(s,0,'char')                      %        Protokol identifier              0x00  
fwrite(s,0,'char')                      %     Anzahl Datenbytes  0x00  
fwrite(s,1,'char')                      %         Anzahl Datenbytes        0x06  
fwrite(s,255,'char')                     %     unit identifier    0xff  
fwrite(s,3,'uint8')                       %  Funktion           0x03  
fwrite(s,date_addr_high,'uint8')         %Startadresse High Byte  
fwrite(s,date_addr_low,'uint8')            %Startadresse Low Byte
fwrite(s,date_num_high,'uint8')           %Anzahl Register Low Byte
fwrite(s,date_num_low,'uint8')     %Anzahl Register High Byte
 
 out = fread(s,1,'char');                
 
 

fclose(s);
 


Die Ausgabe:

Warning: Unsuccessful read: The specified amount of data was not returned within the
Timeout period.

TCPIP Object : TCPIP-192.168.2.177

Communication Settings
RemotePort: 502
RemoteHost: 192.168.2.177
Terminator: 'CR/LF'
NetworkRole: client

Communication State
Status: closed
RecordStatus: off

Read/Write State
TransferStatus: idle
BytesAvailable: 0
ValuesReceived: 0
ValuesSent: 12
Private Nachricht senden Benutzer-Profile anzeigen
 
knuppel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.11.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 29.01.2014, 22:30     Titel:
  Antworten mit Zitat      
Ich hab nun folgenden Code:

Code:
function [s] = serialstart(opt)
% Funtion for initializing a serial interface in matlab for interfacing

% Functions using the serial port must be passed the serial port object
% s in order for the serial port to be acessable.  

port = 502;  
%   link = tcpip('127.0.0.1',502);  
%   link = tcpip('10.64.15.101',502);  
s = tcpip('192.168.2.177',port);  
%?????  
set(s, 'InputBufferSize', 30000);

% Initialize serial port on specified com port
  date_addr   = 40001;
date_num=1;
 date_addr_high = floor(date_addr/100);  
date_addr_low = mod(date_addr,100);  
date_num_high = floor(date_num/100);  
date_num_low = mod(date_num,100);
%Open serial connection


 
fopen(s);

% Specify Terminator
s.terminator='CR/LF';

 
 

fwrite(s,0,'char')                      %Transactio identifier        0x00  
fwrite(s,0,'char')                      %  Transactio identifier                   0x00  
fwrite(s,0,'char')                      %    Protokol identifier      0x00  
fwrite(s,0,'char')                      %        Protokol identifier              0x00  
fwrite(s,0,'char')                      %     Anzahl Datenbytes  0x00  
fwrite(s,1,'char')                      %         Anzahl Datenbytes        0x06  
fwrite(s,255,'char')                     %     unit identifier    0xff  
fwrite(s,3,'uint8')                       %  Funktion           0x03  
fwrite(s,date_addr_high,'uint8')         %Startadresse High Byte  
fwrite(s,date_addr_low,'uint8')            %Startadresse Low Byte
fwrite(s,date_num_high,'uint8')           %Anzahl Register Low Byte
fwrite(s,date_num_low,'uint8')     %Anzahl Register High Byte
 


 
while ~s.BytesAvailable,end
s.BytesAvailable
res=fread(s,s.BytesAvailable)                
fclose(s);  
 
 

fclose(s);


Gestern hat es auch mal geklappt und ich hab was zurückbekommen.

Wenn ich nun das Programm ausführe tut sich nichts. Erst wenn ich mit Strg-C abbreche kommt folgende Meldung:

Operation terminated by user during instrument/get (line 47)


In instrument/subsref (line 119)
result = get(indexObj, prop1);

In serialstart (line 49)
while ~s.BytesAvailable,end

[EDITED, Jan, Bitte Code-Umgebung benutzen - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.01.2014, 09:19     Titel:
  Antworten mit Zitat      
Hallo knuppel,

Es kann eine Menge Gründehaben, warum das Device nicht antwortet. Vielelicht horchst Du auf dem falschen Port, vielleicht hast Du die Anfrage auf dem falschen Prot geschickt, vielleicht ist die physische Verbindung nicht korrekt, vielleicht is die IP falsch,

Zitat:
Gestern hat es auch mal geklappt und ich hab was zurückbekommen.

Nun müsstes Du herausfinden, was sich seit dem geändert hat. Ich bezweifele, dass ein Forums-Teilnehmer das erraten kann.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
knuppel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.11.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 30.01.2014, 21:46     Titel:
  Antworten mit Zitat      
Port und IP sind richtig, Verbindung ist da. Hab alles mit einem Modbus Master Programm getestet.
Er hängt sich scheinbar an der Schleife auf.

Eine erfolgreiche Verbindung gibt folgendes aus:

TCPIP Object : TCPIP-192.168.2.177

Communication Settings
RemotePort: 502
RemoteHost: 192.168.2.177
Terminator: 'CR/LF'
NetworkRole: client

Communication State
Status: closed
RecordStatus: off

Read/Write State
TransferStatus: idle
BytesAvailable: 0
ValuesReceived: 0
ValuesSent: 12
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.