雨滴科技技术论坛

 找回密码
 立即注册
查看: 3479|回复: 2

msOS学习之路(2)

[复制链接]

68

主题

274

帖子

2443

积分

金牌会员

Rank: 6Rank: 6

积分
2443
扫一扫,手机访问本帖
发表于 2018-7-15 20:32:32 | 显示全部楼层 |阅读模式
本帖最后由 DataH 于 2018-8-5 23:08 编辑

基于msOS自动回火机的实现
1 简介
1.1 背景
基于msOS自动回火机的实现的实例是学习msOS比较好的入门实例,它包括msOS界面的设计、数据库的使用、系统节拍的使用、按键的使用、系统节拍使用等,通过这个例子可以很好的对msOS的使用有个大概的了解。
1.2 自动会火机简介
自动回火机是一个基于msOS系统开发的温度计时控制系统,可应用于焊接、回炉加热设备的控制,从A0口读取模拟量转为温度值并能够实时显示到菜单界面中,OUT1为加热状态控制端口,OUT2为保温控制端口。自动回火机能够实现升温计时,保温计时以及降温计时。在升温、保温以及降温过程中,能够在界面显示当前的状态。保温时间、保温值、降温值可根据用户需求进行修改。 整个项目主要分为两个部分,一个是界面的设计,另一个是逻辑业务的设计。
2 界面设计2.1 界面组成部分
实现的界面效果如下图所示。该界面的控件包括4个Lable和3个TextBox,这三个TextBox是可调的分别是保温时间、保温的温度和降温的目标温度。图中长方形圈起来的为lable控件,只可读,而椭圆圈的为TextBox控件,是可读可写的。
                                                                                 1531473028633.png
2.2 界面的实现过程
界面的实现分的过程分为三个步骤:
(1)首先在AppStruct的Menu中添加需要增加的界面,这个结构体在menu.h和data.h中,两个地方都要修改,如下图所示
                                                                                       1531473461561.png
(2)创建界面初始化函数,在这个界面中直接设置界面要要显示的内容,添加控件等,实现的函数代码如下,包括控件的创建、添加,界面背景的创建。

  1. void InitWorkForm(void)
  2. {
  3.         static Label TemperatureUpTimeLabel;  // 升温时间
  4.     static Label CurrentTemperatureLabel; // 当前温度
  5.         static TextBox TemperatureHoldTimeTextBox;  // 保温时间
  6.         static TextBox TemperatureHoldTextBox;  // 保温温度
  7.         static Label TemperatureDownTimeLabel;  // 降温时间
  8.         static TextBox TemperatureDownTextBox;  // 降温目标温度
  9.         
  10.     static Label TemperatureStateLabel;
  11.     static const string TemperatureStateString[] = {"升温","保温","降温","待机"};
  12.    
  13.     System.Gui.Form.Init(&App.Menu.WorkForm);
  14.     App.Menu.WorkForm.BackTextPointer = "升温:   S    ℃"
  15.                                         "保温:   S    ℃"
  16.                                         "降温:   S    ℃"
  17.                                         "状态:         ";

  18.     // 加热时间
  19.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureUpTimeLabel);
  20.     TemperatureUpTimeLabel.DataPointer = (void *)(&App.Data.TemperatureUpTime);
  21.     TemperatureUpTimeLabel.Type = GuiDataTypeIntDec;
  22.     TemperatureUpTimeLabel.Digits = 2;
  23.     TemperatureUpTimeLabel.X = 7;
  24.     TemperatureUpTimeLabel.Y = 0;

  25.     // 当前温度
  26.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &CurrentTemperatureLabel);
  27.     CurrentTemperatureLabel.DataPointer = (void *)(&App.Data.CurrentTemperature);
  28.     CurrentTemperatureLabel.Type = GuiDataTypeIntDec;
  29.     CurrentTemperatureLabel.X = 13;
  30.     CurrentTemperatureLabel.Y = 0;

  31.     // 保温时间
  32.     System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTimeTextBox);
  33.     TemperatureHoldTimeTextBox.DataPointer = (void *)(&App.Data.TemperatureHoldTime);
  34.     TemperatureHoldTimeTextBox.Type = GuiDataTypeIntDec;
  35.     TemperatureHoldTimeTextBox.DataMax = 360;
  36.     TemperatureHoldTimeTextBox.DataMin = 0;
  37.     TemperatureHoldTimeTextBox.DataBigStep = 10;
  38.     TemperatureHoldTimeTextBox.DataStep = 1;
  39.     TemperatureHoldTimeTextBox.X = 7;
  40.     TemperatureHoldTimeTextBox.Y = 1;
  41.                
  42.     // 保温温度
  43.     System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTextBox);
  44.     TemperatureHoldTextBox.DataPointer = (void *)(&App.Data.TemperatureHold);
  45.     TemperatureHoldTextBox.Type = GuiDataTypeIntDec;
  46.     TemperatureHoldTextBox.DataMax = 900;
  47.     TemperatureHoldTextBox.DataMin = 300;
  48.     TemperatureHoldTextBox.DataBigStep = 100;
  49.     TemperatureHoldTextBox.DataStep = 10;
  50.     TemperatureHoldTextBox.X = 13;
  51.     TemperatureHoldTextBox.Y = 1;

  52.     // 降温时间
  53.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureDownTimeLabel);
  54.     TemperatureDownTimeLabel.DataPointer = (void *)(&App.Data.TemperatureDownTime);
  55.     TemperatureDownTimeLabel.Type = GuiDataTypeIntDec;
  56.     TemperatureDownTimeLabel.X = 7;
  57.     TemperatureDownTimeLabel.Y = 2;

  58.     // 降温温度
  59.     System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureDownTextBox);
  60.     TemperatureDownTextBox.DataPointer = (void *)(&App.Data.TemperatureDown);
  61.     TemperatureDownTextBox.Type = GuiDataTypeIntDec;
  62.     TemperatureDownTextBox.DataMax = 900;
  63.     TemperatureDownTextBox.DataMin = 300;
  64.     TemperatureDownTextBox.DataBigStep = 100;
  65.     TemperatureDownTextBox.DataStep = 10;
  66.     TemperatureDownTextBox.X = 13;
  67.     TemperatureDownTextBox.Y = 2;

  68.     // 状态显示
  69.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureStateLabel);
  70.     TemperatureStateLabel.DataPointer = (void *)(&App.Data.TemperatureState);
  71.     TemperatureStateLabel.Type = GuiDataTypeSnString;
  72.     TemperatureStateLabel.Align = GuiDataAlignRight;
  73.     TemperatureStateLabel.StringBlockPointer = TemperatureStateString;
  74.     TemperatureStateLabel.X = 15;
  75.     TemperatureStateLabel.Y = 3;

  76. }
