简介:这是一款基于C#开发的IEC 104协议专用测试工具,面向电力自动化、工业通信及协议开发人员,用于快速验证设备端IEC 104客户端报文交互能力。工具支持遥测、遥信、遥控、对时与SOE等核心功能的实时解析与显示,可在线修改参数、导入导出配置,并新增语音报警与工具栏提醒功能,显著提升现场调试效率。压缩包共13个文件,含1个主程序exe、2个关键dll(如DotNetSpeech.dll)、3个xml/xlsx配置模板(含参数模板与历史数据)、1个ini配置文件及log、txt等辅助文件,整体仅2.17MB,轻量易部署。目前已有6661人学习下载,适合具备一定IEC 104协议基础的工程师或爱好者开展设备联调、规约型式验证与功能边界测试,无需说明书即可通过界面逻辑与协议常识快速上手。
1. IEC104测试工具:一个没说明书却能当天上手的电力协议调试黑匣子
你有没有遇到过这种场景:现场调试一台新接入的RTU,IEC104连接一建立,报文哗哗往上刷,但Wireshark里全是十六进制乱码,68 04 02 00 00 00看得人眼晕;想验证遥控命令是否发对了,却卡在ASDU类型号和可变结构限定词(VSQ)的组合逻辑上;更别提SOE时间戳对不上、遥测系数算错导致后台显示数值翻倍——这些不是玄学,是协议栈没“翻译”到位。这个iec104测试工具.zip就是为这类硬核调试时刻准备的:它不讲大道理,不塞冗余UI,用C#写成但行为像原生C工具一样轻快,核心功能就三件事——实时抓、当场解、马上改。它适合刚接触IEC104的继保工程师、嵌入式设备联调人员,也适合需要快速验证自研主站协议栈的开发同学。注意:它没有安装程序、不写注册表、双击即用,所有参数存在本地INI和Excel里,关机重启后配置全在——这恰恰是现场最需要的确定性。
2. 工具结构与核心能力:从文件清单看懂它能干什么
2.1 文件清单逐项拆解:每个文件都是一个功能开关
压缩包里看似杂乱的文件,实则分工明确。我把它按功能域归类,标出哪些是必须的、哪些可删、哪些改了会翻车:
| 文件名 | 类型 | 作用 | 是否可删 | 修改风险 |
|---|---|---|---|---|
IEC104测试软件.exe | 主程序 | C# WinForms应用,协议解析+界面渲染核心 | ❌ 绝对不可删 | 替换即失效 |
104.ini | 配置文本 | 存储TCP连接参数(IP/端口/超时)、ASDU默认类型、SOE时间格式等 | ✅ 可删(重启后恢复默认) | 改错会导致连接失败或报文解析错位 |
参数模板.xlsx | Excel模板 | 定义遥测/遥信点表结构:点号、描述、系数、偏移、单位、ASDU地址等 | ✅ 可替换为自定义模板 | 表头列名必须严格匹配,少一列就导入失败 |
data.xlsx/data20200628.xlsx | 运行时数据 | 当前会话的实时遥测值、遥信状态、SOE事件记录 | ✅ 可删(清空历史) | 删除后重启软件会新建空白表 |
run.log | 日志文本 | 记录TCP连接状态、发送/接收字节数、关键异常(如CRC校验失败) | ✅ 可删 | 删除不影响运行,但丢掉排错线索 |
readme1.txt | 纯文本说明 | 作者手写的极简使用提示(含快捷键、右键菜单入口) | ✅ 可删 | 唯一的“文档”,建议保留并打印贴工位 |
DotNetSpeech.dll | 语音库 | 支持语音报警(如“遥信点101变位”) | ✅ 可删(语音功能失效) | 删除后点击语音按钮会弹窗报错,但主功能正常 |
DevComponents.DotNetBar2.dll | UI控件库 | 提供专业级工具栏、状态栏、表格样式 | ❌ 不可删 | 缺失会导致界面崩溃或按钮消失 |
提示:
data文件夹下的ulog、fixpt、co、exv、soe子目录,是软件自动创建的日志分类目录,对应不同报文类型(如soe存SOE事件原始字节流)。它们不参与启动,但调试时可直接打开查看原始二进制数据,比Wireshark更聚焦。
2.2 协议解析能力边界:它到底能解到哪一层?
这个工具的解析深度,决定了你能省多少查标准的时间。它不是简单地把68 xx xx xx xx xx拆成APCI+ASDU,而是深入到IEC60870-5-104:2006标准的语义层。以一条典型的单点遥信变化报文为例(类型标识=1):
68 13 00 00 00 00 2D 01 06 00 01 00 01 00 00 00 00 00 00 00 00 00 00工具会实时在界面上分栏显示:
- APCI层:起始符
68h、APDU长度13h(19字节)、控制域(含启动标志、帧计数等) - ASDU层:类型标识
01h(单点遥信)、可变结构限定词06h(SQ=1, 数量=6)、传送原因00 01h(突发)、ASDU地址00 01h(公共地址)、信息体地址00 01h(点号1)、信息体元素00h(状态=0)
关键的是,它把00h自动映射为“分”(合闸),而不是让你去翻标准里的0=off, 1=on定义。同理,对时报文(类型标识=100)会直接把CP56Time2a时间戳转成2024-06-28 14:22:35.123格式,并高亮显示毫秒字段是否有效。
注意:它不支持扩展ASDU(如类型标识=128以上),也不解析加密或签名字段(IEC104本身无加密,但某些私有扩展会加)。如果你的设备用了非标扩展,这部分报文会显示为“未识别ASDU”,但TCP连接和基础帧收发不受影响。
2.3 实时交互设计:为什么说它是“调试态”而非“监控态”?
区别于SCADA系统那种只读监控界面,这个工具的每一个交互都指向“我要改点什么”。比如:
- 遥测值修改:双击表格中任意遥测值,直接输入数字,回车后立即生成对应类型的
M_ME_NB_1(归一化值)遥控命令发给服务端; - 遥控执行:右键遥信点 → “遥控合闸/分闸”,弹出确认框后,自动生成
C_SC_NA_1命令,带完整可变结构限定词和原因码; - 参数在线调:点击工具栏“系数设置”,弹出对话框,可为单个点或整列点批量设置系数(如电压×100)、偏移(如电流+0.5);
- SOE过滤:在SOE表格顶部,有下拉菜单可按“点号范围”、“时间区间”、“变位类型”实时筛选,筛选结果直接联动到报文窗口高亮显示。
这种设计让调试效率翻倍:不用切到Wireshark抓包再手动构造命令,所有操作都在一个界面闭环完成。
3. 快速上手:三步完成首次连接与报文验证
3.1 第一步:配置连接参数(104.ini 的正确打开方式)
不要试图双击104.ini用记事本改——编码错误会导致软件启动失败。正确做法是:
- 用软件自带的“参数设置”菜单(工具栏第二个图标)打开图形化配置页;
- 在“网络设置”页填入:
- 服务器IP:你的RTU或模拟主站IP(如
192.168.1.100) - 端口:标准为
2404,但某些设备用8080或502(需确认) - 重连间隔:设为
5000(毫秒),避免频繁断连冲击设备 - 超时时间:
3000毫秒足够,太长会让遥控响应迟钝
- 服务器IP:你的RTU或模拟主站IP(如
- 点击“保存到INI”按钮,软件会自动用UTF-8 BOM格式写入
104.ini,规避编码坑。
参数说明:
104.ini中ConnectTimeout=3000对应超时,ReconnectInterval=5000对应重连。如果手动编辑,务必确保等号前后无空格,且文件保存为UTF-8 with BOM(Notepad++里选“编码→转为UTF-8-BOM”)。
3.2 第二步:加载点表并启动连接
点表决定你能看到什么、能控制什么。参数模板.xlsx是起点,但必须按规则改造:
- 打开
参数模板.xlsx,保留表头行(点号,描述,类型,系数,偏移,单位,ASDU地址,信息体地址,传送原因); - 在下方填入你的实际点:
类型列填YX(遥信)、YC(遥测)、YT(遥控);ASDU地址填公共地址(如1),信息体地址填具体点号(如101);传送原因填十进制数(如5表示周期、20表示响应总召唤);
- 保存为
data.xlsx(覆盖原文件),重启软件——点表自动加载。
# 启动连接命令(无需命令行,但要知道底层动作) # 软件启动后,自动执行: # 1. 创建Socket,绑定本地随机端口 # 2. 向192.168.1.100:2404发起TCP连接 # 3. 连接成功后,发送I帧(APCI=0x40)启动链路 # 4. 接收服务端U帧(TESTFR)并回复逻辑说明:软件不实现完整的链路管理(如S帧确认),它依赖TCP可靠传输,用I帧携带ASDU进行业务交互。这意味着它假设网络稳定,不处理丢包重传——这正是测试工具的合理取舍:现场调试时,网络问题该由网管查,不是测试工具的职责。
3.3 第三步:验证报文收发(用真实报文说话)
连接成功后,界面左上角状态栏显示Connected,右侧报文窗口开始滚动。此时做两件事验证有效性:
- 看接收:观察报文窗口,找一条类型标识=
01(单点遥信)的ASDU,确认其信息体地址与你点表中的101一致,状态值为01(合)或00(分); - 发遥控:在遥信点
101上右键 → “遥控合闸”,确认后,报文窗口应立即出现一条类型标识=46(单点遥控)的ASDU,且传送原因=6(激活确认); - 查日志:打开
run.log,搜索Send:和Recv:,确认字节数匹配(如Send: 22 bytes对应一条遥控命令)。
如果遥控无响应,先检查run.log是否有CRC error—— 这表示设备返回了错误帧,而非网络不通。
4. 避坑指南:五个血泪经验换来的常见问题排查
4.1 现象:软件启动报错“未能加载文件或程序集‘DevComponents.DotNetBar2.dll’”
原因:该DLL被杀毒软件误报为风险文件并隔离,或解压时损坏(尤其用老旧解压工具)。
解决:
- 临时关闭杀软,重新解压整个ZIP包;
- 若仍报错,从另一台已运行正常的机器复制该DLL到当前目录;
- 绝不能用网上搜的同名DLL替换——版本不匹配会导致界面按钮错位或点击无响应。
4.2 现象:连接显示“Connected”,但报文窗口空白,run.log里只有Send: 6 bytes循环
原因:服务端未按IEC104流程响应。典型情况是设备只支持“无回答”模式(如某些简易RTU),或防火墙拦截了返回流量。
解决:
- 用Wireshark抓包,过滤
ip.addr == 192.168.1.100 && tcp.port == 2404,确认是否有返回的I帧或U帧; - 若无返回,检查设备文档是否要求先发
STARTDT(启动链路)U帧——本工具默认发TESTFR,需在104.ini中添加StartUFrame=1并重启; - 若有返回但软件不解析,在
run.log末尾找Unknown ASDU type,说明设备用了非标类型标识。
4.3 现象:遥测值显示为0或极大值(如2147483647),系数设置无效
原因:data.xlsx中“系数”列格式被Excel自动转为“常规”或“文本”,导致软件读取为字符串而非数字。
解决:
- 选中整列“系数”,右键→“设置单元格格式”→“数值”,小数位数设为
6; - 手动在任一单元格输入
1.0,回车,确认格式生效; - 验证方法:修改后保存,重启软件,点“系数设置”对话框,看默认值是否显示为
1.000000而非1。
4.4 现象:SOE事件时间显示为1970-01-01或乱码
原因:设备发送的CP56Time2a时间戳中毫秒字段为0xFFFF(无效),或软件未正确解析7字节时间结构。
解决:
- 在
104.ini中添加SOETimeMode=1(启用兼容模式),重启; - 若仍无效,打开
run.log,找SOE报文的原始字节(如68 1B ... 00 00 00 00 FF FF FF FF),确认第6-7字节是否为FF FF(毫秒无效标记); - 此时软件会 fallback 到使用系统时间打标,虽不精确但可用。
4.5 现象:语音报警不响,或报错“无法初始化语音合成引擎”
原因:Windows系统未启用“文字转语音”功能,或.NET Framework版本低于4.6.2。
解决:
- Win10/11:设置→时间和语言→语音→管理语音→下载中文(简体)语音包;
- 检查.NET版本:运行
cmd,输入reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release,返回值≥394802即合格; - 替代方案:删除
DotNetSpeech.dll,改用系统提示音——在“语音设置”里勾选“启用系统声音”,遥控成功时会播放Windows Notify.wav。
5. 进阶技巧:用Excel模板实现批量点表生成与协议一致性校验
5.1 构建可复用的点表模板:告别手工录入
参数模板.xlsx的潜力远不止于填点。我把它升级为一个带校验逻辑的智能模板,让点表本身成为协议合规性检查器。核心是利用Excel公式自动标记风险项:
| A列(点号) | B列(描述) | C列(类型) | D列(系数) | E列(ASDU地址) | F列(信息体地址) | G列(校验公式) |
|---|---|---|---|---|---|---|
| 101 | 开关1状态 | YX | 1 | 1 | 101 | =IF(OR(C2="YX",C2="YC"),IF(F2<1,"点号<1",IF(F2>65535,"点号>65535","OK")),"类型非法") |
| 102 | 母线电压 | YC | 100 | 1 | 102 | =IF(C2="YC",IF(AND(D2>=0.001,D2<=1000000),"系数合理","系数超限"),"") |
将G列公式拖满全表,任何单元格显示“OK”外的文字,即为需人工复核项。这样导出的data.xlsx,导入软件前已在Excel层完成基础合规检查。
5.2 报文导出与离线分析:把实时窗口变成调试数据库
软件右上角有“导出报文”按钮,但默认导出的是带格式的HTML。要用于Wireshark对比或脚本分析,需改用原始字节导出:
- 在报文窗口右键 → “导出为文本”;
- 选择“原始字节(十六进制)”,保存为
capture_raw.txt; - 用Python脚本清洗成标准格式(每行一条完整APDU):
# clean_capture.py with open('capture_raw.txt', 'r', encoding='utf-8') as f: raw = f.read() # 提取68开头、长度正确的APDU(IEC104 APDU最大长度255+6=261字节) import re apdu_pattern = r'68\s+[0-9A-Fa-f\s]{2,260}' apdus = re.findall(apdu_pattern, raw) with open('clean_apdu.txt', 'w') as out: for apdu in apdus: # 合并空格,转大写,去首尾空格 hex_str = ''.join(apdu.split()).upper() if len(hex_str) % 2 == 0 and 12 <= len(hex_str) <= 522: # 6~261字节 out.write(hex_str + '\n')参数说明:
len(hex_str)限制确保是合法APDU(最小为APCI 6字节+ASDU 6字节=12字符;最大261*2=522字符)。清洗后文件可直接被scapy或自研解析器读取,实现离线重放或模糊测试。
5.3 用“增量赋值”功能快速模拟遥测突变
现场常需验证后台告警逻辑,比如“电压越上限”。手动改每个点太慢,用工具的“增量赋值”:
- 在遥测表格中,选中目标列(如“母线电压”);
- 右键 → “增量赋值” → 输入起始值
10.0、步长0.1、数量10; - 点击确定,10个点的值自动变为
10.0, 10.1, 10.2...10.9; - 此时软件自动向服务端发送10条
M_ME_NB_1报文,每条间隔200ms(可调)。
技巧:若需突变到固定值(如全部设为
11.5),用“等量赋值”;若需按正弦规律变化,先在Excel算好序列,复制粘贴到表格——软件支持Ctrl+V批量粘贴。
从那以后我每次拿到新设备,第一件事就是用这个工具连上,导出一份clean_apdu.txt,然后用xxd -r -p clean_apdu.txt | wireshark -k -i -直接在Wireshark里看协议细节。它不完美,没文档,但胜在诚实——所有行为都写在代码和INI里,没有黑盒。希望帮到你。
本文还有配套的精品资源,点击获取