大数跨境

还在为SOME/IP仿真头秃?这个SolarONE技巧让你秒变高手

还在为SOME/IP仿真头秃?这个SolarONE技巧让你秒变高手 怿星科技
2025-05-09
3

车载网络仿真测试工具

去年怿星发布了首款车载网络仿真测试工具链(SolarONE仿真测试软件+ETS5系列接口卡),该产品一面世,就受到了热烈反响,不断有小伙伴在后台咨询这套工具该怎么用。今天小怿就带大家实操如何基于SolarONE软件实现SOME/IP仿真,快快跟紧小怿的步伐!






SOMEIP_SIM示例工程




首先,我们来看一下最终生成的示例工程目录结构:


接下来我们开始尝试一步一步搭建仿真工程。

01

从零开始搭建SOME/IP仿真工程

Step 1: 添加Ethernet通道


Step 2: 添加SOME/IP数据库


Step 3: 添加数据库节点


Step 4: 勾选需要仿真的服务


Step 5: 编写仿真节点脚本


Step 6: 运行工程


到这里工程就搭建完成了,是不是非常简单、高效。为了方便大家理解,我们来看一下其实现逻辑是怎样的。



02

示例工程功能及实现逻辑说明

1

Method

Arxml中定义了设置充电起始时间的方法,该方法call和return对应的参数均为“SetTimeInfoStruct”的结构体


call


 retune


基于ARXML中方法的定义,实现了一个用户操作的面板,该面板的实现效果如下图:


服务提供方的python代码如下:

from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取指定network_name中仿真的第一个SOME/IP Server(Provided Service Instance) servers = someip_get_servers(network_name)server = servers[0]#当server接收到method请求之后此监听器将被调用@server.on_method_request()def on_method_request(method: SOMEIPMethod):    print("on_method_request:",method)    #将method request中的信号值赋值给response    method.return_signal.SetStart_YEAR.value = method.call_signal.SetStart_YEAR.value    method.return_signal.SetStart_Month.value = method.call_signal.SetStart_Month.value    method.return_signal.SetStart_Day.value = method.call_signal.SetStart_Day.value    method.return_signal.SetStart_Hour.value = method.call_signal.SetStart_Hour.value    method.return_signal.SetStart_Minute.value = method.call_signal.SetStart_Minute.value    method.return_signal.SetEnd_YEAR.value = method.call_signal.SetEnd_YEAR.value    method.return_signal.SetEnd_Month.value = method.call_signal.SetEnd_Month.value    method.return_signal.SetEnd_Day.value = method.call_signal.SetEnd_Day.value    method.return_signal.SetEnd_Hour.value = method.call_signal.SetEnd_Hour.value    method.return_signal.SetEnd_Minute.value = method.call_signal.SetEnd_Minute.value 
    #设置return_signal完毕,控制SolarONE响应method request    #True代表method returnFalse代表method no return    method.reply(True)


服务消费方的python代码如下:

from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取Ethernet通道上所有的SOME/IP Client (Consumed Service Instance)clients = someip_get_clients(network_name)client = clients[0]#获取指定client中仿真的第一个SOME/IP method methods = client.get_methods()method = methods[0]#当系统变量的值发生更改时,此监听器将会被调用#"Method_Config::method_call"与“Call”按钮绑定@on_sysvar("Method_Config::method_call")def on_sysvar_method_call_change(sysvar):    #判断系统变量"Method_Config::method_call"是否等于1    if sysvar == 1 :        #设置method call signal参数与系统变量值一一对应        method.call_signal.SetStart_YEAR.value = sysvar_get_u16("Method_SetTimeInfo::SetStart_Year")        method.call_signal.SetStart_Month.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Month")        method.call_signal.SetStart_Day.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Day")        method.call_signal.SetStart_Hour.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Hour")        method.call_signal.SetStart_Minute.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Minute")        method.call_signal.SetEnd_YEAR.value = sysvar_get_u16("Method_SetTimeInfo::SetEnd_YEAR")        method.call_signal.SetEnd_Month.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Month")        method.call_signal.SetEnd_Day.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Day")        method.call_signal.SetEnd_Hour.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Hour")        method.call_signal.SetEnd_Minute.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Minute")
        #发送method请求        client.call_method(method.method_id)#当接收到method response之后该函数将会被调用@client.on_method_response()def on_server_response(method:SOMEIPMethod):    print("IAM_SIM",method)



2

event

Arxml中定义了充电信息的事件,该事件的参数为“ChargingInfoStruct”结构体


基于ARXML中方法的事件,实现了一个用户操作的面板,该面板的实现效果如下图:


服务提供方的python代码如下:

from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取指定network_name中仿真的第一个SOME/IP Server(Provided Service Instance) servers = someip_get_servers(network_name)server = servers[0]#当系统变量“Event_ChargingInformation::Event_ChargingInformation_Trigger”发生更改的时候,此监听器将会被调用@on_sysvar("Event_ChargingInformation::Event_ChargingInformation_Trigger")def on_sysvar_ChargingInformation_Trigger_change(sysvar):    if sysvar_get_u8("Event_ChargingInformation::Event_ChargingInformation_Trigger") == 1:        #将用户设置的充电状态和充电时间与event信号一一对应        event.signal.ChargingStatus.value = sysvar_get_u8("Event_ChargingInformation::ChargingStatus")        event.signal.ChargingTime.value = sysvar_get_u16("Event_ChargingInformation::ChargingTime")        #PSI发布指定event_id的事件        server.publish_event(event.event_id)        #计数:将发布的次数累加        sysvar_set_u16("Event_ChargingInformation::Trigger_Count",                        sysvar_get_u16("Event_ChargingInformation::Trigger_Count")+1)


服务消费方的python代码如下:

from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取Ethernet通道上所有的SOME/IP Client (Consumed Service Instance)clients = someip_get_clients(network_name)client = clients[0]#当client接收到event之后,此监听器将会被调用@client.on_event()def on_server_notification(event:SOMEIPEvent):    print("IAM_SIM:",event)    if event.event_id == 53251:        #计数:将接收到Event的次数进行累加        sysvar_set_u16("Event_ChargingInformation::IAM_Count",sysvar_get_u16("Event_ChargingInformation::IAM_Count")+1)







总结




以上就是本次展示的内容,我们简单来做个总结吧!

在上面展示的示例工程中,我们基于SolarONE实现的method request和response的仿真、event的仿真,切换到我们实际开发或者测试的场景中,不管是验证PSI还是CSI,SolarONE都可以准确应对。


大家如果还想看SolarONE的其他功能,欢迎在评论区留言互动,我们下期继续分享!




相关 · 推荐

SolarONE:新一代开放灵活高效的车载网络仿真测试软件

ETS5130 CAN/LIN总线接口卡,通信与负载注入双利器

新品推介 | 基于Android平台的SOME/IP测试模块 EPT-ETS

【声明】内容源于网络
0
0
怿星科技
让智能汽车研发更高效!
内容 428
粉丝 0
怿星科技 让智能汽车研发更高效!
总阅读694
粉丝0
内容428