# C_HMI32_DFR 功能块分析报告

## 基本信息

| 项目 | 内容 |
|------|------|
| 功能块名称 | C_HMI32_DFR |
| 功能描述 | HMI Interface with DFR（带边沿检测复位的32位HMI接口） |
| 最后修改 | 2018.03.23 |
| 作者 | HuJingQi |
| 页数 | 1页（4个程序段） |

## 功能概述

C_HMI32_DFR是一个带边沿检测复位功能的32位HMI接口功能块。该功能块使用DWORD（32位）数据类型，支持置位(S)和复位(R)控制信号，适用于需要更多命令信号和灵活控制的场合。

### 应用场景
- **保持型按钮控制**：需要保持状态的按钮操作
- **置位/复位控制**：通过S/R信号控制输出状态
- **状态锁存**：锁存HMI操作状态
- **多命令控制**：支持最多32个独立命令

### 功能特点
1. **32位数据宽度**：支持更多命令信号
2. **边沿检测**：检测输入信号的变化
3. **置位控制**：通过S信号置位输出
4. **复位控制**：通过R信号复位输出

## 思维导图

```mermaid
graph TD
    A[C_HMI32_DFR 带DFR的32位HMI接口] --> B[输入处理模块]
    A --> C[状态控制模块]
    A --> D[输出处理模块]
    
    B --> B1[INPUT 输入信号32位]
    B --> B2[S 置位信号32位]
    B --> B3[R 复位信号32位]
    
    C --> C1[边沿检测DWORD]
    C --> C2[异或运算DWORD]
    C --> C3[置位运算DWORD]
    C --> C4[复位运算DWORD]
    
    D --> D1[OUTPUT 输出信号32位]
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style C fill:#f5e1ff
    style D fill:#e1ffe1
```

## 流程路径描述

### 边沿检测路径：
开始 → 读取INPUT → 检测变化 → 生成INPUT_P → 异或运算
**功能**: 检测输入信号的变化

### 状态控制路径：
开始 → 异或结果 → 置位运算 → 复位运算 → 输出
**功能**: 通过S/R信号控制输出状态

## 逐帧功能分析

### Rung 1: 边沿检测

**功能描述**: 检测INPUT信号的变化并生成脉冲

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| INPUT | 输入信号（32位） | DWORD | 变化 |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| INPUT_P | 输入脉冲 | DWORD |

**触发逻辑**:
- INPUT_P = (INPUT XOR INPUTOLD) AND INPUT
- INPUTOLD = INPUT（保存当前状态）

**功能实现**: 
1. 使用XOR_DWORD计算INPUT与INPUTOLD的异或值
2. 使用AND_DWORD与INPUT进行与运算
3. 使用MOVE_DWORD保存当前INPUT状态

### Rung 2: 异或运算

**功能描述**: 将输入脉冲与输出异或

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| INPUT_P | 输入脉冲 | DWORD | 非零 |
| OUTPUT | 当前输出 | DWORD | 数值 |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| OUTPUT | 输出信号 | DWORD |

**触发逻辑**:
- OUTPUT = OUTPUT XOR INPUT_P

**功能实现**: 
使用XOR_DWORD将INPUT_P与OUTPUT异或。

### Rung 3: 置位运算

**功能描述**: 通过S信号置位输出

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| S | 置位信号 | DWORD | 位模式 |
| OUTPUT | 当前输出 | DWORD | 数值 |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| OUTPUT | 输出信号 | DWORD |

**触发逻辑**:
- OUTPUT = OUTPUT OR S

**功能实现**: 
使用OR_DWORD将S与OUTPUT进行或运算，实现置位功能。

### Rung 4: 复位运算

**功能描述**: 通过R信号复位输出

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| R | 复位信号 | DWORD | 位模式 |
| OUTPUT | 当前输出 | DWORD | 数值 |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| OUTPUT | 输出信号 | DWORD |

**触发逻辑**:
- OUTPUT = OUTPUT AND (NOT R)

**功能实现**: 
1. 使用NOT_DWORD对R取反
2. 使用AND_DWORD与OUTPUT进行与运算，实现复位功能

## 触发条件总结

### 边沿检测条件
- **输入变化**: INPUT状态变化产生INPUT_P脉冲

### 置位条件
- **S信号有效**: S对应位为1时置位OUTPUT对应位

### 复位条件
- **R信号有效**: R对应位为1时复位OUTPUT对应位

## 实现功能总结

### 主要功能
1. **边沿检测**: 检测输入信号变化
2. **异或翻转**: 输入脉冲翻转输出状态
3. **置位控制**: 通过S信号置位输出
4. **复位控制**: 通过R信号复位输出

### HMI_DFR系列对比
| 功能块 | 数据类型 | 位数 | 运算指令 |
|--------|----------|------|----------|
| C_HMI16_DFR | WORD | 16位 | XOR_WORD/AND_WORD/OR_WORD |
| **C_HMI32_DFR** | **DWORD** | **32位** | **XOR_DWORD/AND_DWORD/OR_DWORD** |

### 运算优先级
1. 先执行异或运算（输入脉冲）
2. 再执行置位运算（S信号）
3. 最后执行复位运算（R信号）

## 关键信号说明

| 信号名称 | 信号描述 | 信号类型 | 用途 |
|----------|----------|----------|------|
| INPUT | 输入信号 | DWORD | HMI输入（32位） |
| INPUTOLD | 输入旧值 | DWORD | 用于边沿检测 |
| INPUT_P | 输入脉冲 | DWORD | 变化脉冲 |
| S | 置位信号 | DWORD | 置位控制 |
| R | 复位信号 | DWORD | 复位控制 |
| OUTPUT | 输出信号 | DWORD | 状态输出（32位） |

## 调试技巧

### 调试步骤
1. 检查INPUT输入信号变化
2. 监控INPUT_P脉冲生成
3. 检查S和R信号状态
4. 验证OUTPUT输出正确

### 常见问题
1. **输出不变化**: 检查INPUT是否变化
2. **置位不生效**: 检查S信号
3. **复位不生效**: 检查R信号
4. **高位命令丢失**: 确认使用DWORD类型

### 监控信号列表
- INPUT（输入信号）
- INPUT_P（输入脉冲）
- S（置位信号）
- R（复位信号）
- OUTPUT（输出信号）
