1.一种基于NS3和MATLAB的网络化控制系统协同仿真方法,含有以下步骤:
(1)设计网络化控制系统协同仿真平台总体方案;
步骤11:设计仿真平台系统架构;
仿真平台系统从功能上可以划分为控制层、通讯层和模型层三部分;控制层由MATLAB用户交互界面组成,负责监控系统的整体运转情况,实现系统参数、控制参数的设置,下发通讯命令、控制命令以及接收仿真模型中采集的的数据信息;通讯层的功能通过协同仿真套接字模块实现,主要负责MATLAB与NS3之间数据的交换;模型层使用接收到的仿真模型控制指令与仿真模型运行所需的数据作为输入,此外两种模拟器分别调用各自的仿真驱动模块推进仿真过程;
步骤12:确定网络化控制系统协同仿真平台组成模块;
仿真平台NS3的组成模块包括NS3 core模块,NS3仿真脚本,NS3节点个数与拓扑文件模块,application模块、wifi模块、LTE模块与移动模型模块等多个模块,MATLAB组成模块包括MATLAB仿真驱动模块,Simulink控制系统模型,MATLAB客户端组件,MATLAB用户交互界面,MATLAB基础工作空间与仿真跟踪统计与可视化模块;
步骤13:确定协同仿真平台数据交换与传递方案;
对于仿真软件间的数据交换,采用将MATLAB作为仿真的主导软件,利用socket套接字实现两仿真进程运行协同仿真时的进程间通信,并使用建立文件缓存区的方式将仿真中初始的初始节点个数与节点位置传递给NS3仿真场景脚本进行解析,同时MATLAB协同仿真界面中设置的NS3仿真场景的初始参数将通过MATLAB的system命令来启动NS3仿真进程,并使用参数初始化仿真场景;
对于单模拟器内的数据传递,涉及到协同仿真界面中的参数与MATLAB基础工作空间的信息交换,MATLAB中客户端组件与MATLAB基础工作空间中信息的交换以及Simulink与MATLAB工作空间的信息交换;
(2)设计网络化控制系统协同仿真平台时间同步方案;
步骤21:协同仿真系统是一种对实时性和时序严格要求的仿真系统,需要通过同步推进两仿真器执行,但由于MATLAB/Simulink与NS3的仿真驱动方式不同,MATLAB/Simulink为时间驱动,而NS3为事件驱动,因此两仿真器对协同仿真同步事件的视角与定义将有所不同;
步骤22:设计了三种协同仿真时间同步方案,并选择其中两种予以实现;
三种不同的同步方案分别为时间步进、主从式和全局事件驱动同步;根据仿真目标场景的不同,选择后两者进行实现,主从式同步用于实现时间驱动的协同仿真方案,主从式同步考虑了同步周期步长内异步网络事件对控制系统的影响,因而不会累积系统误差,然而主从式同步没有考虑到控制系统对异步网络事件的及时响应,控制系统仅能在周期同步事件时间点执行周期发送事件时触发网络事件;全局事件驱动同步用于实现基于控制器事件驱动的协同仿真方案,主从式同步既没有累积系统误差又能控制系统及时响应某些非周期的异步网络事件;
步骤23:设计同步交互模型;同时为了实现与Simulink模型的交互,对同步交互模型进行改进,因为需跳出客户端程序运行Simulink模型,则采用客户端不断建立TCP连接又关闭套接字断开连接的方式进行交互,在客户端建立与断开连接之间将发送与接收结构体用于同步;此时NS3的服务器将作为迭代服务器存在,主套接字用于侦听客户端的连接请求,而主套接字将不断创建关闭子套接字,子套接字用于接收新的连接请求以及发送与接收结构体;
(3)NS3各模块程序设计;
步骤31:在专利《基于TCP协议的NS3与MATLAB集成的联合仿真接口方法》中提供了对NS3默认仿真器、UDP应用程序类以及其助手类的改进,此外为了记录下客户端发送的数据包的编号、数据包的状态编号、多包传输下状态数和数据包的发送时间,分别设计了PacketNumTag、PacketPortTag、StateNumTag以及SendTimeTag四种标签类;
步骤32:设计NS3仿真脚本;
用户在使用NS3时需要编写仿真脚本来搭建网络仿真场景,仿真场景的通过waf工具进行编译和运行,仿真脚本的执行流程如下:执行主函数→使用初始化列表初始化测试脚本类→利用命令行参数来设置仿真参数→运行Run()函数开始搭建仿真场景→运行SeedManager()函数设置仿真的随机数种子→运行Configure_phyMode_Defaults()函数配置物理层传输模式并配置全局参数→运行CreateNodesphymacmobility()函数,其功能包括:1.从NS3节点个数与拓扑文件模块中提取节点个数与节点位置2.使用回调函数为设备添加物理层和mac层的发送和丢包跟踪3.为节点配置移动性质与节点位置回调4.配置物理层(信道模型)和mac层并安装通信设备在节点上,并开启网络跟踪文件生成,有ascii和pcap两种文件类型→运行Set_ExternallyDrivenSim_config()函数配置外部驱动模拟器的参数→运行InstallInternetStack()函数安装internet协议栈,其功能包括:1.安装IP层路由协议,开启路由表跟踪文件生成2.安装internet协议栈并为所有节点设备的接口分配IP地址→运行InstallApplication()函数,其功能包括:1.选择安装TCP或UDP的应用程序2.如果用户选择LTE网络,激活边链路承载,并配置LTE网络跟踪文件生成3.如果期望协同仿真使用设定的延迟与丢包率运行,运行Set_delayloss()函数进行设置→运行SetupWaveMessages()函数,如果用户的物理层模式选为WAVE协议,设置并发送bsm(基本安全消息)数据包→运行ConfigureLogTracing函数生成一些额外的跟踪文件,并判断是否开启log系统中必要的日志组件→运行Runsimulation()函数,其功能为配置网络节点动画,数据流量文件生成→仿真场景搭建完毕,启动并结束仿真;
(4)MATLAB/Simulink各模块程序设计;
步骤401:设计MATLAB仿真驱动模块;
MATLAB仿真驱动模块由一组互相紧密关联的MATLAB脚本子模块组成,包括仿真初始化模块、仿真主循环模块、单步仿真驱动模块、通知解析与单步规划模块、Simulink仿真启停控制模块;
步骤402:设计仿真初始化模块;
仿真初始化模块用于初始化仿真运行的一系列参数,以及打开需要进行仿真的Simulink模型文件,同时让Simulink执行一个求解步长的时间以启动控制系统仿真,当用户在协同仿真交互界面中按下Simulink初始化按钮时,该脚本将运行;仿真初始化模块时间驱动与事件驱动的差异在于初始化参数略有不同,同时在事件驱动下该模块将会保存该求解步长后的节点发送状态,用于采用事件驱动的客户端设置通知结构体中的发送数据包的触发信号;
步骤403:设计仿真主循环模块;
仿真主循环模块通过交互界面的开始协同仿真按钮触发运行,仿真主循环模块将不断循环运行仿真中MATLAB时间轴中的协同仿真事件之间的单步,以推进MATLAB/Simulink中控制系统的仿真过程,另外仿真主循环模块将创建进度条以不断更新显示整个协同仿真的进度;仿真主循环模块时间驱动与事件驱动的差异仅仅在于:模块开始运行时,采用时间驱动的模块将会使用调用mex编译器编译时间驱动的客户端源程序生成客户端组件,在接下来的整个仿真过程中将一直使用该组件完成与NS3的交互,而采用事件驱动的仿真主循环模块不会执行该步骤;
步骤404:设计单步仿真驱动模块;
通过单步仿真驱动模块运行仿真中MATLAB时间轴中的协同仿真事件之间的单步,单步仿真驱动模块在两种驱动方式的流程将大不相同,采用时间驱动时将会直接运行仿真主循环模块中编译生成的时间驱动客户端组件,而在事件驱动下每次与NS3进行同步时,客户端通知结构体中的发送数据包的触发信号被设置修改,为了确保修改值被正确发送,每次运行单步仿真驱动模块前都将编译一次事件驱动客户端源文件;之后,单步仿真驱动模块将分别运行各自的通知解析与单步规划模块和Simulink仿真启停控制模块,事件驱动下还需要运行控制器响应模块已完成可能的控制器响应;最后,将会删除求解步长的最大和最小值以及外部输入变量,消除每次运行单步时由这些变量维度不一致而导致的仿真异常;
步骤405:设计通知解析与单步规划模块;
客户端利用接收到的通知结构体生成的文本文件,通知解析与单步规划模块读取这些文本文件并解析,之后通知解析与单步规划模块根据不同的方式规划接下来一个单步中的仿真参数与过程;通知解析与单步规划模块实现的核心思想在于:控制系统仿真复现了同样单步内网络仿真中控制系统的运行情况,另外通知解析与单步规划模块定义了两种应用层的数据包处理模式,一种方式是设置接收数据包延迟的阈值,防止接收延迟过大的数据包,另一种则是将当前接收事件的数据包编号与之前接收事件后仿真使用的数据包编号进行比较,如果当前接收到数据包的编号大于之前的接收的数据包的编号,则采用该数据包内数据,否则则丢弃该数据包数据;通知解析与单步规划模块在两种驱动方式下的设计思想与运行流程也很不相同,在时间驱动下,单步为一个同步周期步长,如果同步周期步长内没有接收到数据包,该单步内将该数据包延迟近似为一个同步周期步长,通过获得节点在每个接收事件时延跨过的同步周期步长的个数以及在当前步长内的时间长度,将该同步周期步长内求解步长索引取值范围分割成一系列上下限的组合,这些组合将会用于确定接下来分段执行该同步周期步长仿真的求解步长的索引,同时收集每一次数据包接收事件的相关信息保存到结构体,并根据接收事件的先后次序将结构体进行冒泡排序,排序后的结构体将用于之后依次复现接收数据包事件,而在事件驱动下,单步为相邻两次同步之间的仿真时间,因此只需通过该仿真时间对应的求解步长索引的上下限即可执行该单步;另外不同于时间驱动使用真实数据包延迟确定某段仿真的求解步长索引的下限,事件驱动采用“推算”延迟来确定该单步的求解步长索引的下限;
步骤406:设计Simulink仿真启停控制模块;
仿真启停控制模块直接控制Simulink中控制系统仿真模型以完成一个单步的仿真,仿真启停控制模块通过在每个求解步长使用set_param函数调用Simulink仿真命令start、pause、step与stop实现在每个求解步长启停Simulink仿真,以达到在某一精确时间点更新系统外部输入的目的;在时间驱动下依次执行通知解析与单步规划模块中得到的单步中各接收数据包事件序列,在接收数据包事件发生时采用新的求解步长索引的上下限,并更新模型的外部输入,循环启停执行每个求解步长直到下一个事件点,当事件序列没有剩余事件时该单步执行完成,而在事件驱动下仅通过某单步的求解步长索引的上下限运行相邻两次同步之间的仿真,之后更新外部输入变量为下一次交互事件中接收到的该模型的外部输入;当该单步运行完成后将对控制系统的节点位置与速度信息进行收集并设置冗余节点发送的触发信号;
步骤407:设计Simulink暂停回调模块;
在Simulink仿真模型中设置回调函数Stopfcn,回调函数Stopfcn将在每个求解步长暂停时回调Simulink暂停回调模块,Simulink暂停回调模块根据仿真的两种驱动方式选择运行两种回调子程序,将仿真中每个求解步长中控制系统的内部状态与输出保存到相应变量中,并写入到文本文件中;
步骤408:设计控制器响应模块;
在事件驱动模式下,控制器响应模块执行每次控制器接收到数据包后计算控制量的任务,并保存该事件下的控制系统各节点数据包发送标志供客户端读取;类似Simulink仿真启停控制模块中的启停方式,控制器响应模块判定控制器接收到数据包且控制器不该丢弃数据包,则运行一个求解步长以获得控制器的控制量,执行完该求解步长后仿真将回退到执行该求解步长前的状态,因为执行控制器响应模块的目的仅仅是为了获得控制器的控制量,回退的目的是为了防止协同仿真时间不一致的问题;
步骤409:设计仿真模型关闭模块;
步骤410:设计Simulink控制系统模型;
将某一控制系统中的传感器和执行器看做为依赖被控对象的同一节点,而控制器看做是另一节点;因此在Simulink的控制系统文件中创建两个子系统模块以代表两个节点;
步骤411:设计MATLAB客户端组件;
MATLAB客户端组件也根据驱动方式的不同分为两种,客户端从MATLAB工作空间以及文本文件中获得Simulink仿真一个单步的结果,并将其自定义封装后发送给NS3循环服务器,之后进入阻塞模式直到收到NS3发送的包含新一轮仿真结果的数据包,数据包解析完成后客户端将关闭;
步骤412:设计MATLAB用户交互界面;
据需求分析,将用户根据不同仿真场景需要把用户可设置的仿真参数分为全局参数、控制系统参数、节点网卡参数、NS3参数以及冗余节点发送设置参数,此外用户可以使用仿真模型的载入、协同仿真过程的控制、仿真结果的绘制、仿真场景动画演示和重置退出界面
5个功能。