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

   2023-02-09 学习力0
核心提示:本人原创,代码拿出来供大家交流学习经验,勿作他用。废话不多说,代码直接上。1.创建链接 function link = connect_create(client_addr,port)%*****************************************************% 创建与PLC的链接% client_addrPLC地址% port 端口号,

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

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

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)


 

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行