1. 前言

上学那会儿MATLAB还没有App Designer,记得当时开发了一个基于MATLAB的计算器。最近,由于项目需要一个简单的上位机做监控,结合自身实际,拟定了以下三种方案:

  1. PyQt5:结合QT和Python的GUI开发库,结合QSS可以做出漂亮的界面
  2. Streamlit:基于Python的web应用开发库,简单易上手,本来是用来做数据科学的快速展示的,在本地上拿来搞个界面也不错,颜值也很高
  3. App Deisgner:MATLAB出品,控件外观可自定义的东西不多,不过借助MATLAB强大的toolbox,数据通讯、采集、控制、分析非常方便

本文采用第三种开发,另外两种后续有时间再写。
使用的MATLAB版本为2018b,关于modbus协议请自行百度。

2. 界面框架

首先应该对界面大体框架进行简单设计,如下图所示

串口连接配置:设置要连接的串口,配置波特率
数据显示:读寄存器显示
控制:写寄存器控制

3. 设计过程

3.1 创建界面

如下图所示

打开界面后,往界面拖入控件修改基础属性并进行布局得到的界面如下

可以从组件浏览器看到界面的组件

完成界面设计后,就可以开始代码编写

3.2 代码编写

3.2.1 私有属性

点击代码视图->属性->私有属性,建立以下几个属性:

CurrentSerial   % 当前选择的串口
ModbusSerialRTU % modbus对象
TreadFlag       % 关闭停止标志
SwitchStateMsg  % 开关状态消息
SwitchList      % 开关对象列表
SwitchTagList   % 开关对象的标签,用于event查找
SliderMsg       % 滑块消息

3.2.1 初始化回调函数

右击组件浏览器中的app.modbusFigure,选择回调->添加StartupFcn回调,在自动生成的startupFcn回调方法中,添加以下代码:

app.SerialPortSelectDropDown.Items = seriallist;    % 获取计算机串口号列表并写入
app.TreadFlag = false;
app.ModbusSerialRTU = 0;
% 两个开关的初始化
app.SwitchStateMsg = zeros(1,2);   % 开关消息数组初始化为0
app.SwitchList = [app.Switch1, app.Switch2];   % 设置开关列表
app.SwitchTagList = ["switch1", "switch2"];    % 开关标签列表,主要用于event事件查找
for i = 1:2    % 初始化开关标签app.SwitchList(i).Tag =  app.SwitchTagList(i);
end

第一行调用matlab的seriallist命令获取计算机当前可用串口号,并将其写入串口号选择下拉列表。

3.2.2 刷新按钮回调

刷新按钮用于手动刷新当前可用的串口号。右击组件浏览器的app.RefreshButton,选择回调->添加RefreshButton回调,添加以下代码

app.PortSelectDropDown.Items = seriallist;    % 获取计算机串口号列表并写入下拉框

3.2.3 连接按钮回调

连接按钮将尝试创建modbus对象,若创建成功则进入监控程序,并禁止使用连接按钮,若创建失败则在状态标签处进行显示。

            tryapp.ModbusSerialRTU = modbus('serialrtu', app.PortSelectDropDown.Value, ...'BaudRate', str2double(app.BaudSelectDropDown.Value), 'Timeout', 1);app.TreadFlag = true;catchapp.ModbusSerialRTU = 0;app.StatusLabel.Text = 'WARNING: modbus创建失败';app.TreadFlag = false;end            if app.TreadFlag == trueapp.LinkButton.Enable = false;main(app, event);   % 进入监控                end

3.2.4 关闭按钮回调

关闭按钮主要功能是将app.TreadFlag设置位false,从而控制退出main(app, event),同时重新使能连接按钮

app.ModbusSerialRTU = 0;
app.TreadFlag = false;
app.LinkButton.Enable = true;

3.2.5 开关回调

GUI有两个开关,可以分别设置回调函数。此处,将两个开关的回调函数设置为相同,首先选择开关1,添加回调函数,然后选择开关2右击选择已有的回调函数定位到开关1回调函数即可。

if event.Source.Tag == app.SwitchTagList(1) % 此处演示如何判断开关触发源fprintf('开关1被按下了');app.StatusLabel.Text = '开关1被按下了';
elsefprintf('开关2被按下了')app.StatusLabel.Text = '开关2被按下了';
endif strcmp(app.Switch1.Value, 'On')app.SwitchStateMsg(1) = 1;
elseapp.SwitchStateMsg(1) = 0;
endif strcmp(app.Switch2.Value, 'On')app.SwitchStateMsg(2) = 1;
elseapp.SwitchStateMsg(2) = 0;
end            % 当开关很多的时候可以这么写
%             for i = 1:length(app.SwitchList)
%                app.SwitchStateMsg(i) = strcmp(app.SwitchList(i).Value, 'On');
%             end

3.2.6 滑动条回调

滑动条用于设置输出电压,其在回调函数中写入

app.SliderMsg = event.Value;

3.2.7 modbus轮询函数

