You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CANalyzer中CAPL脚本createGlobalMarker()函数可用场景及配置影响咨询

关于CAPL中createGlobalMarker()函数的可用场景说明

一、合法使用场景

  • 按键触发事件(on key):官方示例里的标准场景,用户主动按键触发,属于同步交互上下文
  • 测量生命周期事件(on start/on stop):测量启动或停止时调用,属于测量流程的核心同步节点
  • 预初始化事件(on preStart):测量启动前的初始化阶段,仅执行一次
  • 自定义菜单事件(on menu):通过CANalyzer自定义菜单触发的操作,属于用户主动发起的同步操作

二、为什么定时器/switch/信号事件里不能用

createGlobalMarker()是需要直接和CANalyzer主界面、测量上下文交互的函数,这类函数必须运行在同步的主线程上下文中。而定时器(on timer)、信号接收(on signal)、switch分支属于异步或周期性的执行上下文,CAPL引擎为了避免线程冲突、保证测量数据一致性,限制了这类上下文调用界面交互类函数。

三、和配置的关系

这个限制和你的发送分支配置无关,是CAPL语言本身的上下文权限规则。如果需要在信号切换时记录标记,可以用以下变通方案:

  1. 定义一个全局变量标记是否需要创建Marker
  2. 在信号切换、定时器触发的逻辑里设置这个变量
  3. 用一个低周期的定时器轮询该变量,满足条件时调用createGlobalMarker()

示例代码:

variables
{
  int g_needMarker = 0;
  timer t_pollMarker;
}

on start
{
  setTimer(t_pollMarker, 10); // 10ms轮询一次
}

on timer t_pollMarker
{
  if(g_needMarker == 1)
  {
    createGlobalMarker("信号切换标记", 0);
    g_needMarker = 0;
  }
  setTimer(t_pollMarker, 10);
}

// 你的信号切换逻辑示例
on signal TargetSignal
{
  switch(this.value)
  {
    case 0x01:
      // 更新帧内信号值
      g_needMarker = 1;
      break;
    case 0x02:
      // 更新帧内信号值
      g_needMarker = 1;
      break;
  }
}

内容的提问来源于stack exchange,提问作者Daemon Painter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:52:13