比如我要对60根电热丝进行通电加热。对电热丝通电的选项一个有两个,一个加热到的温度,一个加热的功率。60根电热丝的设置各不相同。用户想怎么设置就怎么设置。功率最大是10.设置为10表示一直加热。设置为0.表示不加热。设置为1-9的时候,表示加热1-9秒。比如设置为2,那就是加热2秒,停止加热8秒。然后再加热2秒,再停止8秒。(设置为3,就是加热3秒,停止加热7秒)循环下去,直到加热到指定的温度。60根发热丝的加热过程都是这样子的。我现在是用60个定时器控制加热的时间。60个定时器控制不加热的时间,总感觉这样设计有点太庞大了。有什么比较巧妙的方法进行加热吗?求解了,谢谢大家。
解决方案 »
- 一个奇怪的问题
- 如何判断服务器是否连网
- 怎么样把DBGrid中的小写字母先转化为大写字母再保存?
- 用indy的idftp下载某个文件夹,idFTP1.DirectoryListing.Count一直为0!郁闷ing
- 关于getdate()常异
- 用StringGrid组件时,怎么设置第0列的宽度而保证其它列的宽度不会变?谢谢!!!
- 有没有兴趣把您自己(高手)放入这个循环???????
- 如何找到异常出在什么地方?然后进行相应的异常处理?
- 请问哪儿有FloatPanel控件的下载?急,马上结帐!谢谢
- 仍然是数据库的查询问题(急!!!!!!!!!!!)
- 今天收到总监的一封惊人的邮件
- 请问像金山arp防火墙那样的Tab控件有没?不好意思没分了!
type
TTimeRecord = record
ExecTime: Integer;
StopTime: Integer;
Count: Integer;
IsExecute: Boolean;
end;var
TimeRec: TTimeRecord;procedure TForm1.Button1Click(Sender: TObject);
begin
TimeRec.ExecTime := 3;
TimeRec.StopTime := 7;
TimeRec.Count := 0;
TimeRec.IsExecute := True;
Timer1.Enabled := True;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
Count: Integer;
begin
Inc(TimeRec.Count);
if TimeRec.IsExecute then Count := TimeRec.ExecTime
else Count := TimeRec.StopTime;
if TimeRec.Count = Count then
begin
TimeRec.Count := 0;
TimeRec.IsExecute := not TimeRec.IsExecute;
if TimeRec.IsExecute then
Caption := '正在加热'
else
Caption := '停止加热';
end
end;
Timer1.Interval := 1000
Timer1.Enabled := False
只做一个frame,代码都在frame设计一次,然后拖60个进去.
THot = recor
ID: integer; //代表每个加热丝的索引
Watt: integer;//加热功率;
StopTime: integer;//停止加热时间
OK: Boolean;//已经完成
end;然后用 TList 装载它;
这样就可以用一个 Timer 循环 List 的列表项;
这个只是思路,具体也没做过。
其实是这样的,加热与不加热时往板卡的通道里面写1或者0.比如加热7秒就是WriteDoChanel(1,index),7秒到了以后就是WriteDochanel(0,Index),时间到3秒以后就再一次WriteDoChanel(1,index),过了7秒后就再次WriteDochanel(0,Index),知道到达指定的温度,如上图所示,做左边的是监控温度,中间的是设置温度,最右边的是设置功率。
THot = recor
ID: integer; //代表每个加热丝的索引
maxc:integer; //最高温度
Watt: integer;//加热功率;
StopTime: integer;//停止加热时间
p:integer; //当前进行的秒数, -1表示尚未开始或已经完成
//OK: Boolean;//已经完成
end;定时器周期为1秒;
定时事件里循环检查Thot数组里的每一个p,如果是-1,则略过,否则根据p和watt来判断本秒该加热还是不加热 停止