基于 MATLAB 平台、Simulink 仿真工具和 TrueTime 工具箱的网络控制系统的仿真方法 附完整代码

通过动手实践了解网络控制系统的架构及运行控制原理

熟悉使用基于 MATLAB 平台、Simulink 仿真工具和 TrueTime 工具箱的网络控制系统的仿真方法

考察不同丢包率下网络控制系统状态、输出和控制曲线的影响

研究丢包率对无线网络传输的网络控制系统的稳定性的影响

二、仿真平台构建

Truetime 是瑞典隆德(Lund)大学自动化系 MartinOhin,Dan Henriksson 和 Anton Cervin 于 2002 年推出的基 于 MATLAB/Simulink 的网络控制系统仿真工具箱。针对每一特定的网络协议,该工具箱可以实现控制系统与实时调 度的综合仿真研究,是目前网络控制系统理想的虚拟仿真工具之一。

本次实验使用 Truetime2.0 工具箱的七大模块中的 TrueTime Kernel 模块和 TrueTime Wireless Network 模块。 其中,系统的传感器、执行器和控制器由 TrueTime Kernel 表示,无线网络由 TrueTime Wireless Network 表示。传感器采用时钟驱动的方式进行周期性采样,控制器和执行器采用事件驱动方式。

在确定各个功能模块之后,需要对各模块进行初始化,即初始化模块内核,定义消息函数并设置消息调度策略 和初始化网络端口并设置节点对应的网络端口代号。

三、实验步骤


对于本次仿真实验,按照 Truetime 仿真流程,我将实验步骤分为三步:建立数学模型,功能模块图仿真和编写 相关代码。

3.1 建立数学模型

这一部分简要重述该网络控制系统的数学模型。 已知直流电机的传递函数为:

该电机通过网络 IEEE 802.11b/g(WLAN)的方式进行远程控制,系统的控制结构如下图所示:

图 1 单闭环网络控制系统流程图

假设传感器采用时钟驱动的方式进行周期性采样,控制器和执行器采用事件驱动方式。存在网络丢包现象, 其状态空间模型可以描述成

其中初始状态为

,p 为丢包概率,p=0 表示无数据丢包,p=1 表示有数据丢包,假设不会发生连续丢包。给定控制器为

3.2 功能模块图仿真

这一部分主要介绍基于 Simulink 及 Truetime 工具箱的模块图绘制。通过理解 wireless 和 network 两个示例文 件,搭建本次实验的网络控制系统的功能模块图,如图 2 所示。

图 2 仿真系统功能模块图

其中,TrueTime Wireless Network 模块模拟了网络部分,可以更改丢包率(Loss Probability)这一参数。在 Regulator Node 中的 TrueTime Kernel 中,模拟了控制器从网络中接收 y(k),并生成 u(k),将 u(k)发送到网络中的过 程。在 Sensor/Actuator Node 的 TrueTime Kernel 中,模拟了传感器到控制器再到执行器节点的过程,执行器从网 络中接收控制信号 u(k);进行零阶保持;若丢包贼改成 u(k-1),若不丢包则改成 u(k);再通过状态转移及传输延迟 生成输出信号 y(k);再讲数字信号 y(k)发送至网络。如此形成闭环网络控制系统。仿真过程可参考图 3。

在搭建的过程中,依照数学模型的参数对部分模块的参数设置做出调整。

图 3 NCS 离散仿真流程图

3.3 编写相关代码

通过研究 TrueTime 2.0-reference manual 及阅读 wireless 文件夹中的相关代码后,可将代码编写分为两个步骤 依次进行,模块初始化和编写任务代码。模块初始化针对控制器(Regulator)和执行器/传感器(Sensor/Actuator), 任务代码仅针对控制节点(Regulator Node)。

3.3.1 模块初始化

