-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcanopen-node-sdo.py
executable file
·91 lines (84 loc) · 3.54 KB
/
canopen-node-sdo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python3
import can
import signal
import socketcanopen
CAN_INTERFACE = "vcan0"
can_bus = can.Bus(CAN_INTERFACE, interface="socketcan")
node_id = 0x02
canopen_od = socketcanopen.ObjectDictionary({
socketcanopen.ODI_DEVICE_TYPE: socketcanopen.Object(
parameter_name="Device type",
object_type=socketcanopen.ObjectType.VAR,
access_type=socketcanopen.AccessType.RO,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED32,
default_value=0x00000000
),
socketcanopen.ODI_ERROR: socketcanopen.Object(
parameter_name="Error register",
object_type=socketcanopen.ObjectType.VAR,
access_type=socketcanopen.AccessType.RO,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED8,
default_value=0x00
),
socketcanopen.ODI_HEARTBEAT_PRODUCER_TIME: socketcanopen.Object(
parameter_name="Producer heartbeat time",
object_type=socketcanopen.ObjectType.VAR,
access_type=socketcanopen.AccessType.RW,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED16,
default_value=1000 # 16-bit, in ms
),
socketcanopen.ODI_IDENTITY: socketcanopen.Object(
parameter_name="Identity object",
object_type=socketcanopen.ObjectType.RECORD,
data_type=socketcanopen.ODI_DATA_TYPE_IDENTITY,
sub_number=1,
subs={
socketcanopen.ODSI_VALUE: socketcanopen.SubObject(
parameter_name="number of supported entries",
access_type=socketcanopen.AccessType.CONST,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED8,
low_limit=0x01,
high_limit=0x04,
default_value=0x01
),
socketcanopen.ODSI_IDENTITY_VENDOR: socketcanopen.SubObject(
parameter_name="Vendor-ID",
access_type=socketcanopen.AccessType.RO,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED32,
low_limit=0x00000000,
high_limit=0xFFFFFFFF,
default_value=0x00000000
)
}
),
socketcanopen.ODI_SDO_SERVER: socketcanopen.Object(
parameter_name="SDO server parameter",
object_type=socketcanopen.ObjectType.RECORD,
data_type=socketcanopen.ODI_DATA_TYPE_SDO_PARAMETER,
sub_number=2,
subs={
socketcanopen.ODSI_VALUE: socketcanopen.SubObject(
parameter_name="number of supported entires",
access_type=socketcanopen.AccessType.CONST,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED8,
low_limit=0x02,
high_limit=0x02,
default_value=0x02
),
socketcanopen.ODSI_SDO_SERVER_DEFAULT_CSID: socketcanopen.SubObject(
parameter_name="COB-ID client -> server (rx)",
access_type=socketcanopen.AccessType.RO,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED32,
default_value=(socketcanopen.FUNCTION_CODE_SDO_RX << socketcanopen.FUNCTION_CODE_BITNUM) + node_id
),
socketcanopen.ODSI_SDO_SERVER_DEFAULT_SCID: socketcanopen.SubObject(
parameter_name="COB-ID client -> server (rx)",
access_type=socketcanopen.AccessType.RO,
data_type=socketcanopen.ODI_DATA_TYPE_UNSIGNED32,
default_value=(socketcanopen.FUNCTION_CODE_SDO_TX << socketcanopen.FUNCTION_CODE_BITNUM) + node_id
)
}
)
})
node = socketcanopen.Node(can_bus, node_id, canopen_od)
signal.pause() # Run forever