复制代码

3 逻辑业务中实现
逻辑业务的设计主要读取读取模拟量,通过端口控制加入和夹子的控制,在整系统中我设置了四个状态进行考虑,分别为升温、保温、降温和待机转态,这四个状态我是以全局变量的形式保存在数据库中的。在逻辑业务中每当到达1s之后就就读取模拟量的输入,并显示在显示屏上,同时也判断当前的状态,比如刚开始按键开始的时候,就设置为升温状态,这时候,控制温度的端口和控制夹子的端口也打开。在节拍中实现的代码如下,这部分的代码只是实现了通过按键控制的模式。

  1. void InitWorkForm(void)
  2. {
  3.         static Label TemperatureUpTimeLabel;  // 升温时间
  4.     static Label CurrentTemperatureLabel; // 当前温度
  5.         static TextBox TemperatureHoldTimeTextBox;  // 保温时间
  6.         static TextBox TemperatureHoldTextBox;  // 保温温度
  7.         static Label TemperatureDownTimeLabel;  // 降温时间
  8.         static TextBox TemperatureDownTextBox;  // 降温目标温度
  9.         
  10.     static Label TemperatureStateLabel;
  11.     static const string TemperatureStateString[] = {"升温","保温","降温","待机"};
  12.    
  13.     System.Gui.Form.Init(&App.Menu.WorkForm);
  14.     App.Menu.WorkForm.BackTextPointer = "升温:   S    ℃"
  15.                                         "保温:   S    ℃"
  16.                                         "降温:   S    ℃"
  17.                                         "状态:         ";

  18.     // 加热时间
  19.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureUpTimeLabel);
  20.     TemperatureUpTimeLabel.DataPointer = (void *)(&App.Data.TemperatureUpTime);
  21.     TemperatureUpTimeLabel.Type = GuiDataTypeIntDec;
  22.     TemperatureUpTimeLabel.Digits = 2;
  23.     TemperatureUpTimeLabel.X = 7;
  24.     TemperatureUpTimeLabel.Y = 0;

  25.     // 当前温度
  26.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &CurrentTemperatureLabel);
  27.     CurrentTemperatureLabel.DataPointer = (void *)(&App.Data.CurrentTemperature);
  28.     CurrentTemperatureLabel.Type = GuiDataTypeIntDec;
  29.     CurrentTemperatureLabel.X = 13;
  30.     CurrentTemperatureLabel.Y = 0;

  31.     // 保温时间
  32.     System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTimeTextBox);
  33.     TemperatureHoldTimeTextBox.DataPointer = (void *)(&App.Data.TemperatureHoldTime);
  34.     TemperatureHoldTimeTextBox.Type = GuiDataTypeIntDec;
  35.     TemperatureHoldTimeTextBox.DataMax = 360;
  36.     TemperatureHoldTimeTextBox.DataMin = 0;
  37.     TemperatureHoldTimeTextBox.DataBigStep = 10;
  38.     TemperatureHoldTimeTextBox.DataStep = 1;
  39.     TemperatureHoldTimeTextBox.X = 7;
  40.     TemperatureHoldTimeTextBox.Y = 1;
  41.                
  42.     // 保温温度
  43.     System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTextBox);
  44.     TemperatureHoldTextBox.DataPointer = (void *)(&App.Data.TemperatureHold);
  45.     TemperatureHoldTextBox.Type = GuiDataTypeIntDec;
  46.     TemperatureHoldTextBox.DataMax = 900;
  47.     TemperatureHoldTextBox.DataMin = 300;
  48.     TemperatureHoldTextBox.DataBigStep = 100;
  49.     TemperatureHoldTextBox.DataStep = 10;
  50.     TemperatureHoldTextBox.X = 13;
  51.     TemperatureHoldTextBox.Y = 1;

  52.     // 降温时间
  53.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureDownTimeLabel);
  54.     TemperatureDownTimeLabel.DataPointer = (void *)(&App.Data.TemperatureDownTime);
  55.     TemperatureDownTimeLabel.Type = GuiDataTypeIntDec;
  56.     TemperatureDownTimeLabel.X = 7;
  57.     TemperatureDownTimeLabel.Y = 2;

  58.     // 降温温度
  59.     System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureDownTextBox);
  60.     TemperatureDownTextBox.DataPointer = (void *)(&App.Data.TemperatureDown);
  61.     TemperatureDownTextBox.Type = GuiDataTypeIntDec;
  62.     TemperatureDownTextBox.DataMax = 900;
  63.     TemperatureDownTextBox.DataMin = 300;
  64.     TemperatureDownTextBox.DataBigStep = 100;
  65.     TemperatureDownTextBox.DataStep = 10;
  66.     TemperatureDownTextBox.X = 13;
  67.     TemperatureDownTextBox.Y = 2;

  68.     // 状态显示
  69.     System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureStateLabel);
  70.     TemperatureStateLabel.DataPointer = (void *)(&App.Data.TemperatureState);
  71.     TemperatureStateLabel.Type = GuiDataTypeSnString;
  72.     TemperatureStateLabel.Align = GuiDataAlignRight;
  73.     TemperatureStateLabel.StringBlockPointer = TemperatureStateString;
  74.     TemperatureStateLabel.X = 15;
  75.     TemperatureStateLabel.Y = 3;

  76. }
复制代码
在实现以上代码之前首先在数据库中添加我们需要增加的变量,在使用过程中我发现,对于需要在显示屏上显示的数据变量,最好定义在数据库中,这样可以方便进行读写和显示。需要注意的是,在系统节拍中使用蜂鸣器最好是使用定时器来实现。
4 总结
通过这个案列,让我对msOS的系统有了更深入的了解,也在系统界面与逻辑业务的使用变得更清晰了。通过这个实例,让我学会了界面、业务使用和IO口的使用。总之,通过这个例子让我学习到了很多不光是msOS的知识,也慢慢的发现msOS使用的一些套路,在此,特别感谢同事的帮助。
回复

使用道具 举报

16

主题

60

帖子

488

积分

中级会员

Rank: 3Rank: 3

积分
488
QQ
发表于 2018-7-16 00:28:18 来自手机 | 显示全部楼层
学习,学习
回复

使用道具 举报

10

主题

92

帖子

357

积分

中级会员

Rank: 3Rank: 3

积分
357
发表于 2018-7-17 21:00:34 | 显示全部楼层

学习,学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2022-5-24 04:08 , Processed in 0.063767 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表