1010 lines
46 KiB
Python
1010 lines
46 KiB
Python
|
|
import os, time, csv, struct, sys
|
|||
|
|
import numpy as np
|
|||
|
|
sys.path.append(r'.\UserScripts')
|
|||
|
|
from user_common import wordData2HexStr, nowStr, nowStr1, checkValue, params_to_int
|
|||
|
|
from CRC import crc16 as checkValue
|
|||
|
|
|
|||
|
|
SENDHEADER = ''
|
|||
|
|
RSPHEADER = ''
|
|||
|
|
RETRYTIMES = 3
|
|||
|
|
CYCLES = 1
|
|||
|
|
TIMEOUT = 0.05
|
|||
|
|
DEBUG = False
|
|||
|
|
|
|||
|
|
# 启动函数,命令开始会调用此函数
|
|||
|
|
def start():
|
|||
|
|
global recvData, deviceData
|
|||
|
|
try:
|
|||
|
|
log_i(f"[{devInfo['name']}] {cmdInfo['name']}".center(80, '-'))
|
|||
|
|
|
|||
|
|
deviceData = _G.get(f"{devInfo['name']}")
|
|||
|
|
if not deviceData:
|
|||
|
|
deviceData = {}
|
|||
|
|
if 'data' not in deviceData:
|
|||
|
|
deviceData['data'] = {}
|
|||
|
|
if 'info' not in deviceData:
|
|||
|
|
deviceData['info'] = {}
|
|||
|
|
if 'status' not in deviceData:
|
|||
|
|
deviceData['status'] = {}
|
|||
|
|
if 'config' not in deviceData:
|
|||
|
|
raise Exception(f"Please load config first.")
|
|||
|
|
|
|||
|
|
deviceData['status']['StopAll'] = False
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in start. {str(e)}")
|
|||
|
|
finish()
|
|||
|
|
|
|||
|
|
# 此函数会被重复调用,间隔10毫秒,直到finish()
|
|||
|
|
def loop():
|
|||
|
|
global recvData, deviceData
|
|||
|
|
try:
|
|||
|
|
LRSOV_Open()
|
|||
|
|
LRSOV_Close()
|
|||
|
|
LRSOV_Open()
|
|||
|
|
LRSOV_Close()
|
|||
|
|
finish()
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in loop. {str(e)}")
|
|||
|
|
finish()
|
|||
|
|
|
|||
|
|
# 接收数据处理函数,当收到数据会调用此函数
|
|||
|
|
def recvDataHandler(data):
|
|||
|
|
global recvData
|
|||
|
|
try:
|
|||
|
|
recvData = recvData + data
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in recvDataHandler. {str(e)}")
|
|||
|
|
finish()
|
|||
|
|
|
|||
|
|
def log_du(str):
|
|||
|
|
if DEBUG:
|
|||
|
|
log_d(str)
|
|||
|
|
|
|||
|
|
def exeCmd(cmd):
|
|||
|
|
try:
|
|||
|
|
global recvData
|
|||
|
|
data = bytearray().fromhex(cmd[0])
|
|||
|
|
data += bytearray(checkValue(data).to_bytes(2, 'little'))
|
|||
|
|
for i in range(RETRYTIMES):
|
|||
|
|
log_du(f"[{nowStr()}] Sent:{wordData2HexStr(data)}")
|
|||
|
|
recvData = bytearray()
|
|||
|
|
send(data)
|
|||
|
|
time.sleep(TIMEOUT)
|
|||
|
|
rspLen = int(cmd[1])
|
|||
|
|
if len(recvData) >= rspLen:
|
|||
|
|
log_du(f"[{nowStr()}] Echo:{wordData2HexStr(recvData[0:rspLen])}")
|
|||
|
|
crc = int.from_bytes(recvData[rspLen-2:rspLen], byteorder='little')
|
|||
|
|
calc_value = checkValue(recvData[0:rspLen-2])
|
|||
|
|
# log(f"{crc:04X}, {calc_value:04X}")
|
|||
|
|
if crc == calc_value:
|
|||
|
|
return [True, recvData[0:rspLen]]
|
|||
|
|
return [False, None]
|
|||
|
|
except Exception as e:
|
|||
|
|
raise Exception(f"Error in exeCmd({cmd}): {str(e)}")
|
|||
|
|
|
|||
|
|
def LRSOV_Enable():
|
|||
|
|
try:
|
|||
|
|
log(f"LRSOV_Enable starts.")
|
|||
|
|
ret = exeCmd(['0306 0080 0001', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"LRSOV_Enable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"LRSOV_Enable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in LRSOV_Enable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def LRSOV_Disable():
|
|||
|
|
try:
|
|||
|
|
log(f"LRSOV_Disable starts.")
|
|||
|
|
ret = exeCmd(['0306 0080 0000', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"LRSOV_Disable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"LRSOV_Disable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in LRSOV_Disable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def LRSOV_Open():
|
|||
|
|
try:
|
|||
|
|
log(f"LRSOV_Open starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0306 0080 0001', 8], #0,使能电机
|
|||
|
|
['0303 00A4 0004', 13], #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0306 0084 0001', 8], #2,预设打开操作
|
|||
|
|
['0303 00A4 0004', 13], #3,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0303 008C 0001', 7] #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
Info = ''
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos <= deviceData['config']['LRSOV']['zeroPosition']:
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设打开操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 3
|
|||
|
|
case 3: #3,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos <= deviceData['config']['LRSOV']['zeroPosition']:
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
case 4: #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curSpeed, = struct.unpack('>h', ret[1][3:5])
|
|||
|
|
if curSpeed == 0:
|
|||
|
|
Info = f"Speed is equal to 0."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 3
|
|||
|
|
case _: #5,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0306 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"LRSOV_Open stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in LRSOV_Open(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def LRSOV_Close():
|
|||
|
|
global deviceData
|
|||
|
|
try:
|
|||
|
|
log(f"LRSOV_Close starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0306 0080 0001', 8], #0,使能电机
|
|||
|
|
['0303 00A4 0004', 13], #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0306 0084 0000', 8], #2,预设关闭操作
|
|||
|
|
['0303 00A4 0004', 13], #3,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0303 008C 0001', 7] #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
Info = ''
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos >= deviceData['config']['LRSOV']['maxPosition']:
|
|||
|
|
Info = f"It reached the max position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设关闭操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus =3
|
|||
|
|
case 3: #3,查询位置信息,当位置在0点附近,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos >= deviceData['config']['LRSOV']['maxPosition']:
|
|||
|
|
Info = f"It reached the max position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 4
|
|||
|
|
case 4: #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curSpeed, = struct.unpack('>h', ret[1][3:5])
|
|||
|
|
if curSpeed == 0:
|
|||
|
|
Info = f"Speed is equal to 0."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 3
|
|||
|
|
case _: #5,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0306 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"LRSOV_Close stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in LRSOV_Close(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPSOV_Enable():
|
|||
|
|
try:
|
|||
|
|
log(f"PPSOV_Enable starts.")
|
|||
|
|
ret = exeCmd(['0206 0080 0001', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"PPSOV_Enable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"PPSOV_Enable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPSOV_Enable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPSOV_Disable():
|
|||
|
|
try:
|
|||
|
|
log(f"PPSOV_Disable starts.")
|
|||
|
|
ret = exeCmd(['0206 0080 0000', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"PPSOV_Disable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"PPSOV_Disable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPSOV_Disable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPSOV_Open():
|
|||
|
|
try:
|
|||
|
|
log(f"PPSOV_Open starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0206 0080 0001', 8], #0,使能电机
|
|||
|
|
['0203 00A4 0004', 13], #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0206 0084 0001', 8], #2,预设打开操作
|
|||
|
|
['0203 00A4 0004', 13], #3,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0203 008C 0001', 7] #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
Info = ''
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos <= deviceData['config']['PPSOV']['zeroPosition']:
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设打开操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 3
|
|||
|
|
case 3: #3,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos <= deviceData['config']['PPSOV']['zeroPosition']:
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 4
|
|||
|
|
case 4: #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curSpeed, = struct.unpack('>h', ret[1][3:5])
|
|||
|
|
if curSpeed == 0:
|
|||
|
|
Info = f"Speed is equal to 0."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 3
|
|||
|
|
case _: #5,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0306 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"PPSOV_Open stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPSOV_Open(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPSOV_Close():
|
|||
|
|
try:
|
|||
|
|
log(f"PPSOV_Close starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0206 0080 0001', 8], #0,使能电机
|
|||
|
|
['0203 00A4 0004', 13], #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0206 0084 0000', 8], #2,预设关闭操作
|
|||
|
|
['0203 00A4 0004', 13], #3,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0203 008C 0001', 7] #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
Info = ''
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos >= deviceData['config']['PPSOV']['maxPosition']:
|
|||
|
|
Info = f"It reached the max position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设关闭操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus =3
|
|||
|
|
case 3: #3,查询位置信息,当位置在0点附近,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos >= deviceData['config']['PPSOV']['maxPosition']:
|
|||
|
|
Info = f"It reached the max position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 4
|
|||
|
|
case 4: #4,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curSpeed, = struct.unpack('>h', ret[1][3:5])
|
|||
|
|
if curSpeed == 0:
|
|||
|
|
Info = f"Speed is equal to 0."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 3
|
|||
|
|
case _: #5,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0306 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"PPSOV_Close stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPSOV_Close(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPECC_Enable():
|
|||
|
|
try:
|
|||
|
|
log(f"PPECC_Enable starts.")
|
|||
|
|
ret = exeCmd(['0106 0080 0001', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"PPECC_Enable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"PPECC_Enable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPECC_Enable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPECC_Disable():
|
|||
|
|
try:
|
|||
|
|
log(f"PPECC_Disable starts.")
|
|||
|
|
ret = exeCmd(['0106 0080 0000', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"PPECC_Disable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"PPECC_Disable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPECC_Disable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPECC_ReturnToZero():
|
|||
|
|
try:
|
|||
|
|
log(f"PPECC_ReturnToZero starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0106 0080 0001', 8], #0,使能电机
|
|||
|
|
['0103 00A4 0004', 13], #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0106 0084 0000', 8], #2,预设回零操作
|
|||
|
|
['0106 0081 0000', 8], #3,发送2条写寄存器0x81指令,产生上升沿,启动预设操作
|
|||
|
|
['0106 0081 0001', 8], #4
|
|||
|
|
['0103 00A4 0004', 13], #5,查询位置信息,当位置在0点附近,禁用电机
|
|||
|
|
['0103 008C 0001', 7] #6,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
Info = ''
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if abs(curPos - deviceData['config']['PPECC']['zeroPosition'])<10 or curPos < deviceData['config']['PPECC']['zeroPosition']:
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设回零操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus =3
|
|||
|
|
case 3: #3,发送2条写寄存器0x81指令,产生上升沿,启动预设操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus =4
|
|||
|
|
case 4: #4
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus =5
|
|||
|
|
case 5: #5,查询位置信息,当位置在0点附近,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if abs(curPos - deviceData['config']['PPECC']['zeroPosition'])<10 or curPos < deviceData['config']['PPECC']['zeroPosition']:
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 6
|
|||
|
|
case 6: #6,查询电机速度,当速度为0时,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curSpeed, = struct.unpack('>h', ret[1][3:5])
|
|||
|
|
if curSpeed == 0:
|
|||
|
|
Info = f"Speed is equal to 0."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 5
|
|||
|
|
case _: #-1,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0106 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"PPECC_ReturnToZero stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPECC_ReturnToZero(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PPECC_Push(targetPressure):
|
|||
|
|
try:
|
|||
|
|
log(f"PPECC_Push starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0106 0080 0001', 8], #0,使能电机
|
|||
|
|
['0103 00A4 0004', 13], #1,查询位置信息,当位置在最大位置附近,退出指令执行
|
|||
|
|
['0106 0084 0001', 8], #2,预设加压操作
|
|||
|
|
['0106 0081 0000', 8], #3,发送2条写寄存器0x81指令,产生上升沿,启动预设操作
|
|||
|
|
['0106 0081 0001', 8], #4
|
|||
|
|
['0103 00A4 0004', 13], #5,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0103 0093 0001', 7], #6,查询当前转矩信息,当转矩超过阈值,退出指令执行
|
|||
|
|
['0106 001A ', 8] #7,设置回零速度
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
curTorque = None
|
|||
|
|
Info = ''
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if targetPressure:
|
|||
|
|
targetPressure = int(targetPressure)
|
|||
|
|
if 'pressure' not in deviceData['data'] or deviceData['data']['pressure']['unit'] != 'psi':
|
|||
|
|
raise Exception(f"Can't get 'pressure' information or pressure unit isn't 'psi'.")
|
|||
|
|
if int(deviceData['data']['pressure']['value']) > targetPressure:
|
|||
|
|
Info = f"Current pressure is {deviceData['data']['pressure']['value']}psi."
|
|||
|
|
optStatus = -1
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在最大位置附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if abs(curPos - deviceData['config']['PPECC']['maxPosition'])<10 or curPos > deviceData['config']['PPECC']['maxPosition']:
|
|||
|
|
Info = f"It reached the max position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设加压操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 3
|
|||
|
|
case 3: #3,发送2条写寄存器0x81指令,产生上升沿,启动预设操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 4
|
|||
|
|
case 4: #4
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 5
|
|||
|
|
case 5: #5,查询位置信息,当位置在最大位置附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if abs(curPos - deviceData['config']['PPECC']['maxPosition'])<10 or curPos > deviceData['config']['PPECC']['maxPosition']:
|
|||
|
|
Info = f"It reached the max position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 6
|
|||
|
|
case 6: #6,查询当前转矩信息,当转矩超过阈值,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curTorque, = struct.unpack('>H', ret[1][3:5])
|
|||
|
|
if curTorque >= deviceData['config']['PPECC']['maxTorque']:
|
|||
|
|
Info = f"It reached the max torque."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 7
|
|||
|
|
case 7: #7, 判断是否到达压力
|
|||
|
|
if (deviceData['data']['pressure']['value'] > 0.85*targetPressure):
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
curSpeed = abs(int((deviceData['data']['pressure']['value']-targetPressure))//10)
|
|||
|
|
if curSpeed > 350 or deviceData['data']['pressure']['value']<0:
|
|||
|
|
curSpeed = 350
|
|||
|
|
elif curSpeed < 100:
|
|||
|
|
curSpeed = 100
|
|||
|
|
# if targetPressure>1000:
|
|||
|
|
# if (deviceData['data']['pressure']['value'] > 0.85*targetPressure):
|
|||
|
|
# optStatus = -1
|
|||
|
|
# continue
|
|||
|
|
# else:
|
|||
|
|
# curSpeed = abs(int((deviceData['data']['pressure']['value']-targetPressure))//10)
|
|||
|
|
# if curSpeed > 300:
|
|||
|
|
# curSpeed = 300
|
|||
|
|
# elif targetPressure > 200:
|
|||
|
|
# if (deviceData['data']['pressure']['value'] > 0.85*targetPressure):
|
|||
|
|
# optStatus = -1
|
|||
|
|
# continue
|
|||
|
|
# else:
|
|||
|
|
# curSpeed = 200
|
|||
|
|
# elif targetPressure>100:
|
|||
|
|
# if (deviceData['data']['pressure']['value'] > 0.9*targetPressure):
|
|||
|
|
# optStatus = -1
|
|||
|
|
# continue
|
|||
|
|
# else:
|
|||
|
|
# curSpeed = 200
|
|||
|
|
# else:
|
|||
|
|
# if (deviceData['data']['pressure']['value'] > targetPressure-3):
|
|||
|
|
# optStatus = -1
|
|||
|
|
# continue
|
|||
|
|
# else:
|
|||
|
|
# curSpeed = 200
|
|||
|
|
exeCmd([f"0106 001A {curSpeed:04X}", 8])
|
|||
|
|
optStatus = 5
|
|||
|
|
case _: #-1,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0106 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, curTorque={curTorque}, Info={Info}")
|
|||
|
|
log(f"PPECC_Push stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PPECC_Push(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, curTorque={curTorque}, Info={Info}. {str(e)}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def BTV_Enable():
|
|||
|
|
try:
|
|||
|
|
log(f"BTV_Enable starts.")
|
|||
|
|
ret = exeCmd(['0406 0080 0001', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"BTV_Enable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"BTV_Enable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in BTV_Enable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def BTV_Disable():
|
|||
|
|
try:
|
|||
|
|
log(f"BTV_Disable starts.")
|
|||
|
|
ret = exeCmd(['0406 0080 0000', 8])
|
|||
|
|
if ret[0]:
|
|||
|
|
log(f"BTV_Disable succeeded.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
log_e(f"BTV_Disable failed.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in BTV_Disable(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def BTV_IsAtZero():
|
|||
|
|
try:
|
|||
|
|
log(f"BTV_IsAtZero starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0403 00A4 0004', 13, 5] #查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
retryTimes = cmdList[optStatus][2]
|
|||
|
|
while(retryTimes):
|
|||
|
|
retryTimes -= 1
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if (curPos - deviceData['config']['BTV']['zeroPosition'])<= 10:
|
|||
|
|
log(f"BTV_IsAtZero stopped. It reached zero position.")
|
|||
|
|
return True
|
|||
|
|
log_w(f"No response.")
|
|||
|
|
log(f"BTV_IsAtZero stopped.")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in BTV_IsAtZero(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def BTV_ReturnToZero():
|
|||
|
|
try:
|
|||
|
|
log(f"BTV_ReturnToZero starts.")
|
|||
|
|
cmdList = [
|
|||
|
|
['0406 0080 0001', 8], #0,使能电机
|
|||
|
|
['0403 00A4 0004', 13], #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
['0406 0084 0001', 8], #2,预设回零操作
|
|||
|
|
['0403 00A4 0004', 13], #3,查询位置信息,当位置在0点附近,禁用电机
|
|||
|
|
['0406 0080 0000', 8] #4,禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
curSpeed = None
|
|||
|
|
Info = ''
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0: #0,使能电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1: #1,查询位置信息,当位置在0点附近,退出指令执行
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if curPos <= int(deviceData['config']['BTV']['zeroPosition']):
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2: #2,预设回零操作
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus =3
|
|||
|
|
case 3: #3,查询位置信息,当位置在0点附近,禁用电机
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if (curPos <= int(deviceData['config']['BTV']['zeroPosition'])):
|
|||
|
|
Info = f"It reached the zero position."
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
case _: #4,禁用电机,退出函数
|
|||
|
|
ret = exeCmd(['0406 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"BTV_ReturnToZero stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in BTV_ReturnToZero(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def BTV_ControlPressure_bk(targetPressure, keepTime, conrtrolMode):
|
|||
|
|
try:
|
|||
|
|
#controlMode取0,当到达限位,禁用电机;controlMode取1,当到达限位,执行回零、加压操作;
|
|||
|
|
global deviceData
|
|||
|
|
log(f"BTV_ControlPressure starts.")
|
|||
|
|
zeroPosition = int(deviceData['config']['BTV']['zeroPosition'])
|
|||
|
|
maxPosition = int(deviceData['config']['BTV']['maxPosition'])
|
|||
|
|
maxSpeed = int(deviceData['config']['BTV']['maxSpeed'])
|
|||
|
|
minSpeed = int(deviceData['config']['BTV']['minSpeed'])
|
|||
|
|
curSpeed = maxSpeed//2
|
|||
|
|
curPressure = int(deviceData['data']['pressure']['value'])
|
|||
|
|
curDirection = 1 # 1:正向,-1:反向
|
|||
|
|
limitedError = int(deviceData['config']['BTV']['limitedError'])
|
|||
|
|
cmdList = [
|
|||
|
|
['0406 0080 0001', 8], #0 使能电机
|
|||
|
|
[f"0410 0061 0002 04 {maxPosition:08X}", 8], #1 设定电机目标位置
|
|||
|
|
['0406 0084 0000', 8], #2 预设加压操作
|
|||
|
|
['0406 0081 0000', 8], #3 发送2条写寄存器0x81指令,产生上升沿,启动预设操作
|
|||
|
|
['0406 0081 0001', 8], #4
|
|||
|
|
['0406 0063', 8], #5 根据当前压力和目标压力的差值,调整电机速度
|
|||
|
|
['0403 00A4 0004', 13], #6 查询位置信息,当位置到达边界位置,退出指令执行
|
|||
|
|
['0406 0063 0000', 8], #7 设定电机目标速度为0, 停止电机
|
|||
|
|
['0406 0080 0000', 8] #8 禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
startTime = time.time()
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
exeFlag =False
|
|||
|
|
if not exeFlag:
|
|||
|
|
log(f"BTV_ControlPressure stopped.")
|
|||
|
|
return False
|
|||
|
|
match optStatus:
|
|||
|
|
case 0:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 3
|
|||
|
|
case 3:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 4
|
|||
|
|
case 4:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 5
|
|||
|
|
case 5:
|
|||
|
|
exeCmd(cmdList[0])
|
|||
|
|
exeCmd(cmdList[3])
|
|||
|
|
exeCmd(cmdList[4])
|
|||
|
|
curPressure = int(deviceData['data']['pressure']['value'])
|
|||
|
|
if abs(curPressure-targetPressure) > limitedError:
|
|||
|
|
startTime = time.time()
|
|||
|
|
if time.time()-startTime > keepTime:
|
|||
|
|
log(f"BTV_ControlPressure stopped.")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
if targetPressure >= curPressure:
|
|||
|
|
curDirection = 1
|
|||
|
|
else:
|
|||
|
|
curDirection = -1
|
|||
|
|
if abs(curPressure-targetPressure)>1000:
|
|||
|
|
curSpeed = maxSpeed
|
|||
|
|
else:
|
|||
|
|
curSpeed = int(abs(curPressure-targetPressure)/1000*maxSpeed)
|
|||
|
|
if abs(curSpeed) < abs(minSpeed):
|
|||
|
|
curSpeed = minSpeed
|
|||
|
|
curSpeed = curDirection*curSpeed
|
|||
|
|
cmdList[optStatus][0] = (cmdList[optStatus][0][:9] + wordData2HexStr(struct.pack('>h', curSpeed)))
|
|||
|
|
ret = exeCmd( cmdList[optStatus])
|
|||
|
|
optStatus = 6
|
|||
|
|
case 6:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if (curPos >= maxPosition+1000 and curSpeed >0) or (curPos <= zeroPosition-1000 and curSpeed <0):
|
|||
|
|
log_w(f"Exceed position limit: curPos={curPos}")
|
|||
|
|
if conrtrolMode == 1:
|
|||
|
|
#执行回零加压操作
|
|||
|
|
BTV_ReturnToZero()
|
|||
|
|
if targetPressure-2000>0:
|
|||
|
|
PPECC_Push(targetPressure-2000)
|
|||
|
|
else:
|
|||
|
|
PPECC_Push(0)
|
|||
|
|
optStatus = 0
|
|||
|
|
else:
|
|||
|
|
#禁用电机
|
|||
|
|
optStatus = 8
|
|||
|
|
else:
|
|||
|
|
optStatus = 5
|
|||
|
|
case 7:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 5
|
|||
|
|
case 8:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
log(f"BTV_ControlPressure stopped.")
|
|||
|
|
return True
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in BTV_ControlPressure(): str{e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def BTV_ControlPressure(targetPressure, keepTime, conrtrolMode):
|
|||
|
|
try:
|
|||
|
|
#controlMode取0,当到达限位,禁用电机;controlMode取1,当到达限位,执行回零、加压操作;
|
|||
|
|
log(f"BTV_ControlPressure starts.")
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
deviceData['status']['flagPressureStable'] = False
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
zeroPosition = int(deviceData['config']['BTV']['zeroPosition'])
|
|||
|
|
maxPosition = int(deviceData['config']['BTV']['maxPosition'])
|
|||
|
|
maxSpeed = int(deviceData['config']['BTV']['maxSpeed'])
|
|||
|
|
minSpeed = int(deviceData['config']['BTV']['minSpeed'])
|
|||
|
|
curSpeed = maxSpeed//2
|
|||
|
|
curPressure = int(deviceData['data']['pressure']['value'])
|
|||
|
|
curDirection = 1 # 1:正向,-1:反向
|
|||
|
|
limitedError = int(deviceData['config']['BTV']['limitedError'])
|
|||
|
|
cmdList = [
|
|||
|
|
['0406 0080 0001', 8], #0 使能电机
|
|||
|
|
[f"0410 0061 0002 04 {maxPosition:08X}", 8], #1 设定电机目标位置
|
|||
|
|
['0406 0084 0000', 8], #2 预设加压操作
|
|||
|
|
['0406 0081 0000', 8], #3 发送2条写寄存器0x81指令,产生上升沿,启动预设操作
|
|||
|
|
['0406 0081 0001', 8], #4
|
|||
|
|
['0406 0063', 8], #5 根据当前压力和目标压力的差值,调整电机速度
|
|||
|
|
['0403 00A4 0004', 13], #6 查询位置信息,当位置到达边界位置,退出指令执行
|
|||
|
|
['0406 0063 0000', 8], #7 设定电机目标速度为0, 停止电机
|
|||
|
|
['0406 0080 0000', 8] #8 禁用电机
|
|||
|
|
]
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
curPos = None
|
|||
|
|
Info = ''
|
|||
|
|
startTime = time.time()
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 2
|
|||
|
|
case 2:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 3
|
|||
|
|
case 3:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 4
|
|||
|
|
case 4:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 5
|
|||
|
|
case 5:
|
|||
|
|
exeCmd(cmdList[0])
|
|||
|
|
curPressure = deviceData['data']['pressure']['value']
|
|||
|
|
if abs(curPressure-targetPressure) > limitedError:
|
|||
|
|
startTime = time.time()
|
|||
|
|
deviceData['status']['flagPressureStable'] = False
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
if time.time()-startTime > 10:
|
|||
|
|
deviceData['status']['flagPressureStable'] = True
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
if time.time()-startTime > keepTime + 10:
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
deviceData['status']['flagPressureStable'] = False
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
if targetPressure >= curPressure:
|
|||
|
|
curDirection = 1
|
|||
|
|
else:
|
|||
|
|
curDirection = -1
|
|||
|
|
if abs(curPressure-targetPressure) > 1000:
|
|||
|
|
curSpeed = maxSpeed
|
|||
|
|
elif abs(curPressure-targetPressure) > limitedError/2:
|
|||
|
|
curSpeed = int(abs(curPressure-targetPressure)/1000*maxSpeed)
|
|||
|
|
if abs(curSpeed) < abs(minSpeed):
|
|||
|
|
curSpeed = minSpeed
|
|||
|
|
else:
|
|||
|
|
curSpeed = 0
|
|||
|
|
curSpeed = curDirection*curSpeed
|
|||
|
|
cmdList[optStatus][0] = (cmdList[optStatus][0][:9] + wordData2HexStr(struct.pack('>h', curSpeed)))
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
optStatus = 6
|
|||
|
|
case 6:
|
|||
|
|
ret = exeCmd(cmdList[optStatus])
|
|||
|
|
if ret[0]:
|
|||
|
|
curPos, = struct.unpack('>i', ret[1][7:11])
|
|||
|
|
if (curPos >= maxPosition+1000 and curSpeed >0) or (curPos <= zeroPosition-1000 and curSpeed <0):
|
|||
|
|
log_w(f"Exceed position limit: curPos={curPos}")
|
|||
|
|
startTime = time.time()
|
|||
|
|
deviceData['status']['flagPressureStable'] = False
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
BTV_ReturnToZero()
|
|||
|
|
if conrtrolMode == 1:
|
|||
|
|
#执行回零加压操作
|
|||
|
|
PreloadPressure(targetPressure)
|
|||
|
|
optStatus = 0
|
|||
|
|
else:
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
optStatus = 5
|
|||
|
|
case _: #8,禁用电机,退出函数
|
|||
|
|
deviceData['status']['flagPressureStable'] = False
|
|||
|
|
_G.set(devInfo['name'], deviceData)
|
|||
|
|
ret = exeCmd(['0406 0080 0000', 8])
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
log(f"BTV_ControlPressure stopped.")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in BTV_ControlPressure(): optStatus={optStatus}, StopAll={deviceData['status']['StopAll']}, curPos={curPos}, curSpeed={curSpeed}, Info={Info}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def PreloadPressure(targetPressure):
|
|||
|
|
global deviceData
|
|||
|
|
try:
|
|||
|
|
if targetPressure > 8000:
|
|||
|
|
targetPressure = 8000
|
|||
|
|
if BTV_IsAtZero():
|
|||
|
|
PPSOV_Open()
|
|||
|
|
if int(deviceData['data']['pressure']['value']) > targetPressure:
|
|||
|
|
LRSOV_Open()
|
|||
|
|
LRSOV_Close()
|
|||
|
|
else:
|
|||
|
|
PPSOV_Open()
|
|||
|
|
LRSOV_Open()
|
|||
|
|
BTV_ReturnToZero()
|
|||
|
|
LRSOV_Close()
|
|||
|
|
optStatus = 0
|
|||
|
|
exeFlag = True
|
|||
|
|
Info = ''
|
|||
|
|
curSpeed = None
|
|||
|
|
while(exeFlag):
|
|||
|
|
deviceData = _G.get(devInfo['name'])
|
|||
|
|
if deviceData and 'status' in deviceData and 'StopAll' in deviceData['status']:
|
|||
|
|
if deviceData['status']['StopAll']:
|
|||
|
|
optStatus = -1
|
|||
|
|
match optStatus:
|
|||
|
|
case 0:
|
|||
|
|
PPECC_ReturnToZero()
|
|||
|
|
optStatus = 1
|
|||
|
|
case 1:
|
|||
|
|
PPECC_Push(targetPressure)
|
|||
|
|
if targetPressure>1000:
|
|||
|
|
if (deviceData['data']['pressure']['value'] > 0.8*targetPressure):
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
curSpeed = abs(int((deviceData['data']['pressure']['value']-targetPressure))//5)
|
|||
|
|
if curSpeed > 300:
|
|||
|
|
curSpeed = 300
|
|||
|
|
elif targetPressure > 200:
|
|||
|
|
if (deviceData['data']['pressure']['value'] > 0.85*targetPressure):
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
curSpeed = 200
|
|||
|
|
elif targetPressure>100:
|
|||
|
|
if (deviceData['data']['pressure']['value'] > 0.9*targetPressure):
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
curSpeed = 200
|
|||
|
|
else:
|
|||
|
|
if (deviceData['data']['pressure']['value'] > targetPressure-3):
|
|||
|
|
optStatus = -1
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
curSpeed = 200
|
|||
|
|
optStatus = 0
|
|||
|
|
case _:
|
|||
|
|
PPSOV_Close()
|
|||
|
|
exeFlag = False
|
|||
|
|
log_du(f"Current pressure is {deviceData['data']['pressure']['value']}{deviceData['data']['pressure']['unit']}, optStatus={optStatus}, curSpeed={curSpeed}")
|
|||
|
|
log(f"PreloadPressure stopped. {Info}")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
log_e(f"Error in PreloadPressure(): {str(e)}.")
|
|||
|
|
return False
|