2013-05-05 1 views
0

ns2 시뮬레이션을 작성하는 동안 Graph proc의 nummsg 변수가 파일에 대한 모든 출력에 대해 변경 될 것으로 예상했습니다. 그러나 그것은 18에서 일정하게 유지됩니다. 왜 incr 함수가 작동하지 않는지 나는 이해하지 못합니다. 어떤 도움을 주셔서 감사합니다.Tcl 글로벌 변수가 ns2에서 변경되지 않는 것 같습니다.

#Create scheduler 
#Create an event scheduler wit multicast turned on 
set ns [new Simulator -multicast on] 
$ns multicast 
set nummsg 18 
#Turn on Tracing 
set tf [open output.tr w] 
$ns trace-all $tf 

# Turn on nam Tracing 
set fd [open mcast.nam w] 
$ns namtrace-all $fd 

# Create nodes 
set OLDCOMM { 
    set n0 [$ns node] 
set n1 [$ns node] 
set n2 [$ns node] 
set n3 [$ns node] 
set n4 [$ns node] 
set n5 [$ns node] 
set n6 [$ns node] 
set n7 [$ns node] 
} 

set i 0 
for {set i} {$i < 20} {incr i} { 
    set n$i "[$ns node]" 
} 

# Create links 
$ns duplex-link $n0 $n1 1.5Mb 10ms DropTail 
$ns duplex-link $n0 $n2 1.5Mb 10ms DropTail 
$ns duplex-link $n2 $n3 1.5Mb 10ms DropTail 
$ns duplex-link $n2 $n4 1.5Mb 10ms DropTail 
$ns duplex-link $n1 $n7 1.5Mb 10ms DropTail 
$ns duplex-link $n1 $n5 1.5Mb 10ms DropTail 
$ns duplex-link $n4 $n6 1.5Mb 10ms DropTail 

#tactic 
# for time 
# add or delete nodes based on a rand 
for {set i} {$i < 100} {incr i} { 
    puts "OK $i " 

} 

# Routing protocol: say distance vector 
#Protocols: CtrMcast, DM, ST, BST 
set mproto DM 
set mrthandle [$ns mrtproto $mproto {}] 

# Allocate group addresses 
set group1 [Node allocaddr] 
set group2 [Node allocaddr] 

# UDP Transport agent for the traffic source 
set udp0 [new Agent/UDP] 
$ns attach-agent $n0 $udp0 
$udp0 set dst_addr_ $group1 
$udp0 set dst_port_ 0 
set cbr1 [new Application/Traffic/CBR] 
$cbr1 attach-agent $udp0 

# Transport agent for the traffic source 
set udp1 [new Agent/UDP] 
$ns attach-agent $n1 $udp1 
$udp1 set dst_addr_ $group2 
$udp1 set dst_port_ 0 
set cbr2 [new Application/Traffic/CBR] 
$cbr2 attach-agent $udp1 


#$ns at 0.2 "Graph" 
set g [open graph.tr w] 
set g1 [open graph1.tr w] 
proc Graph {} { 
    global nummsg 
    global ns g g1 
    set time 0.5 
    set now [$ns now] 
    puts $nummsg 
    puts $g "$now $nummsg" 
    #puts $g1 "[expr rand()*8] [expr rand()*6]" 
    $ns at [expr $now+$time] "Graph" 
} 


# Create receiver 
set rcvr1 [new Agent/Null] 
$ns attach-agent $n5 $rcvr1 
$ns at 1.0 "$n5 join-group $rcvr1 $group1" 
incr nummsg 


set rcvr2 [new Agent/Null] 
$ns attach-agent $n6 $rcvr2 
$ns at 1.5 "$n6 join-group $rcvr2 $group1" 
incr nummsg 

set rcvr3 [new Agent/Null] 
$ns attach-agent $n7 $rcvr3 
$ns at 2.0 "$n7 join-group $rcvr3 $group1" 
set nummsg 22 
#$ns duplex-link $n4 $n6 1.5Mb 10ms DropTail 


