案例以串口发送485指令实现
硬件需求:USB转485接口 、变频器(由三科变频提供测试产品)
这里写的是一些常用的功能,计划要完成一个全功能的参数设置程序,貌似工作量不小呢。
【特别声明】:代码测试所使用的485通讯是三科SKI90型号的机器,其他品牌型号变频器用本代码调试时务必请先查阅其使用手册,修改通讯地址,避免因误传参数导致机器损坏。
import modbus_tk.modbus_rtu as modbus_rtu
import pyttsx3
import serial
import time
# 创建modbus通讯连接
master = modbus_rtu.RtuMaster(
serial.Serial(port='COM3', # 连接端口
baudrate=9600, # 连接波特率
bytesize=8, # 数据位
parity='N', # 奇偶校验位
stopbits=1)) # 停止位
master.set_timeout(5.0) # 连接超市
master.set_verbose(True)
语音播报 = pyttsx3.init() # 语音播报器初始化
class 变频器:
def __init__(self,电机,频率):
self.电机 = 电机
self.频率 = 频率
def 参数查询(self): # 查询电流输入输出情况
try:
read = master.execute(slave=self.电机,function_code=3,starting_address=0x1001,quantity_of_x=8)
a = f'当前运行频率为{read[0] / 100}赫兹,母线电压{read[1]/10}伏,输出电压{read[2]}伏,输出频率{read[6]/100}赫兹,输出电流{read[7]/10}安'
print(a)
语音播报.say(a)
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 状态查询(self):
try:
read = master.execute(slave=self.电机, function_code=3, starting_address=0x3000, quantity_of_x=1)
if read[0] == 3:
语音播报.say("变频器未启动")
语音播报.runAndWait()
elif read[0] == 2:
语音播报.say("变频器反转运行中");
语音播报.runAndWait()
else:
语音播报.say('变频器正传运行中')
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 频率设置(self):
# 变频器设置的上限频率对应100%,参数识别值为10000,通用机型出厂默认设置的上限频率为50HZ
# 所以50对应10000及频率要以0.005为系数换算需要传入的参数值
# 要注意,如果变频器设置的上限频率 不等于50 频率转换参数的系数 需按实际设置的上限频率/10000计算
# 485地址只接受正整数参数传入,别忘了int哈,这里卡了很久,注意避坑 :)
try:
master.execute(slave=self.电机, function_code=6, starting_address=0x1000,
quantity_of_x=8, output_value=int(self.频率/0.005))
语音播报.say(f"运行频率已设置为{self.频率}")
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 正转启动(self):
try:
master.execute(slave=self.电机,function_code=6,starting_address=0x2000,quantity_of_x=8,output_value=1)
语音播报.say("变频器已正转启动")
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 反转启动(self):
try:
master.execute(slave=self.电机,function_code=6,starting_address=0x2000,quantity_of_x=8,output_value=2)
语音播报.say("变频器已反转启动")
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 正转点动(self):
try:
master.execute(slave=self.电机,function_code=6,starting_address=0x2000,quantity_of_x=8,output_value=3)
语音播报.say("变频器已正转点动")
语音播报.runAndWait()
# 模拟点动 点动频率2HZ 5秒后自由停机
time.sleep(5)
变频器(self.电机, self.频率).自由停车()
except Exception as exc:
print(str(exc))
def 反转点动(self):
try:
master.execute(slave=self.电机,function_code=6,starting_address=0x2000,quantity_of_x=8,output_value=4)
语音播报.say("变频器已反转点动")
语音播报.runAndWait()
# 模拟点动 点动频率2HZ 5秒后自由停机
time.sleep(5)
变频器(self.电机,self.参数值).自由停车()
except Exception as exc:
print(str(exc))
def 自由停车(self):
try:
master.execute(slave=self.电机,function_code=6,starting_address=0x2000,quantity_of_x=8,output_value=5)
语音播报.say("变频器已自由停车")
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 减速停车(self):
try:
master.execute(slave=self.电机, function_code=6, starting_address=0x2000, quantity_of_x=8, output_value=6)
语音播报.say("变频器已减速停车")
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 故障复位(self):
try:
master.execute(slave=self.电机, function_code=6, starting_address=0x2000, quantity_of_x=8, output_value=7)
语音播报.say("变频器故障已复位")
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
def 故障查询(self):
try:
read = master.execute(slave=self.机号,function_code=3,starting_address=0x8000,quantity_of_x=1)
print(read)
if read[0]==0:
语音播报.say("变频器无故障")
语音播报.runAndWait()
elif read[0]==1:
语音播报.say("未知故障,请咨询生产厂家")
语音播报.runAndWait()
elif read[0]==2:
语音播报.say('加速过电流保护,请延长启动时间或减轻电机负载')
语音播报.runAndWait()
elif read[0]==3:
语音播报.say('减速过电流保护,请延长减速时间或加装制动电阻')
语音播报.runAndWait()
elif read[0]==4:
语音播报.say('恒速过电流保护,电网异动或电机卡转')
语音播报.runAndWait()
elif read[0]==5:
语音播报.say('加速过电压保护,请查看进线电源是否接错')
语音播报.runAndWait()
elif read[0]==8:
语音播报.say('制动电阻过载,请更换更大阻值制动电阻')
语音播报.runAndWait()
elif read[0]==9:
语音播报.say('欠压保护,输入电压过低,请查看电网电压')
语音播报.runAndWait()
elif read[0] ==0xA:
语音播报.say('变频器过载保护,请减轻负载再试或更换更大功率变频器')
语音播报.runAndWait()
elif read[0] ==0xB:
语音播报.say('电机过载保护,请检查设置电机组参数')
语音播报.runAndWait()
elif read[0] ==0xC:
语音播报.say('输入缺相保护,请查看电源接线')
语音播报.runAndWait()
elif read[0] ==0xD:
语音播报.say('输出缺相保护,请检查电机接线')
语音播报.runAndWait()
elif read[0] ==0xE:
语音播报.say('变频器模块过热保护,请检查散热风扇')
语音播报.runAndWait()
else:
语音播报.say('程序员偷懒了,不常见故障请查阅《使用手册》')
语音播报.runAndWait()
except Exception as exc:
print(str(exc))
语音播报.say('未知故障,请复位再试')
语音播报.runAndWait()
def 点动频率(self):
try:
master.execute(slave=self.电机, function_code=6, starting_address=0xF800,
quantity_of_x=8, output_value=int(self.频率/0.005))
except Exception as exc:
print(str(exc))
主电机=变频器(1,25)
主电机.频率设置()
标签:变频器,播报,python,self,用法,read,say,runAndWait,语音
From: https://blog.csdn.net/qq_41049737/article/details/141335389