对控制器(Regulator)和执行器/传感器(Sensor/Actuator)的初始化可直接参照 wireless 中的 regulator.m 文 件和 actuator_init.m 文件进行,无需改动。代码如下:

 function regulator_init

 % Distributed control system: regulator node  %
 % Receives messages from the sensor node, computes control signal
 % and sends it back to the actuator node. 7.
 % Initialize TrueTime kernel
 ttInitKernel('prioFP'); % fixed priority
 ttSetKernelParameter('energyconsumption', 0.010); % 10 mW

 % Create mailboxes
 ttCreateMailbox('sensor_signal', 10)
 ttCreateMailbox('power_ping', 10)
 ttCreateMailbox('power_response', 10) 16.
 % Controller parameters 
  h = 0.010;
 N = 100000;
  Td = 0.035;
 K = 1.5;

 % Create task data (local memory)
 data.u = 0.0;
 data.K = K;
 data.ad = Td/(N*h+Td);
 data.bd = N*K*Td/(N*h+Td);
 data.Dold = 0.0;
 data.yold = 0.0; 
 % Create controller task
 deadline = h;
 prio = 1;
 ttCreateTask('pid_task', deadline, 'ctrlcode', data);
 ttSetPriority(prio, 'pid_task'); 36.
 % Create power controller task
 offset = 2;
 period = 0.025;
 prio = 2;
 power_data.transmitPower = 20;
 power_data.name = 2;    % We are node number 2 in the network
 power_data.receiver = 1; % We are communicating with node 1
 power_data.haverun = 0; % We have not run yet
 ttCreatePeriodicTask('power_controller_task', offset, period, 'powctrlcode', power_data);
 ttSetPriority(prio, 'power_controller_task'); 47.
 % Create power response task
 deadline = 100;
 prio = 3;
 ttCreateTask('power_response_task', deadline, 'powrespcode');
 ttSetPriority(prio, 'power_response_task'); 53.
 % Initialize network
 ttCreateHandler('nw_handler', 1, 'msgRcvCtrl');
 ttAttachNetworkHandler('nw_handler');
 function actuator_init

 % Distributed control system: actuator node 
  %
 % Receives messages from the controller and actuates
 % the plant. 7.
 % Initialize TrueTime kernel
 ttInitKernel('prioFP'); % fixed priority
 ttSetKernelParameter('energyconsumption', 0.010); % 10 mW 11.
 % Create mailboxes
 ttCreateMailbox('control_signal', 10)
 ttCreateMailbox('power_ping', 10)
 ttCreateMailbox('power_response', 10) 16.
 % Create sensor task
 data.y = 0;
 offset = 0.0;
 period = 0.010;
 prio = 1;
 ttCreatePeriodicTask('sens_task', offset, period, 'senscode', data);
 ttSetPriority(prio, 'sens_task'); 
 % Create actuator task
 deadline = 100;
 prio = 2;
 ttCreateTask('act_task', deadline, 'actcode');
 ttSetPriority(prio, 'act_task'); 30.
 % Create power controller task
 offset = 2.07;
period = 0.025;
 prio = 3;
 power_data.transmitPower = 20;
 power_data.name = 1;    % We are node number 1 in the network
 power_data.receiver = 2; % We are communicating with node 2
 power_data.haverun = 0; % We have not run yet
 ttCreatePeriodicTask('power_controller_task', offset, period, 'powctrlcode', power_data);
 ttSetPriority(prio, 'power_controller_task');

 % Create power response task
 deadline = 100;
 prio = 4;
 ttCreateTask('power_response_task', deadline, 'powrespcode');
 ttSetPriority(prio, 'power_response_task'); 
 % Initialize network
ttCreateHandler('nw_handler', 1, 'msgRcvActuator');
 ttAttachNetworkHandler('nw_handler');
3.3.2 编写任务代码
 function [exectime, data] = ctrlcode(seg, data) 2.
 switch seg
  case 1
   % Read all buffered packets
   temp = ttTryFetch('sensor_signal');
   while ~isempty(temp)
     y = temp;
     temp = ttTryFetch('sensor_signal');
  end
  if isempty(y)
    data.u = data.old; % 丢包,保持 u(k-1)
  else
    data.u = -0.005 * (y(1) + y(2)); % 不丢包,保持 u(k)
  end
  exectime = 0.0005; 17.
 case 2
