控制器设计的数据驱动技术

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml">

控制器设计的数据驱动技术

Author: pclion

 

考虑一个电饭煲,它有一种工作模式,可以用来煲粥。开始它全功率工作,9分钟后加热器以50%的功率工作,18分钟后加热器输出功率改为30%30分钟后停止加热。

功率控制可应用一种称之为“脉宽调制”的技术。比如说,你要让加热器输出50%的功率工作,可以在10秒内让加热器通电工作5秒钟,关断5秒钟。如果要让它输出30%的功率,可以在10秒内让它通电3秒钟,关断7秒钟。所以你可以用10bits数据来表示一个10秒周期内加热器的通电状态。这10bits数据称之为模式数据。控制器讲情以模式数据中的中的比特为1,就送出通电信号,读到比特为0就送出关电信号。如果你改变了这10bits的数据,你就改变了加热器的工作模式工,而制品不需要切换到其它代码去执行,它依然执行相同的代码。这种技术就叫数据驱动技术,或者说,是以数据驱动模式的技术。

如果你的控制程序中有很多switch…case…语句去选择控制器的工作模式,你就应该考虑是否可以找到一种数据驱动技术来代替这种代码选择方式。

所以控制器模式的程序设计,应遵守一个设计原则:

 

原则:尽最大可能采用数据驱动技术,而不是采用切换代码的代码驱动技术。

 

象前述的30分钟煲粥控制器设计中,可以二元组(时间,模式)来实现它的控制过程,称这个数组为过程控制数组:

(0,00x3FF),(9*60,0x01F)(18*60,0x007)(30*60,0x000)

实现这个控制器过程有两种方法:

一是轮询法:主程序不停读取系统时间,与过程控制数组中的时间域比较,如果时间相等,就将模式数据写入控制器的模式存储器,然后主程序用指针指向控制数组的下一元素,直到控制数组的数据取完了,程序就结束了。

二是在系统时钟中挂接定时器,定时器时间到达就发送定时信息,定时信息驱动控制器设置器将相应模式数据写入控制器。

第一种是已经淘汰了的程序设计方式,第二种是现代程序设计中最常用的消息驱动技术,比前者更先进,更高效,而且更简单,更符合面向对象的设计方法,实现也更简单和易于维护。尽管这种控制器十分简单,只有单一的消息生产者和单一的消息消费者,我们还是应该选择消息驱动机制和数据驱动技术来实现它。

 

原则:使用消息驱动机制,不要使用状态轮询方式。

 

象电饭煲、微波炉、煮咖啡煲、空调器,它们的控制器都是一样的简单,控制器的实现模式亦是一样的。你永远只需一段程序来实现各种各样的控制器的工作模式,。当你需要改变控制器的工作模式、行为或状态时,你只需要向控制器置入不同的模式数据,而且置入程序与控制器工作程序之间通常不需要线程同步。参数(模式)设置程序永远只需向控制器写入参数值,模式工作程序永远只需要从控制器读参数值。

考虑一台煮咖啡机的控制器,它只有一种固定的过程控制曲线。这条曲线的时间宽度是T,这个T值由一个旋钮来设定。在起始处,它全功率工作;在0.3T处它输出功率为50%;在0.6T处它输出功率为30%;在T处它完全关断加热器。用户唯一可调的是使用旋钮来调节过程控制曲线的时间宽度,即T值。假定用户将旋钮旋在10分钟处,那么控制器读取旋钮的设置值,然后生成一组过程控制数组:(0,0x3FF),(3*60,0x01F),(6*60,0x007),(10*60,0x000).

这样,这台咖啡煲将在开始的时间全功率工作,3分钟后切换为50%的功率输出,6分钟后切换为30%的功率输出,10分钟后完全关断电源。

你可以随时改变旋钮的位置,一旦主程序检测到旋钮位置改变,就大读到此值稳定后(假设可取3秒稳定时间)就从新生成一组控制数组,同时向控制器置入新的模式数据。这样用户可在机器工作过程中发现预设的时间过大或过小时即时调整。比如发现咖啡滚溢出时,说明设定工作时间过大,此时立即旋小旋钮的值,令加热器的输出功率在3秒内降下来,这样可避免咖啡过热而滚溢出,如此强大而且灵活易用的功能,整个咖啡煲却只需一个电源开关和一个时间设定旋钮!

这个咖啡煲控制器只需实现两个接口:start(ContralData[] data)restart(ControlData[] data)Start()令咖啡煲开始按过程控制数组data工作,restart()是当咖啡煲在工作过程中用户改变了旋钮的位置之后从新设定控制数组的数据。

这台咖啡煲的功能强大,使用灵活简单方便,而实现却极简单!

以上就是控制器的设计模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值