ステップ入力をラダー言語とアッセンブリ言語で書く
以下に、**ステップ入力**(順次動作制御)をラダー言語(ラダー図)とアセンブリ言語(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ではラダー図がこの複雑さを抽象化しています。
コメント
コメントを投稿