msg.msg = data.u;
msg.type = 'control_signal';
ttSendMsg(1, msg, 80);   % Send 80 bits to node 1 (actuator)
 exectime = -1; % finished
 end

四、实验结果分析


4.1 不同丢包率下三条结果曲线

当丢包率分别为 0.3 和 0.6 时系统状态曲线、输出曲线和控制曲线如图 4 和图 5 所示。显然,在丢包率为 0.3 和 0.6 时,系统是稳定的。

图 4 丢包率为 0.3 时,系统状态曲线、输出曲线和控制曲线

图 5 丢包率为 0.6 时,系统状态曲线、输出曲线和控制曲线

4.2 不同丢包率下稳定性分析

根据上课讲解的 Bernoulli 过程的线性跳变系统,建立新的系统状态变量

由是否丢包情况下两种不同的控制率,即:

结合系统离散状态方程:

其中,

采样周期为 0.01s。

由 Lyapunov 稳定性判据可知,

运用 LMI 工具箱对 P>0 进行求解,得到当丢包率大于等于 0.96 时,系统不满足均方稳定(MSS),当丢包率小于等于 0.95 时,系统是均方稳定的。

 h=0.01;
 eAh=[1 1-exp(-h);0 exp(-h)];
 A01=eAh-[h h+exp(-h)-1;0 1-exp(-h)]*[0;1000]*[0.005 0.005];
 A0=[A01(1),A01(3),0;A01(2),A01(4),0;-0.005,-0.005,0];
 tmp=[h h+exp(-h)-1;0 1-exp(-h)]*[0;1000];
 A1=[eAh(1),eAh(3),tmp(1);eAh(2),eAh(4),tmp(2);0,0,1];
 c=zeros(1,120);
 i=1;
 for p=0:0.01:1
 setlmis([]);
 P=lmivar(1,[3,1]);
 lmiterm([-1,1,1,P],1,1);%P>0
 lmiterm([2,1,1,P],(1-p)*A0',A0);
 lmiterm([2,1,1,P],p*A1',A1);
 lmiterm([2,1,1,P],-1,1);
 lmis=getlmis;
 [tmin,xfeas]=feasp(lmis);
 if tmin>0
 c(i)=p;
 i=i+1;
 end
 %P=dec2mat(lmis,xfeas,P);
end
 c

为了观察不稳定情况下,系统状态曲线、输出曲线和控制曲线的走势,我重新设置丢包率为 0.98,这时三条曲 线走势如图 6 所示。

图 6 丢包率为 0.98 时,系统状态曲线、输出曲线和控制曲线

完整代码:https://download.csdn.net/download/weixin_55771290/87407365

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
控制系统建模与仿真 基于matlabsimulink实现》是一本介绍如何使用MatlabSimulink进行控制系统建模和仿真的书籍。Matlab是一种强大的数值计算和编程环境,而SimulinkMatlab的一个扩展模块,专门用于模拟和仿真动态系统。 这本书首先介绍了控制系统的基本概念和原理,包括传递函数、状态空间和反馈控制。然后,书中详细介绍了如何使用MatlabSimulink进行控制系统的建模。读者可以学习如何使用Matlab进行数值计算和编程,以及如何使用Simulink进行系统建模。 书中的案例涵盖了多个不同的领域和应用,包括机械系统、电气系统和化学系统等。每个案例都具有明确的目标和要求,读者可以按照书中的指导完成建模和仿真实验。通过这些案例,读者可以学习如何将实际问题转化为数学模型,并使用MatlabSimulink进行仿真和分析。 值得一提的是,MatlabSimulink具有友好的界面和丰富的工具箱,可以方便地进行系统建模和仿真。同时,MatlabSimulink还支持多种不同的控制系统设计和分析方法,如PID控制、根轨迹分析和频域分析等。这本书也详细介绍了这些方法的原理和实践。 总的来说,《控制系统建模与仿真 基于matlabsimulink实现》是一本很好的学习材料,可以帮助读者快速入门控制系统建模与仿真的基本技能。无论是对于学习控制理论的学生,还是对于工程师和研究人员来说,这本书都将提供有价值的指导和实践经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机毕设论文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值