CAN_DECODE_SIGNAL

功能概述

从 CAN 报文的数据区中提取信号,并按 DBC 中的线性换算公式转换为物理值:

物理值 = 原始值 × factor + offset
物理值 = 原始值 × factor + offset
。例如把原始值换算为车速(km/h)、电池温度(℃)。

位提取规则与 CAN_EXTRACT_SIGNAL 完全相同,只多了换算一步。只需原始值时用

CAN_EXTRACT_SIGNAL
CAN_EXTRACT_SIGNAL
。

语法

CAN_DECODE_SIGNAL(<data>, <start_bit>, <bit_length>, <byte_order>, <is_signed>, <factor>, <offset>)

参数说明

  • <data>
    <data>
    、
    <start_bit>
    <start_bit>
    、
    <bit_length>
    <bit_length>
    、
    <byte_order>
    <byte_order>
    、
    <is_signed>
    <is_signed>
    :与 CAN_EXTRACT_SIGNAL 相同,取值照抄 DBC 文件中的信号定义。
  • <factor>
    <factor>
    :DOUBLE 类型,比例系数,对应 DBC 中的 factor。
  • <offset>
    <offset>
    :DOUBLE 类型,偏移量,对应 DBC 中的 offset。

返回 DOUBLE 类型。

使用示例

原始值

0x2A
0x2A
(42),factor 为 0.5、offset 为 -40,换算结果为
42 × 0.5 − 40 = −19
42 × 0.5 − 40 = −19
:

SELECT can_decode_signal(CAST(unhex('2A00') AS BINARY), 0, 8, 'intel', false, 0.5, -40) AS value;

value
-19.0

解析一张 CAN 报文表。前置数据(

payload
payload
存十六进制字符串):

CREATE TABLE IF NOT EXISTS doc_can_frames (vin STRING, ts TIMESTAMP, can_id INT, payload STRING); INSERT INTO doc_can_frames VALUES ('VIN001', TIMESTAMP '2024-06-01 08:00:00', 256, '6400A0'), ('VIN001', TIMESTAMP '2024-06-01 08:00:01', 256, '7800B4'), ('VIN002', TIMESTAMP '2024-06-01 08:00:00', 256, '3200C8');

假设 DBC 中 ID 为 256 的报文定义了两个信号:车速占第 0 字节(起始位 0、长度 8、factor 1、offset 0),电池温度占第 2 字节(起始位 16、长度 8、factor 0.5、offset −40):

SELECT vin, ts, can_decode_signal(CAST(unhex(payload) AS BINARY), 0, 8, 'intel', false, 1, 0) AS speed_kmh, can_decode_signal(CAST(unhex(payload) AS BINARY), 16, 8, 'intel', false, 0.5, -40) AS battery_temp FROM doc_can_frames WHERE can_id = 256 ORDER BY vin, ts;

vintsspeed_kmhbattery_temp
VIN0012024-06-01 08:00:00100.040.0
VIN0012024-06-01 08:00:01120.050.0
VIN0022024-06-01 08:00:0050.060.0

注意事项

  • 换算公式固定为线性公式
    原始值 × factor + offset
    原始值 × factor + offset
    。DBC 中的取值范围(min/max)、单位、枚举值描述不在函数中处理,需要时在 SQL 中另行判断。
  • 参数不合法时返回 NULL 而不是报错。

相关文档

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