主要内容

以编程方式配置 AUTOSAR 可运行实体和事件

此示例说明如何以编程方式配置 AUTOSAR 可运行实体和事件。

此示例使用 autosar.api.getAUTOSARPropertiesautosar.api.getSimulinkMapping 对象及函数来操作示例模型 autosar_swc_expfcns

AUTOSAR 软件组件的行为由一个或多个可运行实体实现。AUTOSAR 可运行实体是可调度实体,由底层 AUTOSAR 操作系统直接或间接调度。每个可运行实体由 RTEEvent 触发,这些事件由 AUTOSAR 运行时环境 (RTE) 生成。对于每个可运行实体,您需要配置它响应的事件。以下是可运行实体响应的 AUTOSAR 事件示例:

  • TimingEvent - 触发周期性可运行实体。

  • DataReceivedEventDataReceiveErrorEvent - 触发具有接收方端口的可运行实体,该端口参与发送方-接收方通信。

  • OperationInvokedEvent - 触发具有服务器端口的可运行实体,该端口参与客户端-服务器通信。

  • ModeSwitchEvent - 触发具有模式接收方端口的可运行实体,该端口参与模式切换通信。

  • InitEvent(AUTOSAR 架构 4.1 或更高版本)- 触发执行组件初始化的可运行实体。

  • ExternalTriggerOccurredEvent - 触发具有触发器接收方端口的可运行实体,该端口参与外部触发事件通信。

为周期性可运行实体配置 AUTOSAR TimingEvent

此示例使用模型 autosar_swc_expfcns 来说明如何以编程方式添加和配置周期性可运行实体和定时事件。

打开 autosar_swc_expfcns 示例模型并创建 autosar.api.getAUTOSARProperties 对象。

hModel = "autosar_swc_expfcns";
open_system(hModel);
arPropsExport = autosar.api.getAUTOSARProperties(hModel);

使用 find 函数查找模型中存在的可运行实体。

swc = get(arPropsExport,"XmlOptions","ComponentQualifiedName");
ib = get(arPropsExport,swc,"Behavior");
runnables = find(arPropsExport,ib,"Runnable","PathType","FullyQualified");
runnables'
ans = 4×1 cell
    {'/pkg/swc/ASWC/IB/Runnable_Init'}
    {'/pkg/swc/ASWC/IB/Runnable1'    }
    {'/pkg/swc/ASWC/IB/Runnable2'    }
    {'/pkg/swc/ASWC/IB/Runnable3'    }

然后,您可以遍历这些可运行实体并列出其属性值。有关 AUTOSAR 属性的详细信息,请参阅 AUTOSAR Element Properties

for ii=1:length(runnables)
    runnable = runnables{ii};
    rnName = get(arPropsExport,runnable,"Name");
    rnSymbol = get(arPropsExport,runnable,"symbol");
    rnCBIC = get(arPropsExport,runnable,"canBeInvokedConcurrently");
    fprintf("Runnable %s: symbol %s, canBeInvokedConcurrently %u\n",...
      rnName,rnSymbol,rnCBIC);
end
Runnable Runnable_Init: symbol Runnable_Init, canBeInvokedConcurrently 0
Runnable Runnable1: symbol Runnable1, canBeInvokedConcurrently 0
Runnable Runnable2: symbol Runnable2, canBeInvokedConcurrently 0
Runnable Runnable3: symbol Runnable3, canBeInvokedConcurrently 0

声明变量以配置可运行实体的属性。

set(arPropsExport,runnables{2},"Name","myRunnable","symbol","myAlgorithm");
runnables = find(arPropsExport,ib,"Runnable","PathType","FullyQualified");
rnName = get(arPropsExport,runnables{2},"Name");
rnSymbol = get(arPropsExport,runnables{2},"symbol");
rnCBIC = get(arPropsExport,runnables{2},"canBeInvokedConcurrently");
fprintf("Runnable %s: symbol %s, canBeInvokedConcurrently %u\n",...
  rnName,rnSymbol,rnCBIC);
Runnable myRunnable: symbol myAlgorithm, canBeInvokedConcurrently 0

您可以通过指定事件类型来遍历 AUTOSAR 定时事件,并列出关联的可运行实体。

events = find(arPropsExport,ib,"TimingEvent","PathType","FullyQualified");
for ii=1:length(events)
    event = events{ii};
    eventStartOn = get(arPropsExport,event,"StartOnEvent");
    fprintf("AUTOSAR event %s triggers %s\n",event,eventStartOn);
