|
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# -*- coding: utf_8 -*-
|
|
|
|
|
|
|
|
|
|
import modbus_tk.defines as cst
|
|
|
|
|
from plc.tools import bytes_to_int_list, get_bit_bool, int_list_to_bytes
|
|
|
|
|
from plc.modbus import ModbusConnection
|
|
|
|
|
from conf.setting import AGVPLC
|
|
|
|
|
from models.path import Path
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TaskAddr:
|
|
|
|
|
|
|
|
|
|
# 起始地址
|
|
|
|
|
TASKTYPE_ADDR_BEGIN = 15000
|
|
|
|
|
|
|
|
|
|
# AGV路径点集合
|
|
|
|
|
PATH_ADDR_BEGIN = 15001
|
|
|
|
|
# PATH_ADDR_LENGTH = 42
|
|
|
|
|
|
|
|
|
|
#是否经过玻璃门
|
|
|
|
|
PASS_DOOR_ADDR = 15051
|
|
|
|
|
|
|
|
|
|
#货架第几层
|
|
|
|
|
LAYER_ADDR = 15052
|
|
|
|
|
|
|
|
|
|
#机械臂是否动作
|
|
|
|
|
ARM_ADDR = 15053
|
|
|
|
|
|
|
|
|
|
#任务数量
|
|
|
|
|
TASK_NUM = 15060
|
|
|
|
|
|
|
|
|
|
#任务取放开始地址 15061, 15062 -> 15079, 15080
|
|
|
|
|
T1_ADDR_GET_ADDR = 15061
|
|
|
|
|
T1_ADDR_RETURN_ADDR = 15062
|
|
|
|
|
|
|
|
|
|
#任务截至地址
|
|
|
|
|
T10_ADDR_GET_ADDR = 15079
|
|
|
|
|
T10_ADDR_RETURN_ADDR = 15080
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
######
|
|
|
|
|
# Read Registers
|
|
|
|
|
######
|
|
|
|
|
#任务是否完成
|
|
|
|
|
TASK_DONE_ADDR = 16000
|
|
|
|
|
#任务消息接收
|
|
|
|
|
TASK_RECV_ADDR = 16001
|
|
|
|
|
#AGV所在站点
|
|
|
|
|
AGV_STOP_ADDR = 16002
|
|
|
|
|
#AGV当前电量
|
|
|
|
|
AGV_POWER_ADDR = 16003
|
|
|
|
|
#AGV充电状态
|
|
|
|
|
AGV_CHARGE_ADDR = 16004
|
|
|
|
|
#设备忙
|
|
|
|
|
BUSY_ADDR = 16005
|
|
|
|
|
#设备异常
|
|
|
|
|
ABNORM_ADDR = 16006
|
|
|
|
|
#报警信息
|
|
|
|
|
ALARM_ADDR = 16007
|
|
|
|
|
|
|
|
|
|
#状态寄存器长度
|
|
|
|
|
# 连续读取8字节,单字节长度为16位
|
|
|
|
|
STATUS_ADDR_LENGTH = 8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
def cmd_type(cmdType: int):
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_SINGLE_REGISTER,
|
|
|
|
|
starting_address=TaskAddr.TASKTYPE_ADDR_BEGIN,
|
|
|
|
|
output_value=cmdType
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
async def setSubPaths(start: str, stop: str):
|
|
|
|
|
path = await Path.filter(start = start, stop = stop, is_valid = True, is_active = True)
|
|
|
|
|
|
|
|
|
|
subPaths = []
|
|
|
|
|
|
|
|
|
|
if path and len(path) > 0:
|
|
|
|
|
subPaths = path.paths
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_MULTIPLE_REGISTERS,
|
|
|
|
|
starting_address=TaskAddr.TASKTYPE_ADDR_BEGIN,
|
|
|
|
|
output_value=subPaths
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
def pass_door(passDoor: int):
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_SINGLE_REGISTER,
|
|
|
|
|
starting_address=TaskAddr.PASS_DOOR_ADDR,
|
|
|
|
|
output_value=passDoor
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
def setLayer(layer: int):
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_SINGLE_REGISTER,
|
|
|
|
|
starting_address=TaskAddr.LAYER_ADDR,
|
|
|
|
|
output_value=layer
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
def moveArm(move: int):
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_SINGLE_REGISTER,
|
|
|
|
|
starting_address=TaskAddr.ARM_ADDR,
|
|
|
|
|
output_value=move
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
def taskNum(num: int):
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_SINGLE_REGISTER,
|
|
|
|
|
starting_address=TaskAddr.TASK_NUM,
|
|
|
|
|
output_value=num
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def setTasks(tasks = []):
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
# 试剂amr机器人
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
res = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.WRITE_MULTIPLE_REGISTERS,
|
|
|
|
|
starting_address=TaskAddr.T1_ADDR_GET_ADDR,
|
|
|
|
|
output_value=tasks
|
|
|
|
|
)
|
|
|
|
|
print('cmd_type: ',res)
|
|
|
|
|
if res:
|
|
|
|
|
task_status = False
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print('cmd_type信息指令异常:' + str(e))
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def readStatus():
|
|
|
|
|
|
|
|
|
|
with ModbusConnection(
|
|
|
|
|
AGVPLC.HOST,
|
|
|
|
|
AGVPLC.PORT
|
|
|
|
|
) as master:
|
|
|
|
|
status = master.execute(
|
|
|
|
|
1,
|
|
|
|
|
cst.READ_HOLDING_REGISTERS,
|
|
|
|
|
TaskAddr.TASK_DONE_ADDR,
|
|
|
|
|
TaskAddr.STATUS_ADDR_LENGTH
|
|
|
|
|
)
|
|
|
|
|
print('readStatus: ',status)
|
|
|
|
|
return status
|