|
模拟周期示意图
下面是模拟算法的形式描述。
事件驱动模拟算法
{
当前时刻=0; // 模拟时钟置为开始。
活跃元件集合=?; // 活跃元件集合置空。
接收外部激励信号波形,加入信号事项处理表中; // 激励波形的各个时刻的跳变就是一个事件,放在事项处理表中。
接收各信号初始值,加入当前信号事项处理表中; // 各信号的初始值均看作一个事项处理。
While(存在事项处理 且 未到达模拟结束时间) // 模拟结束条件:不存在事项处理,或者到达用户制定的模拟结束事件
{
处理当前各信号事项处理:
{
若事项处理中保存的值与原来的值相同,则删除该事项处理;// 不是一个事件。
否则接收新值,并把该信号的负载元件放入活跃元件集合中;//
是一个事件,其负载元件需要计算。此时信号的当前值就是该是项处理中保存的新值。
}
将各信号的新值写入波形结果文件中; // 动态输出模拟结果。
删除当前信号事项处理; // 事项处理表中保存的是未处理的事项。
处理各模拟命令,若满足中断条件跳出循环; // 此处指需要有模拟程序自动完成的模拟命令,包括纪录指定信号的值,检查有无非法信号或非法信号值组合等。
计算活跃元件集合中各元件功能,得到新的事项处理,插入事项处理表中;
活跃元件集合= ;
模拟时钟走到下一时刻; // 该时刻的事项处理链表均删除之后,其后的时间节点所表示的时刻即为下一时刻。
}
转入交互命令状态; //包括波形显示、参数修改、激励波形修改、继续模拟、重新模拟、结束模拟等。
}
请读者体会事件与事项处理的区别。为什么称事件驱动,而不称事项处理驱动?算法描述中那个地方体现该思想?事件一定是值发生变化。但在计算得到新值的时候一般不能立即确定是否发生跳变,而这些新值的处理要等到该新值发生的时刻,所以要把它们记录下来准备以后处理,我们称之为事项处理。从上面的算法中可以看到,在到达事项处理发生的时刻后,信号值没有变化的事项处理无任何动作即被删除,真正引起后面作连接的元件的计算的是那些值变化了的事项处理,也就是事件驱动后面元件的计算。事项处理表中都是将来时刻的信号值,有可能与前面的信号值相同,也有可能不同;而事件体现在信号值表(波形)中,是当前值或历史值,与前面的信号值不同。在信号值表(即波形表)中,当前值可能是当前时刻的新值(当前时刻的事件),也有可能是前面某一时刻的新值(前面某一时刻的事件),到当前时刻一直没有新的事件发生。
|