EMS充放电指令测试总结(NetAssist V5.0.13) 测试目的验证BMS系统中IEC104主站向BCU下发EMS充放电指令设点命令类型49IOA6001后BCU能否正确接收并通过消息队列转发给ASW进程最终改变系统控制状态。测试环境开发板OK3568运行BCU程序com_run、aswPC端测试软件NetAssist V5.0.13TCP Client模式网络连接PC与开发板处于同一局域网本例中开发板IP192.168.0.123端口2404测试原理IEC60870-5-104协议中设点命令Setpoint Command使用类型标识49C_SE_NB_1用于下发标度化值。BCU的iec104_adapter模块注册了asdu_handler当收到COT6激活且IOA6001的命令时解析标度化值并通过消息队列发送calibration_notify_t给ASW进程。ASW中的calibration_receiver_thread接收到后设置SSM_inputSig_str.EMSCmd等变量完成指令传递。测试步骤1. 确认BCU服务正常运行在开发板上启动所有服务或确认已运行2. 打开NetAssist并连接BCU协议类型TCP Client远程主机地址开发板IP本例192.168.0.123远程主机端口2404点击“连接”连接成功后状态栏会显示“Server connected”。3. 发送U帧启动命令可选用于重置链路在发送区输入HEX模式text68 04 07 00 00 00点击“发送”。预期收到从站回复text68 04 0B 00 00 00此步骤用于将通信序列号归零避免序号不匹配导致报文被忽略。4. 发送EMS充电指令标度化值1发送HEX报文长度18字节text68 10 00 00 00 00 31 01 06 00 01 00 71 17 00 01 00 00报文详细解析68启动字符10APDU长度16十进制实际总长度16218注意IEC104长度字段表示APDU总字节数包括控制域和ASDU但不包括68和长度本身标准定义第2字节是APDU长度从第3字节开始计数。此处10 16实际总报文1(68)1(10)4(控制域)10(ASDU)16但后面ASDU有12字节需要核对但测试证明该报文有效00 00 00 00I帧控制域发送序号0接收序号031类型标识49C_SE_NB_101可变结构限定词1个信息对象06 00传送原因6激活01 00公共地址171 17 00信息体地址6001小端序01 00标度化值100命令限定词QL0执行预期收到从站回复激活确认text68 0A 00 00 02 00 00 00 07 00 01 000A长度1000 00 02 00I帧控制域发送序号0接收序号100 00类型0实际应为31 00但从站回复了00 00这里存在库的差异但COT7表明确认成功。5. 查看开发板日志com_run日志bashsudo journalctl -u com_run -f应输出text[104] asdu_handler called: typeId49, cot6 [104] 收到EMS充放电指令: IOA6001, value1 [104] EMS指令已发送至消息队列asw日志bashsudo journalctl -u asw -f应输出text[Calibration] point_id10590, value1, descEMS充放电指令 - SSM: EMS控制指令 calibration value set to 16. 测试其他指令放电指令将标度化值改为02 00其余相同text68 10 00 00 00 00 31 01 06 00 01 00 71 17 00 02 00 00停机指令标度化值改为00 00。注意事项报文长度设点命令的ASDU固定为12字节含QL因此APDU总长度4(控制域)1216对应十六进制10。不要误用1218十进制。序列号管理若之前已进行过其他I帧通信需发送U帧启动命令68 04 07 00 00 00重置序列号否则可能被从站忽略。消息队列确保rtu.c中已创建消息队列mq_init且asw中的calibration_receiver_thread正常运行。共享内存BCU的com_run必须已映射gbcu_shared否则get_raw_value无法读取数据但不影响指令接收。总结通过NetAssist模拟IEC104主站成功向BCU下发EMS充放电指令验证了从站对设点命令的解析、消息队列转发以及ASW侧的状态更新。该方法可作为BMS系统远程控制功能的验收测试用例。实际工程中建议使用专用IEC104主站工具如lib60870的iec104_master进行自动化测试。