Examples

August 20, 2025 · View on GitHub

The following examples mirror and extend pydbc/examples/api_examples.py and demonstrate how to use the high‑level APIs.

Run examples interactively (Windows PowerShell):

poetry run python -i pydbc\examples\api_examples.py

Or import and call the functions:

from pydbc.examples.api_examples import dbc_example, ldf_example, ncf_example

dbc_example()
ldf_example()
ncf_example()

DBC example (CAN)

from pydbc.api.dbc import DBCCreator

dbc = DBCCreator(":memory:")
engine = dbc.create_node("Engine")
gateway = dbc.create_node("Gateway")
engine_data = dbc.create_message("EngineData", 100, 8, engine)

petrol_level = dbc.create_signal(
    "PetrolLevel", 8,
    byteorder=1, sign=1,
    formula_factor=1.0, formula_offset=0.0,
    minimum=0, maximum=255, unit="l",
)

vehicle_speed = dbc.create_signal(
    "VehicleSpeed", 16,
    byteorder=1, sign=1,
    formula_factor=0.1, formula_offset=0.0,
    minimum=0, maximum=300, unit="km/h",
)

dbc.add_signal_to_message(engine_data, petrol_level, 24)
dbc.add_signal_to_message(engine_data, vehicle_speed, 0)

# optional: receivers
# dbc.add_node_as_receiver(vehicle_speed, gateway)

dbc.commit()
dbc.close()

LDF example (LIN)

from pydbc.api.ldf import LDFCreator

ldf = LDFCreator(":memory:")
network = ldf.create_network("LINNetwork1", protocol_version="2.1", speed=19.2)
master = ldf.create_master_node("MasterECU", timebase=0.005, jitter=0.0001)
slave1 = ldf.create_slave_node("SlaveNode1", protocol_version="2.1", configured_NAD=1, initial_NAD=1)

motor_speed = ldf.create_signal("MotorSpeed", signal_size=16, init_value=0, publisher=master)
frame = ldf.create_unconditional_frame("MasterFrame", frame_id=0x10, size=2, publisher=master)
ldf.add_signal_to_frame(frame, motor_speed, 0)

ldf.commit()
ldf.close()

NCF example (Vehicle config)

from pydbc.api.ncf import NCFCreator

ncf = NCFCreator(":memory:")
vehicle = ncf.create_vehicle("TestVehicle")
can_network = ncf.create_network("CANNetwork", protocol="CAN", speed=500)
engine_ecu = ncf.create_ecu("EngineECU")
engine_node = ncf.create_node("EngineNode")

ncf.add_network_to_vehicle(vehicle, can_network)
ncf.add_ecu_to_vehicle(vehicle, engine_ecu)
ncf.add_node_to_network(can_network, engine_node)
ncf.add_node_to_ecu(engine_ecu, engine_node)

ncf.commit()
ncf.close()

python-can integration example

# Run the dedicated example script
# poetry run python pydbc\examples\python_can_examples.py

Code generation examples

See pydbc/examples/generate_code_examples.py to generate:

  • MicroPython CAN app (micropython_app.py)
  • Linux SocketCAN C program (socketcan_app.c)

Run:

poetry run python pydbc\examples\generate_code_examples.py

Exporters

from pydbc.db.imex import DbcExporter, LdfExporter

DbcExporter(":memory:").run()
LdfExporter(":memory:").run()

The exporters use templates in pydbc/cgen/templates and render a text file named testfile.txt.render.

Import a .dbc and query messages

from pydbc.api.imports import import_dbc
from pydbc.db.model import Message

# Parse the DBC file and get a SQLAlchemy session
session = import_dbc("C:\\path\\to\\file.dbc")

# Count all messages
print("Messages:", session.query(Message).count())

# List message names and IDs
for m in session.query(Message).order_by(Message.message_id).all():
    print(f"0x{m.message_id:X} {m.name}")

Open an existing .vndb and query messages/signals

from pydbc.api.imports import open_vndb
from pydbc.db.model import Message

vndb = open_vndb("C:\\path\\to\\database.vndb")
session = vndb.session

# Find one message and print its signals
msg = session.query(Message).filter_by(name="EngineData").first()
if msg:
    print("Message:", msg.name, hex(msg.message_id), "dlc=", msg.dlc)
    for ms in msg.signals:  # Message_Signal association
        s = ms.signal
        print(f"  {s.name}: start={ms.offset} size={s.bitsize} unit={s.unit}")