写在面前
上次分享了文章:
TIA Portal实现动态加密的高阶玩法—分级催款密钥授权管理
然后很快就有朋友根据里面的思路实现了,很赞,不过提醒大家的是,我们分享的只是一些思路,不是让大家跟做某件事,请理性看待,不要陷入自己的思维蚕茧之中~
00 前言
自动化立体仓库是集机械、电子、计算机、通信网络、传感器和自动控制等多种技术为一体,以搬运机械化、控制自动化、管理微机化、信息网络化为特征的现代化物流系统中产品生产与储存的枢纽,主要应用于存储配件、半成品、产品、工具、夹具和模具等。
随着信息化技术的发展和自动化要求的不断提高,立体仓库的设备控制不仅要将堆垛机的运行控制做到平滑顺畅,更需要堆垛机系统能具备运行过程中各种信息数据的转换处理,便于操作运行人员或者管理人员能对堆垛机的各种参数及性能得到细致的了解与掌握。
目前堆垛机控制系统更多的研究方向都是控制曲线的实现,并且也已经有很多实际成果已经在实施。然而在堆垛机信息化管理方面,PLC系统做的还不是很完善且实际应用中涉及的比较浅,这造成了在工业应用中更多的信息化数据都是通过WMS/WCS的仓储数据的信息化,而堆垛机的设备的参数性能,堆垛机对任务处理过程数据等信息化的管理由于PLC系统做的不彻底,导致现在的仓储控制系统在这方面是一个弱点。
本文主要阐述一种基于PLC(SIEMENS)的堆垛机控制技术中对于堆垛机运行过程中的数据的管理的原理以及数据处理的方式。
01 立体仓库控制系统
立体仓库的控制系统主要包括WMS/WCS系统以及设备控制系统(PLC)。最上层的WMS系统负责仓储业务逻辑的处理,最下层是具体物流设备的控制,比如堆垛机。WCS处于WMS与PLC之间,负责协调,调度底层设备,使底层设备可以执行仓储系统的业务流程并且这个过程完全按照程序预先设定的流程执行的。通常WMS与WCS都是在同一硬件系统(服务器)实现,所以下文所有的描述都统称为WMS/WCS系统。
图1 立体仓库控制系统构架
PLC和WMS/WCS之间由以太网(无线)连接,通过TCP/IP协议交换信息数据,二者之间主要由两类数据的交互:
心跳包数据:心跳包数据主要用于监视PLC和WMS/WCS之间的连接是否正常,只有连接正常的情况下才有数据交互的可能性;
任务信息数据:WMS/WCS给PLC发送的任务信息,PLC在执行过程中该任务信息状态反馈以及设备信息的反馈;此类数据二者在不同时刻具有不同身份,是不同信息的创造者;
添加链接描述
图2 PLC与WMS/WCS通信链路处理
堆垛机作业流程:
WMS/WCS根据业务流程向堆垛机发送任务信息,堆垛机系统(PLC)在收到任务信息后将按照信息内容执行任务流程并且在执行过程中实时向WMS/WCS反馈当前任务状态。
正常流程:堆垛机执行任务一次性完成,中途没有出现任何异常;
异常流程:堆垛机执行任务过程中,由于设备出现故障或其他因素,导致任务必须暂停甚至中断称之为异常。此时PLC必须告知WMS/WCS异常的原因并等待异常结束后将任务执行完成,最终并发送任务完成信息给WMS/WCS系统;
图3 PLC与WMS/WCS作业流程示意图
02 PLC中堆垛机的数据管理方式
2.1任务信息组成
堆垛机主要基于WMS/WCS发送的任务信息执行货物的位置搬运,设备空移等动作,核心要素即堆垛机的位置移动,位置定位等的控制。所以,WMS/WCS发送给PLC的任务信息也是主要包括任务属性描述以及位置等核心数据。一般的任务信息数据可以概括如下表所示:
表格1 堆垛机任务信息数据
2.2PLC系统数据管理
PLC为了将接收到的任务信息能正确的执行,在PLC中建立了四个数据区域:
Link:各种数据记录(TST,TIF,TST)的链接,每一个独立的任务信息对应一个Link编号且该Link下面会有相关数据记录编码的链接;
TIF: Task Information,任务信息记录,记录任务信息中接收到的数据;每一个TIF对应一个任务ID的信息并由Link链接到其他记录信息;
TST: Task States,任务状态记录,表明该任务信息当前状态;每一个TST对应一个任务ID的信息并由Link链接到其他记录信息;
TDT: Task Distance,任务距离数据记录,记录该任务起始/目的/当前位置信息或者距离信息,每一个堆垛机对应一组信息记录,同一堆垛机的TSD记录号码是相同的且与堆垛机编号相同;
2.2.1任务信息记录(TIF: Task Information)
TIF用于记录PLC收到的WMS/WCS的任务信息,用于指导堆垛机的运行控制;在PLC中自定义一种结构体数据类型名叫:UDT_TIF,其结构如下图所示:
TYPE “UDT_TIF”
STRUCT
Link : Int; // Link Record in Link DB list
Function_Code : Int; // 任务功能编码:比如定义出库,入库编号
stocker_ID : Int; // 堆垛机编号
Task_ID : DInt; // 任务编号
Priority_code : Int; // 任务优先级,级别越高越先执行
Res_Platform : Int; // 起始栈台编号
Res_Tunnel : Int; // 起始巷道编号
Res_Row : Int; // 起始货架Row编号,决定堆垛机伸叉方向
Res_Line : Int; // 起始货架Y轴坐标(堆垛机行走方向)
Res_Tier : Int; // 起始货架X轴坐标(堆垛机提升方向)
Res_Depth : Int; // 起始货架Z轴坐标(堆垛机伸叉方向)
Des_Platform : Int; // 目的栈台编号
Des_Tunnel : Int; // 目的巷道编号
Des_Row : Int; // 目的货架Row编号,决定堆垛机伸叉方向
Des_Line : Int; // 目的货架Y轴坐标(堆垛机行走方向)
Des_Tier : Int; // 目的货架X轴坐标(堆垛机提升方向)
Des_Depth : Int; // 目的货架Z轴坐标(堆垛机伸叉方向)
Weigth : Int; // 货物重量
Barcord_Tub : String[10]; // 托盘条码
END_STRUCT;
END_TYPE
在PLC中实例化一个数据块,名称叫做DB_TIF_List。该数据区域包括两部分:数据块头文件与数据主体。
数据头文件区域定义了数据区域的一些属性,比如头文件长度,数据类型的长度,当前最大记录数目等信息;
数据主体就是存放实际数据的区域,主要由100组UDT_TIF类型组成的数据列表,意味着数据区域最多可以同时存放100个堆垛机任务;
DATA_BLOCK"DB_TIF_List"
STRUCT
Length_Header : Int; // DB块头文件的长度,工程师设定
Length_Record : Int; // 每一台记录的长度,系统自动计算
Last_Task_Record : Int; // 当前存储的记录的位置,系统自动计算
Entries_Present : Int; // 能存储的最多数据的记录
Default_Record_DB : Int; // 默认的数据块编号
Not_Used : Int; // 没有定义
s_Done : Bool; // 用于指示该数据块正在被调用
TIF : Array[1..100] of"UDT_TIF";
END_STRUCT;
END_DATA_BLOCK
2.2.2任务状态记录(TST: Task States)
对于堆垛机设备来说,每一个任务的执行都是三个坐标(水平,垂直,货架)系统的目标位置与设备当前位置之间的坐标位移。TST则用于记录任务的执行状态,其中包括两个方面的数据的记录:
任务的整体状态:包括任务是否被激活,任务是否正在执行,任务是否被中断,任务是否执行完成等;
任务的过程状态:过程状态包括三个坐标系电机在当前任务中的执行状态,比如在该任务中水平行走坐标是否已经完成,垂直提升坐标是否已经完成,货叉伸缩货叉任务是否已经完成等;
PLC自定义一种数据类型名叫:UDT_TST用于记录任务执行状态
TYPE"UDT_TST"
STRUCT
Link : Int; // Link Record in Link DB list
Interrupt_code : Int; // 任务中断代码
Defeated_Reason : Int; // 任务中断的原因代码
Depth_Run_Counter : Int; // 1:单货叉运行;2::双货叉运行
Current_Lift_Speed : Int; // 提升电机当前速度
Current_Line_Speed : Int; // 行走电机当前速度
Read_Barcode_States : Int; // 0表示条码状态正确;1:表示条码状态错误
Read_Barcode_1 : String[10]; // 读到的第一条条码
Read_Barcode_2 : String[10]; // 读到的第二条条码
Read_Barcode_3 : String[10]; // 读到的第三条条码
Task_status : Bool; // 1:任务正在执行 0:任务等待中
Task_Res_Depth_Status : Bool; // 1:任务正在执行 0:任务等待中
Task_Des_Depth_Status : Bool; // 1:任务正在执行 0:任务等待中
Task_Finished : Bool; // TRUE=任务完成
Task_defeated : Bool; // TRUE=任务中断
Task_completed : Bool; // TRUE=收到WCS反馈信息
Hold_Goods : Bool; // 叉车上有货物
Task_defeated_inform : Bool; // TRUE=上位机任务中断确认
Task_Res_Line_Finish : Bool; // TRUE=起始Y轴(行走)完成
Task_Des_Line_Finish : Bool; // TRUE=目的Y轴(行走)完成
Task_Res_Column_Finish : Bool; //TRUE=起始X轴(提升)完成
Task_Des_Column_Finish : Bool; //TRUE=目的X轴(提升)完成
Task_Res_Depth1_Finish : Bool; //TRUE=起始Z轴(单伸货叉)完成
Task_Des_Depth1_Finish : Bool; //TRUE=目的Z轴(单伸货叉)完成
Task_Res_Depth2_Finish : Bool; //TRUE=起始Z轴(双伸货叉)完成
Task_Des_Depth2_Finish : Bool; //TRUE=目的Z轴(双伸货叉)完成
Task_Res_Req_Lift_LittleUp : Bool;//TRUE:请求提升电机微升
Task_Res_Req_Lift_LittleDn :Bool; // TRUE:请求提升电机微降
Task_Des_Req_Lift_LittleUp :Bool; // TRUE:请求提升电机微升
Task_Des_Req_Lift_LittleDn :Bool; // TRUE:请求提升电机微降
Line_Motor_Run_On : Bool; // X轴电机运行信号
Column_Motor_Run_On : Bool; // Y轴电机运行信号
Depth_Motor1_Run_On : Bool; // 货叉电机1运行信号
Depth_Motor2_Run_On : Bool; // 货叉电机2运行信号
END_STRUCT;
END_TYPE
在PLC中实例化一个数据块,名称叫做DB_TST_List。该数据区域包括两部分:数据块头文件与数据主体。
数据头文件区域定义了数据区域的一些属性,比如头文件长度,数据类型的长度,当前最大记录数目等信息;
数据主体就是存放实际数据的区域,主要由100组UDT_TST类型组成的数据列表,意味着数据区域最多可以同时存放100个堆垛机任务;
DATA_BLOCK “DB_TST_List”
STRUCT
Length_Header : Int; // DB块头文件的长度,工程师设定
Length_Record : Int; // 每一台记录的长度,系统自动计算
Last_Task_Record : Int; // 当前存储的记录的位置,系统自动计算
Entries_Present : Int; // 能存储的最多数据的记录
Default_Record_DB : Int; // 没有定义
Not_Used : Int; // 没有定义
s_Done : Bool; // 用于指示该数据块正在被调用
TST : Array[1…100] of"UDT_TST";
END_STRUCT;
END_DATA_BLOCK
2.2.3任务位置(TSD: Task Distance)
TSD主要记录执行任务中相关的坐标位置数据,主要包括两种位置数据:
设备当前位置数据:包括堆垛机三台电机的当前位置坐标值;
任务位置数据:每一个有效任务都包括起始位置和终点位置,任务位置值就包括任务中这两类的三台设备的目的数据;
PLC自定义一种数据类型名叫:UDT_TSD用于记录任务坐标位置值;
TYPE"UDT_TSD"
STRUCT
Link : Int;
Current : Struct // Current stocker position information
Line_Posi : DInt; // 当前Y轴坐标(堆垛机行走方向)
Tier_Posi : DInt; // 当前X轴坐标(堆垛机提升方向)
Depth_Posi : DInt; // 当前Z轴坐标(堆垛机伸叉方向)
Platform : Int; // 当前栈台编号
Tunnel : Int; // 当前巷道编号
Row : Int; // 当前列编号
Line : Int; // 当前排编号
Tier : Int; // 当前层编号
Depth : Int; // 当前深度编号
END_STRUCT;
Task_Res : Struct // Current task resource positioninformation
Platform_Posi : DInt; // 任务栈台位置值,单位mm
Tunnel_Posi : DInt; // 任务巷道位置值,单位mm
Row_Posi : DInt; // 货架Row编号,决定堆垛机伸叉方向
Line_Posi : DInt; // 货架Y轴坐标(堆垛机行走方向)
Tier_Posi : DInt; // 货架X轴坐标(堆垛机提升方向)
Depth_Posi : DInt; // 货架Z轴坐标(堆垛机伸叉方向)
END_STRUCT;
Task_Des : Struct // Current task destination positioninformation
Platform_Posi : DInt; // 任务栈台位置值,单位mm
Tunnel_Posi : DInt; // 任务巷道位置值,单位mm
Row_Posi : DInt; // 货架Row编号,决定堆垛机伸叉方向
Line_Posi : DInt; // 货架Y轴坐标(堆垛机行走方向)
Tier_Posi : DInt; // 货架X轴坐标(堆垛机提升方向)
Depth_Posi : DInt; // 货架Z轴坐标(堆垛机伸叉方向)
END_STRUCT;
END_STRUCT;
END_TYPE
在PLC中实例化一个数据块,名称叫做DB_TSD_List。该数据区域包括两部分:数据块头文件与数据主体。
数据头文件区域定义了数据区域的一些属性,比如头文件长度,数据类型的长度,当前最大记录数目等信息;
数据主体就是存放实际数据的区域,主要由100组UDT_TSD类型组成的数据列表,意味着数据区域最多可以同时存放100个堆垛机任务;
DATA_BLOCK “DB_TSD_List”
STRUCT
Length_Header : Int; // DB块头文件的长度,工程师设定
Length_Record : Int; // 每一台记录的长度,系统自动计算
Last_Task_Record : Int; // 当前存储的记录的位置,系统自动计算
Entries_Present : Int; // 能存储的最多数据的记录
Last_TaskID : DInt; // 默认的数据块编号
s_Done : Bool; // 用于指示该数据块正在被调用
TSD : Array[1..5] of "UDT_TSD";
END_STRUCT;
END_DATA_BLOCK
2.2.4数据链接(Link)
TIF,TST堆栈共有100组数组,TSD堆栈共有5组数组,当收到一个新的任务的时候相关信息要保存到各自数据区域的哪一组里面呢?
类似疑问就需要通过Link来解决,Link在堆垛机控制系统中主要有以下用途:
当接收到新的任务信息后,系统会生成一个新的Link编号并存放于数据块中;
Link生成成功后基于Link编号生成其他数据(TIF,TST,TSD)的编号并通过Link编号进行各类数据之间的桥接;
Link数据如下所示:
TYPE"UDT_Link"
STRUCT
TIF: Int; // 任务信息编号;
TST: Int; // 任务状态编号;
TSD: Int; // 任务距离编号;
Priority : Int; // 优先级:确定任务执行的先后顺序,优先级越高越先执行;
END_STRUCT;
END_TYPE
Priority:优先级,与TIF中的优先级的值是一致的,在Link中主要用于生成当前任务号(优先级越高,该任务必须越先执行);
注:优先级仅限于当前列表中未执行任务的比较;
在PLC中实例化一个数据块,名称叫做DB_Link_List。该数据区域包括两部分:数据块头文件与数据主体。
数据头文件区域定义了数据区域的一些属性,比如头文件长度,数据类型的长度,当前最大记录数目等信息;
数据主体就是存放实际数据的区域,主要由100组UDT_TSD类型组成的数据列表,意味着数据区域最多可以同时存放100个堆垛机任务;
DATA_BLOCK “DB_Link_List”
STRUCT
Length_Header : Int; // DB块头文件的长度,工程师设定
Length_Record : Int; // 每一台记录的长度,系统自动计算
Last_Record : Int; // 当前存储的记录的位置,系统自动计算
Entries_Present : Int; // 能存储的最多数据的记录
Current_Record : Int; // 当前执行的记录编号
Record_DB_Nr : Int; // Link下面链接的其他数据DB块编号
s_Done : Bool; // 用于指示该数据块正在被调用
DB_nr_Record :"UDT_Record_Nr";
Link : Array[1..100] of "UDT_Link";
END_STRUCT;
END_DATA_BLOCK
03 数据处理逻辑
数据关系的基本原则:一致性,同步性;
图4 数据逻辑关系图
优先性:数据关系中Link是核心要素,当收到新的Link生成请求后,只有在分配新的Link才能基于此Link生成其他Record(TIF/TST/TSD),即Link在数据管理中是最高级别的;
注:Link分配过程必须检测分配的编号是否被占用,若占用则必须重新分配;
同步性:当系统请求删除Link时候,必须先删除TIF/TST/TSD成功后才能将Record链接的Link的数据删除;
一致性:TIF/TST/TSD数据中的Link必须一致且三者的编号必须与Link中的相关Record号码一致;
详细的逻辑流程详见下图所示:
图5 数据管理(生成/删除)逻辑图
04 控制系统框架以及实现
基于模块化,标准化思维,PLC程序主要分为三个模块:数据管理、设备控制以及通信(WMS/WCS)程序。
位置编码是一种位置编码与位置实际位置值之间转换的算法,该算法是为控制系统中的三个模块提供算法支持的。
图6 堆垛机控制系统结构图
4.1 通信程序(WMS/WCS)
堆垛机的控制都是基于WMS/WCS的任务信息,所以PLC首要任务是和WMS/WCS建立通信链接并接收WMS/WCS的任务指令,这就是PLC控制系统中的通信模块程序的任务。
此模块程序将WMS/WCS的任务解析为通俗易懂的数据,利用位置编码算法将任务中的位置编码转换为用于控制算法的实际距离值,最终将这些数据分别存放在数据管理模块中的TIF以及TSD序列中。
4.2 数据管理
数据管理模块主要有以下几项任务:
任务执行前检查并确保该任务的正确性,不正确的任务数据应该得到清除或其他方式给予恰当处理。
监视当前任务的执行状态,基于任务的状态向WMS/WCS系统发送恰当的状态反馈,比如任务完成信息,任务中断信息或者设备故障等状态信息。
当前任务执行完成后基于任务优先级搜索任务序列中的有效任务并将其激活为当前任务。
设备控制
堆垛机的设备控制主要为三个方向的位置定位控制,数据管理模块会根据任务执行状态实时更新位置信息并反馈到驱动控制器用于指导设备的位置及精度的控制。
设备运行过程中信息,包括设备的状态,故障、某些逻辑的算法故障、当前任务的执行情况(完成、中断或者暂停等)会实时写入数据管理模块,控制系统通过数据管理模块将有效的信息(任务状态,设备状态等)反馈到WMS/WCS用于整个存储系统的数据分析,同时控制系统也会通过恰当的方式(比如HMI,SCADA)实现与操作者的人机信息交互。
05 结束语
基于数据管理的控制技术中管理的数据类型是仓储物流控制系统的全部的数据,能实现堆垛机的全过程的信息化管理。该数据管理模式关注了每一个任务的全过程数据,对于信息化管理要求高的企业也能满足其要求。对于客户的任务信息化的要求,只要在设计阶段定义好数据的发送点以及数据的内容,PLC能实时的将任务过程中的全部信息(任务信息、设备信息)从数据管理模块收集起来并发送到指定设备。
同时,应用该技术可以让WMS/WCS系统专注于数据的管理,对于设备控制层面的过程管理只需要和PLC做好相应的信息接口,这样WMS/WCS系统能更专业,快速地处理数据并实现专业分工。