npcsma.m
上传用户:m_sun_001
上传日期:2014-07-30
资源大小:1115k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. % Program 6-8
  2. % npcsma.m
  3. %
  4. % non-persistent CSMA System
  5. %
  6. % Input argument
  7. %   now_time  : now time   but, now_time<0 initializes the access terminals
  8. %
  9. % Output argument
  10. %   next_time : next state change time
  11. %
  12. % Programmed by M.Okita
  13. % Checked by H.Harada
  14. %
  15. function [next_time] = npcsma(now_time)
  16. global STANDBY TRANSMIT COLLISION                       % definition of the global variable
  17. global Srate Plen
  18. global Mnum Mplen Mstime Mstate
  19. global Tint Rint
  20. global Spnum Splen Tplen Wtime
  21. persistent mgtime mtime                                 % definition of the static variable
  22. if now_time < 0                                         % initialize access terminals
  23.     rand('state',sum(100*clock));                       % resetting of the random table
  24.     mgtime        = -Tint * log(1-rand(1,Mnum));        % packet generation time
  25.     Mstime        = zeros(1,Mnum) - inf;                % packet transmitting time
  26.     mtime         = mgtime;                             % state change time
  27.     Mstate        = zeros(1,Mnum); 
  28.     Mplen(1:Mnum) = Plen;
  29.     next_time     = min(mtime);
  30.     return
  31. end
  32. idx = find(mtime==now_time & Mstate==TRANSMIT);         % finding of the terminal which transmission succeeded
  33. if length(idx) > 0
  34.     Spnum       = Spnum + 1;
  35.     Splen       = Splen + Mplen(idx);
  36.     Wtime       = Wtime + now_time - mgtime(idx);
  37.     Mstate(idx) = STANDBY;
  38.     mgtime(idx) = now_time - Tint * log(1-rand);        % next packet generation time
  39.     mtime(idx)  = mgtime(idx);                          % next packet transmitting time
  40. end
  41. idx = find(mtime==now_time & Mstate==COLLISION);        % finding of the terminal which transmission failed
  42. if length(idx) > 0
  43.     Mstate(idx) = STANDBY;
  44.     mtime(idx)  = now_time - Rint * log(1-rand(1,length(idx))); % resending time
  45. end
  46. idx = find(mtime==now_time & Mstate==STANDBY);          % finding of the terminal which carrier sensing
  47. if length(idx) > 0
  48.     Tplen = Tplen + sum(Mplen(idx));
  49.     for ii=1:length(idx)
  50.         jj = idx(ii);
  51.         if carriersense(jj,now_time) == 0               % channel is idle
  52.             Mstate(jj) = TRANSMIT;                      % packet transmitting
  53.             Mstime(jj) = now_time;                      % start time of transmitting
  54.             mtime(jj)  = now_time + Mplen(jj) / Srate;  % end time of transmitting
  55.         else                                            % channel is busy
  56.             mtime(jj) = now_time - Rint * log(1-rand);  % waiting time
  57.         end
  58.     end
  59. end
  60. next_time = min(mtime);                                 % next state change time
  61. %%%%%%%%%%%%%%%%%%%%%% end of file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%