CAN_EXTRACT_SIGNAL

功能概述

从 CAN 总线报文的数据区(payload)中按位提取一个信号的原始整数值。用于车联网、工业设备等场景:把采集到的原始 CAN 帧直接存入 Lakehouse,再按 DBC 文件中的信号定义(起始位、长度、字节序、是否有符号)用 SQL 解析。

只需要原始值时用本函数;需要按 DBC 中的 factor、offset 换算成物理值(如车速、温度)时,用 CAN_DECODE_SIGNAL。

语法

CAN_EXTRACT_SIGNAL(<data>, <start_bit>, <bit_length>, <byte_order>, <is_signed>)

参数说明

  • <data>
    <data>
    :BINARY 类型,CAN 帧的数据区字节。十六进制字符串可用
    CAST(unhex('...') AS BINARY)
    CAST(unhex('...') AS BINARY)
    转换。
  • <start_bit>
    <start_bit>
    :BIGINT 类型,信号的起始位,与 DBC 文件中的定义一致。位编号为
    字节序号 × 8 + 字节内位号
    字节序号 × 8 + 字节内位号
    ,字节内位号 0 是最低位。
    • Intel 字节序:起始位是信号的最低位(LSB)。
    • Motorola 字节序:起始位是信号的最高位(MSB),按 DBC 的锯齿形编号向后取位。
  • <bit_length>
    <bit_length>
    :BIGINT 类型,信号长度(位数),取值 1 ~ 64。
  • <byte_order>
    <byte_order>
    :STRING 类型,字节序,不区分大小写:
    • 小端:
      'intel'
      'intel'
      、
      'little'
      'little'
      、
      'i'
      'i'
    • 大端:
      'motorola'
      'motorola'
      、
      'big'
      'big'
      、
      'm'
      'm'
  • <is_signed>
    <is_signed>
    :BOOLEAN 类型,
    true
    true
    表示按补码解释为有符号数,
    false
    false
    表示无符号数。

返回 BIGINT 类型。

使用示例

Intel 字节序,从第 0 位取 8 位:

0x2A
0x2A
即 42:

SELECT can_extract_signal(CAST(unhex('2A00') AS BINARY), 0, 8, 'intel', false) AS raw;

raw
42

以下示例中字节从 0 开始编号。

跨字节的信号。Intel 字节序从第 8 位取 9 位,取的是第 1 字节全部 8 位(

0x80
0x80
)加第 2 字节最低位(
1
1
),结果为
0x180
0x180
:

SELECT can_extract_signal(CAST(unhex('018001') AS BINARY), 8, 9, 'intel', false) AS raw;

raw
384

Motorola 字节序,起始位 15 是第 1 字节(

0x01
0x01
)的最高位。从这里向后取 9 位:先取第 1 字节的 8 位
00000001
00000001
,再取第 2 字节(
0x00
0x00
)的最高位
0
0
,拼成二进制
000000010
000000010
:

SELECT can_extract_signal(CAST(unhex('800100') AS BINARY), 15, 9, 'motorola', false) AS raw;

raw
2

有符号与无符号解释:

0xFF
0xFF
作为 8 位有符号数是 -1:

SELECT can_extract_signal(CAST(unhex('FF00') AS BINARY), 0, 8, 'intel', true) AS signed_val, can_extract_signal(CAST(unhex('FF00') AS BINARY), 0, 8, 'intel', false) AS unsigned_val, can_extract_signal(CAST(unhex('0100') AS BINARY), 0, 0, 'intel', false) AS bad_len;

signed_valunsigned_valbad_len
-1255NULL

注意事项

  • 起始位和字节序的定义与 DBC 文件一致,可以直接照抄 DBC 中的信号定义。
  • 参数不合法时返回 NULL 而不是报错。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询