Files
endo_an_2/PRD.md
T
2026-02-10 09:51:18 +08:00

802 lines
25 KiB
Markdown

# 智能内镜储存柜系统 PRD
## 文档信息
- **项目名称**: 智能内镜储存柜系统
- **版本**: v1.0.1
- **文档日期**: 2026-01-20
- **应用平台**: Android (UniApp + Vue3)
---
## 1. 产品概述
### 1.1 产品定位
智能内镜储存柜是一款面向医疗场景的专业内镜存储管理设备,通过物联网技术实现内镜的智能存取、环境监控、自动消毒等功能,提升医院内镜管理效率和使用安全性。
### 1.2 核心价值
- **智能管理**: 通过RFID/IC卡技术实现内镜自动识别和存取记录
- **环境监控**: 实时监控储存柜内的温度、湿度、压差等关键指标
- **安全存储**: 自动消毒、真空保鲜、门禁管理等多重保障
- **数据追溯**: 完整的操作日志记录,便于追踪和管理
---
## 2. 系统架构
### 2.1 技术栈
- **前端框架**: UniApp + Vue3
- **UI组件**: Ant Design Vue
- **状态管理**: Vuex
- **本地存储**: SQLite
- **硬件通信**: RS485 (传感器 + 门控制) + RS232 (卡片识别 + 设备控制)
- **原生插件**: android-serialport (串口通信)
### 2.2 硬件组成
- **RS485串口**: 温湿度传感器、压差传感器、门锁控制器(左右门)
- **RS232串口**: 16个内镜位置IC卡读写器,门口1个IC卡读写器(可读取人员卡和内镜卡)
- **继电器控制**: 风机、照明、真空泵、消毒设备
- **门系统**: 主门(概念门)、左门、右门(实体门)
---
## 3. 功能模块
### 3.1 启动模块
#### 功能描述
应用启动页面,负责系统初始化和硬件自检。
#### 核心功能
- **串口初始化**
- RS485串口: `/dev/ttyUSB2`, 波特率 9600
- RS232串口: `/dev/ttyUSB1`, 波特率 115200
- 支持通过配置文件自定义串口参数
- **本地存储初始化**
- 加载运行参数配置
- 加载基础设置
- 加载服务器配置
- **数据库初始化**
- user表: 人员卡信息
- endo表: 内镜卡片信息
- scope表: 16个内镜位置状态
- log表: 操作日志
- **时间同步**
- 本地时间初始化
- 网络时间同步(联网状态下)
#### 入口控制
- 点击"进入"按钮跳转主界面
- 密码保护: 可设置屏幕解锁密码
- 调试模式: 连续点击标题5次触发,提供Modbus调试、SQLite调试、清除缓存功能
---
### 3.2 主界面模块
#### 功能描述
系统核心操作界面,实时显示设备状态和内镜存储情况。
#### 核心功能
##### 3.2.1 环境监控显示
- **温度显示**: 实时显示当前温度(°C),超出阈值自动启动风机
- **湿度显示**: 实时显示当前湿度(%RH),超出阈值自动启动风机
- **压差显示**: 实时显示当前压差(Pa),支持压差补偿值设置
- **联网状态**: 显示当前网络连接状态
- **模式切换**: 自动模式/清扫模式
##### 3.2.2 内镜存储管理
- **16个存储位置**: 每个位置支持2个内镜存储位
- **实时状态显示**:
- 空闲: 显示"已取出"
- 占用: 显示内镜编号和存储时长(如: "已存入:32h 42m")
- 临期提醒: 黄色高亮显示(超过临期阈值)
- 超期提醒: 红色高亮显示(超过超期阈值)
- **自动刷新**: 每60秒自动刷新内镜列表数据
##### 3.2.3 设备控制
| 控制项 | 功能说明 | 手动操作 | 自动逻辑 |
|--------|----------|----------|----------|
| 照明 | 控制柜内照明 | 开启/关闭按钮 | 开门自动开启,关门自动关闭 |
| 开门 | 控制左门/右门 | 手动选择门,通过RS485发送开门指令 | 人员刷卡验证通过后,弹窗选择开左门/右门 |
| 消毒 | 控制消毒设备 | 点击开启(运行指定时长后自动关闭) | 根据时间段自动启动/停止 |
| 真空 | 控制真空泵 | (预留) | 开门关闭,关门开启,定时运行/停止 |
##### 3.2.4 模式切换
- **自动模式**: 系统自动运行消毒、真空泵、风机等任务
- **清扫模式**: 停止自动任务,便于设备维护清洁
---
### 3.3 串口通信模块
#### 3.3.1 RS485通信(传感器数据)
**支持的传感器:**
- **温湿度传感器**: 站号02
- 读取指令: `020300000002C438`
- 返回数据格式: `01 03 04 XX XX XX XX XX XX ...`
- **压差传感器**: 站号01
- 读取指令: `01030001000295CB`
- 返回数据格式: `01 03 02 XX XX XX XX ...`
- **门状态监测与控制**: 站号03
- 协议说明: 采用中盛4路数字IO模块,通过Modbus RTU协议通信
- 左门控制(通道1,地址0000H):
- 左门开门指令(磁吸通电): `030600000001480A` (发送后,leftDoor状态更新为true)
- 左门关门指令(磁吸断电): `03060000000089CA` (发送后,leftDoor状态更新为false)
- 右门控制(通道2,地址0001H):
- 右门开门指令(磁吸通电): `03060001000109CA` (发送后,rightDoor状态更新为true)
- 右门关门指令(磁吸断电): `03060001000048E8` (发送后,rightDoor状态更新为false)
- 门状态上报(功能码04,读输入寄存器):
- 左门触点开关状态变化时主动上报
- 右门触点开关状态变化时主动上报
- 收到上报数据后需更新对应门状态
- 状态定义: true=开门(磁吸通电), false=关门(磁吸断电,触点触发)
**门状态计算规则:**
- 门状态(door) = 左门状态(leftDoor) OR 右门状态(rightDoor)
- 任一门打开时,door状态为开
- 两门都关闭时,door状态为关
**数据读取策略:**
- 定时轮询: 每5秒读取一次温湿度数据,间隔1秒读取压差数据
- 数据校验: 温湿度数据过滤异常值(0-100范围内有效)
#### 3.3.2 RS232通信(控制与卡片识别)
**指令协议:**
| 功能 | 指令码 | 格式 | 说明 |
|------|--------|------|------|
| 风机控制 | 02 | `5AA5EE02` + `01`(开)/`00`(关) | 控制风机 |
| 照明控制 | 03 | `5AA5EE03` + `01`(开)/`00`(关) | 控制照明 |
| 真空泵控制 | 04 | `5AA5EE04` + `01`(开)/`00`(关) | 控制真空泵 |
| 消毒控制 | 05 | `5AA5EE05` + `01`(开)/`00`(关) | 控制消毒设备 |
**门状态逻辑说明:**
- 门开关状态(door)是逻辑状态,由左右门物理状态共同决定
- 规则: `door = leftDoor OR rightDoor`
- 左门开 或 右门开 → door = true (开)
- 左门关 且 右门关 → door = false (关)
**门控制流程:**
1. 发送开门指令到RS485站号03
- 左门开门: `cmd.LeftDoor(true)` → 发送 `030600000001480A` (磁吸通电)
- 右门开门: `cmd.RightDoor(true)` → 发送 `03060001000109CA` (磁吸通电)
2. 指令发送后,立即更新对应门的物理状态
- 左门打开 → `leftDoor = true`
- 右门打开 → `rightDoor = true`
3. 根据左右门状态自动计算门状态
- `door = leftDoor OR rightDoor`
4. 发送关门指令到RS485站号03
- 左门关门: `cmd.LeftDoor(false)` → 发送 `03060000000089CA` (磁吸断电)
- 右门关门: `cmd.RightDoor(false)` → 发送 `03060001000048E8` (磁吸断电)
5. 指令发送后,更新对应门的物理状态
- 左门关闭 → `leftDoor = false`
- 右门关闭 → `rightDoor = false`
6. 重新计算门状态 `door = leftDoor OR rightDoor`
**卡片识别协议:**
- **门口IC卡读写器**: 1个,位于门口,可读取人员卡和内镜卡
- 卡存入: `20 01 00 08 04 00 00 00 [卡号4字节] [校验] 03` (14字节)
- 卡离开: `20 01 00 01 02 [校验] 03` (7字节)
- 卡号位置: 倒数4-8字节为卡号数据
- **16个内镜位置IC卡读写器**: 每个内镜位置1个,仅读取内镜卡
- 卡存入: `20 01 00 08 04 00 00 00 [卡号4字节] [校验] 03` (14字节)
- 卡离开: `20 01 00 01 02 [校验] 03` (7字节)
- 卡号位置: 倒数4-8字节为卡号数据
**卡片处理逻辑:**
- **卡片读取**: 接收卡片数据 → 提取卡号 → 在数据库中比对判断卡片类型
- 在user表中找到 → 人员卡
- 在endo表中找到 → 内镜卡
- 都未找到 → 无效卡片
- **人员卡存入**: 验证人员卡号是否在user数据库中 → 弹窗选择开左门/开右门 → 用户确认后通过RS485发送开门指令 → 更新门状态 → 记录日志
- **内镜卡存入**: 验证内镜卡号是否在endo数据库中 → 弹窗选择存入/取出 → 用户选择后更新scope表对应位置 → 记录日志
- **内镜卡取出**: 弹窗确认取出 → 更新scope表对应位置为空闲 → 记录日志
---
### 3.4 自动任务模块
#### 3.4.1 自动消毒任务
- **配置**: 支持多时间段配置(如: 08:00-10:00, 14:00-16:00)
- **执行逻辑**:
- 到达开始时间 → 启动消毒和风机
- 到达结束时间 → 停止消毒
- 仅在自动模式下生效
- **运行时长**: 手动启动时运行指定时长后自动关闭
#### 3.4.2 真空泵任务
- **运行时长控制**: 连续运行超过指定时长后自动停止
- **间隔运行控制**: 停止后间隔指定时长自动启动
- **执行逻辑**:
- 开门时 → 关闭真空泵
- 关门时 → 启动真空泵和风机
- 到达运行时长 → 关闭真空泵
- 到达间隔时长 → 启动真空泵和风机
#### 3.4.3 风机自动控制
- **启动条件**:
- 温度超过阈值
- 湿度超过阈值
- 消毒设备启动
- 真空泵启动
- **停止条件**:
- 温度和湿度均低于阈值
- 照明、真空泵、消毒、门均处于关闭状态
- 清扫模式下不自动控制
#### 3.4.4 门状态监控
- **开门超时报警**: 开门超过3分钟且非清扫模式 → 触发蜂鸣器报警 → 弹窗提示
- **门状态记录**: 记录开门/关门时间
- **门状态同步**: 概念门(door)状态 = 左门(leftDoor) OR 右门(rightDoor)
- **门状态监测**: 通过RS485站号03接收触点开关状态上报(功能码04)
- 收到DI状态变化上报时解析并更新对应门状态
- 左门触点触发(关门): 更新 `leftDoor = false`
- 右门触点触发(关门): 更新 `rightDoor = false`
---
### 3.5 设置模块
#### 功能描述
系统参数配置界面,需密码验证后访问。
#### 3.5.1 设置菜单
**设备信息管理**
- 查看设备基本信息
- 设备SN码管理
**基础设置**
- 屏幕解锁密码
- 设置密码(访问设置界面)
**服务器设置**
- 服务器IP地址
- 服务器端口
- API接口配置
**运行参数设置**
- 温度阈值(自动启动风机)
- 湿度阈值(自动启动风机)
- 压差补偿值
- 内镜临期提醒时长
- 内镜超期提醒时长
- 消毒时长(手动启动时的运行时间)
- 真空泵运行时长
- 真空泵间隔时长
- 自动消毒时间段配置(支持多时段)
**内镜信息管理**
- 添加/编辑/删除内镜卡片
- 内镜RFID编号
- 内镜型号、品牌、类型
**人员信息管理**
- 添加/编辑/删除人员卡片
- 人员IC卡编号
- 人员姓名
#### 3.5.2 数据同步功能
- **时间同步**: 同步网络时间
- **内镜信息同步**: 从服务器同步内镜列表
- **人员信息同步**: 从服务器同步人员列表
- **运行参数同步**: 从服务器同步运行参数
---
### 3.6 日志模块
#### 功能描述
显示系统操作日志,支持分页查询。
#### 核心功能
- **日志类型**:
- 内镜存入记录
- 内镜取出记录
- 刷卡开门记录
- 设备操作记录
- **日志字段**:
- 时间
- 操作对象(人员/内镜编号)
- 操作类型(存入/取出/开门等)
- **分页显示**: 每页15条,支持上一页/下一页翻页
---
## 4. 数据库设计
### 4.1 user表(人员信息)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| ic | TEXT | 人员卡号 |
| name | TEXT | 人员姓名 |
| create_time | TEXT | 创建时间 |
| _openid | VARCHAR(64) | 用户标识 |
### 4.2 endo表(内镜信息)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| rfid | TEXT | 内镜RFID编号 |
| ic | TEXT | 内镜IC卡号 |
| model | TEXT | 内镜型号 |
| brand | TEXT | 品牌 |
| type | TEXT | 类型 |
| create_time | TEXT | 创建时间 |
| _openid | VARCHAR(64) | 用户标识 |
### 4.3 scope表(内镜位置状态)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| key | INTEGER | 位置编号(0-15) |
| name | TEXT | 状态名称(enter/leave) |
| ic | TEXT | 存储的内镜卡号 |
| time | TEXT | 存入时间 |
| _openid | VARCHAR(64) | 用户标识 |
### 4.4 log表(操作日志)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| name | TEXT | 操作对象 |
| action | TEXT | 操作类型 |
| create_time | TEXT | 操作时间 |
| _openid | VARCHAR(64) | 用户标识 |
---
## 5. 状态管理(Vuex)
### 5.1 relay(继电器状态)
```javascript
{
door: false, // 主门状态(概念门)
leftDoor: false, // 左门状态
rightDoor: false, // 右门状态
wind: false, // 风机状态
light: false, // 照明状态
vacuum: false, // 真空泵状态
disinfect: false // 消毒状态
}
```
### 5.2 sensor(传感器数据)
```javascript
{
temp: 0, // 温度(°C)
humi: 0, // 湿度(%RH)
pressure: 0 // 压差
}
```
### 5.3 run(运行参数)
```javascript
{
temp: 30, // 温度阈值
humi: 60, // 湿度阈值
pressureCom: 0, // 压差补偿值
endoNear: 24, // 临期提醒时长(小时)
endoOver: 48, // 超期提醒时长(小时)
disinfectTime: 30, // 消毒时长(分钟)
vacuumRunTime: 5, // 真空泵运行时长(分钟)
vacuumPerHour: 2, // 真空泵间隔时长(小时)
group: [ // 自动消毒时间段
{ start: {h:8, m:0}, end: {h:10, m:0}, status: true },
{ start: {h:14, m:0}, end: {h:16, m:0}, status: true }
]
}
```
### 5.4 timer(计时器状态)
```javascript
{
door: '', // 开门时间
doorAlert: false, // 门报警状态
disinfect: '', // 消毒开始时间
wind: '', // 风机开始时间
vacuumStart: '', // 真空泵开始时间
vacuumEnd: '' // 真空泵停止时间
}
```
### 5.5 其他状态
- `clean`: 清扫模式标志
- `autoDisinfect`: 自动消毒标志
- `connect`: 网络连接状态
- `apiUrl`: API服务器地址
- `time`: 当前系统时间
---
## 6. 接口设计(API)
### 6.1 获取网络时间
- **接口**: `GET /api/time`
- **返回**: 时间字符串(如: "2026-01-20 10:30:00")
### 6.2 内镜列表同步
- **接口**: `GET /api/endoscopelist`
- **返回**:
```json
{
"endoscope_list": [
{
"endoscope_rfid": "RFID001",
"endoscope_model": "型号1",
"endoscope_brand": "品牌1",
"endoscope_type": "胃镜"
}
]
}
```
### 6.3 人员列表同步
- **接口**: `GET /api/userlist`
- **返回**: 人员列表数据
### 6.4 运行参数同步
- **接口**: `GET /api/parameterlist`
- **返回**: 运行参数配置数据
### 6.5 日志上传
- **接口**: `POST /api/logsync`
- **参数**: 日志数据数组
---
## 7. 交互流程
### 7.1 完整操作流程
```
1. 刷人员卡
- 系统读取卡号,验证是否在user数据库中
- 验证通过: 弹窗提示"选择要打开的门",显示"开左门"和"开右门"按钮
- 验证失败: 提示"无权限"
2. 选择门并打开
- 用户点击"开左门"或"开右门"
- 通过RS485发送对应开门指令
- 系统自动开启照明和风机
- 提示"左门已打开"或"右门已打开"
3. 刷内镜卡
- 系统读取卡号,验证是否在endo数据库中
- 验证通过: 弹窗提示"选择操作",显示"存入"和"取出"按钮
- 验证失败: 提示"无效内镜卡"
4. 选择操作
- 用户点击"存入": 根据插入位置更新scope表 → 记录日志 → 提示"内镜已存入"
- 用户点击"取出": 更新scope表对应位置为空闲 → 记录日志 → 提示"内镜已取出"
5. 关门
- 用户手动关门
- 触点开关触发,IO控制器上报DI状态变化
- 系统收到上报数据,更新对应门状态为关闭
- 自动关闭照明,开启真空泵和风机
```
### 7.2 内镜存取详细流程
```
1. 用户将内镜卡插入对应位置
2. IC卡读写器检测到卡片
3. 系统解析卡片数据,提取卡号
4. 在数据库中查询卡号,判断卡片类型
- 在endo表中找到 → 内镜卡
- 在user表中找到 → 人员卡
- 都未找到 → 无效卡片
5. 验证内镜卡号是否在endo数据库中
- 验证通过: 弹窗选择"存入"或"取出"
- 用户选择存入: 根据插入位置更新scope表对应位置 → 记录日志 → 弹窗提示"内镜已存入"
- 用户选择取出: 更新scope表对应位置为空闲 → 记录日志 → 弹窗提示"内镜已取出"
- 验证失败: 提示"无效内镜卡"
```
### 7.2 内镜取出流程
```
1. 用户点击"取镜"按钮
2. 弹窗显示"取镜",提示"请刷人员卡"
3. 用户刷人员卡
- 系统读取卡号,验证是否在user数据库中
- 验证通过: 弹窗显示人员姓名
- 验证失败: 提示"无权限"
4. 系统提示"请刷内镜卡"
5. 用户刷内镜卡
- 系统读取卡号,验证是否在endo数据库中
- 验证通过: 弹窗显示内镜名称、钢印号、类型等信息
- 验证失败: 提示"无效内镜卡"
6. 弹窗显示"确定"按钮
7. 用户点击"确定"按钮
- 系统更新scope表对应位置为空闲
- 记录操作日志(包括操作人员、内镜信息)
- 弹出Toast提示"取镜成功"
- 关闭弹窗
```
### 7.3 人员刷卡开门流程
```
1. 人员在主门处刷人员卡
2. IC卡读写器检测到卡片
3. 系统解析卡片数据,提取卡号
4. 在数据库中查询卡号,判断卡片类型
- 在user表中找到 → 人员卡
- 在endo表中找到 → 内镜卡
- 都未找到 → 无效卡片
5. 验证人员卡号是否在user数据库中
- 验证通过: 弹窗选择"开左门"或"开右门"
- 用户选择左门: 通过RS485发送左门开门指令 `030600000001480A` → 更新leftDoor状态 → 记录日志 → 提示"左门已打开"
- 用户选择右门: 通过RS485发送右门开门指令 `03060001000109CA` → 更新rightDoor状态 → 记录日志 → 提示"右门已打开"
- 验证失败: 提示"无权限"
```
### 7.4 手动开门流程
```
1. 点击主界面"开门"按钮
2. 弹出门选择对话框(开左门/开右门)
3. 用户选择要打开的门
4. 通过RS485发送对应开门指令
- 左门: 发送 `030600000001480A` → 更新leftDoor=true → 记录日志 → 提示"左门已打开"
- 右门: 发送 `03060001000109CA` → 更新rightDoor=true → 记录日志 → 提示"右门已打开"
```
### 7.5 开门事件自动处理流程
```
1. 检测到门打开(通过RS485站号03监测,发送开门指令后立即更新状态)
- 左门打开: leftDoor = true
- 右门打开: rightDoor = true
- door = leftDoor OR rightDoor
2. 关闭真空泵
3. 延迟300ms开启照明
4. 延迟300ms开启风机
5. 记录开门时间
6. 启动开门超时监控(3分钟)
```
### 7.7 关门事件自动处理流程
```
1. 检测到门关闭(通过RS485站号03监测,收到功能码04的DI状态上报)
2. 解析上报数据,识别是左门还是右门的触点触发
- 左门触点触发: 更新 leftDoor = false
- 右门触点触发: 更新 rightDoor = false
3. 重新计算door状态: door = leftDoor OR rightDoor
4. 关闭照明
5. 延迟300ms开启真空泵和风机
6. 清除开门超时监控
7. 停止报警
```
---
## 8. 异常处理
### 8.1 串口通信异常
- 串口初始化失败 → 提示"初始化串口失败"
- 串口打开失败 → 提示错误信息
- 指令发送失败 → 记录错误日志,不影响系统运行
### 8.2 数据验证异常
- 无效内镜卡 → 弹窗提示"无效内镜卡"
- 无效人员卡 → 弹窗提示"无权限"
- 超期内镜 → 黄色高亮提醒
- 超期内镜 → 红色高亮提醒
### 8.3 网络异常
- 网络未连接 → 显示"未连接"状态
- 网络同步失败 → 提示"同步失败,请检查网络"
- 自动重试机制(暂未实现)
### 8.4 设备操作异常
- 开门超时(>3分钟) → 蜂鸣器报警 + 弹窗提示"未关门,请及时关闭"
- 温湿度异常 → 自动启动风机
- 压差数据异常 → 过滤无效数据
---
## 9. 安全设计
### 9.1 访问控制
- 屏幕解锁密码: 保护主界面访问
- 设置密码: 保护设置界面访问
### 9.2 操作审计
- 所有关键操作记录到日志表
- 日志包含时间、操作人、操作内容
### 9.3 卡片验证
- 所有内镜卡和人员卡必须在数据库中注册
- 未经注册的卡片无法操作
### 9.4 调试模式保护
- 调试入口隐藏(连续点击标题5次触发)
- 调试模式提供数据清除功能(需谨慎操作)
---
## 10. 性能要求
### 10.1 响应时间
- 界面切换: < 300ms
- 串口指令响应: < 100ms
- 数据刷新间隔: 60秒
### 10.2 数据处理
- 串口数据解析: 实时处理
- 数据库查询: < 200ms
- 日志记录: 异步存储
### 10.3 资源占用
- 内存占用: < 200MB
- CPU占用: < 20%(正常运行时)
---
## 11. 非功能性需求
### 11.1 可靠性
- 7x24小时不间断运行
- 异常情况下自动恢复
- 断网情况下本地功能正常运行
### 11.2 可维护性
- 模块化设计,便于功能扩展
- 完善的日志记录
- 调试模式支持问题排查
### 11.3 可扩展性
- 支持增加内镜位置(需修改硬件)
- 支持新增传感器类型
- 支持新增控制设备
---
## 12. 版本规划
### v1.0.1 (当前版本)
- ✅ 基础功能完整
- ✅ 左右门独立控制
- ✅ RS485门状态监测集成
- ✅ 自动任务执行
- ✅ 日志记录
- ✅ 环境监控
- ✅ 卡片识别
### v1.1.0 (当前开发中)
- 🔄 取镜流程优化(人员卡+内镜卡双卡片验证)
- 🔄 串口通信错误处理优化
- 🔄 状态同步逻辑完善
### v2.0.0 (未来规划)
- 📋 网络日志上传
- 📋 远程控制接口
- 📋 数据统计分析
- 📋 多设备管理
---
## 13. 附录
### 13.1 术语表
| 术语 | 说明 |
|------|------|
| 主门(概念门) | 逻辑门状态,由左门和右门状态共同决定(door = leftDoor OR rightDoor) |
| 实体门 | 物理门锁(左门/右门) |
| IC卡 | 接触式智能卡 |
| RFID卡 | 射频识别卡 |
| RS485 | 串行通信标准,用于传感器通信和门控制 |
| RS232 | 串行通信标准,用于卡片识别和设备控制 |
### 13.2 硬件清单
| 设备 | 数量 | 说明 |
|------|------|------|
| 温湿度传感器 | 1 | 站号02,RS485通信 |
| 压差传感器 | 1 | 站号01,RS485通信 |
| 门状态监测与门锁控制 | 1 | 站号03,RS485通信,中盛4路数字IO模块,控制左右门磁吸和触点开关 |
| IC卡读写器(门口) | 1 | 位于门口,可读取人员卡和内镜卡,RS232通信 |
| 继电器模块 | 1 | 控制风机、照明、真空泵、消毒设备 |
### 13.3 通信协议
#### RS485传感器数据格式
**温湿度数据(站号02)**
```
帧格式: 01 03 04 [湿度高字节] [湿度低字节] [温度高字节] [温度低字节] [CRC低] [CRC高]
示例: 01 03 04 02 98 00 BC 7B D5
```
**压差数据(站号01)**
```
帧格式: 01 03 02 [压差高字节] [压差低字节] [CRC低] [CRC高]
示例: 01 03 02 12 34 B5 33
```
**门控制数据(站号03,中盛4路数字IO模块)**
```
硬件配置:
- 站号: 03
- 通道1(地址0000H): 左门磁吸控制(DO) + 左门触点开关(DI)
- 通道2(地址0001H): 右门磁吸控制(DO) + 右门触点开关(DI)
- 控制指令: 功能码06(写单个保持寄存器)
- 状态上报: 功能码04(读输入寄存器),DI状态变化主动上报
控制指令:
左门开门(磁吸通电): 03 06 00 00 00 01 48 0A (发送后,leftDoor=true)
左门关门(磁吸断电): 03 06 00 00 00 00 89 CA (发送后,leftDoor=false)
右门开门(磁吸通电): 03 06 00 01 00 01 09 CA (发送后,rightDoor=true)
右门关门(磁吸断电): 03 06 00 01 00 00 49 E8 (发送后,rightDoor=false)
状态上报:
收到功能码04的上报数据,解析DI状态
- 左门触点触发: 更新 leftDoor=false
- 右门触点触发: 更新 rightDoor=false
```
#### RS232控制指令格式
```
帧格式: 5AA5EE [指令码] [操作码] [校验和]
指令码: 02=风机, 03=照明, 04=真空泵, 05=消毒
操作码: 01=开启, 00=关闭
示例:
风机开启: 5AA5EE0201
照明开启: 5AA5EE0301
真空泵开启: 5AA5EE0401
消毒开启: 5AA5EE0501
```
#### 门控制说明
- **开门操作**: 通过RS485站号03发送开门指令(磁吸通电)
- 左门开启: `cmd.LeftDoor(true)` → 发送 `030600000001480A` (发送后,leftDoor状态更新为true)
- 右门开启: `cmd.RightDoor(true)` → 发送 `03060001000109CA` (发送后,rightDoor状态更新为true)
- **关门操作**: 通过RS485站号03发送关门指令(磁吸断电)
- 左门关闭: `cmd.LeftDoor(false)` → 发送 `03060000000089CA` (发送后,leftDoor状态更新为false)
- 右门关闭: `cmd.RightDoor(false)` → 发送 `03060001000048E8` (发送后,rightDoor状态更新为false)
- **门状态计算**:
- 门状态(door)根据左右门物理状态实时计算
- 规则: `door = leftDoor OR rightDoor`
- 任一门打开 → door状态为开
- 两门全关 → door状态为关
- **门状态上报**:
- 接收到功能码04的DI状态上报数据
- 解析上报数据识别触点开关状态
- 左门触点触发(关门) → 更新 `leftDoor = false`
- 右门触点触发(关门) → 更新 `rightDoor = false`
#### RS232卡片数据格式
**卡片数据通过同一通道读取**
```
卡存入(14字节):
格式: 20 01 00 08 04 00 00 00 [卡号4字节] [校验] 03
卡号位置: 倒数4-8字节(字节位置6-9)
卡离开(7字节):
格式: 20 01 00 01 02 [校验] 03
卡片类型判断:
- 从数据库查询卡号
- 在user表找到 → 人员卡
- 在endo表找到 → 内镜卡
- 都未找到 → 无效卡片
```
### 13.4 开发环境
- **IDE**: HBuilderX / VSCode
- **Node.js**: >= 14.0
- **Android SDK**: API Level 21+
- **UniApp**: 3.x
---
**文档结束**