协议仿真器
协议仿真器用于在 GatewayRuntime 内直接建立 Modbus 或 Siemens S7 从站,向 PLC、上位机、组态软件、采集程序和协议测试工具提供可读写的仿真数据。它适合协议联调、点表验证、异常场景复现、培训演示和自动化测试,不需要额外安装独立仿真软件。
页面采用统一的三级配置模型:
| 层级 | 作用 |
|---|---|
| 仿真通道 | 管理监听端点、串口、启动状态、安全限制、诊断容量和故障注入。 |
| 内置协议插件 | 从下拉框选择 Modbus Slave 或 S7Slave,决定协议报文和地址空间。 |
| 仿真变量 | 定义协议地址、数据类型、初始值、访问权限和自动变化规律。 |
协议仿真器把 GatewayRuntime 作为协议服务端或从站使用;“采集配置”通常把 GatewayRuntime 作为客户端或主站读取现场设备。协议仿真通道、协议插件和仿真变量只在本页面管理。
功能入口
登录 GatewayRuntime Web,进入“开发配置 → 协议仿真器”。

本页截图来自当前 GatewayRuntime 的实际运行页面,用于展示工作台布局、默认参数和配置入口。截图中的示例通道处于停止状态且未配置变量,实际运行数据以用户自己的通道和客户端为准。
页面左侧是仿真通道列表,顶部是刷新、导入、编辑和运行命令,右侧工作区包含以下内容。
| 区域 | 说明 |
|---|---|
| 运行摘要 | 显示监听端点、当前客户端、请求数、请求速率、协议错误、预留内存和运行中的发生器数量。 |
| 变量 | 分页查看变量、当前值、变化模式和访问模式,并执行新增、批量新增、写值、暂停、继续、保存当前值和删除。 |
| 原始内存 | 按协议内存区读取十六进制和 ASCII 数据;具有权限时可预览并写入原始字节。 |
| 客户端 | 查看连接端点、会话阶段、S7 协商 PDU、请求数、错误数和收发流量。 |
| 报文与事件 | 按页查询生命周期、连接、请求、协议错误、变量变化和安全拒绝事件。 |
| 配置 | 查看当前通道的协议、安全、诊断和完整配置摘要。 |
当浏览器宽度不超过 1024px 时,通道列表会自动收进当前通道名称左侧的通道按钮。点击该按钮可在抽屉中切换或新建通道;工作区会独占剩余宽度,筛选器、分页和表单按两列或单列重新排列。
配置前准备
配置前先确定测试客户端的协议、网络位置和目标点表。
| 信息 | 需要确认的内容 |
|---|---|
| 协议角色 | 测试程序必须作为 Modbus 主站或 S7 客户端连接 GatewayRuntime。 |
| 协议插件 | Modbus 客户端选择 Modbus Slave;S7 客户端选择 S7Slave。 |
| 通道类型 | 网络监听使用 TcpService;Modbus RTU 串口测试使用 SerialPort。 |
| 监听端点 | 确认可用网卡地址、端口、防火墙和端口占用情况。 |
| 地址空间 | 确认 Modbus 站号和功能区,或 S7 的 I/Q/M/DB 区及 DB 号。 |
| 写入范围 | 明确哪些变量允许客户端写入,哪些变量只能由页面或发生器修改。 |
| 数据规律 | 确定固定值、波形、随机量、序列、脉冲或字符串模板及更新周期。 |
| 事件规模 | 长期压测前确定事件容量、是否记录成功请求、是否捕获原始报文。 |
新建仿真通道
- 在左侧“协议仿真器”标题右侧点击“新增”。
- 在“通道配置”中填写通道名称。
- 在“协议插件”下拉框中选择
Modbus Slave或S7Slave。 - 进入“传输配置”,选择通道类型并填写监听或串口参数。
- 按所选协议完成 Modbus 或 S7 Slave 参数。
- 检查“权限与安全”“诊断”和“故障注入”。
- 点击“保存”。保存后先配置变量,再启动通道。

通道配置
| 配置项 | 说明 |
|---|---|
| 通道名称 | 当前仿真通道的唯一名称,建议包含协议和用途,例如 modbus-line-demo。 |
| 协议插件 | 下拉选择 Modbus Slave 或 S7Slave。创建后如需改用另一协议,应新建通道并重新核对变量地址。 |
| 自动启动 | 开启后,GatewayRuntime 启动时自动启动该仿真通道。正式启用前应确认监听端口和变量配置无误。 |
| 说明 | 记录测试对象、负责人、端口用途或联调范围。 |
传输配置
通道类型属于“传输配置”。网络服务与串口是通道能力,不是协议插件。

