码迷,mamicode.com
首页 > 其他好文 > 详细

GISOO通信

时间:2021-01-05 11:31:55      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:height   c中   取数据   命令   设计   图片   下一步   serial   nec   

GISOO通信--

https://github.com/araujokth/kth-gisoo/wiki/Installing-GISOO

简介

GISOO代表Simulink和COOja的图形集成,并且名称代表GISOO中的每个模拟应该包括两个模拟的组合,一个在Cooja中,另一个在Simulink中,它们与数据通信的可能性同步。事实上,所有无线系统(也可以包含控制器)都将在Cooja中进行模拟,系统将在Simulink中进行模拟,每当Cooja中的模拟系统需要测量系统中的某些变量或在那里驱动一些执行器时,传感器Cooja中的执行器或执行器将发送传感器值请求或将驱动数据发送到Simulink模型中与镜像模型接触的镜像传感器或执行器,它们可以接收所请求的传感器数据或应用驱动值。下图显示了GISOO的一般视图,它可以显示Cooja和Simulink中的镜像元素以及与植物相关的微粒的位置。 (下图显示了控制器位于其中一个控件中的情况,但也可以将控制器放在PC中)

 

 

技术图片

 

 

为了使上述系统工作,我们需要能够进行适当的数据通信,并且两个系统都应该同步工作。因此,创建GISOO的主要事实是提供适当的数据通信系统和准确的同步。以下部分将说明为实现这些目标而设计和实施的部件的详细信息。由于数据通信也用于同步,首先我们需要了解数据通信细节。

数据通信

在GISOO中准备模拟的第一步,我们需要将所有无线节点添加到Cooja环境中,然后在下一步中我们需要激活Cooja(GISOO-Simulink插件)中提供的GISOO插件来处理GISOO的数据通信和同步。此插件将创建一个UDP端口,端口号等于“18000 + Mote-id”,它将侦听此端口以接收来自Simulink的与此mote相关的数据。这意味着Cooja中的每个微尘都有自己特定的UDP端口来接收数据。

 技术图片

 

另一方面,Simulink模型有不同的情况,所有模型都将从一个预定义的UDP端口接收数据,默认端口号为55555.这意味着Simulink甚至是Simulink的特定部分应该接收的所有数据模型应该发送到这个端口。

 

技术图片

 

 

仿真过程

在GISOO中,Cooja负责控制模拟程序。这意味着Cooja将开始模拟无线系统,直到Cooja中的一个节点需要向系统模型发送或从系统模型接收一些数据。这可能发生在四种情况:

  • 传感器微尘需要感测一些传感器数据。
  • 执行器微尘需要在系统上施加一些作动值。
  • 微尘需要发送一些串行数据。
  • 微尘需要接收一些串行数据。

在任何这些情况下,Cooja中的微尘都会向Simulink模型发送一条消息,告知Simulink哪个时刻需要哪种动作。为了实现这一目标,已经设计了特殊的消息结构。此消息包含四个不同部分:

  • 模拟时间
  • mote-ID
  • 驱动值(uValue)
  • 串行数据

模拟时间(4个字节):在消息结构中考虑用于承载模拟时间的前四个字节(以毫秒为单位)。事实上,Cooja将运行直到mote需要与Simulink进行特殊通信,然后它将生成一条消息并将Cooja中的模拟时间添加到消息的开头。另一方面,Simulink将暂停模拟,直到收到Cooja的消息。然后在第一步中,它将从消息开始提取Cooja时间,并运行Simulink模拟以达到特定时刻。此过程将在本页的同步说明中进行说明。

 

Mote-Pin-ID(4字节):每当由Cooja中的微尘生成的消息时,Simulink作为接收者应该知道该消息来自哪个微尘并且应该影响该微尘的哪个部分(引脚)。例如,当id = 4的微尘需要从其ADC1读取数据时,在将被发送到Simulink的消息中,“mote-id”和“ADC1(我们称之为引脚号)”都应该清楚。为此,我们通过此方法创建了一个名为mote-pin-id的数字:

