基于TRDP 的CCU 模拟软件设计与应用
2024-11-29周超
摘要:随着列车控制系统的智能化、网络化发展,列车实时以太网TRDP由于其传输速率可达到100Mb/s,已逐渐替代速率1~1.5Mb/s的WTB和MVB网络,成为高速动车组的控制网络。在列车实时以太网中,列车中央控制单元CCU作为最关键的核心部件,负责列车的通信、过程控制及显示控制的管理。文章介绍了一种基于TRDP网络的CCU模拟软件的设计方法,用于与车载子系统通信,以满足调试需求。该软件基于C语言编写,具有简单易学、可移植性高、模块化、结构化的优点。
关键词:C语言;列车中央控制系统;TRDP协议;模拟软件
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2024)27-0062-04
0 引言
列车设备接入列车控制网络前均需要对自身设备的功能进行调试,这就需要CCU实物以提供地面测试。对CCU的研究有基于IsaGRAF应用程序的模拟CCU串口通信的软件设计[1],有基于MVB的城轨车辆CCU 设计[2]。对TRDP 的调试之前有相关研究抓取TRDP报文进行数据分析的软件[3],但着重在于数据分析而没有进行交互控制。本文提供一种基于C语言的模拟CCU软件对子系统设备进行调试,用于在车辆总装前对子系统设备提供地面验证,节约调试成本。软件可部署于个人电脑,通过以太网连接子系统,控制以太网发送TRDP报文与子系统通信,并模拟列车CCU列车设备的调度和调试,对调试列车设备有重要的意义。
本文首先对列车实时以太网协议TRDP进行介绍,然后详细介绍了CCU模拟软件设计开发过程,包括TRDP协议移植、通信参数的配置、组播的加入、过程数据通信、数据的实时显示、用户界面设计、子系统部件状态监视、故障记录等。最后,通过搭载地面半实物平台与车载受电弓控制单元通信,验证了CCU模拟软件开发的正确性、实用性。
1 列车实时以太网协议TRDP 介绍
TRDP协议栈基于传统以太网架构,数据链路层采用Ethernet以太网协议,传输层使用TCP/UDP协议进行传输,过程数据和消息数据都可使用UDP发送[4]。过程数据是实时周期性数据,用于列车关键控制和列车状态信息的传输,是CCU模拟软件需要的数据;消息数据是实时非周期性数据,不用于控制。图1为TRDP协议栈架构图。
IEC61375-2-3协议定义了TRDP过程数据通信单元PDU的组成,报文头部长度为40个字节,如图2 所示。
TRDP过程数据通信单元报文头包括报文计数器SequenceCounter,根据协议SequenceCounter需要在发送过程保持累加,另外还包括协议版本ProtocolVer⁃sion、信息类型MsgType、通信标识符ComID、数据长度DatasetLength、报头校验和HeaderFCS等。
每个TRDP通信都使用一个通信标识符(comID) ,该comID在每个PDU报头中传输。comID是数据结构的唯一标识符,由用户自行定义,为大于999 的整数值。
紧跟报文头的是后续数据,长度最长为1 432字节的用户数据。
2 软件设计与开发
2.1 开发环境
软件开发环境选用Windows系统社区版VS 2022 进行编译,采用MSVC编译器,具有良好的兼容性、丰富的库函数支持、高效的代码优化和方便调试的优点。采用XAML窗口模式提供丰富的界面展示效果。
2.2 软件结构
软件分为前台和后台程序。前台程序包括用户界面模块、数据实时显示模块、故障记录模块。后台程序包括网络通信模块、数据处理模块,如图3所示。
软件主要执行过程包括:TRDP协议的移植、UDP 连接建立、加入组播发送和接收进程处理、前台数据显示、故障数据记录。
2.3 软件设计架构图
软件整体架构图如图4所示。
1) 软件开始执行后,对TRDP报文结构进行定义,通过UDP包形式采用符合TRDP报文结构的方式对TRDP报文进行封装。
2) 列车以太网大多采用组播形式进行报文收发。检测到连接按钮被点击后,通过HMI界面的IP地址和组播地址建立连接并加入组播。此步骤通过调用C 语言标准库函数进行。
3) 建立收发线程。通过创建线程,建立UDP数据发送线程以及UDP数据接收线程:
public MainWindow() //主窗口创建
{
InitializeComponent(); //初始化
udpRecvThread = new Thread(UdpRecv); //UDP接收线程建立
udpRecvThread. IsBackground = true; //UDP 接收线程设为后台
udpRecvThread.Start(); //UDP 接收线程开启
udpSendThread = new Thread(UdpSend); //UDP 发送线程建立
udpSendThread.IsBackground = true; //UDP 发送线程设为后台
udpSendThread.Start(); //UDP 发送线程开启
}
4) 显示到看板。建立委托,将接收进程里面的数据报文进行解析,根据协议位展示在看板中:
private void ShowTrainData() //展示传输数据函数
{
this. Dispatcher. Invoke(new Action(() => //建立委托
{
ShowTrainRecvData(); //展示接收数据函数
}));
}
3 模块功能设计
3.1 TRDP 协议移植
根据TRDP协议定义,定义结构体,将报文头和数据按顺序排列:
struct TRDP_PD_MSG
{
public UInt32 sequenceCounter; //消息序号计数器
public UInt16 protocolVersion; // 协议版本
public UInt16 msgType; // 消息类型
public UInt32 comId; // 通信标识符
public UInt32 etbTopoCnt; // ETB 拓扑计数器
public UInt32 opTrnTopoCnt; //Optrn拓扑计数器
public UInt32 datasetLength; // 数据长度
public UInt32 reserved; // 预留
public UInt32 replyComId; // 已请求的通信标识符
public UInt32 replyIpAddress; // 应答IP地址
public UInt32 frameCheckSum; // 报头校验和
[MarshalAs(UnmanagedType.ByValArray, SizeConst =1300)]
public Byte[] data;
}
而子系统与车辆间交互的数据均存放在data字节数组中。
3.2 组播的介绍以及加入和退出组播
列车以太网不是一对一的单点传输,CCU的公共信号(例如车速、时间等内容)需要同时发送给车辆所有子部件,所以大多动车组均采用组播形式进行发送。组播允许某个IP站点将一个报文一次发送给网络上指定的一组节点,只有该组内的节点可以接收到组播报文,其他节点则不能收到[5]。子系统的发送组播和接收组播地址由列车制造厂商规定。因此,子系统须加入发送组播和接收组播组来与CCU进行通信。
软件通过引用标准库中的两个库函数进行加入组播和退出组播操作。
using System.Net;
using System.Net.Sockets; 加入组播库函数
public void JoinMulticastGroup(IPAddress multi⁃castAddr) 退出组播库函数
public void DropMulticastGroup(IPAddress multi⁃castAddr)
3.3 连接建立
在软件建立连接过程中,通过绑定IP地址、端口号、目标组播地址,初始化ComID,初始化TRDP报文头,加入组播等操作建立模拟CCU软件和子系统设备的连接。本文示例发送的ComID设置为21304,IP地址为看板中输入的IP地址。
.private void connectBtn_Click(object sender, Rout⁃edEventArgs e) //按键响应函数
{……
IPAddress localIpAddr = IPAddress. Parse(localIP.Text); //目的IP地址绑定
localPoint = new IPEndPoint(localIpAddr, int.Parse(localPort.Text)); //端口绑定
udpClient = new UdpClient(localPoint); //本地端口设置
IPAddress recvMultIpAddr = IPAddress.Parse(recv⁃MultIP.Text);//接收组播地址
jSs6SGAcbZckayEC5TIELQ==recvMultiPoint = new IPEndPoint(IPAddress.Any, 0);// 接收组播端口
udpRecvClient.JoinMulticastGroup(recvMultIpAddr);//加入接收组播
sendPdMsg. protocolVersion= PP_HTONS(0x0100);//TRDP报文头的协议版本
sendPdMsg. msgType=PP_HTONS(0x5064); //TRDP 报文头的消息类型
sendPdMsg.comId=PP_HTONL(21304); //TRDP 报文头的COMID
sendPdMsg.datasetLength=PP_HTONL(1300); //TRDP 报文头的数据长度
……
}
3.4 根据通信协议进行通信
连接建立完成后,通过子系统与车辆的协议内容,在看板中展示各类收发数据,包括数值信号、开关量信号、故障信号等内容。通过int、Byte、Word型变量展示数值信号,通过bool型变量展示开关量信号和故障信号,如图5所示。
3.5 HMI 看板展示
软件的看板规划如下:分为左侧控制区和右侧展示区,展示区分为车辆发送与车辆接收。发送和接收的内容均能根据具体协议自主定义。本示例为列车受电弓控制器与列车CCU通信模拟,如图6所示。
3.6 故障记录功能
软件具有与列车司机室显示屏相同的故障记录功能,通过定义两个故障清单,展示当前故障(cur⁃rentlist) 和历史故障(historylist) 。通过接收报文的故障位从0跳变为1展示在当前记录中,从1变为0则将当前记录转移到历史记录中。故障产生与消除时均加入时间戳,以准确记录故障持续时间。
以接触网超范围故障为例,如果是从0变为1,则判断当前故障清单currentlist中是否已有此故障,如有则无须操作,如没有则增加到当前故障清单。如果是从1变为0,则将当前故障清单中故障移除,添加到历史故障清单。如图7所示。
4 软件效果验证
4.1 测试环境搭建
选用车载受电弓控制器作为被测设备,以太网连接测试电脑和被测设备。测试电脑运行CCU模拟软件,发送控制报文,接收被测设备报文。
4.2 测试工具
采用Wireshark软件对TRDP数据进行抓包,以检测软件执行情况。打开电脑Wireshark软件,对TRDP 报文进行过滤接收,可监测到模拟CCU和子系统设备双方报文正确发送,ComID设置正确,如图8所示。
4.3 测试结果分析
现场对设备进行调试,记录调试软件交互报文和展示界面正确。通过分析报文进一步验证了软件通信功能的正确性,CCU软件发送升降弓指令后,受电弓正确进行动作。这表明软件具备模拟CCU的TRDP 报文收发功能,满足设计预期。
5 结束语
本文针对目前列车子部件接入列车实时以太网调试的问题,通过TRDP报文收发、组播的加入、协议位的展示、人机交互界面的设计等方面,模拟了CCU 与子系统设备的通信,为子系统地面测试提供了条件,并对软件功能进行了测试,满足子系统调试要求。目前通过此软件测试的受电弓控制器已安装在CR400AF以及CR400BF动车组,大大节约了车辆联合调试的时间,也减少了上车后的设备故障。此软件能够推及其他子系统部件,为列车调试节约时间及成本。
参考文献:
[1] 黄瑜,朱红岗.TCMS系统中CCU通信设计开发及验证[J].电子制作,2019,27(13):42-44.
[2] 任宝兵.城轨车辆中央控制单元设计[D].大连:大连理工大学,2014.
[3] 郭文韬,李常贤,刘洋,等.基于TRDP的动车组单车网络调试软件设计[J].工业控制计算机,2021,34(2):21-23.
[4] 宫湛彭.列车网络TRDP消息数据通信监控软件设计与实现[D].大连:大连交通大学,2022.
[5] 唐岚,张学智.IP组播通信机制及相关问题的研究[J].西安工业学院学报,2000,20(3):209-214.
【通联编辑:谢媛媛】