end
AUTOSAR event /pkg/swc/ASWC/IB/Event_t_1tic_A triggers ASWC/IB/myRunnable
AUTOSAR event /pkg/swc/ASWC/IB/Event_t_1tic_B triggers ASWC/IB/Runnable2
AUTOSAR event /pkg/swc/ASWC/IB/Event_t_10tic triggers ASWC/IB/Runnable3

设置名称并将事件配置为 TimingEvent

set(arPropsExport,events{1},"Name","myEvent");
events = find(arPropsExport,ib,"TimingEvent","PathType","FullyQualified");
eventStartOn = get(arPropsExport,events{1},"StartOnEvent");
fprintf("AUTOSAR event %s triggers %s\n",events{1},eventStartOn);
AUTOSAR event /pkg/swc/ASWC/IB/myEvent triggers ASWC/IB/myRunnable

将 Simulink 导出函数 Runnable1 映射到 AUTOSAR 可运行实体 myRunnable

slMapExport = autosar.api.getSimulinkMapping(hModel);
mapFunction(slMapExport,"Runnable1","myRunnable");
The function name value 'Runnable1' is obsolete and will be removed in a future
release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
The function name value 'Runnable1' is obsolete and will be removed in a future
release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
arRunnableName = getFunction(slMapExport,"Runnable1")
The function name value 'Runnable1' is obsolete and will be removed in a future
release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
arRunnableName = 
'myRunnable'

配置和映射可运行实体

此示例使用模型 autosar_swc_counter 来说明如何添加初始化和周期性可运行实体,以及配置与这些可运行实体关联的定时事件。还提供了一个示例来说明如何以编程方式将可运行实体映射到 Simulink 函数。

打开示例模型 autosar_swc_counter,并创建相关的 autosar.api.getAUTOSARProperties 对象。

hModel = "autosar_swc_counter";
open_system(hModel);
arPropsCounter = autosar.api.getAUTOSARProperties(hModel);

定义并添加 AUTOSAR 初始化和周期性可运行实体,分别为 myInitRunnablemyPeriodicRunnable

initRunnable = "myInitRunnable";
periodicRunnable = 'myPeriodicRunnable';
swc = get(arPropsCounter,"XmlOptions","ComponentQualifiedName")
swc = 
'/Company/Powertrain/Components/autosar_swc_counter'
ib = get(arPropsCounter,swc,"Behavior")
ib = 
'autosar_swc_counter/ASWC_IB'
add(arPropsCounter,ib,"Runnables",initRunnable);
add(arPropsCounter,ib,"Runnables",periodicRunnable);

添加 AUTOSAR 定时事件 myPeriodicEvent

eventName = "myPeriodicEvent";
add(arPropsCounter,ib,"Events",eventName,"Category","TimingEvent","Period",1,...
    "StartOnEvent",[ib '/' periodicRunnable]);

创建 autosar.api.getSimulinkMapping 对象。

slMapCounter = autosar.api.getSimulinkMapping(hModel);

将初始化可运行实体 myInitRunnable 映射到 Simulink InitializeFunction。将周期性可运行实体 myPeriodicRunnable 映射到 Simulink StepFunction

mapFunction(slMapCounter,"InitializeFunction",initRunnable);
The function name value 'InitializeFunction' is obsolete and will be removed in
a future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
The function name value 'InitializeFunction' is obsolete and will be removed in
a future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
mapFunction(slMapCounter,"StepFunction",periodicRunnable);
The function name value 'StepFunction' is obsolete and will be removed in a
future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").
The function name value 'StepFunction' is obsolete and will be removed in a
future release. For valid function name values, use
autosar.api.getSimulinkMapping(modelName).find("Functions").

要通过验证,请删除 AUTOSAR 配置中冗余的初始化和步进可运行实体。

runnables = get(arPropsCounter,ib,"Runnables");
delete(arPropsCounter,[ib,'/Runnable_Init']);
delete(arPropsCounter,[ib,'/Runnable_Step']);
runnables = get(arPropsCounter,ib,"Runnables")
runnables = 1×2 cell
    {'autosar_swc_counter/ASWC_IB/myInitRunnable'}    {'autosar_swc_counter/ASWC_IB/myPeriodicRunnable'}

检索和映射信号与状态

