网络控制系统的稳定性分析1、引言人类社会是不断向前发展的,促使这种发展最大的动力莫过于人类的创造力,人类利用自己这种特有的能力在改造着自然,同时也在不断改变着人类社会和人们的思维方式。
正是由于人类在自身发展过程中不断的创造和探索,特别是随着科学技术的不断发展,这种变革的速度也越来越快。
现在科技的进步日新月异,各种新技术不断涌现,网络控制系统(Networked Control Systems, NCS)是最近几年随着控制技术、计算机技术、通信网络技术发展起来的,是控制系统新的发展方向,是复杂大系统控制和远程控制系统的客观需求。
NCS的典型结构图如图1所示。
传感器、执行机构和驱动装置等现场设备的智能化为通信网络在控制系统更深层次的应用提供了必需的物质基础,同时通信网络的管理和控制也要求更多地采用控制理论技术和策略,而高速以太网和现场总线技术的发展和成熟解决了网络控制系统自身的可靠性和开放性问题,这都使得网络控制系统发展更具有现实性。
使用专用或公用计算机网络代替传统控制系统的点对点控制结构,实现传感器、控制器、执行器等系统组件之间的控制信息互相传递。
在这样的控制系统中,检测、控制、协调和指令等各种信息都可通过公用数据网络进行传输,而估计、控制和诊断等功能也可以在不同的网络节点中分布执行。
NCS广泛应用于汽车工业、制造业、交通管理与控制、机器人远程操作、高级的航天航空器和电气化运输工具等各种应用中。
图 1 网络控制系统典型结构图然而,在网络控制系统中由于通信网络的介入,使得控制系统的分析和综合更为复杂。
首先,由于控制系统的信息在网络中传输,网络调度是一个很重要的问题,怎么让时间同步,避免网络堵塞,减少网络中的冲突,能有效的利用网络。
其次,由于网络控制系统中存在网络诱导时延,它是随机的,可能是定长的,也可能是时变的,这种时延可能会降低系统的性能,甚至导致系统的不稳定,其次,在网络中传输的数据包还可能在传输中丢失,在多包传输中可能有数据包乱序等问题,这也是导致系统性能下降甚至不稳定的因素。
本文将针对网络控制系统(NCS)中中普遍存在的时延和丢包问题进行建模和仿真,讨论不同时延情况和不同丢包率情况下的网络控制系统稳定性。
2、网络控制系统稳定性分析2.1网络时延在网络控制系统中,当传感器,执行器和控制器等多个环节通过网络交换数据是,由于网络带宽的显示和数据流量变化的不规则,不可避免的会造成数据碰撞,多路传输,连接中断和网络拥塞的现象。
这种由于网络的介入而是控制系统的信息传输产生延时的现象称为网络诱导时延或网络时延。
网络时延或造成控制系统品质降低,性能恶化,甚至导致系统的不稳定性,对快速系统的影响更大,网络时延是网络控制系统分析和设计中不可忽略的重要因素。
网络时延主要由以下四个因素构成:(1)数据包排队等待时延。
当网络忙活着发生数据包碰撞时,等待网络空闲再发送所用的等待时间。
(2)信息产生时延。
发送端等待发送信息封装成数据包并进入排队队列所需时间。
(3)传输延时。
数据包在实际传输介质上传输所需的时间,其大小取决于数据包的大小,网络带宽和传输距离(4)数据处理、计算时延。
节点在采样、量化、编码解码和计算等数据处理过程中所需时间网络控制系统中的时延分布如下图2所示,其中,传感器到控制器的传输时延为τk sc,控制器到执行器的时延为τk ca(K表示第K个式中周期),此外还有控制器的计算时延τk c,不过相对而言τk c要小的多,往往放到τk ca中一起考虑。
图 2 NCS时延分布图2.2数据包丢失在NCS中,由于网络通讯的影响,除不可避免的带来时延之外,数据包的丢失也是时常发生的,其原因主要有以下几点:(1)网络节点偶尔发生通讯故障。
作为网络节点的核心,微处理器不可能无时无刻保证能正常工作,偶尔故障的时间不可避免。
当节点发生故障或重新启动时,数据包所在的缓冲区被清空,因而造成数据包丢失的现象。
(2)频繁的通讯冲突。
在随机访问的网络中,冲突的发生本质上是无法避免的。
发生冲突后,虽然多数网络通讯协议可以实现网络冲突的重发机制,然而信息的重传都设置了超时,一旦超时到则放弃此次通讯任务,从而导致丢包。
(3)信道的干扰,在实际系统中外界环境将不可避免的影响到信道中数据的传输质量。
干扰造成物理信号的错位、丢失等,使实际数据到达目的节点后产生失真,无法通过算法恢复有效数据,数据包也就会丢失。
一般而言,反馈控制的被控对象只能忍受一定比例的丢包,对于本来没有丢包的系统当丢包率达到一定值时,系统将变得不稳定,数据包丢失的处理方法是沿用上一次未发生丢包时的数据或给定某一常数值。
在一些网络拥塞控制算法里面,有时会有目的的丢掉一部分数据包来防止网络阻塞,这些数据往往是一些非实时数据,接着发送新数据,以保证信号的及时更新和数据的有效性。
3、仿真平台TrueTime是基于Matlab/Simulink的工具箱,它主要包括TrueTime Kernel和TrueTime Network两个接口模块,具有很强的功能。
可以用于研究时问不定性(如网络传输延时)对控制性能的影响;对具有时变系统的控制器进行设计,对系统进行补偿;可以进行灵活的动态调度方法仿真实验TrueTime是一个理想的网络控制系统仿真开发软件。
它包含以下几个模块1)实时内核模块Kernel模块作为网络控制系统的网络节点使用,具有灵活的实时内核,有A/D和D/A转换器接口、网络接口和外部通道,调度器与监控器的输出用于显示仿真过程中公共资源的分配。
内核模块按照用户定义的任务工作,任务执行取决于内部事件与外部事件,以中断方式产生。
外部中断与计算机模块的外部中断通道相连,相应的信号改变时中断被触发。
内部中断与与定时器相关,当定时器事件到或者任务完成时触发。
当外部和内部中断发生时,用户定义的中断句柄被调用去执行中断服务程序,中断句柄工作相似于一个任务,一个中断句柄被定义为标示符、优先级,和代码函数,任务的执行与中断句柄都是由用户编写的代码函数实现的。
2)网络通讯模块网络模块给网络控制系统提供了通信资源,包含了多种网络参数,如网络节点数目、传输速率、媒体访问控制协议等参数,其中媒体访问控制协议包括CSMA/CD随机载波监听/冲突检测/CSMA/CA(载波监听多路获取/冲突避免,TDMA(时分多路复用),FDMA(频分多路复用)以及round robin方式。
网络模块采用事件驱动方式,当有消息进出网络时,网络模块执行工作。
TmeTime中预定义了多种调度策略。
包括固定优先级(FixedPri.ority),单调速率假M,Rate Monotonic),截止期单调(DM,Deadline Monotonic),最小截止期优先(EDF、Earliest Deadline First)。
4、控制系统仿真如下图3所示是一个基于以太网的直流电机网络控制系统,系统中包含4个用TrueTime Kernel块表示的计算节点,时间驱动的传感器节点周期性的对系统进行采样,通过网络将信号传送到控制节点,控制节点任务计算控制信号,然后将信号传送到执行节点,从而执行一系列动作,仿真中还包含一个扰动节点向网络发送扰动信号,采样周期设为0.01秒。
其中控制对象为直流伺服电机,其模型的传递函数如下式(1)所示G(s)=1500(1)2s2+s图3系统结构图系统的参考输入采用阶跃函数,PID控制参数为:K=1.5,Ki=10000,Kd=0.035,网络传输速率500000bits/s,运行时间为0.8s,Transmit powe为35 dbm。
系统无延为0,无丢包时的仿真图形如下图4所示。
图 4 无延时,无丢包时的波形由图5可知系统输出在0.8s 前就能够达到稳定状态,上升时间小于0.5s ,超调量02.0102.1=-=∆。
系统延时0.1s ,丢包率为0时的仿真输出如图5。
系统输出在1.5s 前能够达到稳定状态,上升时间约为1s ,超调量15.0115.1=-=∆s 。
图 5 时延为0.1s ,无丢包时的仿真波形系统延时0.3s ,丢包率为0时的仿真输出如图6。
系统输出在约6s 时才能够达到稳定状态,上升时间约为1.3s ,超调量5.015.1=-=∆s 。
图 6系统延时0.3s ,丢包率为0系统延时0.8s ,丢包率为0时的仿真输出如图7。
在一定的范围内,当延时增加时间,系统输出超调增大,上升时间基本保持不变,而超调量和达到稳态所需要的时间则成倍增加。
当延时时间超过某一特定时间时,系统输出震荡,不能满足要求。
图7系统延时0.3s,丢包率为0系统延时0s,丢包率为0.3时,系统输出图形如图8。
图8 系统延时0s,丢包率为0.3时的波形系统延时0s,丢包率为0.4时的仿真输出如图9。
从图8和图9综合分析表明,在丢包率较小时,系统输出基本保持不变;当丢包率大于某一数值时,系统输出失调。
图9系统延时0.35s,丢包率为0的波形5、总结随着NCS应用的越来越广泛,关于NCS的研究也正在如火如荼的进行中,时延和丢包问题是NCS设计中的一个基本问题,得到了广大理论研究者的高度重视,也已经取得了不少成果,但随着实践队理论的需求,这种研究还需要进一步深入下去。
本文针对NCS的时延和丢包问题进行了仿真研究,随着时延和丢包率的加大,系统都会出现失调,在实际系统设计中。
问了系统的稳定性,这两个问题都是值得深思的。
附件程序function [exectime, data] = actuator_code(seg, data)persistent uswitch segcase 1u = ttGetMsg;exectime = 0.0005;otherwiseif ~isempty(u)ttAnalogOut(1, u)elsedisp('Error: actuator received empty message!')endexectime = -1; % finishedendfunction [exectime, data] = controller_code(seg, data)switch segcase 1y = ttGetMsg; % Obtain sensor valueif isempty(y)disp('Error in controller: no message received!');y = 0.0;endr = ttAnalogIn(1); % Read reference valueP = data.K*(r-y);D = data.ad*data.Dold + data.bd*(data.yold-y);data.u = P + D;data.Dold = D;data.yold = y;exectime = 0.0005;case 2ttSendMsg(2, data.u, 80); % Send 80 bits to node 2 (actuator) exectime = -1; % finishedendfunction [exectime, data] = controller_code(seg, data)switch segcase 1y = ttGetMsg; % Obtain sensor valueif isempty(y)disp('Error in controller: no message received!');y = 0.0;endr = ttAnalogIn(1); % Read reference valueP = data.K*(r-y);D = data.ad*data.Dold + data.bd*(data.yold-y);data.u = P + D;data.Dold = D;data.yold = y;exectime = 0.0005;case 2ttSendMsg(2, data.u, 80); % Send 80 bits to node 2 (actuator) exectime = -1; % finishedendfunction [exectime, data] = controller_code(seg, data)switch segcase 1y = ttGetMsg; % Obtain sensor valueif isempty(y)disp('Error in controller: no message received!');y = 0.0;endr = ttAnalogIn(1); % Read reference valueP = data.K*(r-y);D = data.ad*data.Dold + data.bd*(data.yold-y);data.u = P + D;data.Dold = D;data.yold = y;exectime = 0.0005;case 2ttSendMsg(2, data.u, 80); % Send 80 bits to node 2 (actuator) exectime = -1; % finishedendfunction [exectime, data] = dummy_code(seg, data)switch segcase 1exectime = data;otherwiseexectime = -1;endfunction [exectime, data] = interference_code(seg, data)BWshare = data;ran = ttAnalogIn(1);if ran < BWsharettSendMsg(1, 1, 80); % send 80 bits to myselfendwhile ~isempty(ttGetMsg) % read old received messages (if any)endexectime = -1;function [exectime, data] = sensor_code(seg, data)persistent yswitch segcase 1y = ttAnalogIn(1);exectime = 0.0005;case 2ttSendMsg(3, y, 80); % Send message (80 bits) to node 3 (controller) exectime = 0.0004;case 3exectime = -1; % finishedendfunction [exectime, data] = sensor_code(seg, data)persistent yswitch segcase 1y = ttAnalogIn(1);exectime = 0.0005;case 2ttSendMsg(3, y, 80); % Send message (80 bits) to node 3 (controller) exectime = 0.0004;case 3exectime = -1; % finishedendfunction sensor_actuator_init% Distributed control system: sensor node%% Samples the plant periodically and sends the samples to the% controller node. Actuates controls sent from controller.% Initialize TrueTime kernelttInitKernel('prioDM'); % deadline-monotonic scheduling% Periodic sensor taskstarttime = 0.0;period = 0.010;ttCreatePeriodicTask('sensor_task', starttime, period, 'sensor_code');% Sporadic actuator taskdeadline = 10.0;ttCreateTask('actuator_task', deadline, 'actuator_code');% Network handlerprio = 1.0;data = 'actuator_task';ttCreateHandler('network_handler', prio, 'nwhandler_code', data); ttAttachNetworkHandler('network_handler')function data = pidcalc(data, r, y)P = data.K*(data.beta*r-y);I = data.Iold;D =data.Td/(data.N*data.h+data.Td)*data.Dold+data.N*data.K*data.Td/(data.N*data.h+da ta.Td)*(data.yold-y);data.u = P + I + D;data.Iold = data.Iold + data.K*data.h/data.Ti*(r-y);data.Dold = D;data.yold = y;function [exectime, data] = nwhandler_code(seg, data)ttCreateJob(data)exectime = -1;。