function [sys,x0,str,ts] = afdpf(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;%调用初始化子函数
case 1,
sys=[];%*************计算连续状态变量的微分方程***********
case 2,
sys=[];%*************更新离散状态、采样时间和主时间步的要求***************
case 3,
sys=mdlOutputs(t,x,u);%调用子函数计算输出
case 4,
sys=[];%************调用子函数计算下一个采样点的绝对时间*****************
case 9,
sys=[];%调用仿真结束子函数
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
%=============================================================================
% mdlInitializeSizes
function [sys,x0,str,ts]=mdlInitializeSizes%初始化子函数
global f_i f_vo f_v_hb f_v_lb theta_i theta_vo isIslanding num0 num1 step step1 k %定义全局变量
f_i=50;%电流频频率
f_vo=50;%电压频率
theta_i=0;%电流相位
theta_vo=0;%电压相位
isIslanding=0;%非孤岛效应
num0=0;
num1=0;
k=10;
step1=0.5;
f_v_hb=50;
f_v_lb=50;
sizes = simsizes;%获得系统默认的系统参数变量sizes
sizes.NumContStates = 0;%连续状态的个数
sizes.NumDiscStates = 0;%离散状态的个数
sizes.NumOutputs = 2;%输出变量的个数
sizes.NumInputs = 2;%输入变量的个数
sizes.DirFeedthrough = 1;%布尔变量,表示有无直接馈入。1表示有,0便是没有
sizes.NumSampleTimes = 1; % 采样时间个数,s函数支持多采样系统
sys = simsizes(sizes);%将结构体sizes赋值给sys
x0 = [];%初始变量状态
str = [];%系统保留值,必须为空
ts = [1e-4 0];%采样周期变量
%=============================================================================
% mdlOutputs
function sys=mdlOutputs(t,x,u)
global f_i f_vo f_v_hb f_v_lb theta_i theta_vo isIslanding num0 num1 step step1 k
theta_vo=u(2);%数字锁相环输出的电压相位
if abs(theta_vo)<0.04 % 电压相位为0时更新频率
f_vo=u(1); %数字锁相环输出的电压频率
end
if(isIslanding==0) %判断是否不是孤岛效应
if abs(theta_vo)<0.04 %并网电压相位是否过零
if (f_vo>50.5) || (f_vo<49.5) %判断并网电压频率是否越界
sys=[0 0];
isIslanding=1;
else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f_vo=u(1);
if (f_v_lb<f_vo)
num0=0;
end
if (f_vo<f_v_hb)
num1=0;
end
% while ((f_v_lb>f_vo) || (f_vo>f_v_hb)) && (isIslanding==0)
if (f_vo>=50)
num1=num1+1;
if (num1>3)
step=k*step1;
else
step=step1;
end
f_i=f_vo+step;
f_v_hb=f_i;
else
num0=num0+1;
if (num0>3)
step=k*step1;
else
step=step1;
end
f_i=f_vo-step;
f_v_lb=f_i;
end
% sys(1)=sin(theta_i);
%if abs(theta_vo)<0.04 %并网电压相位是否过零
% if (f_vo>50.5) || (f_vo<49.5) %判断并网电压频率是否越界
% sys=[0 0];
% isIslanding=1;
% else
% f_vo=u(1);
% end
% end
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
theta_i=theta_vo;
end
else
if(pi-theta_i<0.03) && (pi-theta_vo>0.03)
theta_i=pi;
elseif(2*pi-theta_i<0.03) && (2*pi-theta_vo>0.03)
theta_i=2*pi;
elseif (pi-theta_vo<0.03) && (pi-theta_i>0.03)
theta_i=pi;
elseif (2*pi-theta_vo<0.03) && (2*pi-theta_i>0.03)
theta_i=2*pi;
else
theta_i=theta_i+2*pi*f_i*1e-4;
end
end
sys(1)=sin(theta_i);%//////////////////非孤岛效应,输出电流正弦波形
else
sys(1)=0;%///////////////////////////////////孤岛效应,输出电流为零
end
sys(2)=f_vo;
评论2