您好我有这段代码从Modbus寄存器40001读取数据:
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,0,'uint8') %Anzahl Register Low Byte
fwrite(s,2,'uint8') %Anzahl Register High Byte
while ~s.BytesAvailable
end
s.BytesAvailable
res=fread(s,s.BytesAvailable)
fclose(s);
我没有回应。 Matlab没有回到命令提示符。 Modbus从站是带有以太网屏蔽的arduino。当我使用modbus主机(例如Modbus Poll)进行测试时,我可以读取寄存器40001。
答案 0 :(得分:0)
在我看来你的第六个字节:
fwrite(s,1,'char') %Anzahl Datenbytes 0x06
是1,而不是0x06?协议中的这个字节是有效载荷数据大小,如果你将它设置为' 1',我怀疑任何好的Modbus Slave都会响应。
要检查的第二件事是看起来你正在写入一个255的Modbus从站地址。根据我的经验,这通常不被用作有效的ID(虽然它适用于协议)。确保您尝试与之通信的从站将响应单元ID 255。
祝你好运!