杨光友, 姜 帆
(1 湖北工业大学机械工程学院, 湖北 武汉 430068;2 湖北省农机装备智能化工程技术研究中心, 湖北 武汉 430068)
为了保障燃料电池汽车在运行时的安全性与可靠性,及时发现车辆的安全隐患,需要对燃料电池汽车的监测系统进行深入研究。加拿大GREEN LIGHT公司开发了燃料电池监测系统,适用于质子交换膜燃料电池与固体氧化燃料电池,能够对电池的各种参数进行监测[1]。北京理工大学研发的远程监控系统用来监测电动公交车电动机和电池的运行状态,能够发现和处理公交车的故障[2]。上汽集团技术中心等单位共同开发了一套新能源汽车监控系统,实现了监控中心与车载终端的双向通信[3]。
本文针对燃料电池乘用车(FCV)提出了车载OBD数据采集系统。相比于与传统内燃机的汽车,燃料电池乘用车各个部件(如燃料电池、蓄电池、DC变换器、电机等)都拥有独立的控制单元,通过CAN总线相互连接与通信,并利用OBD接口与外界交互,其基于OBD的采集系统可以直接与车辆进行通信,获取数据并上传到远程服务器。
基于OBD系统的燃料电池乘用车(FCV)数据采集系统的功能包括:OBD系统数据采集,加速度、陀螺仪数据采集,GPS数据采集,4G远程传输以及采集数据的本地存储。
通过OBD系统即车载自诊断系统可获取各个控制单元的内部参数[4-5],其他(如车辆行驶加速度等)则通过增加惯性传感器获取,车辆的经纬度数据来自GPS模块。这些数据通过串口发送至控制器。
车载采集系统实时采集汽车的运行参数,要求系统稳定可靠、成本低、功耗低。而嵌入式系统是能够根据用户的要求对软硬件进行裁剪的专用计算机,在监控系统中最常用的是ARM处理器。系统总架构图如图1所示。
图1 系统总架构
OBD协议有很多,汽车K线协议在比较老的车型中使用相对广泛,现在大部分已经被CAN总线取代。基于CAN总线的代表协议在欧洲使用比较广泛的是ISO 15765[6-7],在美国使用广泛的是SAEJl939[8]。本系统使用的ISO 15765协议是一种基于CAN总线的车辆诊断协议,该协议是根据 ISO/OSI 的7层参考模型建立而来的。目前ISO 15765协议广泛应用于轿车等车辆控制单元的故障诊断方面。根据ISO 15765标准协议的定义[9],从网络层传送来的数据报文经由数据链路层处理后可以在总线上以报文帧的形式传输。ISO 15765标准协议指明了CAN总线上传输的数据既可以使用 CAN 的标准帧格式,也可以使用 CAN的扩展帧格式进行传送[10]。
1.2.1控制器系统整体硬件结构如图2所示。控制器采用了基于NXP的32位Cortex A7的处理器i.MX6ULL作为控制板[11]。该控制板广泛应用于各种工业控制环境,具有价格低廉、稳定性好等优点,可以运行LINUX系统,对网络功能有着良好的支持。该控制板具有528 MHz主频,满足基本的运算要求,拥有512 MB内存和8 GB EMMC,具有十分丰富的外设资源。
图2 控制器原理
1.2.2CAN总线通信IMX.6ULL控制板通过CAN总线接收OBD系统的数据。该控制板带有 CAN 控制器外设,即FlexCAN。FlexCAN 符合 CAN2.0B 协议,完全符合CAN协议,支持标准格式和扩展格式,支持64个消息缓冲。
CAN接口通信原理图如图3所示。图中CAN1_TX和CAN1_RX分别是I.MX6ULL FlexCAN1的发送和接收引脚,对应I.MX6ULL 的 UART3_CTS 和 UART3_RTS 这两个引脚。TJA1050 是 CAN 收发器,通过 TJA1050向外界提供 CAN_H 和 CAN_L 总线,R10是一个 120 Ω的端接匹配电阻,用来消除在通信电缆中的信号反射。
图3 CAN总线原理
1.2.34G通信模块IMX.6ULL控制板通过4G模块将数据上传到远程服务器。该控制板板载了ME3630 4G模组,原理如图4所示。ME3630是一款全网通 4G 模块,广泛用于各种工业监控场合[12]。在LTE模式下可以提供50 Mbps上行速率,以及150 Mbps的下行速率,并支持回退到3G或2G网络。同时该模组也支持GPS定位功能,完全符合系统功能要求。IMX.6ULL控制板通过MiniPCIE接口与4G模组相连,HUBDP2与HUBDM2是该模块的通信引脚。
图4 4G模块原理
1.2.4SD卡IMX.6ULL控制板通过SD卡接口将数据保存到本地。该控制板板载了一个SD卡接口,其原理图如图5所示。该卡采用4位uSDHC方式驱动,非常适合高速存储。
图5 SD卡原理
USDHC1_DATA0~DATA3/USDHC1_CLK/USDHC1_CMD分别连接在I.MX6ULL的SD1_DATA0~DATA3/SD1_CLK/SD1_CMD引脚上。USDHC1_CD_B是SD卡检测引脚,用于检测SD卡插拔过程,连接到I.MX6U的UART1_RTS引脚上。
系统软件功能模块如图6所示。
图6 基于OBD的FCV监测系统
根据系统功能需求,控制系统使用Linux4.15嵌入式操作系统,采用多线程编程方式,整个系统软件通过5个线程实现。根据系统各个功能模块间的相互关系,线程调度如图7所示。
图7 系统调度
OBD指令发送线程通过信号量1控制OBD系统数据接收线程,在接收到信号量1之前,OBD系统数据接收线程处于阻塞状态。当OBD指令发送线程发出OBD数据请求指令后,该线程将向OBD系统数据接收线程发送信号量1,唤醒OBD系统数据接收线程,接收OBD系统数据。当数据接收结束之后,OBD系统数据接收线程重新进入阻塞状态,等待下一次OBD指令发送线程的唤醒。
为了防止TCP线程重复发送旧数据,浪费流量,在信号量到来之前,TCP线程受到信号量的控制,整个线程处于阻塞状态,直到收到GPS数据采集线程、加速度传感器采集线程、OBD系统数据接收线程的信号量之后才会被唤醒,其后将数据传送至远程服务器。数据传输完成之后,该线程将重新进入阻塞状态,等待下一次被唤醒。
OBD指令发送线程主要负责向OBD系统发送数据请求指令,控制器在接收OBD数据之前要向OBD系统发送请求指令,发送请求指令后控制器才能够接收到OBD系统的数据。程序实现的伪代码如下:
OBD_Send_Thread()
{
Initialize();
∥初始化
fd = Socket();
∥创建套接字
Ioctrl();
∥指定CAN设备
Bind();
∥绑定CAN设备
Send(fd,cmd);
∥发送读取数据指令
Sem_post(signal)
∥发送信号量,标记线程完成
}
在LINUX系统中,CAN设备作为网络设备进行管理,因此在CAN总线应用开发方面, Linux 提供了SocketCAN 接口,使得 CAN 总线通信近似于和以太网的通信,应用程序开发接口更加通用,也更加灵活。
当线程开启之后,首先利用Socket函数创建SocketCAN套接字,随后使用Ioctl函数指定Can设备,最后使用bind函数将套接字与CAN设备绑定,完成CAN设备初始化过程。由于线程主要使用CAN设备进行数据接收,系统可以根据预先设置的过滤规则,实现对报文的过滤。
系统使用ISO 15765协议与OBD系统通信,OBD系统的CAN标准帧的ID为0X7DF。这个CANID是OBD系统本身的一个CANID,指令格式为02 01 PIDx 00 00 00 00 00。发送的数据中,02代表数据长度,后面有效字节长度为2。01代表服务号,也叫SID,其中01是动力有关的数据,01服务为用的最多的一个服务。PIDx是参数ID,具体定义可查询ISO 15031-5协议标准,其中一部分如表1所示。以车速为例,IMX.6ULL控制板通过CAN总线发出HEX字节“02 01 0D 00 00 00 00 00”,OBD系统反馈“04 41 0D 0B 3E 00 00 00”,接收到的数据为行车电脑返回的数据。CAN报文数据为“04”,代表后续有效字节有4个。41为对01服务的一个应答,所有行车电脑返回的数据,都会在请求数据的基础上加0x40返回(0X01+0X40即0x41)。0D对应请求命令中的0D,代表车速。0B 3E代表车速值,转换成十进制为km/h。
表1 ISO15031-5协议部分标准
OBD系统数据接收线程的主要任务是负责接收OBD系统传出的数据。该线程在未收到OBD指令发送线程之前处于阻塞状态,当收到OBD指令发送线程发出的信号量时被唤醒,开始读取OBD系统数据。在接收到数据之后将发送信号4,用于标记完成一次数据接收。程序实现的伪代码如下:
OBD_Read_Thread()
{
Initialize();
∥初始化
fd = Socket();
∥创建套接字
Ioctrl();
∥指定CAN设备
Bind();
∥绑定CAN设备
If(signal)
∥是否收到信号量
Read(fd,data);
∥读取数据
Sem_post(signal);
∥发送信号量,标记线程完成
else
Sem_wait(signal);
∥等待
}
TCP线程负责将接收到的CAN数据通过TCP透传发送至服务器。ME3630 4G模组支持AT指令配置,在线程开启之后,需要通过串口发送AT指令对其进行配置。配置指令见表2,配置方法如下:使用串口发送AT指令“AT+ZSWITCH=L”,用来将模组配置为ECM模式。之后使用 AT 指令+CGDCONT 来设置数据参数,联通卡的 APN 为 3gnet,电信卡的 APN为 ctnet,移动卡的 APN 为 cmnet。比如用联通卡,设置 APN 为 3gnet,命令如下:AT+CGDCONT=1,"IP","3gNET"。最后发送AT连接命令“AT+ZECMCALL=1”。
表2 AT指令表
在Linux系统中对网络之间的进程通信提供了专门的Socket接口,应用层只需要调用Socket接口就可以实现TCP/IP网络通信。
线程开启之后,在线程内使用socket()函数用于创建一个socket描述符(socket descriptor),它唯一标识一个socket,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。之后调用connect()函数,这个函数用于客户端中,将socket描述符与远端IP地址、端口号进行绑定,在TCP客户端中调用这个函数将发生握手过程(会发送一个TCP连接请求),并最终建立一个TCP连接。
建立连接完成之后,线程处于阻塞状态,直到被信号量唤醒,才可以利用socket描述符与write函数将接收到的数据发送至服务器。当服务器收到系统发送的数据之后,会回复{OK}字符,如果没收到回复则视为连接中断,将重新建立与服务器的连接。TCP线程程序实现的伪代码如下:
TCP_Thread()
{
2016年6月-2018年9月,通过电视等媒体发布黄色预警35次,为山东省各级国土资源相关部门及人员发送预警短信十三万余条,近三年汛期发生的9起突发性地质灾害,均成功预报。由于提前预警、防范措施到位,实现了多次强台风过境期间人员零伤亡,最大限度避免了人民群众的生命财产损失,取得了良好的防灾减灾效果。
Initialize();
∥初始化
fd = Socket();
∥创建套接字
Connect();
∥建立连接
If(signal);
∥是否收到信号量
Sendfd,data);
∥发送采集到的数据
If(answer)
∥是否收到了服务器的应答
Sem_wait(signal);
∥等待
else
∥重新建立连接
else
Sem_wait(signal);
∥等待
}
加速度数据、陀螺仪数据接收线程主要通过串口接收加速度传感器数据。当线程开启后,首先初始化串口,随后通过串口接收加速度数据、陀螺仪数据,将数据解析之后发送信号量3,用来通知TCP线程。其实现的伪代码如下:
IMU_Thread()
{
Initialize();
∥初始化串口
Read(fd,data);
∥读取IMU数据
Resolute();
∥解析加速度、陀螺仪数据
Sem_post(signal);
∥发送信号量,标记线程完成
}
位置数据是通过GPS模块接收GPS数据后解析得到的。GPS数据接收线程负责GPS的数据接收与解析。当线程开启之后,首先初始化串口,随后使用串口接收来自传感器的GPS数据
因为传感器发出的GPS数据采用NMEA协议格式,输出为GPRMC帧。GPRMC帧的数据式为:$GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF),各个数据帧字段意义如表3所示。
表3 NMEA协议格式表
这里需要对NMEA格式的数据进行数据解析才能获取到经纬度数据。解析方式采取字符串分割的方式进行,将数据按照“,”进行分割之后,将各个字段的数据储存到对应的二维数组中,最后将解析出来的经纬度数据转存至全局缓存区,用于TCP线程的发送。其实现的伪代码如下:
GPS_Thread()
{
Initialize();
∥初始化串口
Read(fd,data);
∥读取GPS数据
Resolute();
∥解析定位数据
Sem_post(signal);
∥发送信号量,标记线程完成
}
为验证系统的可行性,将系统装车进行了初步的测试试验(图8)。
图8 系统装车试验
图9为系统采集的实验数据上传至远程监测系统的界面。
图9 远程监测系统界面
实验结果表明,在服务器端可以实时接收到监测系统通过4G模块传递的各项数据,实现了系统的各项功能。
本文针对燃料电池乘用车(FCV)设计了一套基于OBD的数据采集系统,完成了车载监测终端系统的硬件电路设计、选型与软件编写,进行了数据采集与上传试验,验证了系统的可行性。该系统响应速度快,可增加人机交互功能,实时显示采集系统采集的各项数据,并可进一步结合故障诊断方法对车辆进行实时预警。由于5G技术的迅速发展为车联网提供了良好的技术支持[13],后续可以考虑使用5G通信技术进行远程传输,以提高传输的速率,增强系统的实时性。