mote-pin-id = Mote-id*100 + pin number

and considered pin-ids are:

  • ADC0 - ADC12 = 0 - 12
  • DAC0 - DAC1 = 16 - 17
  • Serial data to be sent to Simulink = 18
  • Serial data to be received from Simulink = 19

执行值(uValue  -  4个字节):虽然只有部分消息用于向系统应用激励值,但由于GISOO中需要修复消息格式,这四个字节将在所有消息中,但这些字节只有当Cooja中的微尘想要对系统施加驱动值时,它们才会获得价值。 

串行数据(16字节):出于与启动值相同的原因,所有消息都将携带16字节的串行消息,但只有在需要将某些串行数据从Cooja传输到Simulink或其中时才会使用它们。反之亦然。

下图显示了GISOO的设计消息结构的模式。

技术图片

 

 

同步

GISOO的另一个重要因素是其精确的同步系统。在已提到的GISOO中,Cooja将控制模拟时间,因此Cooja将运行其模拟,直到Cooja中的微尘需要向Simulink发送或从Simulink接收一些数据。在这一刻,Cooja中用于该mote的GISOO插件将创建一条消息并将其发送到Simulink,其中包含Cooja中的准确模拟时间(以毫秒为单位)。一旦插件发送消息,它将在那一刻暂停模拟以接收来自Simulink的回复。此回复可以是传感器值或串行数据或确认,但接收数据很重要,否则Cooja将不会继续其模拟。 Cooja中的暂停始终通过在发送数据后执行“接收”命令来创建。由于“接收”命令是阻塞功能,因此模拟将保持该时刻,直到它可以读取某些数据并通过该状态。以下代码显示了代码的一部分,该代码发送ADC值请求并在模拟中暂停,直到接收到该时刻的ADC。

 

另一方面,Simulink从一开始就处于暂停模式,它会等到收到来自Cooja的消息。一旦收到消息,它将在Cooja中提取模拟时间,然后它将继续模拟,直到它到达Cooja中的模拟时间,然后发回所请求的数据或在那一刻应用驱动数据。两条消息之间的持续时间是Simulink可以独立于Cooja模拟运行模拟的持续时间,因为通常Simulink比Cooja快得多,Simulink可以在很短的时间内捕获Cooja中的模拟时间。取决于Simulink中系统模型的复杂性。下图显示了GISOO中同步和消息通信的组合。

 技术图片

 

 

GISOO Simulink library

GISOO使用其特定的Simulink库,这部分将解释设计系统的细节,以实现模拟中的正确功能。

 

GISOO仿真环境

GISOO-Simulink-library包含一个主块,用于处理同步和数据通信(在Simulink中接收数据),称为“GISOO-Simulation Environment”。这个模块模拟了Simulink中的Cooja环境及其内容,如果我们需要在Simulink中实现控制器模型,它应该被添加到这个模块中。系统模型应位于此区块之外。在这里和这里可以找到更多的解释和例子。 “GISOO-Simulation Environment”块是一个do-while块,它可以暂停模拟系统模型“while”它没有收到Cooja的新时间,并且在收到来自Cooja的模拟时间后“do”继续模拟系统模型

该块也应该能够连续接收来自Cooja的消息,为此我们添加了可以处理接收数据的附加部分。下图显示了“GISOO_Simulation_Environment”块。

 

技术图片

 

 

 

“GISOO_Simulation_Environment”内部如下图所示。如图所示,它包含一个GISOO-Simulink插件块,负责从Cooja接收数据,并且它将同步Simulink和Cooja。另一个块是“SynchronizerLoop”,它只控制Simulink中的do while循环。

 技术图片技术图片

 

 

 

 

 