此示例使用模型 autosar_swc_counter 来说明如何以编程方式将信号和状态映射到 AUTOSAR 变量类型。

hModel = "autosar_swc_counter";
open_system(hModel);
slMapCounter = autosar.api.getSimulinkMapping(hModel);

使用 autosar.api.getSimulinkMapping 对象、slMapCounter 以及对象函数 find 获取信号及其名称,以及模型中存在的状态。

listOfSignals = find(slMapCounter,"Signals")
listOfSignals = 1×3

  520.0011  524.0020  529.0018

namesOfSignals = get_param(listOfSignals, "Name")
namesOfSignals = 3×1 cell
    {'equal_to_count'}
    {'sum_out'       }
    {'switch_out'    }

listOfStates = find(slMapCounter,"States")
listOfStates = 
"autosar_swc_counter/X"

将信号映射到 AUTOSAR 变量类型。有关详细信息,请参阅 mapSignal 函数。

mapSignal(slMapCounter,listOfSignals(1),"StaticMemory")
mapSignal(slMapCounter,listOfSignals(2),"ArTypedPerInstanceMemory")
mapSignal(slMapCounter,listOfSignals(3),"Auto")

将状态映射到 AUTOSAR 变量类型 StaticMemory。有关详细信息,请参阅 mapState 函数。

mapState(slMapCounter,'autosar_swc_counter/X','',"StaticMemory")

为可运行实体激活配置事件

此示例说明向模型中的可运行实体添加 AUTOSAR TimingEventDataReceivedEventDataReceiveErrorEvent 的属性函数语法。对于 DataReceivedEventDataReceiveErrorEvent,您需要指定触发器。触发器名称包括接收事件的 AUTOSAR 接收方端口和数据元素的名称,例如 RPort.DE1

打开示例模型 autosar_swc_expfcns 并创建相关的 autosar.api.getAUTOSARProperties 函数。

hModel = "autosar_swc_expfcns";
open_system(hModel);
arPropsExport = autosar.api.getAUTOSARProperties(hModel);

使用软件组件的名称和行为,向指定的可运行实体(在本例中为 Runnable1)添加定时事件。

swc = get(arPropsExport,"XmlOptions","ComponentQualifiedName")
swc = 
'/pkg/swc/ASWC'
ib = get(arPropsExport,swc,"Behavior")
ib = 
'ASWC/IB'
runnables = get(arPropsExport,ib,"Runnables")'
runnables = 4×1 cell
    {'ASWC/IB/Runnable_Init'}
    {'ASWC/IB/myRunnable'   }
    {'ASWC/IB/Runnable2'    }
    {'ASWC/IB/Runnable3'    }

runnable = 'Runnable2';
timingEventName = 'myTimingEvent';
add(arPropsExport,ib,"Events",timingEventName,"Category",'TimingEvent',...
    "Period",1,'StartOnEvent',[ib '/' runnable]);

向可运行实体 myRunnable 添加 DataReceivedEventDataReceiveErrorEvent

drEventName = "myDREvent";
add(arPropsExport,ib,"Events",drEventName,"Category","DataReceivedEvent",...
    "Trigger","RPort.DE1",'StartOnEvent',[ib '/' runnable]);
dreEventName = "myDREEvent";
add(arPropsExport,ib,"Events",dreEventName,"Category","DataReceiveErrorEvent",...
    "Trigger","RPort.DE1",'StartOnEvent',[ib '/' runnable]);

要通过验证,请删除 AUTOSAR 配置中的冗余定时事件。

events = get(arPropsExport,ib,"Events")'
events = 6×1 cell
    {'ASWC/IB/myEvent'       }
    {'ASWC/IB/Event_t_1tic_B'}
    {'ASWC/IB/Event_t_10tic' }
    {'ASWC/IB/myTimingEvent' }
    {'ASWC/IB/myDREvent'     }
    {'ASWC/IB/myDREEvent'    }

delete(arPropsExport,[ib,'/Event_t_1tic_B'])
events = get(arPropsExport,ib,"Events")'
events = 5×1 cell
    {'ASWC/IB/myEvent'      }
    {'ASWC/IB/Event_t_10tic'}
    {'ASWC/IB/myTimingEvent'}
    {'ASWC/IB/myDREvent'    }
    {'ASWC/IB/myDREEvent'   }

另请参阅

对象

函数

属性

主题