目次
前
次
状態遷移シミュレーション(Python)
小型ソーラーパネルが、発電していることを確認し
2次電池への充電ができる装置を考えていました。
小型ソーラーパネルは、次のデバイスを利用。
発電しているかは、ある電圧レベルに
なっているのかを次の回路で検出。
電圧レベル値をA/Dコンバータの出力値で判断し
2次電池への接続は、リレーを使うとします。
回路動作は、次の仕様でよいはず。
発電電力を見て、リレーをMAKEかBREAKにする。
タイミングチャートで、発電による充電をさせるか
させないか、リレーの動作で検証。
タイミングチャートから、発電電力が充電するのに
充分ということを検出し、MAKEかBREAKを指定する
ように状態遷移を考えます。
MAKEを0、BREAKを1として、状態をタイミング
チャートに書き込んでみると、次のようになります。
状態を2ビットのシフトレジスタに入れてみると
次のように変化。
現在の状態を、下位ビットに、ひとつ前の状態を
上位ビットに入れてみると、状態遷移は、以下と
なります。
00 → 01 → 11 → 10 → 00 → 10
10進数で表現すると、0、1、3、2、1、0と
数列になっていることを見て、1ではBREAKにし
2ではMAKEとすればよいとわかります。
スクリプト言語で状態遷移をシミュレートするには
ループの中に、状態値を変化させる処理を入れて
制御信号として何を出力するかを記述することと
等価と理解できます。
以下に、シミュレートのスクリプトを示します。
print( '0 pstate = '+str(0)+' '+str(10)+' MAKE' )
pstate = 0
for e in range(1,32):
# shift state
pstate <<= 1
# mask
pstate &= 3
# get power
power = 10
if e == 10 or e == 11 or e == 28 :
power = 0
if e >= 20 and e < 25 :
power = 0
# judge
if power <= 0 :
pstate = pstate + 1
# default
eflag = 0
xtmp = '***'
if pstate == 1 :
tmp = 'BREAK'
eflag = 1
if pstate == 2 :
tmp = 'MAKE'
eflag = 1
#
if eflag == 1 :
xtmp = tmp
#
print( str(e)+' pstate = '+str(pstate)+' '+str(power)+' '+xtmp )
タイミングチャートでは、発電していない場合は
出力電力をゼロで扱っていますが、論理処理では
正の整数とそれ以外の整数で処理。
スクリプトで、状態遷移をシミュレートすると
以下となりました。
0 pstate = 0 10 MAKE
1 pstate = 0 10 ***
2 pstate = 0 10 ***
3 pstate = 0 10 ***
4 pstate = 0 10 ***
5 pstate = 0 10 ***
6 pstate = 0 10 ***
7 pstate = 0 10 ***
8 pstate = 0 10 ***
9 pstate = 0 10 ***
10 pstate = 1 0 BREAK
11 pstate = 3 0 ***
12 pstate = 2 10 MAKE
13 pstate = 0 10 ***
14 pstate = 0 10 ***
15 pstate = 0 10 ***
16 pstate = 0 10 ***
17 pstate = 0 10 ***
18 pstate = 0 10 ***
19 pstate = 0 10 ***
20 pstate = 1 0 BREAK
21 pstate = 3 0 ***
22 pstate = 3 0 ***
23 pstate = 3 0 ***
24 pstate = 3 0 ***
25 pstate = 2 10 MAKE
26 pstate = 0 10 ***
27 pstate = 0 10 ***
28 pstate = 1 0 BREAK
29 pstate = 2 10 MAKE
30 pstate = 0 10 ***
31 pstate = 0 10 ***
状態維持ならば、'*'を3個表示したので
変化がわかりやすくなっています。
状態変数pstateの値で、リレーのMAKEかBREAKを
出力していることを確認できています。
目次
前
次