昨日、TOC有明で電気工事士二種技能試験があり、様々なトラブルに見舞われたものの、無事時間内に終えた。
東京のTOC有明会場では公表問題No.3が出題された。
No.3は明らかに簡単過ぎて練習にならないと思い、難しい問題に絞って練習していたため、ぶっつけ本番となった。昼休み中に複線図を書いてみたら一発で正解となったので、特に対策はしていなかった。
試験開始前の材料確認で、アウトレットボックスが無いこと、2.0mm三芯ケーブルが無いこと、小スリーブが予備を含めて5個、中スリーブが無いこと、スイッチはタンブラー一つだけ、取り付け枠も一つだけ、接地極付きコンセントが一つ、TSの端子台があることから最も簡単な問題が予想され、透けて見えた図面の一部も見て安心し、緊張がほぐれた。一番大変なNo.7が出なくて良かったと思った。
※No.7は練習ではどうしても時間内に終わらせることができなかった。
以下は実況回想www
左のタンブラースイッチ、電源の2.0mm二芯ケーブル、1.6mm三芯の黒線の圧着で芯線が1本ずれて5mm以上はみ出してしまったので、やり直し。
マルチストリッパーの切れ味が悪くなり、外部被覆のシースが完全に切れず、つながったまま残ったり、逆に切れ過ぎて中の芯線が露出してしまったり、ランプレセプタクルの施工の際にペンチが行方不明となったので、マルチストリッパーで適当に芯線出しをして、のの字を描いたが白線の被覆が噛んでしまい、ハサミで噛んだ部分を取り除き、右側のワゴによる結線で、繋ぎ方をど忘れし、パニックになりかけた。急に思い出して一気に完全となった。
残り時間で見直し、ゴミの片付け、道具の片付けまで無事終えた。
ガミ電気チャンネルで注意喚起されていたTSの端子台は左から電源側からの黒線、電源側からの白線、引っ掛けシーリングからの白線、引っ掛けシーリングからの黒線の順に繋いで増し締めした。
端子台を左手で包み込むように持ち、左手の指で芯線をつまんで露出する長さを1mm位(被覆を噛んでいないとはっきり判定できる状態)に調節しながら増し締めした。
ランプレセプタクルはケーブルの取り回し、ネジ止めが練習の時に苦戦した所だったので、のの字を描いたらランプレセプタクルの形状を適当に作り、左手の中指の関節の肉でネジを挟みながら左手でランプレセプタクルを包み込むように持ってネジ止めしたらスムーズにいった。
練習では机の上に置いてネジをつまみながら締めようとしたが、ネジ先の穴への食いつきが悪過ぎて何回もコケたり落としたりして苦労したから、この方法を偶然思いついて試してみた。
重大な欠陥の見逃しがなければ合格しているはず。
いやぁ~燃え尽きた感じ。もう電気系の資格試験の勉強のモチベーションが一気になくなってしまった。今後、電験三種等の受験を予定していたが、切り捨ててすっ飛ばしてネットワークスペシャリスト→エンベデッドシステムスペシャリスト→公認会計士と行きたくなった。
電気系の資格試験の勉強は、本当に学びたいことなのか?改めて自問自答している自分がいる。
以下に、DeepSeekの回答に基づくラダー制御の改善版を「ラダー図形式(擬似的記述)」および「構造化テキスト(ST)形式」で提示します。
✅ 前提:改善点を反映した仕様
- H2センサー:即時緊急モード移行+換気+警報
- THEセンサー:温度・湿度をアナログ値比較で制御(D0, D1)
- FANBANK:温湿度に応じた段階制御(最小/中間/全開)
- 排他制御:温度高⇔低、湿度高⇔低を同時に動作させない
- モード:通常(M3)、警報(M4)、緊急(M5)、オーバーライド時も表示保持
- 非常停止:全出力停止+換気ON
🪜 ラダー図形式(擬似記述)
[初期設定]
LD SM0
MOV 22, D2 ; 温度設定
MOV 50, D3 ; 湿度設定
SET M3 ; 通常モードON
[H2センサー検知処理]
LD X0
AN X5 ; オーバーライドなし
AN X6 ; 非常停止なし
SET M2 ; H2アラーム
SET M5 ; 緊急モード
OUT Y5 ; ブザーON
OUT Y6 ; 非常換気ON
RST M3
[温度高⇔低の排他制御]
LD D0
> D2
OUT M10 ; Temp_High
LD D2
> D0
OUT M11 ; Temp_Low
LD M10
AN M5
AN X5
SET M0
OUT Y0 ; チラーON
OUT Y2 ; DAHU冷却バルブON
OUT Y3 ; FANBANK1
OUT Y4 ; FANBANK2
LD M11
AN M5
AN X5
SET M0
RST Y0
RST Y2
OUT Y3 ; FANBANK1のみ(最小換気)
RST Y4
[湿度高⇔低の排他制御]
LD D1
> D3
OUT M12 ; Humid_High
LD D3
> D1
OUT M13 ; Humid_Low
LD M12
AN M5
AN X5
SET M1
OUT Y1 ; ERユニットON
OUT Y3
OUT Y4
LD M13
AN M5
AN X5
SET M1
RST Y1
OUT Y3
RST Y4
[正常LED表示制御]
LD M3
ANDN M2
OUT Y7 ; システム正常LED
[非常停止処理]
LD X6
RST Y0
RST Y1
RST Y2
RST Y3
RST Y4
SET Y6
SET M5
RST M3
[手動オーバーライド]
LD X5
SET M4
RST M3
RST M5
🧠 構造化テキスト(ST)形式
// 初期化
IF SM0 THEN
D2 := 22; // 温度設定値
D3 := 50; // 湿度設定値
M3 := TRUE; // 通常モード
END_IF;
// H2センサ警報処理
IF X0 AND NOT X5 AND NOT X6 THEN
M2 := TRUE;
Y5 := TRUE; // 警報ブザー
Y6 := TRUE; // 非常換気
M3 := FALSE;
M5 := TRUE;
END_IF;
// 温度判定(アナログ比較)
Temp_High := D0 > D2;
Temp_Low := D0 < D2;
// 温度制御
IF (Temp_High OR Temp_Low) AND NOT M5 AND NOT X5 THEN
M0 := TRUE;
IF Temp_High THEN
Y0 := TRUE; // チラーON
Y2 := TRUE; // DAHU冷却
Y3 := TRUE;
Y4 := TRUE;
ELSIF Temp_Low THEN
Y0 := FALSE;
Y2 := FALSE;
Y3 := TRUE;
Y4 := FALSE;
END_IF;
END_IF;
// 湿度判定
Humid_High := D1 > D3;
Humid_Low := D1 < D3;
// 湿度制御
IF (Humid_High OR Humid_Low) AND NOT M5 AND NOT X5 THEN
M1 := TRUE;
IF Humid_High THEN
Y1 := TRUE; // ERユニットON
Y3 := TRUE;
Y4 := TRUE;
ELSIF Humid_Low THEN
Y1 := FALSE;
Y3 := TRUE;
Y4 := FALSE;
END_IF;
END_IF;
// システム正常LED
IF M3 AND NOT M2 THEN
Y7 := TRUE;
ELSE
Y7 := FALSE;
END_IF;
// 非常停止処理
IF X6 THEN
Y0 := FALSE;
Y1 := FALSE;
Y2 := FALSE;
Y3 := FALSE;
Y4 := FALSE;
Y6 := TRUE;
M5 := TRUE;
M3 := FALSE;
END_IF;
// 手動オーバーライド処理
IF X5 THEN
M4 := TRUE;
M3 := FALSE;
M5 := FALSE;
END_IF;
🔚 補足
ご希望に応じて:
- GX Works、TIA Portal、KV STUDIOなどに合わせた記述形式にも対応可能です。
- グラフィカルなラダー図(PDFやCAD形式)としての出力も可能です。
- データロギングやPIDチューニング機能の追加も対応可能です。
必要であれば、実際のHMI連動画面(温湿度表示・強制切替)例や、Melsec・Keyence・Omron等のPLCモデル別命令にも対応しますので、お申し付けください。
以下に、DeepSeekが提示したAmazonデータセンターの電気制御ラダープログラム例に対するセカンドオピニオンを提示します。
---
✅ 評価:全体として妥当な制御ロジック設計
DeepSeekの回答は、H2センサーおよびTHEセンサーに基づいた設備制御を明快にモデル化しており、基本構成は以下の点で評価できます。
1. シグナル設計が明瞭
入力(X)、出力(Y)、内部リレー(M)、データレジスタ(D)などが整理されており、可読性と保守性が高い。
命名もわかりやすく、教育・設計レビューの観点で実用的です。
2. H2センサーの緊急処理ロジックは妥当
水素は爆発性が高く、即時対応が必須なため、非常換気+ブザー+システム停止の組合せは正しい。
オーバーライド(X5)や非常停止(X6)の無視条件が設けられており、安全優先の設計思想が見られます。
3. THEセンサーによる温湿度制御ロジックも概ね良好
温度や湿度に対して個別のフラグ(M0, M1)を立てたうえで、複数機器を段階制御。
換気・冷却の併用も適切に設計されている。
---
❗ 懸念・改善点(プロの視点での追加指摘)
❶ ラダー図の「論理競合」リスク
M0・M1 により 温度高/低 or 湿度高/低の両方に同時反応する可能性あり。
例:X1(高)とX3(低)がチャタリングで同時にONになると、Y0がON・OFFの両方で操作される。
➤ 排他制御が必要(温度制御でも一方のみ評価)
> ✅【改善提案】
LD X1
ANDN X3
OUT M0_High
LD X3
ANDN X1
OUT M0_Low
→ M0_High または M0_Low のどちらかのみ有効とする。
---
❷ FANBANK の多重出力制御に関する調整
Y3/Y4(FANBANK)のONが温湿度制御で重複してON指令されるが、FANの段数制御には明確な優先順位が必要。
➤ エネルギー効率や設備寿命を考慮したステージング制御が必要
> ✅【改善提案】
FANBANK の出力を共通関数ブロック化し、出力条件を優先度付きで整理。
例:温度制御>湿度制御>最低換気
---
❸ データレジスタ (D0~D3) の未使用
現在温度/湿度、設定値(D0~D3)は宣言されているがまったく使用されていない。
➤ これはPID制御や閾値比較に用いるべきで、X1/X2 などのビット入力よりも柔軟
> ✅【改善提案】
LD D0
> D2
OUT X1 // 温度高フラグ代替
(擬似コード)→ アナログ比較を導入して柔軟制御へ移行可能。
---
❹ 手動オーバーライド(X5)の使い方が単純すぎる
X5がONのときにアラーム無効化や通常モード解除に使われているが、詳細な手動制御操作(例:FANだけONなど)が不可
> ✅【改善提案】
モード選択SW + 各機器ON/OFF入力を追加して「選択的オーバーライド」へ拡張
---
❺ LED (Y7) の点灯条件がやや弱い
通常モード AND 非警報 AND 非アクティブ時にのみ Y7 がON。
➤ 制御中(例えば冷却中など)でも異常がなければ「正常」表示してよいという考えもある。
> ✅【改善案】
LD M3
ANDN M2
AND X6 // 非常停止されていない
OUT Y7
---
✅ 総合評価
評価項目 評価 コメント
安全性 ★★★★★ H2センサーとE-STOPへの反応は非常に良好
可読性 ★★★★★ コメント付き構造化テキストで良好
拡張性 ★★★☆☆ PID制御・アナログ処理・詳細モードは未対応
実用性 ★★★★☆ 実装初期フェーズの標準制御としては妥当
改善余地 多数あり 排他制御/アナログ処理/優先制御など
---
🔚 まとめ
このラダー構成は「教育的・初期設計段階としては適切」ですが、実運用に投入するには以下が必要です:
1. アナログセンサ値のしきい値比較(Dレジスタ活用)
2. 排他制御の導入(温湿度それぞれ)
3. FANステージ制御の優先制御
4. 手動モードの拡張性
これらを盛り込めば、現実のデータセンター(特にAmazonのようなTier4相当)で使用される制御に近づく設計になるでしょう。
---
ご希望であれば、上記の改善点を反映した**完全な改善版ラダー図(ST形式またはLD記述)**を作成可能です。ご指示ください。
# Amazonデータセンター電気制御ラダープログラム例
以下は、AmazonデータセンターにおけるH2センサー(水素センサー)とTHEセンサー(温度・湿度センサー)の検知に基づき、チラー、ERユニット、DAHU(空調処理ユニット)、FANBANKなどの機器をPLCで制御するラダープログラムの例です。
## ラダー図ソースコード (構造化テキスト形式)
```
// Amazon Data Center Control System
// PLC Ladder Logic Program for Equipment Control
// Based on H2 and THE Sensor Inputs
// 入力定義
X0 H2_Sensor_Alarm // 水素センサー警報 (1=異常検知)
X1 THE_Sensor_Temp_High // 温度高警報
X2 THE_Sensor_Humid_High // 湿度高警報
X3 THE_Sensor_Temp_Low // 温度低警報
X4 THE_Sensor_Humid_Low // 湿度低警報
X5 Manual_Override // 手動オーバーライドスイッチ
X6 Emergency_Stop // 非常停止ボタン
// 出力定義
Y0 Chiller_Compressor // チラー圧縮機制御
Y1 ER_Unit_Fan // ERユニットファン制御
Y2 DAHU_Cooling_Valve // DAHU冷却バルブ制御
Y3 FanBank_Stage1 // FANBANK ステージ1
Y4 FanBank_Stage2 // FANBANK ステージ2
Y5 Alarm_Buzzer // 警報ブザー
Y6 Emergency_Ventilation // 非常換気システム
Y7 System_OK_LED // システム正常LED
// 内部変数定義
M0 Temp_Control_Active // 温度制御アクティブフラグ
M1 Humid_Control_Active // 湿度制御アクティブフラグ
M2 H2_Alarm_Active // H2警報アクティブフラグ
M3 System_Normal_Mode // システム通常モード
M4 System_Alert_Mode // システム警報モード
M5 System_Critical_Mode // システム緊急モード
D0 Current_Temperature // 現在温度 (℃)
D1 Current_Humidity // 現在湿度 (%RH)
D2 Temp_Setpoint // 温度設定値 (例: 22℃)
D3 Humid_Setpoint // 湿度設定値 (例: 50%)
// システム初期化
LD SM0 // 常時ONリレー
MOV 22, D2 // 温度設定値初期化
MOV 50, D3 // 湿度設定値初期化
SET M3 // 通常モード開始
// H2センサー監視と警報処理
LD X0 // H2センサー警報
OR M2 // または既に警報状態
AN X5 // かつ手動オーバーライドなし
AN X6 // かつ非常停止なし
OUT M2 // H2警報アクティブフラグをセット
LD M2
OUT Y5 // 警報ブザー作動
OUT Y6 // 非常換気システム起動
RST M3 // 通常モード解除
SET M5 // 緊急モード設定
// THEセンサーによる温度制御
LD X1 // 温度高警報
OR X3 // または温度低警報
AN M5 // かつ緊急モードでない
AN X5 // かつ手動オーバーライドなし
OUT M0 // 温度制御アクティブ
LD M0
AND X1 // 温度が高い場合
OUT Y0 // チラー圧縮機ON
OUT Y2 // DAHU冷却バルブ開
OUT Y3 // FANBANK ステージ1ON
OUT Y4 // FANBANK ステージ2ON
LD M0
AND X3 // 温度が低い場合
RST Y0 // チラー圧縮機OFF
RST Y2 // DAHU冷却バルブ閉
RST Y4 // FANBANK ステージ2OFF
OUT Y3 // FANBANK ステージ1ON (最小換気)
// THEセンサーによる湿度制御
LD X2 // 湿度高警報
OR X4 // または湿度低警報
AN M5 // かつ緊急モードでない
AN X5 // かつ手動オーバーライドなし
OUT M1 // 湿度制御アクティブ
LD M1
AND X2 // 湿度が高い場合
OUT Y1 // ERユニット除湿モードON
OUT Y3 // FANBANK ステージ1ON
OUT Y4 // FANBANK ステージ2ON
LD M1
AND X4 // 湿度が低い場合
RST Y1 // ERユニット除湿モードOFF
OUT Y3 // FANBANK ステージ1ON (最小換気)
// システム状態表示
LD M3 // 通常モード
ANDN M2 // かつH2警報なし
ANDN M0 // かつ温度制御非アクティブ
ANDN M1 // かつ湿度制御非アクティブ
OUT Y7 // システム正常LED点灯
// 非常停止回路
LD X6 // 非常停止ボタンが押された
RST Y0 // チラー停止
RST Y1 // ERユニット停止
RST Y2 // DAHUバルブ閉
RST Y3 // FANBANK停止
RST Y4 // FANBANK停止
SET Y6 // 非常換気システム起動
RST M3 // 通常モード解除
SET M5 // 緊急モード設定
// 手動オーバーライド処理
LD X5 // 手動オーバーライドがON
OUT M4 // 警報モード設定
RST M3 // 通常モード解除
RST M5 // 緊急モード解除
```
## プログラム説明
1. **センサー入力監視**:
- H2センサー(X0)で水素漏洩を検知すると、警報ブザー(Y5)と非常換気(Y6)を起動
- THEセンサーで温度(X1,X3)と湿度(X2,X4)を監視
2. **温度制御**:
- 温度が高い場合: チラー(Y0)、DAHU冷却バルブ(Y2)、FANBANK全段(Y3,Y4)を起動
- 温度が低い場合: 冷却系を停止し、FANBANK最小換気(Y3)のみ維持
3. **湿度制御**:
- 湿度が高い場合: ERユニット除湿モード(Y1)とFANBANK全段を起動
- 湿度が低い場合: 除湿を停止し、FANBANK最小換気を維持
4. **動作モード**:
- 通常モード(M3): すべて正常
- 警報モード(M4): 手動オーバーライド時
- 緊急モード(M5): H2検知または非常停止時
5. **安全機能**:
- 非常停止(X6)時は主要機器を停止し、非常換気のみ作動
- 手動オーバーライド(X5)で自動制御を無効化
このプログラムは基本的な制御ロジックを示しており、実際のデータセンターではより複雑な制御(PID制御、機器のステージング制御、冗長系の管理など)が追加されることが一般的です。また、Amazonの実際のシステムはより高度な分散制御アーキテクチャを採用している可能性があります。
以下に、**ステップ入力**(順次動作制御)をラダー言語(ラダー図)とアセンブリ言語(x86)で実装する方法を解説します。ステップ入力は、工程ごとに順番に動作を進める制御方式で、生産ラインや自動装置でよく使われます。
---
### 1. ラダー言語でのステップ制御(3工程の例)
#### ラダー図構成
```
|-----|-----[MOV K1 S0]--| (初期化: S0=1)
| START | |
|-------|----------------|
| S0 |-----[MOV K1 S1]--| (工程1開始)
| |-----[MOV K0 S0]--| (S0オフ)
|-------|----------------|
| S1 |-----(工程1動作)--|
| |-----[TMR T1 5s]--|
| |-----[MOV K1 S2]--| (工程2へ)
| |-----[MOV K0 S1]--| (S1オフ)
|-------|----------------|
| S2 |-----(工程2動作)--|
| |-----[TMR T2 3s]--|
| |-----[MOV K1 S0]--| (先頭に戻る)
| |-----[MOV K0 S2]--| (S2オフ)
```
**動作説明**:
1. `START`信号で初期化(`S0=1`)
2. `S0`がON → 工程1開始(`S1=1`)、`S0`オフ
3. 工程1完了後、`S2`へ移行
4. 最終工程後、最初のステップに戻る
---
### 2. x86アセンブリ言語でのステップ制御
#### データ定義
```assembly
section .data
Steps db 1, 0, 0 ; ステップ状態 (S0,S1,S2)
Timer dd 0 ; タイマーカウンタ
Delay1 equ 500 ; 工程1の遅延時間(5秒)
Delay2 equ 300 ; 工程2の遅延時間(3秒)
```
#### 制御ループ
```assembly
section .text
global _start
_start:
; 初期化
mov byte [Steps], 1 ; S0=1
control_loop:
; ステップS0チェック
cmp byte [Steps], 0b00000001
jne check_s1
; 工程1開始処理
mov byte [Steps], 0b00000010 ; S1=1, S0=0
mov dword [Timer], Delay1
jmp timer_check
check_s1:
cmp byte [Steps], 0b00000010
jne check_s2
; 工程2移行判定
dec dword [Timer]
jnz end_loop
mov byte [Steps], 0b00000100 ; S2=1, S1=0
mov dword [Timer], Delay2
jmp end_loop
check_s2:
; 工程3→最初に戻る
dec dword [Timer]
jnz end_loop
mov byte [Steps], 0b00000001 ; S0=1, S2=0
end_loop:
; 実際の出力処理(ポート操作など)
call output_actions
jmp control_loop
output_actions:
; ステップに応じた出力
test byte [Steps], 0b00000010
jz not_step1
; 工程1の出力処理(例: ポート0x20に信号)
mov al, 1
out 0x20, al
not_step1:
ret
```
---
### 3. 動作フロー比較
| 要素 | ラダー言語 | アセンブリ言語 |
|-----------------|-------------------------------|-----------------------------------|
| **状態管理** | 内部リレー(S0,S1,S2) | メモリ変数(Steps) |
| **タイミング** | TMR命令 | カウンタ変数(Timer) |
| **遷移条件** | 接点の組み合わせ | 条件分岐(cmp/jne) |
| **出力処理** | 直接コイル操作 | `out`命令によるポート制御 |
---
### 4. 重要な注意点
1. **PLCのスキャンサイクル**:
ラダー図はサイクルごとに全ステップを評価しますが、アセンブリでは明示的な状態管理が必要です。
2. **タイマー実装**:
- 実際のPLC: ハードウェアタイマーを使用
- アセンブリ: ソフトウェアカウンタで模擬(遅延ループやシステムタイマー利用)
3. **割り込み処理**:
緊急停止などの割り込みを実装する場合:
```assembly
emergency_stop:
mov byte [Steps], 0 ; 全ステップ停止
ret
```
---
### 5. 応用例(工程追加)
4工程目を追加する場合:
```assembly
; データ拡張
Steps db 1, 0, 0, 0 ; S0-S3
; 制御ループ追加
check_s2:
cmp byte [Steps], 0b00000100
jne check_s3
; 工程3処理
dec dword [Timer]
jnz end_loop
mov byte [Steps], 0b00001000 ; S3=1
mov dword [Timer], Delay3
check_s3:
; 最終工程→最初に戻る
dec dword [Timer]
jnz end_loop
mov byte [Steps], 0b00000001 ; S0=1
```
---
### 6. ラダー図の別実装(STL形式)
三菱電機PLCのステップラダー例:
```
|--[SET S0]--| (初期化)
| S0 |--[SET S1][RST S0]--|
| S1 |--[TMR T1 K50]------|
| T1 |--[SET S2][RST S1]--|
| S2 |--[TMR T2 K30]------|
| T2 |--[SET S0][RST S2]--|
```
このように、ステップ制御は「状態変数」と「遷移条件」の組み合わせで実現されます。アセンブリでは状態管理を明示的に行う必要がありますが、PLCではラダー図がこの複雑さを抽象化しています。
以下に、**XOR回路(排他的論理和)**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。XORは「入力が異なるときに真」となる特性を持ち、制御システムで頻繁に利用されます。
---
### 1. ラダー言語(ラダー図)でのXOR回路
#### 方法1: 基本ロジックの組み合わせ
```
|-----| |/|---( )--| (A AND NOT B)
| A | | B | OUT1 |
|-----| |-----| |
|/|---|-----| |
| A | | B | |
|-----|-------( )--| (NOT A AND B)
OUT2 |
|-----|-------( )--|
|OUT1 | OUT2 OUT | (OUT1 OR OUT2)
```
**動作**:
1. `(A AND NOT B)` と `(NOT A AND B)` を並列実行
2. 両方の結果をORで統合
#### 方法2: 機種依存のXOR命令(一部PLC)
```
|--[XOR A B]--( )--|
| OUT |
```
(※三菱電機PLCなどでは`XOR`命令が直接利用可能)
---
### 2. x86アセンブリ言語でのXOR回路
#### 基本実装(メモリ変数使用)
```assembly
section .data
A db 1 ; 入力A (1=ON, 0=OFF)
B db 0 ; 入力B (1=ON, 0=OFF)
OUT db 0 ; 出力OUT
section .text
global _start
_start:
; XOR演算: A XOR B
mov al, [A]
xor al, [B] ; AL = A XOR B (排他的論理和)
mov [OUT], al ; 結果を保存
; プログラム終了
mov eax, 1
int 0x80
```
#### 物理I/O版(PLC風リアルタイム制御)
```assembly
section .text
global _start
_start:
; ポートから入力読み取り
in al, 0x20 ; A
and al, 0x01
in bl, 0x21 ; B
and bl, 0x01
; XOR演算
xor al, bl ; A XOR B
out 0x22, al ; 結果を出力
jmp _start ; 無限ループ
```
---
### 3. 動作の真理値表
| A | B | OUT (XOR) |
|---|---|----------|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
---
### 4. ラダー図とアセンブリの対応ポイント
| ラダー要素 | アセンブリ対応 |
|-------------------------|---------------------|
| 排他的条件の並列分岐 | `xor` 命令直接利用 |
| 中間リレー(OUT1/OUT2) | レジスタ暫存 |
---
### 5. 最適化されたアセンブリ実装
条件分岐を利用した明示的実装:
```assembly
_start:
mov al, [A]
cmp al, [B]
jne set_one ; A ≠ B の場合ジャンプ
mov al, 0 ; OUT=0
jmp save
set_one:
mov al, 1 ; OUT=1
save:
mov [OUT], al
```
---
### 6. 重要な注意点
1. **PLCのXOR実装コスト**:
ラダー図ではXORを4つの接点で表現する必要があり、メモリリレーを消費します。
2. **アセンブリの`xor`命令**:
- ビット単位演算のため、マスク処理(`and al, 0x01`)が必要
- フラグレジスタに影響(`jnz`などの分岐に活用可能)
3. **タイミング制約**:
物理I/Oでは入力のチャタリング防止にディレイ処理が必要な場合があります。
---
### 7. 応用例(パリティチェック)
XORを使った偶数パリティ生成:
```assembly
mov al, [DATA]
xor al, [PARITY] ; パリティビット更新
```
#### ラダー図での応用(不一致検出):
```
|-----| |-----|-------( )--|
| A | | B | ALARM |
|-----| |/|---| |
|/|---|-----| |
| A | | B | |
```
(AとBが異なるとアラーム作動)
---
XOR回路は「状態の不一致検出」や「エンコーダ処理」に不可欠です。PLCではシーケンス制御、アセンブリでは暗号化処理など多様な場面で活用されます。
以下に、**NOR回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。NORは「ORの否定」であり、NANDと同様に万能論理ゲートとして機能します。
---
### 1. ラダー言語(ラダー図)でのNOR回路
#### 方法1: OR + NOTの組み合わせ
```
|-----|-------|/|-------( )--|
| A | NOT OUT |
|-----| |
| B | |
```
**動作**:
1. `A` OR `B` を計算
2. その結果をNOT(否定)して `OUT` に出力
#### 方法2: 否定接点を利用(PLC機種依存)
```
|/|---|/|---( )--|
| A | | B | OUT |
```
**動作**:
- `A` と `B` が**両方OFFの場合のみ** `OUT` がON(NORの定義通り)
---
### 2. x86アセンブリ言語でのNOR回路
#### 基本実装(メモリ変数使用)
```assembly
section .data
A db 0 ; 入力A (1=ON, 0=OFF)
B db 0 ; 入力B (1=ON, 0=OFF)
OUT db 0 ; 出力OUT
section .text
global _start
_start:
; NOR演算: NOT (A OR B)
mov al, [A]
or al, [B] ; AL = A OR B
xor al, 1 ; AL = NOT (A OR B) (ビット反転)
mov [OUT], al ; OUTに結果を保存
; プログラム終了
mov eax, 1
int 0x80
```
#### 物理I/O版(PLC風リアルタイム制御)
```assembly
section .text
global _start
_start:
; ポートから入力読み取り
in al, 0x20 ; A
and al, 0x01
in bl, 0x21 ; B
and bl, 0x01
; NOR演算
or al, bl ; A OR B
xor al, 1 ; NOTを適用
out 0x22, al ; 結果を出力
jmp _start ; PLCのように無限ループ
```
---
### 3. 動作の真理値表
| A | B | A OR B | OUT (NOR) |
|---|---|-------|----------|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 0 |
---
### 4. ラダー図とアセンブリの対応ポイント
| ラダー要素 | アセンブリ対応 |
|---------------------|---------------------------|
| 並列接点(OR部分) | `or` 命令 |
| NOT演算 | `xor al, 1`(ビット反転) |
| 出力コイル | `mov [OUT], al` |
---
### 5. 最適化されたアセンブリ実装
条件分岐を利用した高速化:
```assembly
_start:
mov al, [A]
or al, [B] ; A OR B
jnz set_zero ; 結果が0でない場合ジャンプ
mov al, 1 ; OUT=1 (NORが真)
jmp save
set_zero:
mov al, 0 ; OUT=0
save:
mov [OUT], al
```
---
### 6. 重要な注意点
1. **PLCの論理評価順序**:
ラダー図では上から下へ順次評価されるため、NORの実装方法によって動作が異なる場合があります。
2. **アセンブリのビット操作**:
- 物理I/Oでは`and al, 0x01`でマスク処理が必要(PLCは1ビット単位)
- `not`命令は全ビット反転のため、`xor al, 1`が安全
3. **NORの特性**:
```
NOT (A OR B) = NOT A AND NOT B
```
この性質を利用すれば、否定接点のみでラダー図を構成可能です。
---
### 7. 応用例(他の論理ゲートの構築)
NORも**万能論理ゲート**です。例としてNOTゲートの作成:
```assembly
; NOT X = X NOR X
mov al, [X]
or al, al ; AL = X OR X
xor al, 1 ; AL = NOT X
```
#### ANDゲートの構成(ド・モルガンの法則利用):
```
A AND B = NOT ((NOT A) OR (NOT B))
```
対応するアセンブリ:
```assembly
mov al, [A]
xor al, 1 ; NOT A
mov bl, [B]
xor bl, 1 ; NOT B
or al, bl ; (NOT A) OR (NOT B)
xor al, 1 ; NOT → AND完成
```
---
NOR回路は組み合わせ次第で任意の論理回路を構築できるため、PLCや低レベル制御プログラムで重要な役割を果たします。ハードウェア記述言語(HDL)やFPGA設計でも同様の原理が適用されます。
以下に、**NAND回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。NANDはANDの否定であり、デジタル回路の基本ゲートの1つです。
---
### 1. ラダー言語(ラダー図)でのNAND回路
#### 方法1: AND + NOTの組み合わせ
```
|-----| |-----|-------|/|-------( )--|
| A | | B | NOT | OUT |
```
**動作**:
1. `A` AND `B` を計算
2. その結果をNOT(否定)して `OUT` に出力
#### 方法2: 接点の否定利用(PLC機種依存)
```
|/|---| |/|---( )--|
| A | | B | OUT |
```
**動作**:
- `A` と `B` が**両方ONでない場合**に `OUT` がON(NANDの定義通り)
---
### 2. x86アセンブリ言語でのNAND回路
#### 基本実装(メモリ変数使用)
```assembly
section .data
A db 1 ; 入力A (1=ON, 0=OFF)
B db 1 ; 入力B (1=ON, 0=OFF)
OUT db 0 ; 出力OUT
section .text
global _start
_start:
; NAND演算: NOT (A AND B)
mov al, [A]
and al, [B] ; AL = A AND B
xor al, 1 ; AL = NOT (A AND B) (ビット反転)
mov [OUT], al ; OUTに結果を保存
; プログラム終了
mov eax, 1
int 0x80
```
#### 物理I/O版(PLC風)
```assembly
section .text
global _start
_start:
; ポートから入力読み取り
in al, 0x20 ; A
and al, 0x01
in bl, 0x21 ; B
and bl, 0x01
; NAND演算
and al, bl ; A AND B
xor al, 1 ; NOTを適用
out 0x22, al ; 結果を出力
jmp _start ; 無限ループ
```
---
### 3. 動作の真理値表
| A | B | A AND B | OUT (NAND) |
|---|---|--------|-----------|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
---
### 4. ラダー図とアセンブリの対応ポイント
| ラダー要素 | アセンブリ対応 |
|---------------------|---------------------------|
| 直列接点(AND部分) | `and` 命令 |
| NOT演算 | `xor al, 1`(ビット反転) |
| 出力コイル | `mov [OUT], al` |
---
### 5. 最適化されたアセンブリ実装
NANDは「ANDの否定」なので、`AND`+`NOT`の代わりに条件分岐で実装可能:
```assembly
_start:
mov al, [A]
and al, [B]
jz set_output ; A AND B=0 ならジャンプ
mov al, 0 ; そうでなければOUT=0
jmp save
set_output:
mov al, 1 ; OUT=1
save:
mov [OUT], al
```
---
### 6. 重要な注意点
1. **PLCのNOT接点**:
機種によって `|/|`(常時閉)か `|\|`(常時開)の記号が異なる場合があります。
2. **アセンブリのNOT演算**:
- `xor al, 1`:最下位ビットの反転(1ビット操作)
- `not al`:全ビット反転(8ビット操作)→ マスクが必要
3. **タイミング制約**:
実際のPLCでは、NAND演算の遅延時間がシステム動作に影響する場合があります。
---
### 7. 応用例(他の論理ゲートの構築)
NANDは**万能論理ゲート**と呼ばれ、他の全ての論理回路を構成できます。
例)NOTゲートの作成:
```assembly
; NOT X = X NAND X
mov al, [X]
and al, al ; AL = X AND X
xor al, 1 ; AL = NOT X
```
このように、NAND回路は組み合わせ次第で複雑な論理を表現できます。ハードウェア制御やPLCプログラミングで頻繁に利用される基本パターンです。
以下に、**AND回路**をラダー言語(ラダー図)とアセンブリ言語(x86)で記述した例を説明します。
---
### 1. ラダー言語(ラダー図)でのAND回路
#### 例: 2入力AND回路(A AND B → OUT)
```
|-----| |-----|-------( )--|
| A | | B | OUT |
```
**動作条件**:
- 入力 `A` **かつ** 入力 `B` がON(接点閉)のとき、出力 `OUT` がON(コイル励磁)します。
---
### 2. x86アセンブリ言語でのAND回路
#### 例: メモリ上の変数でAND演算
```assembly
section .data
A db 1 ; 入力A (1=ON, 0=OFF)
B db 1 ; 入力B (1=ON, 0=OFF)
OUT db 0 ; 出力OUT (初期値0)
section .text
global _start
_start:
; AND演算の実行
mov al, [A] ; AL = Aの値
and al, [B] ; AL = A AND B
mov [OUT], al ; OUT = 結果
; プログラム終了
mov eax, 1 ; システムコール番号 (exit)
int 0x80 ; カーネル呼び出し
```
#### 動作説明:
1. `A` と `B` の値をレジスタ `AL` にロード
2. `AND` 命令で論理積を計算
- `A=1` かつ `B=1` の場合のみ `AL=1` になります
3. 結果を `OUT` に格納
---
### 3. 物理I/Oを使った例(PLC風の実装)
#### 例: ポート入出力でAND回路を実現
```assembly
section .text
global _start
_start:
; ポート0x20から入力Aを読み取り
in al, 0x20 ; AL = ポート0x20の値 (A)
and al, 0x01 ; 最下位ビット(Aの状態)を抽出
; ポート0x21から入力Bを読み取り
in bl, 0x21 ; BL = ポート0x21の値 (B)
and bl, 0x01 ; 最下位ビット(Bの状態)を抽出
; AND演算
and al, bl ; AL = A AND B
; ポート0x22に結果を出力
out 0x22, al ; OUTポートに書き込み
; 無限ループ(PLCは常に動作するため)
jmp _start
```
#### 動作説明:
- ハードウェアの入力ポート(`0x20`, `0x21`)からスイッチ状態を読み取り
- ビット演算でANDを計算後、出力ポート(`0x22`)に結果を送信
- PLCのように**無限ループ**で動作
---
### 4. ラダー図とアセンブリの対応関係
| ラダー要素 | アセンブリ対応 |
|-------------------|-----------------------------|
| 入力接点(A) | `mov al, [A]` または `in`命令 |
| AND論理 | `and` 命令 |
| 出力コイル(OUT) | `mov [OUT], al` または `out`命令 |
---
### 5. 注意点
- **PLCの実際の動作**:
実機のPLCは「スキャンサイクル」と呼ばれるループで入出力を連続的に処理します。アセンブリの無限ループ(`jmp _start`)がこれに相当します。
- **ビット操作**:
PLCでは1ビット単位で入出力を制御しますが、x86アセンブリでは通常8ビット(1バイト)単位で操作します。
- **タイミング**:
実際のPLCはタイマーやシーケンシャル制御を含みますが、単純なAND回路では不要です。
このように、ラダー図のAND回路はアセンブリでは **`AND`命令** で直接表現できます。
はい、計装にはPLC(プログラマブルロジックコントローラ)やシーケンス制御も含まれます。
詳しく説明すると以下のようになります。
計装とは
計装(Instrumentation)は、産業プロセスや機械の運転を監視、測定、制御するために、様々な計測機器や制御機器を設計、設置、運用、保守する技術分野です。これには、温度、圧力、流量、液位といった物理量の計測から、それらのデータを収集し、適切な制御を行うシステム全体が含まれます。
PLCとシーケンス制御の関連性
* PLC (Programmable Logic Controller):
* PLCは、産業オートメーションにおいて非常に重要な役割を果たす制御装置です。元々はリレー回路の代替として開発され、繰り返し行われる作業や複雑な論理判断を自動的に制御するために用いられます。
* 計装システムにおいて、PLCは「コントローラ」の核となります。 センサーからの入力信号(計装機器からの計測値)を受け取り、事前にプログラムされたロジックに基づいて、アクチュエータ(バルブ、モーターなど)に出力信号を送ることで、プロセスを制御します。
* PLCは、DCS(分散型制御システム)に比べ小規模なシステムや、高速なシーケンス制御が求められる場合に特に強みを発揮します。最近では、DCSのようなプロセス制御機能を持つ「PLC計装」という概念も普及しており、一台のPLCでループ制御とシーケンス制御の両方を行うことが可能です。
* ラダー図 (Ladder Diagram) と ST言語 (Structured Text):
* これらはPLCをプログラミングするための主要な言語です。
* ラダー図:リレー回路図に似たグラフィカルな言語で、電気回路に慣れたエンジニアにとって直感的で理解しやすいのが特徴です。主にオンオフ制御やシンプルなシーケンス制御に用いられます。
* ST言語:C言語やPascalに似たテキストベースの言語で、より複雑な計算やデータ処理、高度な制御アルゴリズムを記述するのに適しています。近年では、より高度な制御やデータ管理が必要な計装システムでST言語が活用されることも増えています。
* シーケンス制御 (Sequence Control):
* シーケンス制御は、「定められた順序に従って、各段階を逐次進めていく制御」を指します。例えば、製造ラインにおける部品の搬送、加工、組み立てなどの一連の動作や、バッチプロセスにおける工程の切り替えなどがこれに当たります。
* 計装システムにおいては、プロセス全体の自動化を実現するためにシーケンス制御が不可欠です。 例えば、特定の条件が満たされたらバルブを開き、一定時間後にポンプを起動するといった一連の動作は、シーケンス制御によって実現されます。
* PLCはシーケンス制御を実現するための主要なツールであり、ラダー図やST言語などのプログラミング言語を用いて、これらの順序制御ロジックが記述されます。
まとめ
計装は、計測と制御の総合的な技術分野であり、その「制御」の部分においてPLCが重要な役割を担います。そして、PLCのプログラミング言語であるラダー図やST言語を用いて、プラントや機械の自動運転を行うための「シーケンス制御」が実現されます。
したがって、計装という広い概念の中に、PLC(ラダー図やST言語によるプログラミング)やシーケンス制御は密接に含まれていると言えます。
やるしかねーな!転職活動を再開するもよし、社長に新規業務立ち上げを申し出るのもよし。
ただし、新規業務として立ち上げるためには計装の経験者を雇わなければならず、しかもこの分野の営業もさせる必要があり、高額な人件費が予想される。俺の教育も任せなければならない。月給30万円〜で俺は考えているが、厳しいかもしれない。最低37万円は出さないと誰も応募してこないかもしれない。なにせ高度な知識とスキルが必要な分野だからな。
それにしても、他社は若くて転職回数の少ない経験者を安く雇いたいとかバカ丸出しの寝言をほざいてやがるからな。話にならん。教育もしないで経験者が生まれるわけがないだろ!
VVRはマルチストリッパーの1.6mmx2芯の部分で8割の力で5cm外皮を剥ぐ。この時、VVRの外皮は抜けやすいので、反対側の先を曲げておくのが良いらしい。