Compare commits
No commits in common. "21d24e1176e16410bb0f02e5ecbf82140c1d8890" and "1ddf8276ef7853b94ef86c6c13191450ecd0aa20" have entirely different histories.
21d24e1176
...
1ddf8276ef
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1 +0,0 @@
|
||||||
__pycache__/main.cpython-311.pyc
|
|
||||||
Binary file not shown.
20
classCAN.py
20
classCAN.py
|
|
@ -5,7 +5,7 @@ import os
|
||||||
|
|
||||||
|
|
||||||
class CANBackend:
|
class CANBackend:
|
||||||
def __init__(self, eds_file =None):
|
def __init__(self):
|
||||||
self.network = None
|
self.network = None
|
||||||
self.nodes = {} # {1: RemoteNode(0x02), 2: RemoteNode(0x03), ...}
|
self.nodes = {} # {1: RemoteNode(0x02), 2: RemoteNode(0x03), ...}
|
||||||
self.connected = False
|
self.connected = False
|
||||||
|
|
@ -17,10 +17,7 @@ class CANBackend:
|
||||||
2: {}, # PU2
|
2: {}, # PU2
|
||||||
3: {} # PU3
|
3: {} # PU3
|
||||||
}
|
}
|
||||||
if eds_file is None:
|
|
||||||
self.eds_path = os.path.join(os.path.dirname(__file__), "eds_file", "processBoard_0.eds")
|
self.eds_path = os.path.join(os.path.dirname(__file__), "eds_file", "processBoard_0.eds")
|
||||||
else:
|
|
||||||
self.eds_path = eds_file
|
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
try:
|
try:
|
||||||
|
|
@ -31,8 +28,7 @@ class CANBackend:
|
||||||
node_map = {
|
node_map = {
|
||||||
1: 0x02,
|
1: 0x02,
|
||||||
2: 0x04,
|
2: 0x04,
|
||||||
3: 0x127,
|
3: 0x127
|
||||||
4: 0xF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for pu_number, node_id in node_map.items():
|
for pu_number, node_id in node_map.items():
|
||||||
|
|
@ -167,18 +163,6 @@ class CANBackend:
|
||||||
print(f"[SDO WRITE ERROR] PU{pu_number}: {e}")
|
print(f"[SDO WRITE ERROR] PU{pu_number}: {e}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def send_command(self, opening :int):
|
|
||||||
try:
|
|
||||||
node = self.nodes.get(4)
|
|
||||||
if node is None:
|
|
||||||
raise ValueError(f"Feed valve is not connected")
|
|
||||||
|
|
||||||
node.sdo[0x6000].raw = opening
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[SDO WRITE ERROR] Valve Board: {e}")
|
|
||||||
raise
|
|
||||||
|
|
||||||
def send_thermal_loop_cleaning(self, mode: str, pu_number: int):
|
def send_thermal_loop_cleaning(self, mode: str, pu_number: int):
|
||||||
if not self.connected:
|
if not self.connected:
|
||||||
raise RuntimeError("CAN not connected")
|
raise RuntimeError("CAN not connected")
|
||||||
|
|
|
||||||
|
|
@ -1,385 +0,0 @@
|
||||||
; EDS file for inletvalveboard - generated by CANopen DeviceDesigner 3.14.2
|
|
||||||
[FileInfo]
|
|
||||||
FileName=inletvalveboard.eds
|
|
||||||
FileVersion=1.0
|
|
||||||
FileRevision=1.0
|
|
||||||
EDSVersion=4.0
|
|
||||||
Description=EDS
|
|
||||||
CreationTime=12:05PM
|
|
||||||
CreationDate=04-15-25
|
|
||||||
ModificationTime=12:05PM
|
|
||||||
ModificationDate=04-15-25
|
|
||||||
CreatedBy=Vineeta Gupta
|
|
||||||
ModifiedBy=Vineeta Gupta
|
|
||||||
|
|
||||||
[Comments]
|
|
||||||
Lines=1
|
|
||||||
Line1=generated by CANopen DeviceDesigner by emotas
|
|
||||||
|
|
||||||
[DeviceInfo]
|
|
||||||
VendorName=nehemis
|
|
||||||
VendorNumber=0x319
|
|
||||||
ProductName=InletValveController
|
|
||||||
ProductNumber=1234
|
|
||||||
RevisionNumber=0x1
|
|
||||||
OrderCode=InletValveController
|
|
||||||
BaudRate_10=0
|
|
||||||
BaudRate_20=0
|
|
||||||
BaudRate_50=0
|
|
||||||
BaudRate_125=0
|
|
||||||
BaudRate_250=1
|
|
||||||
BaudRate_500=0
|
|
||||||
BaudRate_800=0
|
|
||||||
BaudRate_1000=0
|
|
||||||
NrOfRxPDO=0
|
|
||||||
NrOfTxPDO=1
|
|
||||||
SimpleBootupSlave=1
|
|
||||||
SimpleBootupMaster=0
|
|
||||||
LSS_Supported=0
|
|
||||||
Granularity=0
|
|
||||||
DynamicChannelsSupported=0
|
|
||||||
GroupMessaging=0
|
|
||||||
|
|
||||||
[DummyUsage]
|
|
||||||
Dummy0001=0
|
|
||||||
Dummy0002=0
|
|
||||||
Dummy0003=0
|
|
||||||
Dummy0004=0
|
|
||||||
Dummy0005=0
|
|
||||||
Dummy0006=0
|
|
||||||
Dummy0007=0
|
|
||||||
|
|
||||||
[MandatoryObjects]
|
|
||||||
SupportedObjects=3
|
|
||||||
1=0x1000
|
|
||||||
2=0x1001
|
|
||||||
3=0x1018
|
|
||||||
|
|
||||||
[ManufacturerObjects]
|
|
||||||
SupportedObjects=2
|
|
||||||
1=0x2001
|
|
||||||
2=0x3000
|
|
||||||
|
|
||||||
[OptionalObjects]
|
|
||||||
SupportedObjects=13
|
|
||||||
1=0x1003
|
|
||||||
2=0x1008
|
|
||||||
3=0x1014
|
|
||||||
4=0x1015
|
|
||||||
5=0x1016
|
|
||||||
6=0x1017
|
|
||||||
7=0x1029
|
|
||||||
8=0x1200
|
|
||||||
9=0x1800
|
|
||||||
10=0x1a00
|
|
||||||
11=0x6000
|
|
||||||
12=0x6001
|
|
||||||
13=0x6002
|
|
||||||
|
|
||||||
[1000]
|
|
||||||
ParameterName=Device Type
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0
|
|
||||||
|
|
||||||
[1001]
|
|
||||||
ParameterName=Error Register
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1003]
|
|
||||||
ParameterName=Predefined Error Field
|
|
||||||
ObjectType=8
|
|
||||||
SubNumber=2
|
|
||||||
|
|
||||||
[1003sub0]
|
|
||||||
ParameterName=Number of Errors
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0
|
|
||||||
|
|
||||||
[1003sub1]
|
|
||||||
ParameterName=Standard Error Field
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0
|
|
||||||
|
|
||||||
[1008]
|
|
||||||
ParameterName=Manufacturer device name
|
|
||||||
ObjectType=7
|
|
||||||
DataType=9
|
|
||||||
AccessType=const
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=emotas Slave 1
|
|
||||||
|
|
||||||
[1014]
|
|
||||||
ParameterName=COB ID EMCY
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=$NODEID+0x80
|
|
||||||
|
|
||||||
[1015]
|
|
||||||
ParameterName=Inhibit Time Emergency
|
|
||||||
ObjectType=7
|
|
||||||
DataType=6
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0x0
|
|
||||||
|
|
||||||
[1016]
|
|
||||||
ParameterName=Consumer Heartbeat Time
|
|
||||||
ObjectType=8
|
|
||||||
SubNumber=1
|
|
||||||
|
|
||||||
[1016sub0]
|
|
||||||
ParameterName=Number of entries
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0
|
|
||||||
|
|
||||||
[1017]
|
|
||||||
ParameterName=Producer Heartbeat Time
|
|
||||||
ObjectType=7
|
|
||||||
DataType=6
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1018]
|
|
||||||
ParameterName=Identity Object
|
|
||||||
ObjectType=9
|
|
||||||
SubNumber=5
|
|
||||||
|
|
||||||
[1018sub0]
|
|
||||||
ParameterName=Number of entries
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=4
|
|
||||||
|
|
||||||
[1018sub1]
|
|
||||||
ParameterName=Vendor Id
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0x319
|
|
||||||
|
|
||||||
[1018sub2]
|
|
||||||
ParameterName=Product Code
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=1234
|
|
||||||
|
|
||||||
[1018sub3]
|
|
||||||
ParameterName=Revision number
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0x1
|
|
||||||
|
|
||||||
[1018sub4]
|
|
||||||
ParameterName=Serial number
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1029]
|
|
||||||
ParameterName=Error behaviour
|
|
||||||
ObjectType=8
|
|
||||||
SubNumber=3
|
|
||||||
|
|
||||||
[1029sub0]
|
|
||||||
ParameterName=Nr of Error Classes
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=2
|
|
||||||
|
|
||||||
[1029sub1]
|
|
||||||
ParameterName=Communication Error
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=1
|
|
||||||
|
|
||||||
[1029sub2]
|
|
||||||
ParameterName=Specific Error Class
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1200]
|
|
||||||
ParameterName=Server SDO Parameter
|
|
||||||
ObjectType=9
|
|
||||||
SubNumber=3
|
|
||||||
|
|
||||||
[1200sub0]
|
|
||||||
ParameterName=Number of entries
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=2
|
|
||||||
|
|
||||||
[1200sub1]
|
|
||||||
ParameterName=COB ID Client to Server
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=$NODEID+0x600
|
|
||||||
|
|
||||||
[1200sub2]
|
|
||||||
ParameterName=COB ID Server to Client
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=$NODEID+0x580
|
|
||||||
|
|
||||||
[1800]
|
|
||||||
ParameterName=TPDO communication parameter
|
|
||||||
ObjectType=9
|
|
||||||
SubNumber=6
|
|
||||||
|
|
||||||
[1800sub0]
|
|
||||||
ParameterName=Highest sub-index supported
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=const
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=6
|
|
||||||
|
|
||||||
[1800sub1]
|
|
||||||
ParameterName=COB-ID used by TPDO
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1800sub2]
|
|
||||||
ParameterName=Transmission type
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1800sub3]
|
|
||||||
ParameterName=Inhibit time
|
|
||||||
ObjectType=7
|
|
||||||
DataType=6
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1800sub5]
|
|
||||||
ParameterName=Event timer
|
|
||||||
ObjectType=7
|
|
||||||
DataType=6
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1800sub6]
|
|
||||||
ParameterName=SYNC start value
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[1a00]
|
|
||||||
ParameterName=Transmit PDO Mapping Parameter
|
|
||||||
ObjectType=9
|
|
||||||
SubNumber=2
|
|
||||||
;;This object contains the mapping for the PDO the device is able to transmit.
|
|
||||||
;;
|
|
||||||
|
|
||||||
[1a00sub0]
|
|
||||||
ParameterName=Highest sub-index supported
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=const
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=1
|
|
||||||
|
|
||||||
[1a00sub1]
|
|
||||||
ParameterName=Mapping Entry 1
|
|
||||||
ObjectType=7
|
|
||||||
DataType=7
|
|
||||||
AccessType=const
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=0x60010008
|
|
||||||
|
|
||||||
[2001]
|
|
||||||
ParameterName=Manufacturer Object
|
|
||||||
ObjectType=7
|
|
||||||
DataType=4
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=1
|
|
||||||
|
|
||||||
[3000]
|
|
||||||
ParameterName=Managed Array
|
|
||||||
ObjectType=8
|
|
||||||
SubNumber=3
|
|
||||||
|
|
||||||
[3000sub0]
|
|
||||||
ParameterName=NUmber of Entries
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=0
|
|
||||||
DefaultValue=2
|
|
||||||
|
|
||||||
[3000sub1]
|
|
||||||
ParameterName=Sub 1
|
|
||||||
ObjectType=7
|
|
||||||
DataType=3
|
|
||||||
AccessType=ro
|
|
||||||
PDOMapping=1
|
|
||||||
|
|
||||||
[3000sub2]
|
|
||||||
ParameterName=sub 2
|
|
||||||
ObjectType=7
|
|
||||||
DataType=3
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=1
|
|
||||||
|
|
||||||
[6000]
|
|
||||||
ParameterName=Position Set Point
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=0
|
|
||||||
|
|
||||||
[6001]
|
|
||||||
ParameterName=Position Feedback
|
|
||||||
ObjectType=7
|
|
||||||
DataType=5
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=1
|
|
||||||
|
|
||||||
[6002]
|
|
||||||
ParameterName=Motor Current
|
|
||||||
ObjectType=7
|
|
||||||
DataType=8
|
|
||||||
AccessType=rw
|
|
||||||
PDOMapping=1
|
|
||||||
|
|
||||||
14
main.py
14
main.py
|
|
@ -29,8 +29,6 @@ router = APIRouter()
|
||||||
templates = Jinja2Templates(directory="templates")
|
templates = Jinja2Templates(directory="templates")
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
can_backend = CANBackend()
|
can_backend = CANBackend()
|
||||||
valve_backend = CANBackend(eds_file="/home/hmi/Desktop/HMI/eds_file/inletvalveboard.eds")
|
|
||||||
|
|
||||||
# Serve static files (HTML, JS, CSS)
|
# Serve static files (HTML, JS, CSS)
|
||||||
app.mount("/static", StaticFiles(directory="static"), name="static")
|
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||||
|
|
||||||
|
|
@ -138,11 +136,6 @@ def connect_toggle():
|
||||||
return {"connected": False}
|
return {"connected": False}
|
||||||
else:
|
else:
|
||||||
success = can_backend.connect()
|
success = can_backend.connect()
|
||||||
try:
|
|
||||||
valve_backend.connect()
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Connection error : {e}")
|
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
raise HTTPException(status_code=500, detail="Connection failed.")
|
raise HTTPException(status_code=500, detail="Connection failed.")
|
||||||
return {"connected": True}
|
return {"connected": True}
|
||||||
|
|
@ -198,7 +191,7 @@ async def update_latest_data():
|
||||||
data = can_backend.get_latest_data(pu_number=pu)
|
data = can_backend.get_latest_data(pu_number=pu)
|
||||||
logging.info(f"[MONITOR BUFFER] PU{pu}: {data}")
|
logging.info(f"[MONITOR BUFFER] PU{pu}: {data}")
|
||||||
latest_data[f"PU_{pu}"] = format_data(data)
|
latest_data[f"PU_{pu}"] = format_data(data)
|
||||||
await asyncio.sleep(0.2) # Update every 100ms
|
await asyncio.sleep(0.1) # Update every 100ms
|
||||||
|
|
||||||
|
|
||||||
@app.get("/monitor")
|
@app.get("/monitor")
|
||||||
|
|
@ -222,12 +215,13 @@ def can_status():
|
||||||
|
|
||||||
|
|
||||||
@app.post("/command/feed_valve")
|
@app.post("/command/feed_valve")
|
||||||
def feedvalve_control(MV01_opening: int = Query(...)):
|
def can_status(MV01_opening: int = Query(...)):
|
||||||
"""Control MV01 feed valve"""
|
"""Control MV01 feed valve"""
|
||||||
valve_backend.send_command(MV01_opening) # TODO: TODO
|
# can_backend.send_command(MV01_opening) # TODO: TODO
|
||||||
logging.info(f"Feed valve opening to {MV01_opening}")
|
logging.info(f"Feed valve opening to {MV01_opening}")
|
||||||
return {"status": "ok"}
|
return {"status": "ok"}
|
||||||
|
|
||||||
|
|
||||||
app.include_router(router)
|
app.include_router(router)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -194,7 +194,7 @@
|
||||||
yaxis: { title: 'Pressure (bar)', range: [0, 15] }
|
yaxis: { title: 'Pressure (bar)', range: [0, 15] }
|
||||||
});
|
});
|
||||||
|
|
||||||
setInterval(updatePlots, 500);
|
setInterval(updatePlots, 250);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.onload = initPlots;
|
window.onload = initPlots;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user