完成所有控件的回调后,点击函数->添加私有函数,命名为main(app, event),该函数在用户点击连接后将轮询读写寄存器

    methods (Access = private)function main(app, event)fprintf('modbus轮询\r\n');while truetryRpm = read(app.ModbusSerialRTU, 'holdingregs', 33, 4, 1, 'uint16'); % 从机地址位1pause(0.1);catchapp.StatusLabel.Text = '保持寄存器读取失败';Rpm = zeros(1, 4);endapp.UITable.Data = Rpm(1:4);trywrite(app.ModbusSerialRTU, 'coils', 54, app.SwitchStateMsg, 2); % 从机地址为2pause(0.1)catchapp.StatusLabel.Text = '线圈写入失败';endtrywrite(app.ModbusSerialRTU, 'holdingregs', 11, round(app.SliderMsg*1000), 3, 'uint16');  % 从机地址为3pause(0.1)catchapp.StatusLabel.Text = '保持寄存器写入失败';endif app.TreadFlag == false fprintf('退出主线程\r\n');app.UITable.Data = zeros(1, 4);break; endendend

4 测试

首先用Virtual SerialPort创建虚拟串口对COM1和COM2,使用ModSim32模拟3个从机,地址分别为1,2,3。运行app,通讯成功。

基于MATLAB App Designer的串口RS485 Modbus上位机相关推荐

  1. 基于MATLAB APP Designer 和 Python 的音视频剪辑

    简介 本软件是基于 MATLAB APP Designer 和 Python 联合编制的一款简易音视频剪辑软件,可以拿来练手MATLAB APP Designer.面向对象编程.假期空闲时和同学一起自 ...

  2. 汽车各档爬坡度曲线matlab,基于MATLAB App Designer的汽车爬坡能力建模与仿真

    1. 引言 汽车常常需要在不同区域的不同道路上行驶,尤其在山区道路上,坡陡路窄,汽车必须具有一定的爬坡能力,爬坡能力通常由最大爬坡度来衡量,最大爬坡度是汽车动力性能的重要指标之一.为此开展了基于MAT ...

  3. 基于Matlab App Designer的语音信号分析与处理(二):IIR和FIR滤波器的设计,语音信号的滤波

    接上文:https://blog.csdn.net/weixin_53877178/article/details/122470759 目录 一.课题的任务 二.内容.步骤和要求 (1)语音信号的采集 ...

  4. 基于MATLAB APP Designer 和 Python 的音视频剪辑App_02

    上篇介绍 Python调用ffmpeg合集--以导出B站缓存视频为例 MATLAB部分主要用于制作前端界面,后端通过调用Python-ffmpeg实现各种快速剪辑功能. MATLAB部分: class ...

  5. 《MATLAB App Designer从入门到实践》随书源代码

    GUIDE已经被MATLAB抛弃了,你还不知道吗?App Designer才是发展的方向 目前市面上MATLAB GUI编程的书籍琳琅满目,但大多数是基于GUIDE开发的,MATLAB从2016年开始 ...

  6. Matlab App Designer 学习笔记

    提示:本文的学习视频来自B站小刘老师的教程 链接:https://www.bilibili.com/video/BV16f4y147x9?from=search&seid=2070258926 ...

  7. MATLAB App Designer —— 手撕代码学习总结

    文章目录 MATLAB App Designer 官方文档 MATLAB App Designer 官方示例 (一) (1.1)csvread() 函数 (1.2)xlsread() 函数 (1.3) ...

  8. MATLAB App Designer GUI开发从0到1(二)

    文章目录 前言 一.开关以及旋钮 1. 左上角:旋钮 2.右上角:90度仪表 3.左下角:分档开关 4.右下角:开关 5.对旋钮微调 二.画图 1. 普通画图 2.添加小组件 三.回调函数 简单的回调 ...

  9. MATLAB App Designer入门实战(一)

    最近也是在研究MATLAB App Designer,开这样的一个系列主要是为了记录我在研究App Designer时遇到的一部分问题的解决,和一部分有趣的想法,每一篇文章会展示如何将一个项目mlap ...

最新文章

  1. 盛大 牛人 blog
  2. 【洛谷 2782】友好城市
  3. JAVA入门级教学之(标识符与关键字)
  4. HTML字体小于12谷歌不兼容,Chrome谷歌浏览器下不支持css字体小于12px的解决办法...
  5. ruby hash方法_Ruby中带有示例的Hash.keys方法
  6. [转载]Zookeeper开源客户端框架Curator简介
  7. Java OpenCV之Mat类的概述、常用构造方法、常用函数
  8. bzoj3007 解救小云公主
  9. 数字值太大,plsql显示不全的设置
  10. java od_OD使用教程
  11. 在Windows Xp上实现Ubuntu主题风格!
  12. Kotlin基础学习-入门篇
  13. 1378:最短路径(shopth)
  14. unity3d技术摄像头跟随_unity 3d 中摄像头跟随人物移动总结
  15. 归纳偏置 (Inductive Bias)
  16. 用java定义中国象棋的棋子_java大神 求帮忙 我坐的中国象棋怎样移动棋子
  17. 「软件测试4」一文详解四大典型的白盒测试方法
  18. FPGA自学:利用主时钟产生周期方波
  19. c++微信读书学习笔记——很久以前随便写的
  20. Yolo算法-车辆检测

热门文章

  1. html 关键字是什么,html中使用关键字的技巧是什么?
  2. 存储模组头部厂商嘉合劲威加入龙蜥社区
  3. 新生计算机能力水平测试,【新生必读】2018级新生计算机水平入学考试要点
  4. java开发NATIVE微信支付功能(下单)
  5. RGB取反,渐变色计算
  6. 关于我用chat gpt生成了一篇nba比赛前瞻预测文章,大家觉得怎么样!
  7. 前端向后端传对象数组--方式一
  8. 啦啦外卖独立版41.7完美运营版!全功能插件
  9. unity开发日记之火箭发射
  10. 奇思妙想构造题 ARC145 D - Non Arithmetic Progression Set