-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcantest.py
executable file
·112 lines (78 loc) · 3 KB
/
cantest.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python3
import can
import sys
from time import sleep
requests = [can.Message(arbitration_id=0x0f89c101, dlc=1, data=[0x20]),
can.Message(arbitration_id=0x0f8a0101, dlc=1, data=[0x20]),
can.Message(arbitration_id=0x0f8a4101, dlc=1, data=[0x20]),
can.Message(arbitration_id=0x0f890101, dlc=1, data=[0x20])]
request_count = 0
with can.interface.Bus(channel='can0', interface="socketcan", bitrate=125000) as bus:
while True:
bus.send(requests[request_count])
request_count = (request_count + 1) % len(requests)
for msg in bus:
#print(f'Header: {msg.arbitration_id:0x} DLC: {msg.dlc} Data: {bytes(msg.data).hex()}')
# answer for get power reg 41: 0x7e0451 > 0.561523kW
if msg.arbitration_id == 0x0f0a4082:
#print("Power received")
multiplier = 4
data = bytearray(msg.data)
# to little endian
data[0], data[1] = data[1], data[0]
dataBin = data[0]<<8 | data[1]
if dataBin&0x8000>0:
dataBin=((~dataBin)&0x7fff)+1
data=-(dataBin/0x2000)*multiplier
else:
dataBin = dataBin & 0x7fff
data = (dataBin/0x2000)*multiplier
print(f'AC Power {data:2.2f}kW')
# answer for get currents reg 40: 0xa7 - 0x04 - 0x52 > 2.32617A
if msg.arbitration_id == 0x0f0a0082:
#print("Current received")
multiplier = 16
data = bytearray(msg.data)
# to little endian
data[0], data[1] = data[1], data[0]
dataBin = data[0]<<8 | data[1]
if dataBin&0x8000>0:
dataBin=((~dataBin)&0x7fff)+1
data=-(dataBin/0x2000)*multiplier
else:
dataBin = dataBin & 0x7fff
data = (dataBin/0x2000)*multiplier
print(f'AC Current {data:2.1f}A')
# answer for get voltage reg 39: 0xbf - 0x1d - 0x54 > 237.969V
if msg.arbitration_id == 0x0f09c082:
#print("Voltage received")
multiplier = 256
data = bytearray(msg.data)
# to little endian
data[0], data[1] = data[1], data[0]
dataBin = data[0]<<8 | data[1]
if dataBin&0x8000>0:
dataBin=((~dataBin)&0x7fff)+1
data=-(dataBin/0x2000)*multiplier
else:
dataBin = dataBin & 0x7fff
data = (dataBin/0x2000)*multiplier
print(f'AC Voltage {data:3.0f}V')
# answer for get freq reg 36:
if msg.arbitration_id == 0x0f090082:
#print("Frequency received")
multiplier = 64
data = bytearray(msg.data)
# to little endian
data[0], data[1] = data[1], data[0]
dataBin = data[0]<<8 | data[1]
if dataBin&0x8000>0:
dataBin=((~dataBin)&0x7fff)+1
data=-(dataBin/0x2000)*multiplier
else:
dataBin = dataBin & 0x7fff
data = (dataBin/0x2000)*multiplier
print(f'AC Frequency {data:2.2f}Hz')
sleep(1)
break
sys.exit(1)