Tcl全局变量在ns2中似乎没有变化

Tcl全局变量在ns2中似乎没有变化,tcl,ns2,Tcl,Ns2,在编写ns2模拟时,我希望Graph proc中的变量numsg在文件的每个输出中都会发生变化。但它在18岁时保持不变。我不明白为什么incr函数不起作用。感谢您的帮助 #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 o

在编写ns2模拟时,我希望Graph proc中的变量numsg在文件的每个输出中都会发生变化。但它在18岁时保持不变。我不明白为什么incr函数不起作用。感谢您的帮助

#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
#创建调度程序
#创建启用多播的事件计划程序
设置ns[新模拟器-多播打开]
$ns多播
设置numsg 18
#启用跟踪
设置tf[open output.tr w]
$ns跟踪所有$tf
#启用nam跟踪
设置fd[打开mcast.nam w]
$ns namtrace all$fd
#创建节点
设置OLDCOMM{
设置n0[$ns节点]
设置n1[$ns节点]
设置n2[$ns节点]
设置n3[$ns节点]
设置n4[$ns节点]
设置n5[$ns节点]
设置n6[$ns节点]
设置n7[$ns节点]
}
设置i 0
对于{set i}{$i<20}{incr i}{
设置n$i“[$ns节点]”
}
#创建链接
$ns双工链路$n0$n1 1.5Mb 10ms垂尾
$ns双工链路$n0$n2 1.5Mb 10ms垂尾
$ns双工链路$n2$n3 1.5Mb 10ms垂尾
$ns双工链路$n2$n4 1.5Mb 10ms垂尾
$ns双工链路$n1$n7 1.5Mb 10ms垂尾
$ns双工链路$n1$n5 1.5Mb 10ms垂尾
$ns双工链路$n4$n6 1.5Mb 10ms DropTail
#策略
#暂时
#基于随机数添加或删除节点
对于{set i}{$i<100}{incr i}{
放入“OK$i”
}
#路由协议:比如距离向量
#协议:CtrMcast、DM、ST、BST
设置mproto DM
set mrthandle[$ns mrtproto$mproto{}]
#分配组地址
设置组1[节点allocaddr]
设置组2[节点allocaddr]
#流量源的UDP传输代理
设置udp0[新代理/UDP]
$ns附加代理$n0$udp0
$udp0 set dst_addr_$group1
$udp0设置dst_端口_0
设置cbr1[新应用程序/流量/CBR]
$cbr1附加代理$udp0
#流量源的传输代理
设置udp1[新代理/UDP]
$ns附加代理$n1$udp1
$udp1设置dst\U地址\UU2$group2
$udp1设置dst_端口0
设置cbr2[新应用程序/流量/CBR]
$cbr2附加代理$udp1
#0.2英寸图形时为$ns
集合g[open graph.tr w]
设置g1[打开图形1.tr w]
过程图{}{
全球nummsg
全局ns g g1
设定时间0.5
立即设置[$ns now]
卖出$numsg
放置$g“$now$nummsg”
#放入$g1“[expr rand()*8][expr rand()*6]”
[expr$now+$time]处的$ns“图形”
}
#创建接收器
设置rcvr1[新代理/空]
$ns附加代理$n5$rcvr1
$ns位于1.0“$n5加入组$rcvr1$group1”
增量nummsg
设置rcvr2[新代理/空]
$ns附加代理$n6$rcvr2
$ns位于1.5“$n6加入组$rcvr2$group1”
增量nummsg
设置rcvr3[新代理/空]
$ns附加代理$n7$rcvr3
$ns位于2.0“$n7加入组$rcvr3$group1”
设置numsg 22
#$ns双工链路$n4$n6 1.5Mb 10ms DropTail
设置rcvr4[新代理/空]
$ns附加代理$n5$rcvr1
$ns位于2.5“$n5加入组$rcvr4$group2”
增量nummsg
设置rcvr5[新代理/空]
$ns附加代理$n6$rcvr2
$ns位于3.0“$n6加入组$rcvr5$group2”
增量nummsg
设置rcvr6[新代理/空]
$ns附加代理$n7$rcvr3
3.5英寸处的$ns$n7加入组$rcvr6$group2
$ns在4.0“$n5休假组$rcvr1$group1”
4.5英寸处的$ns$n6休假组$rcvr2$group1
$ns在5.0“$n7休假组$rcvr3$group1”
set numsg[expr{$numsg-1}]
set numsg[expr{$numsg-1}]
set numsg[expr{$numsg-1}]
$ns在5.5英寸处$n5休假组$rcvr4$group2
$ns在6.0“$n6休假组$rcvr5$group2”
$ns在6.5英寸处$n7休假组$rcvr6$group2
set numsg[expr{$numsg-1}]
set numsg[expr{$numsg-1}]
set numsg[expr{$numsg-1}]
#安排活动
0.0“图形时为$ns”
0.5“$cbr1开始时为$ns”
9.5英寸处$ns$cbr1停车位
0.5“$cbr2开始时为$ns”
9.5英寸处$ns$cbr2停车位
#后处理
10.0“光洁度时为$ns
过程完成{}{
全球ns tf
$ns刷新跟踪
收盘价$tf
#行政总裁南·麦卡斯特·南&
出口0
}
#不结盟运动
#来自两个mcast组的数据包的颜色
$ns颜色10红色
$ns颜色11绿色
$ns颜色30紫色
$ns颜色31绿色
#手动布局:链接的顺序很重要!
#$ns双工链路操作$n0$n1向右
#$ns双工链路操作$n0$n2向上定向
#$ns双工链路操作$n0$n3定向右下
#在单工链路n0->n1上显示队列
#$ns双工链路操作$n2$n3队列位置0.5
#组0源
$udp0设置fid_u10
$n0颜色红色
$n0标签“源1”
#第一组来源
$udp1设置fid_u11
$n1颜色绿色
$n1标签“源2”
$n5标签“接收器1”
$n5颜色蓝色
$n6标签“接收器2”
$n6颜色蓝色
$n7标签“接收器3”
$n7蓝色
#$n2添加标记m0红色
#$n2删除标记m0“
#动画速率
$ns设置动画速率3.0ms
$ns跑步

我找到了一个解决方案。我没有执行incr numsg,而是编写了一个递增和递减变量的过程,并调用了它们。它可以工作。

我对ns2的了解不够,无法回答您的问题,尽管我没有看到图表过程中有任何错误。但是您知道
incr
命令需要一个步长参数?不是
set numsg[expr{$numsg-1}]
你可以做
incr numsg-1
(或者
incr numsg-3
,如果你愿意…)我确实在第104行放了一个set numsg 22来测试图形中打印的值是否会改变。但是它仍然打印18。从哪里调用
Graph
?$ns在0.0处图表“第151行。我找到了解决办法。我没有做incr numsg,而是编写了一个递增和递减的过程,并调用了它们。我仍然不明白问题是什么。可能是调用是异步进行的,调用
Graph
时的值根本不是您期望的值。(我不知道ns2——我不做网络模拟——所以说不出这是不是真的,但我现在只能猜测。)