| 通道类型 | 适用协议 | 关键参数 | 说明 |
|---|---|---|---|
TcpService | Modbus、S7Slave | 监听地址、端口、监听队列、TCP NoDelay、握手超时 | GatewayRuntime 监听端口,等待客户端主动连接。 |
SerialPort | Modbus | 串口、波特率、数据位、校验位、停止位、流控、接收超时、帧间隔 | 用于 Modbus RTU 串口从站仿真。S7Slave 不使用串口。 |
TcpService 常用设置:
| 配置项 | 说明 |
|---|---|
| 监听地址 | 127.0.0.1 只允许本机连接;局域网联调填写指定网卡地址;监听全部网卡可填写 0.0.0.0。 |
| 端口 | Modbus TCP 常用 502,S7 常用 102;非管理员测试环境可使用未占用的高位端口。 |
| 监听队列 | 控制等待接受的连接数量。一般保持默认值,集中压测时再按计划客户端数调整。 |
| TCP NoDelay | 减少小报文等待时间,协议联调通常保持开启。 |
| 握手超时 | 客户端连接后完成协议握手的最长等待时间。网络延迟较高时可适当增大。 |
监听 0.0.0.0 会向所有可达网卡开放端口。生产网络中应同时配置“允许网段”、操作系统防火墙和边界访问策略,不要只依赖端口不公开。
配置 Modbus Slave
选择 Modbus Slave 后,通道支持以下组合。
| 仿真方式 | 通道类型 | 报文格式 |
|---|---|---|
| Modbus TCP | TcpService | Modbus TCP |
| RTU over TCP | TcpService | Modbus RTU |
| Modbus RTU Serial | SerialPort | Modbus RTU |
Modbus 参数
| 配置项 | 说明 |
|---|---|
| 站号 | 可配置一个或多个从站号,范围为 1 至 247,同一通道内不能重复。 |
| 线圈数量 | 分配 Coil 地址空间,用于可读写布尔量。 |
| 离散输入数量 | 分配 Discrete Input 地址空间,用于只读布尔量。 |
| 输入寄存器数量 | 分配 Input Register 地址空间,用于只读寄存器数据。 |
| 保持寄存器数量 | 分配 Holding Register 地址空间,用于可读写寄存器数据。 |
| 默认字节序 | 设置多寄存器数值的默认字节/字顺序;单个变量仍可单独配置。 |
| 严格地址模式 | 开启后拒绝超出已分配空间或没有有效映射的访问。 |
变量地址可使用结构化格式,例如:
| 地址示例 | 含义 |
|---|---|
S=1;F=1;0 | 站号 1,功能区 1,偏移 0 的线圈。 |
S=1;F=2;0 | 站号 1,功能区 2,偏移 0 的离散输入。 |
S=1;F=3;0 | 站号 1,功能区 3,偏移 0 的保持寄存器。 |
S=1;F=4;0 | 站号 1,功能区 4,偏移 0 的输入寄存器。 |
S=1;F=3;10.3 | 保持寄存器偏移 10 中的第 3 位。 |
配置 S7Slave
选择 S7Slave 后,GatewayRuntime 作为真实 S7 从站/服务端运行,通过 ISO-on-TCP 建立连接,并处理 COTP、Setup Communication、Read Var 和 Write Var。它不是把 S7 地址转换成 Modbus 地址。

| 配置项 | 说明 |
|---|---|
| 机架号 / 槽号 | 用于确定本地 S7 连接标识,应与客户端连接参数一致。 |
| 本地 TSAP | GatewayRuntime 使用的本地 TSAP,例如 0x0101。 |
| 允许的远端 TSAP | 可限制允许建立会话的客户端 TSAP;留空时按现场安全策略评估。 |
| 最大 PDU 长度 | S7 会话协商的最大 PDU 长度,客户端设置不能超过服务端能力。 |
| 输入区字节 | 分配 I 区容量。 |
| 输出区字节 | 分配 Q 区容量。 |
| 标志区字节 | 分配 M 区容量。 |
| 数据块 | 配置一个或多个 DB 号和每个 DB 的字节数。 |
| 严格地址模式 | 开启后拒绝超出 I/Q/M/DB 分配范围的访问。 |
S7Slave 变量可映射到以下地址区:
| 地址示例 | 含义 |
|---|---|
IX0.0 | 输入区第 0 字节第 0 位。 |
QW10 | 输出区偏移 10 的字。 |
MD20 | 标志区偏移 20 的双字。 |
DB1.DBX0.0 | DB1 第 0 字节第 0 位。 |
DB1.DBW2 | DB1 偏移 2 的字。 |
DB1.DBD4 | DB1 偏移 4 的双字。 |
权限与安全
“权限与安全”控制协议客户端能否接入和写入;系统角色权限控制登录用户能否在 Web 中执行管理命令。两者应同时配置。

