Skip to content
← 返回博客
AI 如何助力 AUTOSAR 系统设计和配置
产品动态

AI 如何助力 AUTOSAR 系统设计和配置

AutoC 开始做 System 层了。转向灯加双闪,Plan 里拆 SWC、建端口、生成 DataType,再丢进 DaVinci Developer 对一下。

产品动态AutoCAUTOSAR

起因

之前 AutoC 能干的是 ECUC 层,CanIf、PduR、Com 这些 BSW 模块的参数。System 层一直得自己在 DaVinci Developer 或 ISOLAR 里点:SWC 怎么连、Port 怎么建、Mapping 怎么对。

DataType、PortInterface 手工建尤其烦。类型名、CompuMethod、Application / Implementation 映射,漏一项后面 RTE 就对不上。

这次想试试 System 层。Plan 里先把架构定下来,再生成到工程。我随便假设了个转向灯加双闪的需求。

先看一个测试

功能不复杂,但仲裁、闪烁、10ms Runnable、四路输出都有,够看 Plan 会怎么下手。

假设的系统需求

功能描述:

车辆的转向灯需要响应两类独立的输入:驾驶员的转向开关,以及危险报警灯(双闪)开关。两者都可能要求控制同一组灯(左前 / 左后 / 右前 / 右后),需要合理的优先级仲裁。

详细要求:

  1. 转向开关输入:状态包括左转、右转、关闭三种,来自转向杆。
  2. 危险报警灯开关输入:状态包括开启、关闭两种,来自独立的危险报警灯按钮。
  3. 优先级规则
    • 危险报警灯开启时,无论转向开关处于什么状态,所有转向灯(左右两侧)都应同步闪烁。
    • 危险报警灯关闭后,恢复响应转向开关的正常单侧转向指示。
  4. 闪烁特性
    • 闪烁频率约 1.5Hz(周期约 667ms,亮灭各占一半时间)。
    • 无论是转向指示还是危险报警灯触发的闪烁,闪烁的时序生成逻辑应该一致(即两种场景下灯的"闪烁节拍"是同一套机制)。
  5. 状态切换要求
    • 任何输入状态变化(转向开关切换、危险报警灯开启 / 关闭)都应立即响应,重新从"亮"状态开始新的闪烁相位,不延续之前的相位。
  6. 该功能需要周期性运行,判定周期为 10ms。
  7. 最终输出:左前、左后、右前、右后四路灯的亮灭状态,供车灯驱动相关模块使用。

Plan 模式怎么拆

把需求丢进 Plan。它没直接写 ARXML,先拆输入、仲裁、闪烁、输出,再落到 SWC 边界。

控制逻辑放一个原子 SWC 里,开关源和灯驱动先放外面。危险报警优先、同一套闪烁、输入一变就重相位,都写在这个 SWC 的行为里。

架构图

组合 C_TurnSignalHazard 包着原子 SWC TurnSignalHazardCtrl,对外三个端口:转向开关、危险报警开关、四路灯命令。组合端口 Delegation 到内部,开关源和灯驱动后面再接。

|TurnSwitchStatus| CPT

HZ["危险报警开关源 SWC"] -->|HazardSwitchStatus| CPH CPL -->|"LampLeftFront/LeftRear/RightFront/RightRear"| LD["车灯驱动 SWC(后续)"] -->

Plan 里的实现细节

下面这些都是 Plan 里出来的。