set rcvr4 [new Agent/Null] 
$ns attach-agent $n5 $rcvr1 
$ns at 2.5 "$n5 join-group $rcvr4 $group2" 
incr nummsg 
set rcvr5 [new Agent/Null] 
$ns attach-agent $n6 $rcvr2 
$ns at 3.0 "$n6 join-group $rcvr5 $group2" 
incr nummsg 
set rcvr6 [new Agent/Null] 
$ns attach-agent $n7 $rcvr3 
$ns at 3.5 "$n7 join-group $rcvr6 $group2" 

$ns at 4.0 "$n5 leave-group $rcvr1 $group1" 
$ns at 4.5 "$n6 leave-group $rcvr2 $group1" 
$ns at 5.0 "$n7 leave-group $rcvr3 $group1" 
set nummsg [expr {$nummsg - 1}] 
set nummsg [expr {$nummsg - 1}] 
set nummsg [expr {$nummsg - 1}] 


$ns at 5.5 "$n5 leave-group $rcvr4 $group2" 
$ns at 6.0 "$n6 leave-group $rcvr5 $group2" 
$ns at 6.5 "$n7 leave-group $rcvr6 $group2" 
set nummsg [expr {$nummsg - 1}] 
set nummsg [expr {$nummsg - 1}] 
set nummsg [expr {$nummsg - 1}] 

# Schedule events 
$ns at 0.0 "Graph" 
$ns at 0.5 "$cbr1 start" 
$ns at 9.5 "$cbr1 stop" 

$ns at 0.5 "$cbr2 start" 
$ns at 9.5 "$cbr2 stop" 


#post-processing 
$ns at 10.0 "finish" 
proc finish {} { 
    global ns tf 
    $ns flush-trace 
    close $tf 
    #exec nam mcast.nam & 
    exit 0 
} 

# For nam 
#Colors for packets from two mcast groups 
$ns color 10 red 
$ns color 11 green 
$ns color 30 purple 
$ns color 31 green 

# Manual layout: order of the link is significant! 
#$ns duplex-link-op $n0 $n1 orient right 
#$ns duplex-link-op $n0 $n2 orient right-up 
#$ns duplex-link-op $n0 $n3 orient right-down 

# Show queue on simplex link n0->n1 
#$ns duplex-link-op $n2 $n3 queuePos 0.5 

# Group 0 source 
$udp0 set fid_ 10 
$n0 color red 
$n0 label "Source 1" 

# Group 1 source 
$udp1 set fid_ 11 
$n1 color green 
$n1 label "Source 2" 

$n5 label "Receiver 1" 
$n5 color blue 
$n6 label "Receiver 2" 
$n6 color blue 
$n7 label "Receiver 3" 
$n7 color blue 

#$n2 add-mark m0 red 
#$n2 delete-mark m0" 

# Animation rate 
$ns set-animation-rate 3.0ms 

$ns run 
+0

그래프 proc에서 아무 것도 보이지 않지만 질문에 대답 할 수있을만큼 ns2에 대해 충분히 알지 못합니다. 하지만 'incr'명령에 단계적인 인수가 있다는 것을 알고 계셨습니까? 'set nummsg [expr {$ nummsg - 1}]'대신에'incr nummsg -1'(또는'incr nummsg -3')을 할 수 있습니다 ... –

+0

잘 nummsg 22를 넣었습니다. 그래프 내부에 인쇄 된 값이 바뀌는 지 테스트하십시오. 하지만 여전히 18이 출력됩니다. –

+0

'Graph'가 어디에서 호출 되었습니까? –

답변

0

해결책을 찾았습니다. incr nummsg 대신에 변수를 증가 및 감소시키는 프로 시저를 작성하여 대신 호출했습니다. 그것은 작동합니다 ..