通道安全参数
| 配置项 | 说明 |
|---|---|
| 允许网段 | 允许连接的 IPv4/IPv6 CIDR。默认回环网段适合本机测试;局域网联调时只增加实际需要的网段。 |
| 允许外部协议写入 | 总开关。关闭时客户端的协议写请求不会修改变量;开启后还要检查变量访问模式和外部写策略。 |
| 最大客户端数 | 当前通道允许同时连接的客户端总数。 |
| 单 IP 客户端数 | 同一源 IP 允许建立的最大连接数。 |
| 空闲超时 | 客户端长时间无活动后断开连接的秒数。 |
| 单客户端每秒请求 | 单个连接的持续请求速率限制。 |
| 突发容量 | 允许短时突发的请求数量。 |
| 无效帧断开阈值 | 同一连接连续产生过多无效报文时主动断开。 |
Web 角色权限
进入“系统管理 → 角色管理”,为需要使用协议仿真器的角色分配页面和按钮权限。建议按职责最小授权。
| 权限组 | 可执行操作 |
|---|---|
| 查看与刷新 | 查看通道、变量、运行状态、内存、客户端和分页事件。 |
| 通道管理 | 新增、编辑、删除仿真通道。 |
| 变量管理 | 新增、编辑、批量新增和删除变量。 |
| 运行控制 | 启动、停止和重启通道。 |
| 数据写入 | 页面写值、原始内存写入。 |
| 发生器控制 | 暂停或继续所选变量的发生器。 |
| 保存当前值 | 把当前运行值保存为下次启动使用的初始值。 |
| 客户端管理 | 断开指定客户端或断开全部客户端。 |
| 事件管理 | 清空当前通道的诊断事件。 |
| 导入与导出 | 导入/导出 JSON 通道配置和 Excel 变量点表。 |
只需要观察运行结果的用户,可仅授予查看与刷新权限。页面会隐藏或禁用没有权限的新增、写入、运行控制、断开和清空命令。
配置仿真变量
通道保存后,在“变量”页点击“新增变量”或“批量建变量”。结构配置只能在通道停止时修改,避免地址空间在客户端通信过程中改变。
- 填写唯一的变量名称。
- 使用地址助手选择协议区域、站号或 DB 号、偏移和位号,也可直接填写规范地址。
- 选择数据类型和数组长度。
- 对 Modbus 多字节数据选择字节序;对字符串填写内存格式。
- 设置访问模式、外部写策略和初始值。
- 需要自动变化时,进入“数据变化设计器”启用发生器。
- 检查占用范围、越界和地址冲突提示,然后保存。
数据类型
| 数据类型 | 说明 |
|---|---|
Boolean | 布尔值,可映射到位地址、线圈或离散输入。 |
Byte | 8 位无符号整数。 |
Int16 / UInt16 | 16 位有符号/无符号整数。 |
Int32 / UInt32 | 32 位有符号/无符号整数。 |
Int64 / UInt64 | 64 位有符号/无符号整数,页面按精确十进制值处理。 |
Float / Double | 单精度/双精度浮点数。 |
Decimal | 高精度十进制数,适合需要精确十进制表达的测试值。 |
String | 固定或带长度头的字符串,也支持 S7 WSTRING。 |
“数组长度”大于 1 时,变量按固定长度数组占用连续地址。增加数组长度前应检查后续地址是否已被其他变量占用。
字节序与字符串
| 配置项 | 说明 |
|---|---|
| 字节序 | Modbus 多字节变量可选择 ABCD、BADC、CDAB、DCBA。S7 按协议字节序处理。 |
| 每个元素字节数 | 为字符串的每个数组元素预留固定空间。 |
| 编码 | 可选择或填写 UTF-8、ASCII、UTF-16BE 等编码。 |
| 带长度头 | 在字符串内存中保存实际长度信息,客户端解析方式必须一致。 |
| S7 WSTRING | 仅 S7Slave 使用,按 S7 宽字符串格式分配和编码。 |
访问模式与外部写策略
| 配置项 | 行为 |
|---|---|
| 只读 | 客户端和页面都不能把该变量作为普通可写点使用。 |
| 读写 | 页面可写;通道允许外部协议写入时,客户端也可按外部写策略写入。 |
| 页面可写、外部拒绝 | Web 页面可以写值,Modbus/S7 客户端写入会被拒绝。 |
| 接受并继续变化 | 接受客户端写值,发生器仍按原时间线继续更新。 |
| 接受并暂停发生器 | 接受客户端写值,同时暂停该变量发生器,便于保持客户端下发值。 |
| 拒绝外部写入 | 即使通道允许外部写入,该变量仍拒绝客户端写请求。 |
协议写入成功需要同时满足:角色或页面操作权限、通道“允许外部协议写入”、变量访问模式/外部写策略。涉及控制逻辑的测试点应优先使用只读或外部拒绝模式。
配置数据变化与种子
每个变量可以独立启用发生器。公共参数包括更新周期、启动延迟、恢复策略、算法版本和种子。
| 变化模式 | 适用场景 |
|---|---|
| Fixed | 保持固定值。 |
| Ramp | 按步长递增或递减,可选择钳位、循环、往返或越界报错。 |
| Sine | 按中心值、振幅、周期和相位生成正弦波。 |
| Triangle | 生成三角波。 |
| Sawtooth | 生成锯齿波。 |
| Square | 按高低值、周期和占空比生成方波。 |
| Random | 在范围内按均匀或高斯分布生成随机值。 |
| RandomWalk | 从初始值开始按最大步长随机游走。 |
| Toggle | 在布尔真/假之间按周期翻转。 |
| Pulse | 按周期、高电平时长和初始电平生成脉冲。 |
| Sequence | 按步骤值和保持时间顺序播放,可循环、往返或保持末值。 |
| Template | 使用计数器和模拟时间生成字符串,例如批次号或时间标签。 |
确定性种子
Random、RandomWalk、噪声修饰器和故障注入都可以配置种子。相同算法版本、种子和配置会产生可重复的序列,适合自动化回归和问题复现。
| 操作 | 建议 |
|---|---|
| 固定种子 | 记录在测试用例中,保证每次运行得到相同变化轨迹。 |
| 生成种子 | 用于临时探索不同随机序列;确认问题后应记录生成值。 |
| 分离种子 | 主发生器、噪声和故障注入使用不同种子,便于单独复现。 |
| 修改算法版本 | 会改变序列结果,回归测试中应与种子一起固定。 |
数值发生器还可叠加缩放、偏移、噪声、最小/最大钳位、量化步长和小数位数。先配置基础波形,再逐项增加修饰器并查看预览,能更快定位参数问题。
启动与运行控制
- 确认通道处于“已停止”,完成通道和变量结构配置。
- 点击顶部“启动”。启动成功后摘要区显示监听端点和预留内存。
- 使用实际 Modbus 主站或 S7 客户端连接该端点并读写变量。
- 在变量列表中观察当前值和发生器状态;选择变量后可暂停、继续或保存当前值为初始值。
- 修改结构配置前先停止通道;仅需重新建立监听和会话时可使用“重启”。
| 命令 | 说明 |
|---|---|
| 启动 | 分配协议内存并开始监听或打开串口。 |
| 停止 | 关闭监听和客户端连接,允许修改通道与变量结构。 |
| 重启 | 停止后按当前配置重新启动。 |
| 写值 | 对单个可写变量设置当前值,可选择是否应用外部写策略。 |
| 暂停 / 继续 | 批量控制所选变量的发生器。 |
| 保存当前值为初始值 | 把当前值持久化,供下次启动恢复。大批量保存时建议按业务分组选择。 |
原始内存与客户端
原始内存
“原始内存”用于排查变量值与协议字节是否一致。
| 协议 | 可选内存区 |
|---|---|
| Modbus | Coils、Discrete Inputs、Holding Registers、Input Registers,并选择站号。 |
| S7Slave | Inputs、Outputs、Markers、Data Block;Data Block 还需选择 DB 号。 |
填写字节偏移和读取字节数后点击“读取内存”。写入十六进制前,页面会检查覆盖范围;与变量映射相交时会要求再次确认。原始内存写入会直接影响对应变量,只应在明确了解地址布局时使用。
客户端
“客户端”页显示每个连接的远端端点、连接时间、最近活动、请求/错误数量和收发字节。S7Slave 还会显示会话阶段和协商 PDU。需要终止异常连接时,可断开单个客户端或断开全部客户端。
报文与事件
在通道“诊断”中决定记录范围。

