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()