
去年怿星发布了首款车载网络仿真测试工具链(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 return;False代表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的其他功能,欢迎在评论区留言互动,我们下期继续分享!
771

被折叠的 条评论
为什么被折叠?



