# C_PLN40 功能块分析报告

## 基本信息

| 项目 | 内容 |
|------|------|
| 功能块名称 | C_PLN40 |
| 功能描述 | Polygon Curve(Maximum 40 Coordinate Points)（多边形曲线，最多40个坐标点） |
| 最后修改 | 2015.12.06 |
| 作者 | Shi Chun Liang |
| 页数 | 1页 |

## 功能概述

C_PLN40 是一个多边形曲线功能块，用于根据最多40个坐标点进行线性插值计算。该功能块检查X坐标点是否单调递增，并根据输入X值在坐标点之间进行线性插值。

## 思维导图

```mermaid
graph TD
    A[C_PLN40 多边形曲线] --> B[输入模块]
    A --> C[处理模块]
    A --> D[输出模块]
    
    B --> B1[X]
    B --> B2[XCP]
    B --> B3[YCP]
    B --> B4[NUM]
    
    C --> C1[点数限制]
    C --> C2[坐标点检查]
    C --> C3[边界判断]
    C --> C4[插值计算]
    
    D --> D1[Y]
    D --> D2[ERR]
    
    B4 --> C1
    B2 --> C2
    C1 --> C2
    C2 --> D2
    B1 --> C3
    B2 --> C3
    C3 --> C4
    B2 --> C4
    B3 --> C4
    C4 --> D1
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style C fill:#e1ffe1
    style D fill:#ffe1e1
```

## 流程路径描述

### 点数限制路径：
开始 → NUM输入 → 限制在2~40之间 → 实际点数n
**功能**: 限制坐标点数量

### 坐标点检查路径：
开始 → 检查X坐标点单调递增 → ERR输出
**功能**: 验证坐标点有效性

### 插值计算路径：
开始 → X输入 → 边界判断 → 插值计算 → Y输出
**功能**: 计算插值结果

## 逐帧功能分析

### 点数限制

**功能描述**: 限制坐标点数量在2~40之间

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| NUM | 坐标点数量 | INT | 设定值 |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| n | 实际点数 | UINT |

**触发逻辑**:
- IF NUM < 2 THEN n = 2
- IF NUM > 40 THEN n = 40
- ELSE n = NUM

**功能实现**: 
对输入的坐标点数量进行限幅处理，确保在有效范围内。

### 坐标点检查

**功能描述**: 检查X坐标点是否单调递增

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| XCP | X坐标点数组 | REAL | n个点 |
| n | 实际点数 | UINT | 数值 |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| ERR | 错误标志 | BOOL |

**触发逻辑**:
- IF XCP[i] >= XCP[i+1] FOR ANY i < n-1 THEN ERR = TRUE

**功能实现**: 
遍历所有X坐标点，检查是否单调递增。如果发现任何相邻两点不满足单调递增，则设置错误标志。

### 边界判断与插值计算

**功能描述**: 根据输入X值进行边界判断和插值计算

**输入条件**:
| 信号名称 | 信号描述 | 信号类型 | 触发值 |
|----------|----------|----------|--------|
| X | 输入值 | REAL | 数值 |
| XCP | X坐标点数组 | REAL | n个点 |
| YCP | Y坐标点数组 | REAL | n个点 |
| n | 实际点数 | UINT | 数值 |
| ERR | 错误标志 | BOOL | FALSE |

**输出功能**:
| 信号名称 | 信号描述 | 信号类型 |
|----------|----------|----------|
| Y | 输出值 | REAL |

**触发逻辑**:
- IF X <= XCP[0] THEN Y = YCP[0]
- IF X >= XCP[n-1] THEN Y = YCP[n-1]
- IF XCP[i] <= X <= XCP[i+1] THEN Y = YCP[i] + (X - XCP[i]) * ((YCP[i+1] - YCP[i]) / (XCP[i+1] - XCP[i]))

**功能实现**: 
首先判断X值是否在边界外，如果在边界外则输出边界值。如果在边界内，则找到X所在的区间，使用线性插值公式计算Y值。

## 触发条件总结

### 计算条件
- **点数有效**: 2 <= NUM <= 40
- **坐标点有效**: X坐标点单调递增
- **边界外**: X <= XCP[0] OR X >= XCP[n-1]
- **边界内**: XCP[i] <= X <= XCP[i+1]

## 实现功能总结

### 主要功能
1. **点数限制**: 限制坐标点数量在有效范围内
2. **坐标点检查**: 检查X坐标点是否单调递增
3. **边界判断**: 判断输入值是否在边界外
4. **线性插值**: 在坐标点之间进行线性插值

## 关键信号说明

| 信号名称 | 信号描述 | 信号类型 | 用途 |
|----------|----------|----------|------|
| X | 输入值 | REAL | 输入X值 |
| XCP | X坐标点数组 | REAL | X坐标点 |
| YCP | Y坐标点数组 | REAL | Y坐标点 |
| NUM | 坐标点数量 | INT | 坐标点数量设定 |
| Y | 输出值 | REAL | 插值输出 |
| ERR | 错误标志 | BOOL | 坐标点错误标志 |

## 调试技巧

### 调试步骤
1. 检查NUM值，确认坐标点数量在有效范围内
2. 检查XCP数组，确认X坐标点单调递增
3. 检查ERR标志，确认坐标点有效
4. 检查X值，确认输入正常
5. 监控Y值，观察插值结果

### 常见问题
1. **ERR标志常亮**: 检查XCP数组是否单调递增
2. **插值结果不正确**: 检查X值和坐标点设置
3. **点数不正确**: 检查NUM值设置

### 监控信号列表
- X（输入值）
- XCP、YCP（坐标点）
- NUM（坐标点数量）
- Y（输出）
- ERR（错误标志）
