基于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)


 

 

你可能感兴趣的:(matlab)