United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

RevPi Core 3とST言語で信号機を作る(1)

pedestrian_crossing_521fae3921b2b3d8d08b6473c0b5ad8fcca2bcc2.jpg
今回はPLC制御用のST言語プログラムにより、簡易的な横断歩道の交通管理システムを構築する。

前回の記事では、LogiCAD 3を使いST言語でプログラミングしたRevolutionPiを用いて、信号機のシミュレーションを行なった。今回はこの信号機を横断歩道用に発展させることにした。押すと信号機が動作する歩行者用のボタン形式の入力に加え、歩行者横断用の追加出力を加える。さらに、歩行者信号がまもなく赤に変わるということを伝えるためのブザーも追加する。

ハードウェア

今回もRevPi Core 3と、I/OにDIO (レーザーカットした5mm MDFに固定されたDINレールに取り付け)を使用する。既存のセットアップに加え、DIO入力端子電源に24Vを供給する必要がある。接続方法を間違えないためにも、クイックスタートガイドの「How to Connect the Power Supply (電源を接続する方法)」セクションを参照するといいだろう。

Input_X2_ead8189c67fe4589d66a7343787f32462c5330e8.jpg

DIOモジュールのX2コネクタに接続 – 24Vをピン1、アースをピン2に接続

歩行者信号灯となる白色LEDインジケータ (763-7905) とブザー(626-157)は、それぞれDIOモジュール出力4と出力5に接続し、ボタンを出力1に接続した。なお、入力にはコネクタと24Vの右下から番号が付けられている。
ここで躓いたときは、入門ガイドとこちらのフォーラムの投稿に目を通すといいだろう。

次に、シンプルなアクリル板を加工して、歩行者信号用の部品(ボタン・ブザー・白色LED)を取り付けた。また雰囲気を出すため、LEDの上に「進め」を意味するグリーンマンを取り付けた。

設定

次はRevPiの構成設定を編集し、入出力に分かりやすい名前のラベルを付ける。具体的には、PiCtoryの[Value Editor]セクションを使って、LogiCAD 3のグローバル設定ファイルに変更を加える。

RevPiResource_02d39e259141107aef9ac70bd07c919f962f6094.png

LogiCADからこれを行なうには、[Project Manager]で、[Revolution Pi]の[RevolutionPiResource]を右クリックし、[Change IO Configuration]をクリックする。すると、デフォルトのWebブラウザでPiCtoryページが開く。

Pictory_add_buzzer_f54e23a70617af48e178800eafbd56d33f1ba749.png

PiCtoryの右下にある[Value Editor]セクションで、入力のラベル名と出力のラベル名を編集します。私は出力4を「Cross_4」、5を「Buzzer_5」に変更し、入力1を「Button_1」に変更した。

変更が終了したら、[File]をクリックし、[Save as Start-Config]を選択して、保存を行なう。

ここでLogi.Cad 3に戻り、再び[RevolutionPiResource]を右クリックして、[Load IOConfiguration]を選択する。するとRevPiから設定ファイルが取得され、LogiCAD 3プロジェクトで適宜グローバル設定ファイルが更新される。

コード

PROGRAM RevolutionPiProgram

	VAR  
	wait : TON; 
	count : INT;
	END_VAR
		
	VAR_EXTERNAL	
		Red_1 : BOOL;
		Amber_2 : BOOL;
		Green_3 : BOOL;
		Cross_4 : BOOL;
		Buzzer_5 : BOOL;
		Button_1 : BOOL;
	END_VAR

CASE count OF
	0: //init
		count := count 4;
	
     		
	1: // Amber
   		
   		Red_1 	:= False;
   		Amber_2 := True;
   		Green_3 := False;
		Cross_4 := False;
		Buzzer_5 := False;
   		
   		wait(IN:=TRUE, PT:=T#7s);
   		
   		IF wait.Q THEN
   			wait(IN:=FALSE);
   			count := count + 1;
   		END_IF;
	
   2: // Red and Cross

		Red_1 := True;
		Amber_2 := False;
		Green_3 := False;
		Cross_4 := True;
		Buzzer_5 := False;

		wait(IN:=TRUE, PT:=T#10s);
	
		IF wait.Q THEN
			wait(IN:=FALSE);
			count := count + 1;
		END_IF;
	
   3: // Red, Amber and Buzzer
  		
   		Red_1 := True;
		Amber_2 := True;
		Green_3 := False;
		Cross_4 := False;
		Buzzer_5 := True;

		wait(IN:=TRUE, PT:=T#5s);
	
		IF wait.Q THEN
			wait(IN:=FALSE);
			count := count + 1;
		END_IF;
		
   4:  // Green
		IF Button_1 = FALSE THEN count := 1;
		END_IF;
		
		Red_1 := False;
		Amber_2 := False;
		Green_3 := True;
		Cross_4 := False;
		Buzzer_5 := False;
     	 		
		ELSE
		count := 4;

END_CASE;
	
END_PROGRAM

 

コードの実行開始と同時に、変数がセットされる。

VAR_EXTERNAL

外部変数は、PiCtoryで設定した入力・出力のラベル及びLogiCAD 3の設定ファイルと完全に一致している必要がある。

count := 4;

プログラムが4の番号の付いたステートメントのブロックに送られる。以降の一連のステートメントは、最初にボタンが押されたかどうかを確認し、押されていない場合は緑のライトを点灯し、それ以外のライトを消灯、ブザーをオフにする。ループで実行されるSTプログラムであるため、最初に戻り、この動作が再度実行される。その結果、ボタンが押されたことが検出されるまで緑のライトは点灯したままとなる。ボタンが押されたことが検出されるとプログラムは1のステートメントに送られ、シーケンスが実行される。

各ブロックには次のタイマーが存在する。

wait(IN:=TRUE, PT:=T#5s);

シーケンスの各ステップが実行される時間は、「T#」の後の値を編集することで簡単に調整できる。このサンプルでは5秒に設定されている。この値を「10s」に設定すると10秒、「10ms」に設定すると10ミリ秒になる。

必須ではないが、私はすべてのステートメントのブロックの各変数に値を入力している。こうすることで視認性が上がるだけでなく、編集が必要な場合にプロセスの各ステップで何が発生するかがわかるので安全だ。

buildandload_7066c973755c433b6b26efc4dd315d1d2637da71.png

LogiCAD 3とRevPiの接続が完了し、コードの構築とアップロードが完了すると、ライト・ボタン・ブザーは期待どおりに動作した。

発展に期待

今回はわずか4ステップしかないシンプルなイベントのシーケンスだったが、出力を増やしたり、さまざまな出力を組み合わせて、さまざまな時間の長さでシーケンスを実行したりすることも可能だ。言い換えれば、あらゆるタイプのライト・ブザー・モータなどさまざまなものをトリガーするよう構成することが可能であり、温度センサやモーションセンサといった入力を追加することで、さらに発展させることができる。

I have a background in the arts, environmental conservation and IT support. In my spare time I do a bit of DJing and I like making things.
DesignSpark Electrical Logolinkedin