基于TCP/IP的Matlab Modbus与M340 PLC通讯

本人原创,代码拿出来供大家交流学习经验,勿作他用。

废话不多说,代码直接上。

1.创建链接

function link = connect_create(client_addr,port)
%*****************************************************
% 创建与PLC的链接
% client_addr PLC地址
% port 端口号,默认为502
% 例:
% client_addr = 10.64.15.101 //M340地址
% port = 502 //modbus方式默认端口号
% 调用方法为:t = connect_create('10.64.15.101',502)
%***************************************************** port = 502;
% link = tcpip('127.0.0.1',502);
% link = tcpip('10.64.15.101',502);
link = tcpip(client_addr,port);
%设置缓冲区
set(link, 'InputBufferSize', 30000);
%打开链接
fopen(link);

2.读寄存器(只写了读一位寄存器的函数,其他的依葫芦画瓢了......)

function date = read_reg_one(link,date_addr,date_num)
%*****************************************************
% 读取PLC寄存器的数据(一位)
% link 之前调用connect_create函数创建的链接
% date_addr 请求数据起始地址 date_addr_high date_addr_low
% date_num 请求数据长度 date_num_high date_num_low
% 例子:
% link = connect_create('10.64.15.101',502)
% date_addr = 30
% date_num = 1 //默认只读一位寄存器的值
% read_reg_one(link,30,1)
%***************************************************** date_num = 1;
%处理数据
%数据地址减一
date_addr = date_addr -1;
%数据地址分解为2个字节的16进制数
date_addr_high = floor(date_addr/100);
date_addr_low = mod(date_addr,100);
%数据量分解为2个字节的16进制数
date_num_high = floor(date_num/100);
date_num_low = mod(date_num,100); %发送命令
fwrite(link,0,'char') %事务元标识符 0x00
fwrite(link,0,'char') % 0x00
fwrite(link,0,'char') %协议标识符 0x00
fwrite(link,0,'char') % 0x00
fwrite(link,0,'char') %后续字节长度 0x00
fwrite(link,6,'char') % 0x06
fwrite(link,255,'char') %单元标识符 0xff
fwrite(link,3,'uint8') %命令字 0x03
fwrite(link,date_addr_high,'uint8') %数据起始地址high
fwrite(link,date_addr_low,'uint8') %数据起始地址low
fwrite(link,date_num_high,'uint8') %数据长度high
fwrite(link,date_num_low,'uint8') %数据长度low
%发送示例 00 00 00 00 00 06 FF 03 00 1D 00 02
%返回数据 00 00 00 00 00 07 FF 03 04 00 00 00 00 %返回数据的长度在返回信息的第9个字节
%分3次读取
%第一次读六个,得到后续信息的长度
%第二次读后续3个字节,从第九个字节处,得到返回数据的长度
%第三次只读取后面的数据
out = fread(link,6,'char'); %第一次
msg_back_num = out(6);
out = fread(link,3,'char'); %第二次
date_back_num = out(3);
out = fread(link,date_back_num,'char'); %第三次 %显示一下数据
%disp(int2str(out))
date = out(1) * 100 + out(2);

3.关闭链接

function connect_close(link)
%*****************************************************
% 关闭链接
% 例:
% t=connect_create('10.64.15.101',502)
% connect_close(t)
%*****************************************************
fclose(link)
delete(link)
clear link

4.测试程序

%测试例程
%将被调用函数的m文件,放到调用函数的文件夹下,即可
%画图测试,时间不是很理想,稍长,待改进
t=connect_create('10.64.15.101',502)
for i = 1:1:100
dat = read_reg_one(t,30,1)
end
plot(dat)
connect_close(t)
上一篇:在chrome 总调试cordova出现Detached from the target. Remote debugging has been terminated with reason: Connection lost. Please re-attach to the new target


下一篇:升级到macos sierra xcode8 requires additional components to support runing and debugging choose Install to add required components