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


  • 相关阅读:
    EXT性能优化(转载)
    xampp 下配置mail()函数发邮件
    从存储过程中返回结果 (转载)
    HDU1394 Minimum Inversion Number
    HDU4414 Finding crosses
    POJ1328 Radar Installation
    HDU3308 LCIS
    POJ2352 Stars
    POJ2513 Colored Sticks
    HDU4027 Can you answer these queries?
  • 原文地址:https://www.cnblogs.com/riskyer/p/3235323.html
Copyright © 2020-2023  润新知