ステップ入力をラダー言語とアッセンブリ言語で書く

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

コメント

このブログの人気の投稿

Pydroid用ピアノアプリ+ラフマニノフピアノ協奏曲第2番1楽章デモ音源付き

訴えの変更(追加的変更)申立

最高裁での上告理由書受理・却下の判断基準について