本帖最后由 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控件,是可读可写的。 2.2 界面的实现过程界面的实现分的过程分为三个步骤: (1)首先在AppStruct的Menu中添加需要增加的界面,这个结构体在menu.h和data.h中,两个地方都要修改,如下图所示 (2)创建界面初始化函数,在这个界面中直接设置界面要要显示的内容,添加控件等,实现的函数代码如下,包括控件的创建、添加,界面背景的创建。
- void InitWorkForm(void)
- {
- static Label TemperatureUpTimeLabel; // 升温时间
- static Label CurrentTemperatureLabel; // 当前温度
- static TextBox TemperatureHoldTimeTextBox; // 保温时间
- static TextBox TemperatureHoldTextBox; // 保温温度
- static Label TemperatureDownTimeLabel; // 降温时间
- static TextBox TemperatureDownTextBox; // 降温目标温度
-
- static Label TemperatureStateLabel;
- static const string TemperatureStateString[] = {"升温","保温","降温","待机"};
-
- System.Gui.Form.Init(&App.Menu.WorkForm);
- App.Menu.WorkForm.BackTextPointer = "升温: S ℃"
- "保温: S ℃"
- "降温: S ℃"
- "状态: ";
- // 加热时间
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureUpTimeLabel);
- TemperatureUpTimeLabel.DataPointer = (void *)(&App.Data.TemperatureUpTime);
- TemperatureUpTimeLabel.Type = GuiDataTypeIntDec;
- TemperatureUpTimeLabel.Digits = 2;
- TemperatureUpTimeLabel.X = 7;
- TemperatureUpTimeLabel.Y = 0;
- // 当前温度
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &CurrentTemperatureLabel);
- CurrentTemperatureLabel.DataPointer = (void *)(&App.Data.CurrentTemperature);
- CurrentTemperatureLabel.Type = GuiDataTypeIntDec;
- CurrentTemperatureLabel.X = 13;
- CurrentTemperatureLabel.Y = 0;
- // 保温时间
- System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTimeTextBox);
- TemperatureHoldTimeTextBox.DataPointer = (void *)(&App.Data.TemperatureHoldTime);
- TemperatureHoldTimeTextBox.Type = GuiDataTypeIntDec;
- TemperatureHoldTimeTextBox.DataMax = 360;
- TemperatureHoldTimeTextBox.DataMin = 0;
- TemperatureHoldTimeTextBox.DataBigStep = 10;
- TemperatureHoldTimeTextBox.DataStep = 1;
- TemperatureHoldTimeTextBox.X = 7;
- TemperatureHoldTimeTextBox.Y = 1;
-
- // 保温温度
- System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTextBox);
- TemperatureHoldTextBox.DataPointer = (void *)(&App.Data.TemperatureHold);
- TemperatureHoldTextBox.Type = GuiDataTypeIntDec;
- TemperatureHoldTextBox.DataMax = 900;
- TemperatureHoldTextBox.DataMin = 300;
- TemperatureHoldTextBox.DataBigStep = 100;
- TemperatureHoldTextBox.DataStep = 10;
- TemperatureHoldTextBox.X = 13;
- TemperatureHoldTextBox.Y = 1;
- // 降温时间
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureDownTimeLabel);
- TemperatureDownTimeLabel.DataPointer = (void *)(&App.Data.TemperatureDownTime);
- TemperatureDownTimeLabel.Type = GuiDataTypeIntDec;
- TemperatureDownTimeLabel.X = 7;
- TemperatureDownTimeLabel.Y = 2;
- // 降温温度
- System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureDownTextBox);
- TemperatureDownTextBox.DataPointer = (void *)(&App.Data.TemperatureDown);
- TemperatureDownTextBox.Type = GuiDataTypeIntDec;
- TemperatureDownTextBox.DataMax = 900;
- TemperatureDownTextBox.DataMin = 300;
- TemperatureDownTextBox.DataBigStep = 100;
- TemperatureDownTextBox.DataStep = 10;
- TemperatureDownTextBox.X = 13;
- TemperatureDownTextBox.Y = 2;
- // 状态显示
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureStateLabel);
- TemperatureStateLabel.DataPointer = (void *)(&App.Data.TemperatureState);
- TemperatureStateLabel.Type = GuiDataTypeSnString;
- TemperatureStateLabel.Align = GuiDataAlignRight;
- TemperatureStateLabel.StringBlockPointer = TemperatureStateString;
- TemperatureStateLabel.X = 15;
- TemperatureStateLabel.Y = 3;
- }
复制代码
3 逻辑业务中实现
逻辑业务的设计主要读取读取模拟量,通过端口控制加入和夹子的控制,在整系统中我设置了四个状态进行考虑,分别为升温、保温、降温和待机转态,这四个状态我是以全局变量的形式保存在数据库中的。在逻辑业务中每当到达1s之后就就读取模拟量的输入,并显示在显示屏上,同时也判断当前的状态,比如刚开始按键开始的时候,就设置为升温状态,这时候,控制温度的端口和控制夹子的端口也打开。在节拍中实现的代码如下,这部分的代码只是实现了通过按键控制的模式。
- void InitWorkForm(void)
- {
- static Label TemperatureUpTimeLabel; // 升温时间
- static Label CurrentTemperatureLabel; // 当前温度
- static TextBox TemperatureHoldTimeTextBox; // 保温时间
- static TextBox TemperatureHoldTextBox; // 保温温度
- static Label TemperatureDownTimeLabel; // 降温时间
- static TextBox TemperatureDownTextBox; // 降温目标温度
-
- static Label TemperatureStateLabel;
- static const string TemperatureStateString[] = {"升温","保温","降温","待机"};
-
- System.Gui.Form.Init(&App.Menu.WorkForm);
- App.Menu.WorkForm.BackTextPointer = "升温: S ℃"
- "保温: S ℃"
- "降温: S ℃"
- "状态: ";
- // 加热时间
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureUpTimeLabel);
- TemperatureUpTimeLabel.DataPointer = (void *)(&App.Data.TemperatureUpTime);
- TemperatureUpTimeLabel.Type = GuiDataTypeIntDec;
- TemperatureUpTimeLabel.Digits = 2;
- TemperatureUpTimeLabel.X = 7;
- TemperatureUpTimeLabel.Y = 0;
- // 当前温度
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &CurrentTemperatureLabel);
- CurrentTemperatureLabel.DataPointer = (void *)(&App.Data.CurrentTemperature);
- CurrentTemperatureLabel.Type = GuiDataTypeIntDec;
- CurrentTemperatureLabel.X = 13;
- CurrentTemperatureLabel.Y = 0;
- // 保温时间
- System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTimeTextBox);
- TemperatureHoldTimeTextBox.DataPointer = (void *)(&App.Data.TemperatureHoldTime);
- TemperatureHoldTimeTextBox.Type = GuiDataTypeIntDec;
- TemperatureHoldTimeTextBox.DataMax = 360;
- TemperatureHoldTimeTextBox.DataMin = 0;
- TemperatureHoldTimeTextBox.DataBigStep = 10;
- TemperatureHoldTimeTextBox.DataStep = 1;
- TemperatureHoldTimeTextBox.X = 7;
- TemperatureHoldTimeTextBox.Y = 1;
-
- // 保温温度
- System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureHoldTextBox);
- TemperatureHoldTextBox.DataPointer = (void *)(&App.Data.TemperatureHold);
- TemperatureHoldTextBox.Type = GuiDataTypeIntDec;
- TemperatureHoldTextBox.DataMax = 900;
- TemperatureHoldTextBox.DataMin = 300;
- TemperatureHoldTextBox.DataBigStep = 100;
- TemperatureHoldTextBox.DataStep = 10;
- TemperatureHoldTextBox.X = 13;
- TemperatureHoldTextBox.Y = 1;
- // 降温时间
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureDownTimeLabel);
- TemperatureDownTimeLabel.DataPointer = (void *)(&App.Data.TemperatureDownTime);
- TemperatureDownTimeLabel.Type = GuiDataTypeIntDec;
- TemperatureDownTimeLabel.X = 7;
- TemperatureDownTimeLabel.Y = 2;
- // 降温温度
- System.Gui.Form.AddTextBox(&App.Menu.WorkForm, &TemperatureDownTextBox);
- TemperatureDownTextBox.DataPointer = (void *)(&App.Data.TemperatureDown);
- TemperatureDownTextBox.Type = GuiDataTypeIntDec;
- TemperatureDownTextBox.DataMax = 900;
- TemperatureDownTextBox.DataMin = 300;
- TemperatureDownTextBox.DataBigStep = 100;
- TemperatureDownTextBox.DataStep = 10;
- TemperatureDownTextBox.X = 13;
- TemperatureDownTextBox.Y = 2;
- // 状态显示
- System.Gui.Form.AddLabel(&App.Menu.WorkForm, &TemperatureStateLabel);
- TemperatureStateLabel.DataPointer = (void *)(&App.Data.TemperatureState);
- TemperatureStateLabel.Type = GuiDataTypeSnString;
- TemperatureStateLabel.Align = GuiDataAlignRight;
- TemperatureStateLabel.StringBlockPointer = TemperatureStateString;
- TemperatureStateLabel.X = 15;
- TemperatureStateLabel.Y = 3;
- }
复制代码在实现以上代码之前首先在数据库中添加我们需要增加的变量,在使用过程中我发现,对于需要在显示屏上显示的数据变量,最好定义在数据库中,这样可以方便进行读写和显示。需要注意的是,在系统节拍中使用蜂鸣器最好是使用定时器来实现。 4 总结通过这个案列,让我对msOS的系统有了更深入的了解,也在系统界面与逻辑业务的使用变得更清晰了。通过这个实例,让我学会了界面、业务使用和IO口的使用。总之,通过这个例子让我学习到了很多不光是msOS的知识,也慢慢的发现msOS使用的一些套路,在此,特别感谢同事的帮助。 |