前回まで、
ちなみに、
シミュレータとその使い方
シミュレータの動作環境として、
まず、
なお、
ダウンロードしたファイルを解凍したら、chmod a+rw railconf.
などとして、
なお、
# 10 13 20 30 37 40 50
# 10 _____+--------+_____
# 13 + +
# | |
# 20 + +
# | |
# 27 +_____ _____+
# 30 +---00--+
R00,3030,2030,1327,1020,1313,2010,3010,3713,4020,3727,3030
TA,2030,3030,50
TB,2010,3010,50
S0000,D
この状態で、

先にも書きましたが、
cp rail22.
などとして、

# 10 13 20 25 30 37 40 45 50 57 60
# 10 _____+---|-04-+--------+---|-00-+
# 13 + p2 ~~~~~+ ~~~~~+
# | | |
# 20 + + +
# | | |
# 27 +_____ p3 _____+ _____+
# 30 +05-|----+--------+01-|----+
R00,4530,5030,5727,6020,5713,5010,4510
R01,4530,4030
p0301,4030,2530
P0304,2530,3030,3727,4020
R04,4510,4010
p0204,4010,2510
P0204,4020,3713,3010,2510
R05,2530,2030,1327,1020,1313,2010,2510
TA,4030,4530,50
TB,4510,5010,50
S0000,AAppAA
最後に、
コマンドラインから./
などと入力してスクリプトを実行すると、php -f rail22.
も試してみてください。
サンプルには、
直線レイアウト | rail11. |
---|---|
第1回サンプル | rail10. |
第2回サンプル | rail21. |
引き込み線レイアウト | rail12. |
第1回サンプル | rail12. |
2重ループレイアウト | rail22. |
第2回サンプル | rail22. |
シミュレータの仕組み
本題とはあまり関係ないのですが、
ブラウザや制御プログラムからsimrail.
この方法を使うには、
車両のオブジェクト化
シミュレータができましたので、
車両の有無は、
2つの車両が1つのレールに入らないように、


R00,2010,2713
R01,2713,3020
R02,3020,2727
R03,2727,2030
R04,2030,1327
R05,1327,1020
R06,1020,1313
R07,1313,2010
TA,2010,1313,50
TB,2030,2727,50
S0000,AAAAAAAA
#! /usr/local/bin/php
<?php
$url = "http://localhost/gh/rail/simrail.php5";
class rail {
var $number;
var $lockcount = 0;
function rail($number = "00") {
$this->number = $number;
}
function drive($speed = 0) {
global $url;
if ($speed >= 0)
$command = substr("ABCDEF", min($speed, 5), 1);
else
$command = substr("abcdef", min(-$speed, 5), 1);
file_get_contents($url."?".$this->number."=".$command);
}
function sense() {
global $url;
return file_get_contents($url."?".$this->number."=S") + 0;
}
function lock($mode = 1) {
printf("rail(%s)->lock(%d) lockcount(%d)\n", $this->number, $mode, $this->lockcount);
switch ($mode) {
default:
die("lock({$mode})");
case 0:
if (($this->lockcount--) <= 0)
die("unlock failed.");
return;
case 1:
if ($this->lockcount > 0)
return -1; /* failed. */
$this->lockcount++;
return 0;
case -1:
$this->lockcount = 0;
return;
}
}
}
class revrail extends rail {
function drive($speed = 0) {
parent::drive(-$speed);
}
}
#
# +---r7---|---r0---|---r1---+
# | |
# | |r2
# |r6 |
# | |
# +---r5---|---r4---|---r3---+
#
$raillist = array();
$raillist[] =& new rail("00");
$raillist[] =& new rail("01");
$raillist[] =& new rail("02");
$raillist[] =& new rail("03");
$raillist[] =& new rail("04");
$raillist[] =& new rail("05");
$raillist[] =& new rail("06");
$raillist[] =& new rail("07");
class train {
var $pos;
var $starttime = 0; /* >0: wait in station */
var $mode = 0; /* 0:in station 1:run */
function train($currentpos = 0) {
global $raillist;
$this->pos = $currentpos;
if (($raillist[$this->pos]->lock(1)) < 0)
die("lock({$this->pos}) failed.");
}
function step() {
global $raillist;
if ($this->starttime > 0) {
if (time() < $this->starttime - 60)
; /* system-clock changed */
else if (time() > $this->starttime)
;
else
return;
$this->starttime = 0;
}
$currentrail =& $raillist[$this->pos];
$nextrail =& $raillist[($this->pos + 1) % count($raillist)];
switch ($this->mode) {
default:
die("mode: ".$this->phase);
case 0:
if ($nextrail->lock(1) < 0)
return; /* lock failed. */
$currentrail->drive(3);
# $currentrail->drive(rand(1, 5));
$this->mode++;
return;
case 1:
if ($nextrail->sense() == 0)
return; /* not arrived yet */
$this->starttime = time() + 5;
$this->mode++;
return;
case 2:
$currentrail->drive(0);
$currentrail->lock(0); /* unlock */
$this->pos = ($this->pos + 1) % count($raillist);
$this->mode = 0;
$this->starttime = time() + 5;
return;
}
}
}
$trainlist = array();
foreach ($raillist as $key => $dummy) {
$raillist[$key]->drive(0);
if (($raillist[$key]->sense()))
$trainlist[] =& new train($key);
}
for (;;) {
foreach ($trainlist as $key => $dummy)
$trainlist[$key]->step();
}
?>
次回は、