关于SAE J1939总线地址的问题

Questions about addresses in SAE J1939 bus

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

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

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

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

亚历克斯

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

正在应用过滤器 n 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)

filters/masks 的工作原理:

# 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

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

First, do the node addresses change often or are they static?

Second, does my program, as an external test equipment application, need to do the address claim procedure every time the bus is turned on, or can I store the ID that I get from the address claim procedure for my application forever?

节点充当桥梁ecu-ccu,因此它们将始终相同。但是您需要始终再次请求数据,因为它们不是 'on line'.

As for the address claim procedure, what is a suitable NAME field for my aplication?

这个问题我真的没看懂XD。但我认为你的意思是你正在开发数据 J1939 reader/logger.