# 金宝 (Gambro) 透析机外部通信协议文档 **适用机型**: AK96, AK200, AK98 (及 AK100, AK95, ASTRID) **主题**: 金宝透析机的外部通信 **最后更新**: 2007年1月11日 (Mikael Lindhult - 增加 AKxalis 块和条件) --- ## 目录 1. [软件结构](#1-软件结构) 2. [外部日志 (External Logging)](#2-外部日志) 3. [通信数据包结构](#3-通信数据包结构) 4. [附录 A: 治疗参数列表与状态码](#附录-a-治疗参数列表与状态码) --- ## 1. 软件结构 ### 1.1 计算机组织 (Computer Organisation) 透析机被划分为多个逻辑节点,每个节点由一个字符标识: | 节点代码 | 名称 | 描述 | | :--- | :--- | :--- | | **'O'** | **操作员通信 (OPCOM)** | 处理与用户交互的功能。 | | **'B'** | **血液控制 (BLOOD)** | 控制血液流路及相关测量(血流量、夹管器、静脉压等)。 | | **'F'** | **液体控制 (FLUID)** | 控制透析液流路及相关测量(跨膜压 TMP、超滤 UF、消毒等)。 | | **'C'** | **CAM 节点** | 仅适用于 AK100/AK200。 | | **'E'** | **外部预设处理** | 仅适用于 AK95。 | | **'P'** | **外部 PC 预设** | 适用于 AK95, AK100, AK200。 | | **'R'** | **远程控制** | 仅适用于 AK100。 | | **'S'** | **SDT 生成代码** | 功能取决于机型。AK90/AK100 无此节点;AK95 中用于保护系统;ASTRID 机器仅有此节点。 | ### 1.2 数据类型与约定 所有节点支持以下基本类型: * **Logical (逻辑型)**: 8位字节。偶数=FALSE,奇数=TRUE。 * **Byte (字节)**: 8位值 (0-255)。 * **Word (字)**: 16位值 (0-65535)。**低位字节在前 (Little-Endian)**。 * **Integer (整数)**: 16位有符号值 (-32768 到 32767),处理方式同 Word,仅符号位不同。 **'O', 'B', 'F' 节点特有类型**: * **Float (浮点型)**: 32位 IEEE 标准浮点数。存储顺序为:字节1(低8位) -> 字节2 -> 字节3 -> 字节4(高8位/符号位)。 **'S' 节点特有类型**: * **Time (时间)**: 8字节结构。前4字节为秒数,后4字节为纳秒数。传输顺序反转(同 Word 和 Float)。 ### 1.3 数据组织 * **数组存储**: 'O', 'B', 'F' 节点的数据存储在数组中。 * `xRL`: 逻辑型数组 * `xRB`: 字节型数组 * `xRW`: 字型数组 * `xRI`: 整型数组 * `xRR`: 实型 (Float) 数组 * *(其中 `x` 为节点标识符,如 `ORI` 表示 OPCOM 的整型数组)* * **'S' 节点寻址**: 必须提供完整的作用域路径,例如:`AK95.PROTECTIVE.BLOOD_FLOW_CONTROL.State`。 ### 1.4 数据标识 变量索引通过 `.LIT` 文件中的字面名称定义。命名规则如下: * `Xvariable$name`: xRL 数组索引名 * `xBvariable$name`: xRB 数组索引名 * `xWvariable$name`: xRW 数组索引名 * `xI_variable$name`: xRI 数组索引名 * `xR_variable$name`: xRR 数组索引名 **版本验证**: `.LIT` 文件包含 `PROM_VERS` (程序版本) 和 `VAR_VERS` (变量文件版本)。发送特殊请求可获取这两个版本的拼接字符串,用于验证文件兼容性。 --- ## 2. 外部日志 (External Logging) ### 2.1 日志控制块结构 (Logging Control Block Structure) PC 通过发送**控制块**来初始化日志记录。控制块包含四个区域:**头区**、**条件区**、**规范区**和**CRC 校验**。 #### **头部 (HEADER)** | 位置 | 内容 | 说明 | | :--- | :--- | :--- | | 0-1 | 序列号 (Word) | 当前程序不检查此项。 | | 2-3 | 块长度 | 包含 CRC 在内的总长度。 | | 4 | 源/目的节点 | 新控制块的目的地址,或回显块的源地址。有效值:'B', 'F', 'O', 'C', 'P', 'E', 'S' | | 5 | 块类型 | `00H`: 日志控制块`01H`: 日志数据块`02H`: 信号日志数据块 ('S' 节点)`03H`: 状态转换日志数据块 ('S' 节点)`04H`: AKxalis 块 | | 6 | 块标识 (Block ID) | 系统内唯一的标识符。 | | 7 | 日志通道规范 | 保留,设为 0。 | | 8 | 状态 (Status) | **位0**: CRC 错误**位1**: 语法错误**位2**: 条件计算栈溢出**位3**: 数据缓冲区太小**位4**: 删除错误 (块不存在)**位5**: 加载拒绝 (内存已满)**位6**: 重复标识错误**位7**: SDT 错误 ('S' 节点) | #### **条件区 (CONDITION)** | 位置 | 内容 | 说明 | | :--- | :--- | :--- | | 9 | **条件码 (Condition Code)** | **0**: 删除控制块**1**: 时间条件 (定期记录)**2**: 上升沿触发 (FALSE→TRUE)**3**: 下降沿触发 (TRUE→FALSE)**4**: TRACO 记录器**5**: 记录程序和变量文件版本 (**重要:读取版本用**)**6**: 单次记录变量数据**7**: 本地记录 (仅 AK100)**8-18**: 特殊功能 (TRACO预设, SDT信号, GSS控制, AKxalis命令等) | | 10-(10+n-1) | 条件数据 | 根据条件码不同,长度和含义不同。例如:条件码 1 (时间条件) 后跟 2 字节的时间间隔 (Tick 或 秒)。 | #### **数据规范区 (DATA SPECIFICATION)** *(适用于 TRACO 节点,条件码 1, 2, 3, 4, 5, 6)* 每个要记录的数据由 **1字节类型信息** + **1或2个字节的索引/地址信息** 组成。 * **类型信息编码**: * **低4位 (数据类型)**: * `0`: Real (xRR) * `1`: Integer (xRI) * `2`: Word (xRW) * `3`: Byte (xRB) * `4`: Boolean (xRL) * `5`: 进程 (xP) * `6`: 函数 (xF) * `7-A`: 内存直接寻址 (MR, MI, MW, MB) * **高4位 (节点来源)**: * `0`: Opcom (Oxx) * `1`: Blood (Bxx) * `4`: Fluid (Fxx) * *(其他代码适用于特定机型)* * **结束标志**: `FFH` 表示数据规范结束。 #### **校验和 (CHECKSUM)** * **位置**: 块末尾 * **算法**: CRC-16 或 简单求和 (具体视实现而定,文档示例中多为累加和)。 --- ### 2.2 日志数据块结构 (Logging Data Block Structure) 当条件满足时,机器发送数据块。结构如下: 1. **头部**: 同控制块头部 (序列号, 长度, 源节点, 类型 `01H`, ID, 状态)。 2. **数据区**: * **条件码 5**: 返回 `PROM_VERS` 和 `VAR_VERS` 的拼接字符串。 * **条件码 6**: 返回一次性的变量快照数据。 * **条件码 1**: 返回按时间间隔记录的变量数据。 3. **校验和**: 块末尾。 ### 2.3 消息传递流程 1. PC 发送 **控制块** (例如:设置每10秒记录一次)。 2. 透析机回显该 **控制块** (作为确认)。 3. 透析机在条件满足时 (如每10秒) 发送 **数据块**。 4. PC 收到数据块后,必须回复 **ACK (0x06)**。 5. 若要停止,PC 发送 **删除控制块** (条件码 0)。 ### 2.4 外部日志示例 *(文档中提供了详细的 Hex 示例,展示了如何构建一个每 10 Tick 记录一次 ORL(122), ORI(5), BRI(16) 的控制块)* --- ## 3. 通信数据包 (Communication Package) ### 3.1 数据包结构 | 位置 | 内容 | | :--- | :--- | | 0 | **块类型描述符**: `'D'` (44H, 数据块) 或 `'O'` (4FH, 溢出块) | | 1 | **序列号** (Byte) | | 2 ~ (2+n-1) | **数据负载** (即上述的日志控制块或数据块) | | 3+n-1 | **字节校验和** (位置 0 到 2+n-1 的和) | ### 3.2 编码规则 (转义) 协议使用了5个特殊 ASCII 字符,如果在数据负载中出现,必须进行转义: * **STX**: `02H` (帧头) * **EOT**: `04H` (帧尾) * **ACK**: `06H` (确认) * **NAK**: `15H` (否认) * **ESC**: `1BH` (转义前缀) **转义方法**: 如果数据字节等于上述任一特殊字符: 1. 插入 `ESC` (`1BH`)。 2. 将该字节值加上 `20H`。 *例如*: 数据中的 `02H` 变为 `1B 22H`;`06H` 变为 `1B 26H`。 ### 3.3 发送流程 1. 发送 **STX** (`02H`)。 2. 发送 **编码后的数据包**。 3. 发送 **EOT** (`04H`)。 4. 等待接收方响应: * **ACK** (`06H`): 成功。 * **NAK** (`15H`): 失败 (校验错或格式错),需重发。 * **超时**: 未收到 EOT 或 ACK,需重发 (AK100 超时设为 1 秒)。 --- ## 附录 A: 治疗参数列表与状态码 ### 治疗参数下载 (GSS 控制命令 - 条件码 12) 部分参数为**必填 (Mandatory)**,部分为**可选 (Optional)**。 | # | 参数描述 | 状态 | 备注 | | :--- | :--- | :--- | :--- | | 1 | 患者姓名字符集 (Code Page) | **必填** | 0=西欧, 1=东欧, 2=日文等 | | 2 | 患者姓名 | **必填** | 最多32字符 | | 3 | 超滤量 (UF Volume) | 可选 | | | 4 | 治疗时间 (分钟) | 可选 | | | 5 | 浓缩液类型 (A=醋酸盐, B=碳酸氢盐) | 可选 | | | 6 | 浓缩液替代名称 | 可选 | 依赖 #5 | | 7 | UF 曲线类型 | 可选 | 'L'=线性 (依赖 #8) | | 8 | UF 曲线起始值 | 若 #7 存在则必填 | | | 9 | Na+ 曲线类型 | 可选 | 'L'/'P'/'D' (依赖 #10,11,12) | | ... | *(详见文档原文)* | | | | 26 | 患者 ID | **必填** | | | 27 | 压力/容量控制模式 | 可选 | 'V'=容量, 'T'=压力 | ### 治疗数据下载状态码 (Status Codes) 机器解析下载参数后返回的状态码: | 代码 | 描述 | | :--- | :--- | | **0** | 无错误,状态列表结束 | | **9** | UF 参数超出限制 | | **12** | 透析液流量无效 | | **23** | 下载的治疗参数 CRC 错误 | | **28** | 浓缩液类型错误 (非 'A' 或 'B') | | **36** | HCO3- 曲线起始值超限 | | **38** | 治疗模式错误 (非 'H', 'F', 'D') | | **49** | **用户手动拒绝** 或 功能检查结束但未接受参数 | | **50** | **用户接受数据** | | **54** | 切换到 HDF 模式失败 | | **60-62** | Na+ 或 HCO3- 浓度超限 | --- *注:本文档为技术参考,实际操作请遵循医疗设备安全规范。*