| 配置项 | 说明 |
|---|---|
| 捕获原始报文 | 保存请求和响应的十六进制内容。只在联调排错时开启,避免记录不必要的数据。 |
| 事件容量 | 当前通道保留的最大事件数。达到容量后覆盖最旧事件,不会无限增长。 |
| 单方向最大捕获字节 | 限制单个请求或响应保存的原始字节数。 |
| 记录变量变化 | 记录发生器、页面写值和协议写入引起的变量变化。高频点较多时可关闭。 |
| 记录成功请求 | 记录正常协议请求。长时间高频压测时可关闭,只保留错误和关键事件。 |
“报文与事件”页支持关键字、事件类型筛选和服务端分页。

| 事件内容 | 说明 |
|---|---|
| 时间与类型 | 区分生命周期、客户端连接/断开、协议请求、协议错误、变量变化、发生器状态、安全拒绝和缓冲覆盖。 |
| 消息与客户端 | 显示事件摘要和关联客户端。 |
| 变量与错误码 | 显示关联变量和协议错误码。 |
| 处理耗时 | 显示请求处理耗时,便于定位异常慢请求。 |
| 请求/响应报文 | 点击事件后查看捕获的十六进制请求与响应。 |
事件列表每次只加载当前页。切换页码、页大小或筛选条件会重新查询服务端;自动刷新会取消过期请求,不会并发堆积重复刷新。页面还会提示已经被环形缓冲覆盖的旧事件数量。
故障注入
故障注入用于可重复地验证客户端超时、重连和异常处理,不应在生产联调通道中长期启用。
| 配置项 | 说明 |
|---|---|
| 启用故障注入 | 总开关。关闭后不应用延迟、抖动、丢响应和主动断开。 |
| 故障种子 | 固定随机故障序列,便于复现同一测试过程。 |
| 固定延迟 | 每个请求增加固定处理延迟。 |
| 随机抖动 | 在固定延迟基础上增加随机等待。 |
| 丢响应概率 | 按概率不发送响应,用于验证客户端超时和重试。 |
| 处理请求数后断开 | 达到指定请求数后主动断开客户端,验证自动重连。 |
导入与导出
顶部“导入 JSON”可导入完整通道配置;“更多”菜单提供导出 JSON、导入 Excel、导出 Excel和删除通道。
| 格式 | 用途 | 注意事项 |
|---|---|---|
| JSON | 备份或复制通道、协议、安全、诊断、故障和变量配置。 | 导入前可选择新建通道或覆盖同协议的已停止通道,并先执行预览。 |
| Excel | 批量维护变量点表。 | 只处理变量;导入结构配置前必须停止通道。先导出模板再填写可减少格式错误。 |
导入时如果其他用户已经修改同一通道,页面会提示配置版本冲突。刷新并核对最新配置后再重新导入,不要直接覆盖未知改动。
大规模仿真与性能建议
| 场景 | 建议 |
|---|---|
| 变量很多 | 使用批量建变量或 Excel 导入;通过名称、地址、类型和访问模式筛选,按页管理,不要依赖一次显示全部变量。 |
| 高频自动变化 | 只为需要动态行为的变量启用发生器,合理设置更新周期,避免所有点都使用毫秒级变化。 |
| 长期协议压测 | 设置固定事件容量;非排错阶段关闭原始报文、成功请求或高频变量变化记录。 |
| 事件查询 | 使用事件类型和关键字缩小范围,保持分页;页面只保留当前页,不会把全部历史事件累积到浏览器。 |
| 自动刷新 | 选择与测试速率匹配的刷新周期。上一轮尚未完成时不会并发发起重复刷新。 |
| 多客户端 | 按计划连接数设置总数、单 IP 限制和请求速率,逐步增加负载并观察请求速率、错误和内存摘要。 |
常见问题
| 现象 | 处理建议 |
|---|---|
| 客户端无法连接 | 检查通道是否已启动、监听地址和端口、操作系统防火墙、允许网段、最大客户端数和端口占用。 |
| Modbus 请求返回地址错误 | 检查站号、报文格式、功能区、偏移、已分配数量和严格地址模式。 |
| S7 客户端握手失败 | 检查端口、机架/槽号、本地与远端 TSAP、最大 PDU、允许网段和握手超时。 |
| S7 读取地址失败 | 检查 I/Q/M/DB 地址格式、DB 是否存在、DB 容量和严格地址模式。 |
| 客户端写值被拒绝 | 依次检查通道“允许外部协议写入”、变量访问模式、外部写策略和请求地址/数据类型。 |
| 写入后值又发生变化 | 外部写策略为“接受并继续变化”。需要保持写入值时改为“接受并暂停发生器”。 |
| 随机结果无法复现 | 固定算法版本、发生器种子、噪声种子、故障种子和启动时的初始值。 |
| 页面事件太多 | 降低事件容量,关闭成功请求或变量变化记录,并使用类型/关键字筛选和分页。 |
| 无法编辑通道或变量 | 先停止通道,再检查当前角色是否具有对应管理权限。 |