没有合适的资源?快使用搜索试试~ 我知道了~
开发人员用于分布式控制程序的数据记录和分析工具的实现和性能结果分析
网址:http://www.elsevie r. n l/l oc ate/en tcs/vol um e55. ht ml 19页从分布式控制程序David Kortenkamp和TodMilamMetrica Inc./TRACLabs美国德克萨斯州休斯敦1012 Hercules,邮编77058里德西蒙斯和华金洛佩兹费尔南德斯计算机科学卡内基梅隆大学匹兹堡宾夕法尼亚州美国15213摘要本文介绍了一组工具,允许开发人员仪器的C/C++程序在运行时记录数据,然后分析数据,以验证正确的被-或。日志工具为开发人员提供了一种将各种不同数据记录到各种不同输出的方法。它们还允许从分布式程序同步记录数据。一个日志记录输出选项是SQL数据库。我们已经开发了一套分析工具,从数据库中检索数据,以回答常见的开发人员问题。分析工具使用一个时间间隔逻辑来构建数据库查询。文中给出了该数据测井仪的完整实现和性能结果。数据分析工具目前正在对美国航天局实际应用的数据进行测试1引言分布式控制程序的验证是非常困难的,然而这种控制程序在复杂的应用中变得越来越普遍。示例包括远程代理控制架构[9]、3T控制架构[3]和TCA控制架构[13]。在这些实例中的每一个中,并发程序运行(通常在单独的机器上)以生成用于单个或多个设备的控制命令。1 电子邮件地址:korten@traclabs.com2 电子邮件地址:reids+@cs.cmu.educ 2001年由Elsevier Science B出版。V.CC BY-NC-ND许可下的开放访问。2当发生错误时,由于时序约束、进程间通信和同步,通常很难将问题隔离到一个特定的控制模块。传统的时序软件动态调试方法没有时序约束。对于这些系统,通常使用循环调试(运行程序直到出现错误,检查程序状态,插入断言并重新执行程序以获得额外信息)[15]。然而,有几个原因导致这种方法不能应用于分布式控制程序:通常,分布式进程不能暂停以进行检查,因为它们控制着物理硬件。没有一个中心的、全局的状态,甚至没有全局时钟来参考状态值,这使得在给定的时间推理系统的“状态”变得困难。由于延迟和定时问题,分布式控制程序本质上是不确定的和不可重复的。在本文中,我们提出了一套工具,使程序员能够实现他们的控制代码和时间戳,并收集实时数据到一个共同的数据库。然后,可以使用一组配套工具来分析数据,以确定输出中是否存在时间模式。首先,我们描述了数据收集工具,然后我们描述了相关的数据分析工具。一个完整的例子是贯穿始终。该示例着眼于验证NASA生命支持系统的分布式控制程序。1.1相关工作卡内基梅隆大学的Reid Simmons和他的小组已经开发了几种用于分布式控制程序的数据显示工具,包括用于查看消息传输的comview,用于查看任务层次分解的tview,以及用于显示和分析计划执行信息的planview这些工具已经与TCA架构[12]和NASA艾姆斯远程代理架构集成。这项工作的概述可以在[14]中找到。实时创新公司(Real Time Innovations Inc.)的一款产品就是对实时程序进行可视化的研究。名为“听诊器”[11]。听诊器允许数据收集、显示和修改。但是,它仅限于在Linux Works下运行的实时程序,并且不支持自治系统所需的那种高级跨系统调试。有一些最近开发的调试和验证的par-technology系统,与我们的研究有关的工具。例如,ParaGraph [4]提供了并行系统不同方面的各种可视化。另一个这样的工具是PIE [7],它与Mach操作系统一起操作。已经开发了许多工具来调试和验证多线程程序,包括tnfview [6]。然而,这些工具3可以提供自治系统所需的跨系统和高级调试和验证支持。有关并行和分布式编程可视化工具的更多信息,请参见[1,16]。2数据收集分布式控制程序的数据收集需求范围从低级传感器数据到程序的内部状态。数据采集程序有以下要求:实时数据收集将数据记录到数据库灵活的采样率将数据转换为逻辑集触发选项(例如,仅允许收集某些范围内的数据或仅在数据发生变化时收集数据)我们开发的数据收集工具面向C/C++编程语言,尽管通过外部函数调用其他编程语言(如Lisp和Java)可以访问它们。我们的目标是复制C中printf命令的易用性,同时允许更多的控制和分布式操作。本质上,我们所实现的是一种称为rlog的远程printf功能。Rlog是作为一组库来实现的,它允许你对你的程序进行检测,并将输出发送到各种不同的地方,例如,屏幕、LE、远程计算机或数据库。可以记录的数据类型有:字符、无符号字符、短整数、无符号短整数、整数、长整数、无符号长整数、浮点数、双浮点数和字符串。我们支持在以下平台上进行日志记录:Linux 、 Solaris 、IRIX 和NetBSD。我们目前正在开发一个CockWorks端口。代码尽可能地避免依赖于操作系统的调用,以便轻松移植到新平台。2.1Rlog函数我们系统的数据收集功能包含在客户端程序编译成其代码的库中。这个库包含各种各样的不同的日志记录功能。本节介绍每个日志记录功能及其作用。2.1.1初始化客户端必须为它们希望激活的每个输出类型调用rlogInitType。例如,调用rlogInitType(argc,argv,“debug1”)将初始化与debug1关联的输出。可选的特定于插件的选项可以跟在后面4输出类型,但不鼓励使用命令行参数或在配置文件中指定参数。2.1.2清理在客户端程序退出之前,或者当它使用输出类型结束时,它应该为每个输出类型调用rlogCleanupType(type),或者只是调用rlogCleanup()来清除所有初始化的类型。这确保了任何打开的le或端口都被关闭,并且任何分配的内存都被释放。2.1.3普通测井以下函数提供常规日志记录功能:rlogEvent:这个调用记录一次变量列表,类似于printf。它接受任意数量的参数,因此可以一次记录任意数量的变量rst参数指定一个事件名称,以关联变量。它可以是任何字符串。第二个参数是一个格式字符串,指示数据类型和其后每个参数的名称。\type[:name]”,其中类型是数据类型,可选名称是数据的名称(不一定与变量名称相同)。每个条目在字符串中由空格分隔rlog:这是rlogEvent的简化版本,它将事件名称设置为默认值。rlogEnableEvent:此函数启用指定事件的日志记录。当调用rlogEvent时,事件将被记录。rlogDisableEvent:此函数禁止记录事件。对于指定的事件,将忽略对rlogEvent的任何调用。rlogOutputFormat:此函数控制各种文本输出插件如何显示数据(参见第2.2节)。rlogEventPrintf:在这个函数中,输出格式由格式字符串决定,很像printf函数,而不是由rlogOutputFormat设置的当前输出格式。它有一个等效的rlogPrintf,它也使用默认的事件名称。2.1.4仅更改日志记录在许多情况下,开发人员只想在值发生更改时记录它,例如内部状态变量。我们实现了以下函数来记录仅更改的数据:rlogRegisterVariable:此函数将变量添加到一个列表中,每当调用\ush”函数(见下一项)时都会检查该列表。rlogFlushChanges:删除自上次调用以来值已更改的所有已注册变量。所有被触发的变量都将具有相同的时间戳。5rlogUnregisterVariable:从列表中删除一个变量,以便在调用ush函数时不再记录该变量。rlogUnregisterAllVariables: 注销所有已注册的变量。2.1.5条件测井在某些情况下,开发人员只想在某些条件下记录一个值。 虽然他们可以通过在if-then中嵌入rlog调用来实现这一点,但我们已经为他们提供了执行此操作的函数。其中包括:rlogRegisterEventCondition:在这个调用中定义日志记录条件。例如,一个值小于某个数字。这个调用返回一个ID,用于其余的条件日志记录函数。rlogSetVariableCondition:这个函数允许你将前面函数中指定的条件应用到指定的变量。现在,当对该变量进行任何日志记录调用时,在日志记录发生之前首先检查条件。rlogUnSetVariableCondition:在记录变量之前不再检查条件。rlogUnRegisterEventCondition:当不再需要某个条件时,此函数将其从检查中删除。还有一些其他更专业的功能也可用。有关详细信息,请参见rlog WWW站点(http://www.traclabs.com/rlog/)2.1.6函数入口和出口调试分布式程序的一个重要部分是知道函数是否以及何时被调用,以及它们何时完成执行。除了下面列出的函数之外,我们还开发了一些脚本,可以读取C/C++ le并自动将函数进入和退出日志记录命令添加到该le中的每个函数。rlogLogFunctionEntry:将入口插入函数。将this(或让脚本自动将其放置)放在函数的开头rlogLogFunctionExit: 从函数中退出。rlogEnableFunctionEntryLogging:开始记录函数条目。rlogDisableFunctionEntryLogging: 停止记录函数项。rlogEnableFunctionExitLogging: 启动日志记录功能退出。rlogDisableFunctionExitLogging:停止记录功能退出。2.2输出插件模块RLog使用GNULibtool来可移植地使用输出插件的动态可扩展模块。动态可重用模块类似于共享的li-6计算机1程序1RLog库文件输出插件屏幕输出插件文件Fig. 1.开发人员的程序(Program1)使用RLog库进行编译。插件可以在运行时加载,并将输出定向到不同的位置。可以使用多个输出目的地。日志目的地转为日志记录。- 是的它们允许用户在不重新编译程序的情况下更改库函数。图1显示了一个典型的配置。有四种类型的插件可用于RLog库,实现自定义插件的详细信息可以在RLog网站上找到。目前可用的四种插件类型是:文 本插件包括屏幕和le插件。它们使用rlogOutputFormat调用指定的格式以文本格式输出记录的数据,如果没有调用rlogOutputFormat,则数 据库插件包括两个MySQL插件。它们中的每一个都使用不同的模式来存储数据库中的数据。通过指定不同的主机名,数据库可以驻留在本地机器上,也可以驻留在远程机器上。 数据库的更多详细信息见第2.4节。套接字插件用于将记录的数据发送到远程机器上的RLog服务器。TCP插件使用原始套接字发送数据。IPC插件使用CMU提供的IPC库和服务器发送数据。RLog服务器处理远程数据的时间戳,如第2.5节所NULL插件用于禁用日志记录。这允许日志记录代码保留在客户机中,以备将来需要调试2.3配置乐Rlog使用一个配置文件来决定要使用哪些输出模块。这允许开发人员在不 重 新 编 译 任 何 代 码 的 情 况 下 更 改 输 出 位 置 。 配 置 文 件 名 为rlogDestinations.txt,位于当前工作目录中,或者完整路径可以由环境变量RlogDestinationFILE指定。这里面的每一条记录 le包括两个ELD和可选的第三ELD。le中的注释7并一直持续到终点。rst字段是一个字符串,包含除空格之外的任何字符(不包括空格)。这eld是一个标签,它将在客户端代码中使用,以标识将记录的数据发送到哪个一般名称(如\debug1”或\app1dest1”)优于描述实际输出插件模块(如\ leOutput”)的名称这将允许更改标签附加到的输出,而无需重新编译代码(或让\ leOutput”实际将数据发送到TCP输出)。第二个字段指定输出插件模块的完整路径,包括模块名称,但不包括扩展名。例如,\/tmp/rlogFile”可能指定le模块。第三个字段是可选的。它指定模块的命令行参数例如,le模块可以使用\-f”ag来指定输出le,因此-f/tmp/rlogOutput.txt将指定将数据记录到le\/tmp/rlogOutput.txt”。2.4数据库存储收集的数据的一个选项是SQL关系数据库。这使用户能够访问强大的 搜 索 和 检 索 功 能 。 对 于 这 个 项 目 , 我 们 选 择 了 MySQL 数 据 库(www.mysql.com)。我们选择这个数据库是因为它是免费的,并且可以在我们使用的平台一旦选择了数据库,我们就需要设计一个存储数据的模式。模式是一组具有相关数据的数据库表。我们已经实现了两个不同的模式;它们都有各自的优点和缺点。性能测试表明,它们的性能相似(见2.6节2.4.1模式1rst模式由两个表组成。rst被称为CommonData,它为每个条目分配一个唯一的ID,并存储每个日志调用的事件名称和时间戳。第二个表是ItemData表,它存储每个记录变量第二个表中的所有信息所有类型的变量都转换为字符串)。这些记录将使用CommonData表中生成的ID绑定到该表条目。CommonData表布局Id-一个整数 字段设置为主键并自动递增。MachineName-由rlog内部生成,是调用log函数的程序正在运行的计算机的名称。TimeStamp-一个日期时间字段,保存日志函数被调用的日期/时间。由rlog内部生成。8微秒-时间戳的微秒部分,由于日期-时间数据类型不符合此精度,因此需要此部分。EventName- 正 在 记 录 的 事 件 的 名 称 。 在 rlog 的 情 况 下 , 使 用 默 认 的EventName。ItemData表格布局Id-一个整数eld,对应于CommonData中的Id eld。这个插件必须与之匹配,因为MySQL不支持外键。ItemType-长度为50的字符eld,这是此变量的数据类型的文本描述。ItemName-长度为100的字符eld,这是在格式语句中指定的变量的名称。如果没有指定名称,则将生成默认名称供内部使用。ItemValue-长度为100的字符eld,这是转换为字符串的变量的值。ItemOrder-一个无符号整数eld,指定此变量在参数列表中出现的顺序。2.4.2图式2第二个模式由12个表组成:一个用于记录事件数据,每个表用于RLog支持的不同数据类型。EventData表与rst架构的CommonData表相同。它为每个条目分配一个唯一的ID,并存储每个日志调用的事件名称和时间戳。各个数据类型表将包含变量信息。这些记录将使用EventData表中生成的ID绑定到该表条目。EventData表布局Id-一个整数 字段设置为主键并自动递增。MachineName-由rlog内部生成,是调用log函数的程序正在运行的计算机的名称。TimeStamp-一个datetime字段,保存日志函数被调用的日期/时间。由rlog内部生成。微秒-时间戳的微秒部分,由于日期时间数据类型不符合此精度,因此需要此部分。EventName-正在记录的事件的名称。在rlog的情况下,使用默认的EventName。11种记录数据类型中每种类型的表布局如下所示:Id-一个整数eld,对应于EventData中的Id eld。这个插件必须与之匹配,因为MySQL不支持外键。9TCP输出插件程序1RLogTCP输出插件RLog文件输出插件文件RLogTCP输出插件计算机1服务器计算机2节目2计算机3程序3图二. 在不同计算机上运行的程序可以通过TCP/IP将数据记录到中央(服务器)计算机。记录在服务器上的数据可以定向到多个目的地,包括MySQL数据库。服务器还确定计算机之间的定时并适当地调整时间戳ItemName-可变长度字符eld,最大长度为100,这是格式语句中指定的变量名称。如果没有指定名称,则将生成默认名称供内部使用。ItemValue-这个表存储的任何数据类型的字段,这是变量的值。ItemOrder-一个无符号整数eld,指定此变量在参数列表中出现的顺序。除了定义模式之外,我们还编写了C/C++代码来将数据插入数据库和从数据库中提取数据。 通过这种方式,我们的日志工具的用户不需要了解SQL或任何关于关系数据库内部的知识。这些工具为用户插入和提取所有数据。2.5分布式测井通过使用套接字输出模块(见第2.2节),来自不同机器上运行的不同程序的数据可以记录到一个中央位置。中央位置的计算机必须运行rlogServer程序来收集数据。图2显示了分布式日志记录的一个实例。当在分布式机器上收集由不同进程生成的数据时,需要某种方式使用公共时钟对数据进行时间标记。rlogServer是收集主机上所有数据的进程。TCP输入插件RLog服务器MySQL输出插件MySQL10然后将其发送到数据库(或其他位置)。当rlogServer收到来自不同(远程)计算机的数据消息时,它启动一个新线程,该线程在设置的时间内向该远程计算机发送请求。 然后,它将该o设置应用于从该远程计算机接收的消息和所有后续消息。 它轮询远程计算机每2分钟更新的时间o设置。如果远程计算机没有给出响应,则时间戳不变。远程机器必须运行由我们编写的rlogTimeServer来确定o集。 此服务器占用最少的CPU时间,因为它很少被调用时间o集根据RFC 2030中[8]的一项建议。以下是RFC 2030的相关部分:为了计算相对于服务器的往返延迟d和本地时钟o set t,客户端根据NTP时间戳格式的客户端时钟将请求中的传输时间戳设置为一天中的时间服务器复制此在回复中设置原始时间戳,并设置接收时间戳并根据NTP时间戳格式的服务器时钟将时间戳发送到一天中的时间。\当收到服务器回复时,客户端根据其NTP times-tamp格式的时钟将Destination Timestamp变量确定为到达时间。下表总结了四个时间戳:生成时的时间戳名称ID起始时间戳T1客户端发送的时间请求接收时间戳T2服务器收到的时间请求发送时间戳T3服务器发送的时间回复目的地时间戳T4客户端接收到的时间应答则往返延迟d和本地时钟o设置t由下式定义d =(T 4T 1)(T 2T 3)和((T 2T 1)+(T 3 T 4))t =2RFC 2030声称精度在几十毫秒之内“当然可以这仅在发送和接收该消息的时间点是真实的。因此,RLog服务器将定期轮询客户端设置的新时间(目前每2分钟一次)。2.6Rlog性能我们已经为不同的输出运行了一些rlog库的性能测量。用于这些测试的平台如下:CPU:Intel Pentium III@800Mhz11Null0.009文件0.053屏幕0.534TCP0.711IPC0.750MySQL10.347MySQL20.382表1为不同的输出可能性调用100次rlog所需的秒数。这包括初始化和清理。内存:256兆。操作系统:RedHat Linux型号:Dell Dimension XPS B800r台式机表1显示了调用rlog函数100所需的秒数不同输出可能性的时间。 这些数字是使用上述指定平台的rlog所需的所有数据库以及初始化和清理函数的10组100次调用的平均值3数据分析分布式控制程序往往会产生大量的输出数据,由于不确定的延迟和执行时间,这些输出数据通常不能从运行到运行精确地再现。程序员通常对12检测数据中特定时间模式的出现(或不出现)感兴趣,而不是寻找与已知(成功)运行的精确匹配。这些模式通常是重复的(例如,“无论何时水位高于给定阈值,泵应该在30秒内被打开”)并且其本身可以由其它模式组成(例如,打开泵可以由一系列更原始的事件组成)。为了处理这种类型的数据分析,我们设计了一个面向这种模式的时态逻辑,并实现了一个工具的初始版本,该工具可以根据记录输出的数据库检查模式的集合。该逻辑称为ITCL(间隔时间检查逻辑),结合了RTIL[10]和RTL [5]的功能。我们从RTIL和RTL开始,因为它们的目标也是确定实时(非分布式)程序的执行是否与程序行为的形式化描述一致。我们看到的所有其他逻辑都是为“模型检查”而设计的,它们限制自己的语言能够应用验证方法。现有的逻辑不足以满足我们的需求的主要原因是基于我们的13需要以不同的方式将区间集关联起来,而不是将两个区间关联起来。此外,我们需要同时处理这两种情况:区间集和事件集。ITCL中的基本原语是events()和interval(),events()对应于日志数据库中的条目,interval()是根据一对时间点定义的时间点又可以是事件发生的时间,或者是相对于事件的某个时间点(例如,事件e1发生后3秒,记为e1!3)。 该逻辑允许定义events()和intervals()的集合,然后可以对其进行联合、区分和迭代(在逻辑中使用“forall”语句)。还可以基于条件(例如,条件P成立的时间间隔,写为[P]),并使用\search”操作符。搜索操作符()或()将输入值从开始事件扩展到结束事件的下一次出现(或从结束事件搜索回到开始事件)。例如,间隔e1)e2是事件e1发生时和事件e2的下一次发生之间的时间段。类似地,e1(e2)是在e2发生时结束并以事件e1的前一次发生开 始 的 时 间 段。搜索运算符在创建间隔集时最有用。例如,[e1)e2]是日志数据库中事件e1之后是事件e2的所有间隔的集合。注意,以这种方式形成的间隔可以重叠。例如,如果数据库具有事件e1、e1、e2,则在集合中将存在两个间隔,每个间隔以事件e1的不同实例开始,但以相同事件e2结束。相反,[e1(e2)]在集合中只有一个区间(从第二个e1事件延伸到e2事件)。除了标准的布尔运算符,我们的逻辑还包括用于访问间隔的开始和结束事件的函数,事件发生的时间,用于确定事件之间和间隔之间的时间关系的几个布尔函数,以及限制在间隔的某个子集期间(例如在开始,结束或整个间隔)计算表达式的方法。表2总结了其中一些ITCL操作符,图3中显示了示例此外,表3显示了一些宏来表达间隔和事件之间的时间关系。区间集之间的运算,如并集、减法、合取和析取,已经被定义为便于表达以下情况\操作a3必须在间隔a1和a2之后开始,并且...“(联合)或“系统必须在连接时工作,除非芯罐中没有水或冷凝罐已满”(减法)等。在间隔中评估条件以查看它们是否最终()、始终()、在输入值之前()、在输入值开始时(4)、在输入值结束时(5)或在输入值之后()变为真。).3这个表达式的结果是一个只有一个区间的区间集(4.5)。9表示9事件集合中的任何事件。14符号意义图3)向前搜索下一个事件1(1)第2项(向后搜索下一个事件21(2)!新事件(设置)作为事件(设置)6四个! 6新事件(设置)作为事件(设置)之前的时间584[两个区间集的41 [2]\两个区间集51\2“开始间隔(设置)的1“1#结束间隔(设置)的2第一名4区间(集94.545区间(集)的最后一个子区间(集)104.55.间隔(设置)11四点五/之前的间隔(设置)84.5/?双区间集?(4) 2/限制带条件的fx:4/x包括9 g3time()事件发生时间(1.2)为24J= j事件集中的项目(间隔设置)j2j是3表2事件和间隔运算符。 1020 40506070 代表任何一种元素代表任何一种元素图三. 事件被分组为事件集和间隔区间集.我们已经开发了一个工具,解释ITCL表达式,并检查其有效性方面的日志输出收集在一个LE或数据库的初始实现。该工具通过构造间隔和事件集并对其执行操作来每当公式的计算结果为\false”,该工具将构造一个反例, 15事件的组合导致错误。 这个想法是,这些信息将帮助用户查明分布式系统中的错误161是before(t1,t2)2 time(1)+t1 time(2)^time(1)+t2> time(2)时间(1)+ t1时间(2)→时间(1)+ t2 >时间(2)1是在[t1,t2)2之前时间(1)+ t1时间(2)^时间(1)+ t2时间(2)1 isbefore(t1,t2] 2时间(1)+ t1时间(2)^时间(1)+ t2时间(2)1在[t1,t2] 2之前时间(“第一章time(“2)^ time(# 1)时间(#2)1包括2时间(“第一章time()^ time(#1)> time()1包括time(“1)time(# 2)^ time(# 1)> time(“2)% 1与% 2相交等价宏观表3区间和事件之间时间关系的一些算子在这个阶段,该工具是在完整的ITCL语言上工作的(本文只描述了该语言的一个子集)。虽然它有点不太有效,特别是在处理嵌套的“forall”语句时,但对我们来说,评估它的效用是足够的。我们目前正在为水回收系统开发更多的模式(见下一节),并将在不久的将来根据真实数据测试数据分析工具。我们也在评估语言的可用性。为此,我们正在添加更高级别的构造(\syntactic sugar”),以使指定常见类型的规则(例如\always do X,T seconds after Y”),并正在开发图形用户界面这将使用户能够指定ITCL公式并查看找到的任何反例。4数据可视化除了数据分析,我们还提供了一些简单的工具来可视化数据库中的数据。这些工具是用Java实现的,从数据库中提取信息并显示。有三种显示类型:1)原始数据; 2)绘制值与时间的关系; 3)绘制两个值之间的关系。当您启动数据查看器时,它将与数据库通信,并为您提供一个可以查看的项目列表(参见图4)。这些项目可以跨时间显示(图5),或者可以相对于彼此显示两个项目(图6)。这仍然是一个非常初步的数据查看器,我们项目的重点不是可视化。我们希望其他人也能为该项目的这一方面做出贡献5例为了说明我们的数据收集和分析工具的集成,我们使用了一个我们有真实数据的例子。这个例子是控制程序17见图4。数据查看器允许开发人员选择他们希望显示的项目。图五. 可以跨时间显示多个项目。18见图6。 可以跨时间显示多个项目。美国宇航局约翰逊航天中心的先进生命支持系统[2]。这个生命支持系统,水回收系统(WRS),有70多个传感器和执行器。有四个子系统,由四个独立的控制器控制,在C中实现。这些控制器本身从基于LISP的反应式规划器接收命令。我们为单个子系统检测了其中一个基于C的控制器,并记录了其数据。 我们正在记录其他三个基于C的控制器。此外,本文中描述的所有日志记录都是使用实际硬件的详细模拟完成的。我们目前正在实际运行的系统上安装日志记录我们对单个子系统进行了仪表化,以便所有传感器读数都在“仅更改”的基础上进行记录(这意味着传感器仅在其值更改时进行记录),并且所有执行器命令也都在仅更改的基础上进行记录日志记录命令的一个示例是:rlogRegisterVariable(“HeaterPower“,R_INT,heater_ power)这意味着变量heater_power(其为整数)将在其改变时被记录,并且该变量的标识符是“\HeaterPower”。该变量连接到测量加热器功耗的传感器。此外,我们还记录了由基于LISP的反应式规划器调用的控制函数的入口和出口。同时,我们记录了传递给这些函数的参数。这些功能被基于LISP的反应计划器用来改变控制设定点,查询信息,19关闭或启动各种子系统组件。函数入口日志记录命令的一个示例是:rlogLogFunctionEntry(“turn_valve_enable”);然后将参数记录到函数中rlogEvent( “turn_valve_params”,“string :valve string:value”,params->valve,params->value);其中阀是字符串并且值是字符串(例如,\on”或\o“)。当调用turn valve函数时,这最后两个rlog调用将在数据库中创建一个条目(带有时间戳),同时也为该函数的参数创建一个单独的条目出于数据分析的目的,人们希望为水回收系统制定一条规则,在正确实施控制程序时必须遵守这些规则。例如,有人会说,当芯槽液位超过L时,或者当超低压槽液位超过M且手动泵打开时,瓦特计必须报告一些功率消耗。这可以在ITCL中写为:吸液芯超过L =[吸液芯槽液位>L];溢流&泵=[(溢流槽液位> M)^(手动泵状态'on')];功率消耗=L上的芯\溢流&泵;8it21:功率消耗fit21(功率报告.2003>0)g、第一个公式定义了一个间隔设置,在此期间,芯罐液位超过L。第二个定义了一个间隔设置,其中溢流罐超过液位M,手动泵状态为“开”。第三个陈述定义一个区间集为前两个的并集。最后,最后一个公式说,在每个这样的间隔,瓦特计必须始终报告正功率。一组稍微复杂的公式使我们能够说,每当芯罐达到超过L的液位或溢流罐达到M的液位并且手动泵“打开”时,加热器必须打开至少20个时间单位。20后=“powerdraw)(“powerdraw!20);8it2 2:20 afterfit2 2(加热器状态“on”)g、我们可以使用功率消耗间隔集,因为它之前已经被定义第一公式将间隔集定义为从功率消耗间隔集中包括的间隔开始的二十分钟的时段。最后一个公式表明,在每个这样的间隔中,加热器的状态必须总是“开”。206结论总之,数据收集和数据分析工具使分布式控制程序开发人员能够查看他们的程序正在做什么并验证正确的行为。我们相信它们将使调试和验证分布式程序更容易。至关重要的是工具的可用性{如果工具不容易使用,那么开发人员就不会采用它们。我们试图让我们的日志库像printf一样简单,以鼓励广泛使用。 分析工具需要更多的学习曲线,但我们计划为这些工具提供图形和文本界面。我们鼓励任何有兴趣的人下载我们的日志工具:www.traclabs.com/rlog/并给我们反馈如何改进它们7致谢这项工作得到了NASA资助NAS 2 -99020由NASA艾姆斯研究中心管理。Metrica Inc.的Pete Bonasso TRACLabs是WRS控制系统的首席软件工程师,并与我们一起对控制代码进行了验证和分析。美国宇航局艾姆斯研究中心的马克·雪莉是这个项目的关键参与者,为初步设计贡献了许多想法。引用[1] Appelbe,W.,Stasko和E.陈文辉,应用程式视觉化技术协助平行与分散式程式开发,技术报告TR GIT-GVU-91-08,乔治亚理工学院(1991)。[2] 博纳索河P.,NASA先进水回收系统的智能控制,载于:第六届国际空间人工智能、机器人和自动化研讨会论文集(i-SAIRAS 2001),2001年。[3] 博 纳 索 河 P. , R. J. Firby , E.Gat , D.Kortenkamp , D.P. Miller 和M.Slack , Experiences with an architecture for intelligent , reactiveagents , Journal of Experimental and Theoretical Arti cial Intelligence9(1997)。[4] 希思,M。和j.陈文辉,并行程序的性能分析,北京:计算机科学出版社,1991。[5] Jahanian,F.和A. K.莫文蔚,实时系统中时序特性的安全分析,IEEE软件工程学报12(1986)。[6] Kleiman , S. , D.Shah 和 B.Smaalders , \Programmingwiththreads,”SunSoft Press,Mountain View CA,1996。[7] Lehr,T.,D.布莱克,Z。Segall和D.陈文荣:马赫数核心监控器的描述、示例和测量,技术报告TR CMU-CS-89- 131,卡内基梅隆大学(1989).
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功