任务处理器
任务处理器(WSF_TASK_PROCESSOR)是一个WSF处理器,它提供了检查轨迹管理器中的数据(轨迹)并对其采取行动的能力。这些行动包括:
*向下属分配任务
*激活或停用传感器或干扰器
*开火武器
*操纵平台
每个能够分配任务或接收任务分配的平台都必须有一个WSF_TASK_PROCESSOR的实例。任务处理器使用“有限状态机”的概念来控制要执行的行动。
任务处理器“监听”轨迹管理器,以确定新的轨迹何时出现。该轨迹可以来自于:
*由本地传感器产生的轨迹。
*从离板源接收到的轨迹。
*嵌入在任务分配中的轨迹。
*预先规划的轨迹。
当出现新的轨迹时,会为“起始”状态(即处理器中的第一个“状态”)安排评估事件。随后的评估事件将根据状态机的规定安排。对于给定的轨迹,评估事件将在满足以下两个条件时结束:
*该轨迹未收到任何任务。
*该轨迹未发起任何任务。
每个轨迹在其自己的状态机中执行。
有限状态机
有限状态机由以下组成:
*有限数量的“状态”,其中一个是“起始状态”。
*一组定义状态将何时发生改变的“转换规则”或“转换函数”。
一个有限状态机通常可以用一个状态图表示,该状态图由
* 节点 表示状态的
* 连接节点的“弧”组成,表示转换规则。
在WSF中,“状态”可以代表几乎任何事情:
*等待某物进入范围。
*等待传感器获得。
*等待武器爆炸。
在下面的例子中,显示了一个简单的状态图,其中有节点(标记为A至D)和连接节点的弧,表示转换规则。
"A"状态是起点。如果满足转换规则,它就会转移到“B”状态。如果所有转换规则都得到满足,最终会转移到“C”状态,然后到“D”状态。在“B”和“C”状态下,如果某些转换规则不满足,它可以回到“A”状态。例如,雷达系统可以用一台状态机制作。状态“A”可以是搜索模式。状态“B”可以代表初始获取模式。状态“C”可以代表次要获取模式。状态“D”可以是跟踪模式。
状态机输入
以下图显示了在WSF中任务处理器中如何定义状态机。
任务处理器中可用的预定义变量
任务处理器可以访问预定义变量,以便于脚本的创建,如下所示:
TRACK 变量
TRACK变量是WsfLocalTrack类型,指的是当前正在评估的轨迹。因为WsfLocalTrack继承自WsfTrack,所以WsfTrack类型中的所有方法也都可用。
PROCESSOR 变量
PROCESSOR变量(或“this”已被弃用)是WsfTaskManager类型,指的是WSF_TASK_PROCESSOR。所有WsfTaskManager、WsfTaskProcessor、WsfProcessor、WsfPlatformPart和WsfObject类型的方法都可供使用。
PLATFORM 变量
PLATFORM变量是WsfPlatform类型,指的是包含处理器的平台。所有WsfPlatform和WsfObject类型的方法都可供使用。
MESSAGE 变量
MESSAGE变量是WsfMessage类型。所有WsfMessage类型的方法都可供使用。 TIME_NOW 变量 TIME_NOW是一个简单的“double”变量,表示自模拟开始以来的秒数。
MATH 变量
MATH允许使用数学函数。请参阅Math。
See :ref:`Common_Script_Interface` for variables available within other components.
状态机的评估过程
*请求一个“思考者”进程
当一个思考者可用时,将其标记为忙碌,持续时间为当前状态中指定的“time_to_evaluate”。
模拟完成某项任务所需的人类或机器时间
由正在评估的状态的“time_to_think”值控制
可以过载
如果没有可用的思考者(没有忙于思考其他评估),评估将被放入“待处理队列”
将由下一个可用的思考者处理。
WSF_TASK_PROCESSOR可以配置多个思考者
命令:“number_of_servers <n>”(默认为1)
*当思考者达到评估时间的末尾时,执行当前状态的规则:
设置保留的脚本变量
TRACK、PLATFORM、PROCESSOR、MESSAGE、TIME_NOW
按照出现顺序执行“next_state”脚本
如果没有返回true,则保持在当前状态。
将思考者标记为“非忙碌”
使用“evaluation_interval”安排下一次评估。
如果有一个返回true,则转换到指定状态。
执行当前状态的“on_exit”脚本。
执行新状态的“on_entry”脚本。
将“当前状态”设置为“新状态”
将思考者的时间延长到新状态的“time_to_evaluate”。
等待思考者完成并评估规则。
任务分配和执行
任务管理器可以将任务分配(或取消)给下属。WsfTaskManager中可用于分配或取消任务的一些方法包括
*AssignTask(也可用于FireAt、StartTracking和StartJamming来处理武器)
*CancelTask
*TasksAssignedFor
*AssigneesForTask
任务分配/取消/状态消息通过通信网络传输(如果不是本地任务),并可能会丢失(受范围或干扰影响)。如果任务的受让人被杀死,所有分配给受让人的任务将自动在分配者身上取消。
当收到任务分配时:
*更新带有消息提供的轨迹的轨迹管理器。
如果无法将其与现有轨迹相关联,则创建“本地轨迹”。
(分配者和受让者之间的轨迹ID不同!)
*增加轨迹的“锁定计数”
在分配活动期间防止本地轨迹被清除。
*添加到接收到的任务列表中。
将反映在TasksReceivedFor返回的值中。
*如果受让人之前并不“了解”目标,将为目标创建并启动一个状态机。
*请求立即评估,等待思考者可用。
无需等待下一次评估周期。
当收到任务取消时:
*从接收到的任务列表中清除条目。
不再反映在TasksReceivedFor返回的值中。
*向分配者发送确认。
*调用“on_task_cancel”脚本(如果定义了)
*释放与任务关联的任何传感器或武器
(仅适用于FireAt、StartTracking和StartJamming任务。)
*减少本地轨迹的锁定计数。
如果没有其他分配且轨迹比清除间隔旧,允许清除本地轨迹。
如果清除了本地轨迹
销毁与轨迹相关联的状态机。
调用“on_track_drop”脚本(如果定义了)。