跳到主要内容

202501 仙工翻斗车

· 阅读需 5 分钟

线体PLC使用Modbus协议产生下料请求,呼叫AGV任务并搬运。使用仙工得天风任务进行配置。

车体IO脚本配置

车体Seer控制器通过IO得方式对翻斗进行控制,具体有两个动作,一个是开盖板和关盖板,一个是翻斗和收斗。

使用IO在仙工控制器中机构脚本进行了配置。如下:

以开盖板为例,设置DO2,Wait DI6。DI6 应该是一个盖板到位信号。

import json
import time
import sys
import struct

from rbk import MoveStatus, BasicModule, ParamServer
from rbkSim import SimModule
from robot import Motor, MotorType, Robot, ModuleTool

"""
####BEGIN DEFAULT ARGS####
{


"operation": {
"value": "",
"default_value": [
"Capopen","Capclose","Poleup","Poledown"
],
"type": "complex",
"tips": "任务动作"
}


}
####END DEFAULT ARGS####
"""

class Module(BasicModule):
def __init__(self, r: SimModule, args):
super(Module, self).__init__()
p = ParamServer(__file__)
self.operation = args.get("operation", None)
self.do8 = 8
self.do1 = 1
self.do2 = 2
self.do3 = 3
self.di1 = 1
self.di2 = 2
self.di6 = 6
self.di7 = 7
self.start_time = time.time()
self.over_time = 60.0
self.init = True
self.status = MoveStatus.NONE
self.state = dict()

def run(self, r: SimModule, args):
# 超时判断
dt = time.time() - self.start_time
if dt > self.over_time:
self.status = MoveStatus.FINISHED
r.setError("running timeout!")
return self.status
self.status = MoveStatus.RUNNING
self.state = dict()
if self.init:
self.init = False
if "operation" not in args :
r.setError("user args error {}".format(json.dumps(args)))
self.status = MoveStatus.FAILED
# =====参数初始化和参数检查=====

# =====处理业务逻辑=====
if self.status is MoveStatus.FAILED:
return self.status
#self.check_do(r)

if self.operation == "Capopen":
self.Capopen(r)
elif self.operation == "Capclose":
self.Capclose(r)
elif self.operation == "Poleup":
self.Poleup(r)
elif self.operation == "Poledown":
self.Poledown(r)
else:
# 如果是不支持的operation则报错
r.setError(
"operation: {} doesn't support!".format(self.operation))
self.status = MoveStatus.FAILED
r.publishSpeed() # 下发速度
# =====数据上报及日志打印=====
self.status = self.status
self.state["status"] = self.status
self.state["args"] = args
str_state = json.dumps(self.state)
r.setInfo(str_state)
r.logDebug(str_state)
return self.status

#def check_do(self,r):
# dolist = [self.do8,self.do1,self.do2,self.do3]
# for i in dolist:
# r.setDO(i, False)

def Capopen(self,r):
'''盖板打开'''
r.setDO(self.do2, True)
if ModuleTool.check_DI(r, self.di6):
r.setDO(self.do2, False)
self.status = MoveStatus.FINISHED

def Capclose(self,r):
'''盖板关闭'''
r.setDO(self.do3, True)
if ModuleTool.check_DI(r, self.di7):
r.setDO(self.do3, False)
self.status = MoveStatus.FINISHED

def Poleup(self,r):
'''推杆上升'''
r.setDO(self.do8, True)
if ModuleTool.check_DI(r, self.di1):
r.setDO(self.do8, False)
self.status = MoveStatus.FINISHED

def Poledown(self,r):
'''推杆下降'''
r.setDO(self.do1, True)
if ModuleTool.check_DI(r, self.di2):
r.setDO(self.do1, False)
self.status = MoveStatus.FINISHED

def cancel(self, r):
# =====处理任务取消时的业务=====
dolist = [self.do8,self.do1,self.do2,self.do3]
for i in dolist:
r.setDO(i, False)
r.logInfo(f"cancel task")
self.status = MoveStatus.NONE

def suspend(self, r):
# =====处理任务暂停时的业务=====
dolist = [self.do8,self.do1,self.do2,self.do3]
for i in dolist:
r.setDO(i, False)
r.logInfo(f"suspend task")
self.status = MoveStatus.SUSPENDED

if __name__ == '__main__':
r = rbkSim.SimModule()
m = Module(r, None)
data = dict()

库位配置动作

仙工执行任务动作配置在库位上, 一个站点可以绑定多个库位,每个库位上可以设置不同得参数。

flgj-seer-location-1

以下配置就是将LM1 站点上 A2库位 上设置了一个脚本动作,参数就是Capopen。代表打开盖板。

flgj-seer-location-2

天风任务配置

取货子任务

在天风任务中制作一个取料的子任务,将取料的两个库位动作做成参数传入子任务。

任务参数名称 target1,target1_1

target1 上指定 A1(库位)盖板打开动作 target1_1 上指定 A1_1(库位)上配置的盖板关闭动作

机器人通用动作上binTask配置的参数,要和库位上配置的一致,不然无法执行动作。

flgj-seer-tianfeng-load

倒货子任务

在天风任务中制作一个倒料的子任务,将取料的四个库位动作做成参数传入子任务。

任务参数名称 target_1,target_2,target_3,target_4

target_1 上指定 A2(库位)盖板打开动作

target_2 上指定 A2_1(库位)上配置的盖板关闭动作

target_3 上指定 A2_2(库位)上配置翻斗推升动作

target_4 上指定 A2_3(库位)上配置翻斗收回动作

flgj-seer-tianfeng-put

整体任务

在天风任务中制作将寄存器读取,取料,放料整合一起。

使用Modbus读取寄存器的2 为 1时触发下面的流程。

读取缓存值isTrigger,如果条件值==true代表任务已经触发,不在产生任务返回。

如果isTrigger为false,则设置isTrigger为true,并在任务结束的时候设置为false。

这样就是实现了Module值为期望值后一直无限触发任务。

flgj-seer-tianfeng-trigger

客户指定目标点

客户现场需要12个机台每天根据不同的物料型号,配置目标点。

此时需要需要配置设置缓存的功能, 分别设置12个机台的缓存设置任务。 每次修改机台的终点时,触发该任务手动输入参数。

在12个机台的定时任务中,使用Modbus等待,去指定起点,终点需要先读取1机台缓存,根据配置的缓存判断具体去那个目标点。