本人原创,代码拿出来供大家交流学习经验,勿作他用。
废话不多说,代码直接上。
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)