-1

我正在开发一个程序来使用 J1939 从总线读取和请求参数。我知道为了请求 PGN,我需要一个地址,该地址在地址声明程序中声明。我对此有一些疑问。

首先,节点地址是经常变化还是静态的?

第二,我的程序作为外部测试设备应用程序,是否需要在每次总线打开时都进行地址声明程序,或者我可以将我从地址声明程序中获得的ID永久存储为我的应用程序?

至于地址声明程序,什么是适合我的申请的 NAME 字段?我想要做的是建立一个总线不同参数的监控系统,比如速度、燃料、踏板位置等。我的猜测是没有足够的 ECU 来填充所有 255 个可用地址,但我可以' t 确认有多少,所以我可能需要一个名字。它不是产品,因此不会批量生产,只能在我们的设施中使用。

4

1 回答 1

1

亚历克斯

首先,您要读取哪些变量?我的意思是,如果您尝试广播车辆速度、燃料、踏板……这些是通用消息,无需请求即可在公共汽车上使用。在 CAN 上应用数字滤波器(掩码)可能会有效地解决您的问题。请求方法更多用于特殊 ID(请参阅此处J1939-71更多信息)。

在 Python 中应用过滤器:

import can

# CAN Setting
can_interface = 'can0'
bus.set_filters([{"can_id":0xCF00400, "can_mask": 0xFFFFFFF, "extended": True},
                 {"can_id":0x18fee927, "can_mask": 0xFFFFFFF, "extended": True}])
bus = can.interface.Bus(can_interface, bustype='socketcan',can_filters=can_filters)

while True:
     message = bus.recv()
     print(message)

过滤器/遮罩的工作原理:

# The following just equals zero
0xCF00400 & 0 == 0 # True

# The following equals 0xCF00400 (217056256 in decimal) exactly
0xCF00400 & 0xFFFFFFF == 0xCF00400 # True
0xCF00400 & 0xFFFFFFF == 217056256 # True

# The following can_id would not get through the filter + mask:
0x18fee500 & 0xFFFFFFF == 0xCF00400 & 0xFFFFFFF # False

# The following obviously would get through the filter + mask:
0xCF00400 & 0xFFFFFFF == 0xCF00400 & 0xFFFFFFF # True

无论如何,老实说,我从未使用过请求方法,但也许我可以提供帮助。

首先,节点地址是经常变化还是静态的?

第二,我的程序作为外部测试设备应用程序,是否需要在每次总线打开时都进行地址声明程序,或者我可以将我从地址声明程序中获得的ID永久存储为我的应用程序?

节点作为桥接 ecu-ccu 工作,因此它们将始终相同。但是您需要始终再次请求数据,因为它们没有“在线”。

至于地址声明程序,什么是适合我的应用程序的名称字段?

我真的不明白这个问题XD。但我认为您的意思是您正在开发数据 J1939 读取器/记录器。

于 2022-02-07T12:24:29.460 回答