MATLAB Petri Net Toolbox

by

 

08 Dec 2004 (Updated )

For analysis of hybrid system modeling.

[XX]=disp_gr(A,RM)
function [XX]=disp_gr(A,RM)

% function [XX]=disp_gr(A,RM)
% Input parameters this function are matrix A and matrix RM, which are output parameters of function graph.m
% Output parameter this function is matrix XX, which  contains these items: state, parent,subs,trans,Xi,Yi,Xf,Yf,col
%
%  state -  number of state, which corresponds to number of column in matrix RM;
%  parent - parent of this state;
%  subs - the number of subsequent states (subs);
%  trans -  index of fired transition (trans)
%  Xi, Xf, Yi, Yf -  initial and final X,Y positions needful for displaying the graph of reachable markings
%  col -  number of column of XX matrix corresponding to parent of processing state
%
% 
% colour solid lines determine direction from left to the right, dashdot white line determine 
% direction from right to left. 


k=1;
item=1;
rows_A=size(A,1);
pom=0;
pom1=0;
color=0;
colors=['y' 'm' 'c' 'r' 'g' 'b'];
vel_nula=0;

fig=figure;
axis('off');
hold;
% 1.uroven stromu dosazitelnosti
sub_1=size(find(A(1,:)),2);

XX([1 2 3 4 5 6 7 8 9],1)=[1 0 sub_1 0 0 0 0 0 0]';
text(-0.02,0,'x');
text(-0.1,-0.25,['m0']);

% next levels of graph of reachable markings

while k<=rows_A,
   
  column_of_subs=find(A(k,:)); 	%finding of subsequent states
  subs=size(column_of_subs,2);	% the number of subsequent states
  
  for j=1:subs	
   item=item+1;		
   trans=A(k,column_of_subs(j));
    if (isempty(trans))
	trans=0;
    end;
   trans_str=int2str(trans);
   transit=['T',trans_str];
    parent= k;
    number_subs_of_state=size(find(A(column_of_subs(j),:)),2);
    if k>6
       color=rem(k,6);
         if rem(k,6)==0
            color=6;
         end;
    else color=k;
    end; 
 
     if number_subs_of_state==0				%finding of states whose subsequent states are null
      nula=[nula column_of_subs(j)];
      vel_nula=size(nula,2);
     end;       

    for i=1:size(XX(1,:),2)
           
      if (parent==XX(1,i)) & (pom1~=1)	%finding column of matrix XX, which contains parents of state we work with.
        col=i;        		% coordinates of this state Xi, Yi equal  coordinates Xf,Yf of parent of this state
        pom1=1;
        Yi= XX(8,col);
        Xi= XX(6,col);
        uroven =Xi+2;
      end;
      
      if (column_of_subs(j)==XX(1,i)) & (pom~=1)   	% creating of row of matrix XX, when state already exists
        Xf=XX(6,i);				
        Yf=XX(8,i);
        pom=1;
      end;
    end; 
    pom1=0;

    if pom~=1	 			% creating of row of matrix XX, when state doesn't exist
      Yf= XX(8,col)+(j-1)*uroven;
      Xf=Xi+1;
     else pom=0;  
    end;
   
   
     % displaying of state and its transition, which returns to some state (direction from right to the left

   if column_of_subs(j)< k

	XX(:,item)=[column_of_subs(j) parent number_subs_of_state trans Xi Xf Yi Yf col]';

      if (Yi>1)  			% counting of coordinates of returning point ( we will go through this point)
       max_Yi=max(XX(7,:));
       max_Yf=max(XX(8,:));
       max_yy=max(max_Yi,max_Yf);   
	    plot([Xi Xf+1/2 Xf],[Yi max_yy+1 Yf],'w-.');
        text(Xf+1/2,max_yy+1,transit)
       else plot([Xi 1 Xf],[Yi -3 Yf],'w-.');text(1,-3,transit);     
      end;

       else plot([Xi Xf],[Yi Yf],colors(color));text(Xf-0.02,Yf,'x'); XX(:,item)=[column_of_subs(j) parent number_subs_of_state trans Xi Xf Yi Yf col]';
text(Xf-0.1,Yf-0.25,['m',int2str(column_of_subs(j)-1)]);  

  end;
   

% displaying name of transitions to particular arcs 
if column_of_subs(j)>= k
     if (Yi>Yf) 
      text(Xi+1/2,(Yf+(Yi-Yf)/2)+0.1,transit)

      else  text(Xi+1/2,(Yi+(Yf-Yi)/2)+0.07,transit); 	
     end;
   end;
 end;  % end of cycle for 
 
 
 % protection of not processing row of matrix A which is null
  k=k+1;
  for i=1:vel_nula	
     if k==nula(i);
    k=k+1;
   end;
  end;

end; 			% end of main cycle - while 

Contact us