数据类型(DataTypes.arxml/DataTypes

元素类型关键参数
CompuMethod_TurnSwitchStatusCOMPU-METHODCATEGORY=TEXTTABLE;0=TURN_OFF, 1=TURN_LEFT, 2=TURN_RIGHT(保证左=1、右=2、关=0)
TurnSwitchStatusAPPLICATION-PRIMITIVE-DATA-TYPECATEGORY=TYPECODE;compuMethod→CompuMethod_TurnSwitchStatus
TurnSwitchStatus_ImplIMPLEMENTATION-DATA-TYPEbaseType=uint8;compuMethod→CompuMethod_TurnSwitchStatus;swDataDefProps 默认
ApplBooleanAPPLICATION-PRIMITIVE-DATA-TYPECATEGORY=TYPECODE;impl→平台 boolean
Appl_DataMappingSetDATA-TYPE-MAPPING-SET映射:TurnSwitchStatus→TurnSwitchStatus_ImplApplBoolean→/AUTOSAR_Platform/ImplementationDataTypes/boolean

危险报警直接用 ApplBoolean(TRUE=开),不单独做枚举。四灯是接口上 4 个独立布尔元素,没有 ApplicationRecordDataType。

转向开关才建 TEXTTABLE:关 / 左 / 右,Application 和 Implementation 各一份,Appl_DataMappingSet 把它们对上。

端口接口(PortInterfaces.arxml/PortInterfaces)—— 全部 SENDER-RECEIVER-INTERFACE

接口数据类型元素元素类型
TurnSwitchStatus_ITurnSwitchStatusTurnSwitchStatus(Appl)
HazardSwitchStatus_IHazardSwitchStatusApplBoolean
LampCommand_ILampLeftFront / LampLeftRear / LampRightFront / LampRightRear各为 ApplBoolean

三个接口都是 Sender-Receiver。灯命令做成四个独立布尔,后面接灯驱动可以按路连。

原子应用 SWC(/ComponentTypes

TurnSignalHazardCtrl(APPLICATION-SW-COMPONENT-TYPE)

  • PP LampCommand(interface=LampCommand_I
  • RP TurnSwitch(interface=TurnSwitchStatus_I
  • RP HazardSwitch(interface=HazardSwitchStatus_I
  • SwcInternalBehavior
    • RunnableEntity TurnSignalHazardCtrl_Run
      • TimingEvent:period=10.0ms,offset=0
      • DataReceivePoints:TurnSwitchHazardSwitch
      • DataSendPoints:LampCommand
    • PerInstanceMemoryVariable(用平台实现类型):
      • flashTick(uint16,0..周期-1)
      • lastTurnTurnSwitchStatus_Impl
      • lastHazard(boolean)

Runnable 周期是需求里的 10ms。flashTick 跑闪烁,lastTurn / lastHazard 记上一拍输入,变了就从亮开始。

组合组件与连接器(/ComponentTypes

C_TurnSignalHazard(COMPOSITION-SW-COMPONENT-TYPE)

  • SWCPrototypeTurnSignalHazardCtrl(type=上面的原子 SWC)
  • 组合端口(接口与上述一致):
    • R-Port TurnSwitchR-Port HazardSwitchP-Port LampCommand
  • DelegationConnector 三条:
    • C_TurnSignalHazard.TurnSwitch → TurnSignalHazardCtrl.TurnSwitch
    • C_TurnSignalHazard.HazardSwitch → TurnSignalHazardCtrl.HazardSwitch
    • C_TurnSignalHazard.LampCommand → TurnSignalHazardCtrl.LampCommand

组合不放逻辑,只外露端口。开关源和灯驱动这次没建。

开始实现

Plan 确认完,让 AutoC 往工程里写。

在 DaVinci Developer 中查看

导入 Developer,对一下类型、接口、端口和组合连接。

CompuMethod_TurnSwitchStatus 的 Int To Phys:0=TURN_OFF1=TURN_LEFT2=TURN_RIGHT

HazardSwitchStatus_I,S/R,一个布尔。灯命令那边是四路独立布尔。

TurnSignalHazardCtrl_Run 的 Access Points:读 TurnSwitchHazardSwitch,写四路 LampCommand

两个输入,一个输出。C_TurnSignalHazard 用 Delegation 接到这块内部 SWC。

Messages 里有一条 40501:Invalid periodic runnable trigger offset。Plan 里 TimingEvent 的 offset 写的是 0。这条要不要动,看工程里的周期触发约束。

在 AutoC 中进行查看

AutoC 里也能看同一份结果。

对象浏览器里有组合 C_TurnSignalHazard,还有 ApplBooleanTurnSwitchStatus

问了一句 C_TurnSignalHazard 是什么。它把类型、外部端口、Delegation 从模型里捞出来了。后面改端口或补 mapping,可以继续在 AutoC 里做。

小结

这次测的是 System 层。DataType、PortInterface、原子 SWC、组合 Delegation,Plan 里定完能写进工程。Developer 里大部分对得上,offset 那条提示还在。

分享