Files
Feeding_control_system/hardware/inverter.py
2026-04-07 09:51:38 +08:00

112 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# hardware/inverter.py
from math import e
import minimalmodbus
import time
from serial import SerialException
class InverterController:
def __init__(self,port='/dev/ttyUSB0'):
self.inverter=None
self.port=port
def _connect(self)->bool:
"""连接变频器"""
try:
self.inverter = minimalmodbus.Instrument(self.port, 1)
# 2. 配置串口参数
self.inverter.serial.baudrate = 9600 # 波特率
self.inverter.serial.bytesize = 8 # 数据位
self.inverter.serial.parity = 'N' # 无校验
self.inverter.serial.stopbits = 1 # 停止位
self.inverter.serial.timeout = 1.0 # 超时时间
self.inverter.mode = minimalmodbus.MODE_RTU # RTU模式
return True
except SerialException as e:
print(f"串口占用或无法连接变频器串口:{e}")
return False
except Exception as e:
print(f"连接变频器异常:{e}")
return False
def set_frequency(self, frequency):
"""设置变频器频率"""
_ret=False
try:
if(self._connect()):
frequency_value = int(frequency * 100)
self.inverter.write_register(0x7310, frequency_value)
_ret=True
else:
print(f'设置频率{frequency}失败')
except Exception as e:
print(f"设置频率{frequency}异常:{e}")
finally:
if self.inverter:
self.inverter.serial.close()
return _ret
def read_frequency(self):
"""读取变频器频率"""
_ret=None
try:
if(self._connect()):
frequency_value = self.inverter.read_register(0x7310)
_ret=frequency_value / 100
else:
print(f"读取频率失败")
except Exception as e:
print(f"读取频率异常:{e}")
finally:
if self.inverter:
self.inverter.serial.close()
return _ret
def read_status(self):
"""读取变频器启动状态"""
_ret=None
try:
if(self._connect()):
status_value = self.inverter.read_register(0x3000)
_ret=status_value
else:
print(f"读取启动状态失败")
except Exception as e:
print(f"读取启动状态异常:{e}")
finally:
if self.inverter:
self.inverter.serial.close()
return _ret
def control(self, action,frequency=230):
"""控制变频器启停"""
if action not in ['start', 'stop']:
print(f"无效操作: {action}")
return False
_ret=False
# 先检查动作是否有
try:
if(self._connect()):
if action == 'start':
status_value = self.inverter.read_register(0x3000)
##读取3000H可直接读取变频器的当前状态0001正转运行0002反转运行0003停机0004电机参数辨识0005故障
if status_value==3:
frequency_value = int(frequency * 100)
self.inverter.write_register(0x7310, frequency_value)
time.sleep(1)
self.inverter.write_register(0x2000, 1) # 1=正转运行
print("启动变频器")
elif action == 'stop':
self.inverter.write_register(0x2000, 6) # 6=减速停机,5自由停机
print("停止变频器")
_ret=True
else:
print("连接变频器失败")
except Exception as e:
print(f"变频器控制错误: {e}")
finally:
if self.inverter:
self.inverter.serial.close()
return _ret