CAN_DECODE_SIGNAL
功能概述
从 CAN 报文的数据区中提取信号,并按 DBC 中的线性换算公式转换为物理值:
物理值 = 原始值 × factor + offset物理值 = 原始值 × factor + offset
。例如把原始值换算为车速(km/h)、电池温度(℃)。
位提取规则与 CAN_EXTRACT_SIGNAL 完全相同,只多了换算一步。只需原始值时用
CAN_EXTRACT_SIGNALCAN_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。
⚠️ 注意 :位提取参数不合法(长度不在 1 ~ 64、超出数据范围、字节序取值错误)或任一参数为 NULL 时返回 NULL,不报错。
返回 DOUBLE 类型。
使用示例
原始值
0x2A0x2A
(42),factor 为 0.5、offset 为 -40,换算结果为
42 × 0.5 − 40 = −1942 × 0.5 − 40 = −19
:
SELECT can_decode_signal(CAST(unhex('2A00') AS BINARY), 0, 8, 'intel', false, 0.5, -40) AS value;
解析一张 CAN 报文表。前置数据(
payloadpayload
存十六进制字符串):
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;
vin ts speed_kmh battery_temp VIN001 2024-06-01 08:00:00 100.0 40.0 VIN001 2024-06-01 08:00:01 120.0 50.0 VIN002 2024-06-01 08:00:00 50.0 60.0
注意事项
换算公式固定为线性公式 原始值 × factor + offset原始值 × factor + offset
。DBC 中的取值范围(min/max)、单位、枚举值描述不在函数中处理,需要时在 SQL 中另行判断。
参数不合法时返回 NULL 而不是报错。
相关文档