様々な理由により、メーカーから販売されているPLCを使用しないで電子工作でPLCみたいなことをすることにした。
白羽がたったのは、昔ながらのArduinoだ。
(Raspberry Piを使用しなかったのは実は理由がある)
ラダーエディターは当初、LDmicroを使うつもりであった。(私の開発環境はUbuntuなのだが、wine上でLDmicroが動きました。)
結果的にはラダープログラムからarduino IDEに変換がうまく行きませんでしたので、ラダーの部分のみ使用させていただくことにしました。
回路はこんな風に配線しました。
arduinoの向こう側はただの端子台です。入力の端子を意味します。
こちら側にあるのは8 Relay Moduleです。出力を意味しています。
入力はプルアップ回路がめんどくさいので、ソフト上でPULL_UPしています。(これはSwitchSceinceさんのブログを参考にさせていただきました。)また、ソフトでPULL_UPすると動作が逆になるのでビックリマークで逆転しています。
リレーは「8 Relay Module」で調べるとだいたい出てきます。ただし、そのまま接続してdigitalWriteすると動作が逆になるので、これもビックリマークで逆転させています。また、 arduinoの5V端子から8台のリレーをいっぺんに駆動しようとすると電圧降下が起きるらしく、誤動作します。 別電源にすることをおすすめします。
arduinoのプログラムはこんなふうに作成しました。
boolean x00 = false;
boolean x01 = false;
boolean x02 = false;
boolean x03 = false;
boolean m00 = false;
boolean m01 = false;
boolean m02 = false;
boolean m03 = false;
boolean m04 = false;
boolean m05 = false;
boolean m06 = false;
boolean m07 = false;
boolean y00 = false;
boolean y01 = false;
boolean y02 = false;
boolean y03 = false;
boolean y04 = false;
boolean y05 = false;
boolean y06 = false;
boolean y07 = false;
void setup() {
pinMode(2, INPUT_PULLUP); //x00
pinMode(3, INPUT_PULLUP); //x01
pinMode(4, INPUT_PULLUP); //x02
pinMode(5, INPUT_PULLUP); //x03
pinMode(6, OUTPUT); //y00
pinMode(7, OUTPUT); //y01
pinMode(8, OUTPUT); //y02
pinMode(9, OUTPUT); //y03
pinMode(10, OUTPUT); //y04
pinMode(11, OUTPUT); //y05
pinMode(12, OUTPUT); //y06
pinMode(13, OUTPUT); //y07
}
void loop() {
// 入力部分
x00 = !digitalRead( 2 );
x01 = !digitalRead( 3 );
x02 = !digitalRead( 4 );
x03 = !digitalRead( 5 );
// 実際のプログラム部分(開始)
y00 = ( x00 || y00 ) && !(x01);
// 実際のプログラム部分(終了)
// 出力部分
digitalWrite( 6 , !y00);
digitalWrite( 7 , !y01);
digitalWrite( 8 , !y02);
digitalWrite( 9 , !y03);
digitalWrite(10 , !y04);
digitalWrite(11 , !y05);
digitalWrite(12 , !y06);
digitalWrite(13 , !y07);
}
PLCとしてのプログラムは「実際のプログラム部分」の一行のみです。 このプログラムの内容としては保持回路です。