基于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)
基于TCP/IP的Matlab Modbus与M340 PLC通讯的更多相关文章
- c#基于TCP/IP、CIP协议的欧姆龙PLC通信
一.关于CIP协议 CIP通信是Common Industrial Protocl(CIP)的简称,它是一个点到点的面向对象协议,能够实现工业器件(传感器,执行器)之间的连接,和高等级的控制器之间的连 ...
- 基于TCP/IP协议的C++网络编程(API函数版)
源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ...
- JAVA Socket 底层是怎样基于TCP/IP 实现的???
首先必须明确:TCP/IP模型中有四层结构: 应用层(Application Layer).传输层(Transport Layer).网络层(Internet Layer ).链路层( ...
- 20181225 基于TCP/IP和基于UDP/IP的套接字编程
一.TCP/IP的套接字编程 服务器端代码: import socketserver = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.sock ...
- 基于TCP/IP的长连接和短连接
1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...
- 读书笔记——网络编程与开发技术(3)基于TCP/IP协议的网络编程相关知识
TCP/IP协议:数据链路层,网络层,传输层,应用层. IP地址分为5类:A类.B类.C类.D类.E类. (A类.B类.C类是基本类,D类多用于多播传送,E类为保留类.) "*"表 ...
- 标准C实现基于TCP/IP协议的文件传输
上学期集成程序设计的课堂作业,对于理解TCP/IP实现还是挺有帮助的. TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如 ...
- 标准C语言实现基于TCP/IP协议的文件传输
TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下: 1.Socket系统调用 为了进行网络I/O,服务器和客户机两 ...
- 网络通信-在浏览器输入url,基于TCP/IP协议,浏览器渲染的解释
知识点1: 网络模型 TCP/IP四层 和ISO七层模型 (统一省略后面层字.比如传输代表传输层) 知识点2: 在应用层中TCP建立连接,经历的三次握手协议 首先:,TCP协议是什么? 为什么要三次握 ...
随机推荐
- GitHub中"watch" "star" "fork"三个按钮干什么用的?
总结下一般使用:1.想拷贝别人项目到自己帐号下就fork一下.2.持续关注别人项目更新就star一下3.watch是设置接收邮件提醒的.具体提醒有Issues and their commentsPu ...
- Spring Boot笔记(一)
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- Win32中GDI+应用(三)---Graphics类
在我理解看来,Graphics是一个device context和你的drawing conetent之间的一个中介.它存储了device context的相关属性,以及drawing content ...
- JavaScript学习总结【10】、DOM 事件
DOM 事件是 JS 中比较重要的一部分知识,所谓事件,简单理解就是用户对浏览器进行的一个操作.事件在 Web 前端领域有很重要的地位,很多重要的知识点都与事件有关,所以学好 JS 事件可以让我们在J ...
- Android中WebView的JavaScript代码和本地代码交互的三种方式
一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...
- JQuery 字符串截取
//字符串截取,全小写 strObj.substring(startIndex,endIndex); //需要注意大小写 strObj.lastIndexOf(String splitObj); // ...
- 精通 Oracle+Python,第 8 部分:适合 Oracle DBA 使用的 Python
传统上,当需要为操作系统编写一些脚本时,人们常常会选用 Bash 或 Perl 脚本工具.这些工具易于使用,因而它们几乎变得无处不在,渗透到了包括 Oracle Database 在内的其他软件中,O ...
- ajax请求遇到服务器重启或中断
常会有不断轮询发送ajax请求,处理一些业务的场景. 要考虑到: 1. 服务器重启,中断,恢复后仍然能恢复正常业务处理. 服务器重启过程中,再次发送请求,请求状态将变为net::ERR_CONNECT ...
- Nodejs 集成到IIS
http://www.hanselman.com/blog/WebMatrixAndNodejsTheEasiestWayToGetStartedWithNodeOnWindows.aspx http ...
- Debug和Release之本质区别
转自Debug和Release之本质区别 Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发 ...