下图显示了整个“GISOO-Simulink插件”。如图所示,该块将从Cooja接收消息并提取Simulation-Time,mote-pin-id,uValue和串行数据,并将Simulink中的Simulation时间与Cooja中的Simulation时间进行比较,如果是Simulink落后,它将继续模拟到达适当的时间。图片右上角的三个块显示了while循环将执行的最大迭代次数。此数字将配置Simulink可以等待从Cooja接收消息的最长时间,如果Simulink在此期间未收到任何消息,则会将其视为与Cooja通信时出现问题的结果,并避免不确定的模拟循环,停止块将停止Simulink Simulation,它将在屏幕上显示一条消息。 (如果在场景中你需要更大的时间间隔来接收来自Cooja的消息,你可以增加该块的默认值,在下图中为300000。)

技术图片

 

 

下图显示了Stop块在达到其最大迭代次数之前无法从Cooja接收消息时创建的消息。技术图片

 

 

SKY-mote

SkyMote bloke旨在模仿真实微尘的动作,例如读取ADC,在DAC上写入以及在Simulink中发送和接收无线电数据。下图显示了SkyMote块的结构。该块将从“GISOO-Simulation-Environment”中的“CoojaConnector”块接收四个数据:

  • Time-Is-Correct:是一个布尔值,表示Simulink时间是否等于从消息收到的     Cooja时间。
  • 接口标识符:mote-pin-id的值,已在数据通信中进行了解释
  • uValue:是DAC的驱动值,它也在数据通信中得到了解释
  • 输入串行数据:是从Cooja接收的串行数据。 

除了上述值之外,SkyMote还可以从mote输入接收输出串行数据。

在mote结构图中,左边的第一个彩色列(浅橙色)是代表motes的pin-id的常数块。 pin-id的值已在数据通信中解释。这些值将用于找出接收的数据属于哪个引脚。

其他三个彩色列是三个过滤器,最终可以根据接收的数据在微尘中做出正确的动作。 

左侧的第一个过滤器列以浅绿色显示,将发现接收到的pin-id是否与已比较的常数相同。对于Simulink中收到的每条消息,这些块中只有一个将返回true,其余块将为false。 

在第二次比较中,首先从mote-pin-id值中提取mote-id的值,然后将该值与Simulink中的mote的id进行比较。如果比较的结果为真,则表示收到的消息属于此mote,否则它属于某些其他节点。在最后一步中,我们将“比较”(逻辑和)此比较的布尔结果与前一个过滤器的结果,并且此AND可以被视为已在橙色列中显示的第二层过滤。

最后,最后一个过滤器将检查Simulink中的模拟时间是否与我们在收到的消息中收到的Cooja中的模拟时间完全相同。此步骤也将通过在GISOO-Simulink插件(IsTimeCorrect)中执行第二个过滤器的结果和接收到的布尔值之间的逻辑AND来实现,并创建在图片中以黄色显示的第三个和最后一个过滤器。只有能够通过滤波器所有这些层的数据才能激活正确的动作块,该动作块将执行ADC读取或应用DAC值或接收串行数据或发送串行数据。由于我们总是使用ADC0和ADC1,我们只使用它们,我们在块模型中终止其余的ADC。但它们可以在需要的情况下使用。 (ADC5应该是活动的但是没有使用,因为Cooja中有一些未经研究的问题。)

技术图片

 

 

需要额外程序的唯一操作是发送串行数据。因为当我们想要将数据发送到mote的串行端口时,我们应该创建一个完整的串行消息,包括它的头,有效负载(串行数据)和页脚,在这个模型中我们也传递了来自专门设计的块的串行数据创建一个串行消息。(该块在上图中以浅蓝色显示)串行消息的结构可以在TEP 113中找到。但应该提到的是,CRC的两个字节应该在P上创建结束有效载荷。 (在TEP-113结束时提到的有效载荷结束之前不会超过S)

 

GISOO通信

标签:height   c中   取数据   命令   设计   图片   下一步   serial   nec   

原文地址:https://www.cnblogs.com/csymemory/p/14222519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!