写在面前

上次分享了文章:

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 listFunction_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 listInterrupt_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 informationLine_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 positioninformationPlatform_Posi : DInt;   // 任务栈台位置值,单位mmTunnel_Posi : DInt;   // 任务巷道位置值,单位mmRow_Posi : DInt;   // 货架Row编号,决定堆垛机伸叉方向Line_Posi : DInt;   // 货架Y轴坐标(堆垛机行走方向)Tier_Posi : DInt;   // 货架X轴坐标(堆垛机提升方向)Depth_Posi : DInt;   // 货架Z轴坐标(堆垛机伸叉方向)END_STRUCT;Task_Des : Struct   // Current task destination positioninformationPlatform_Posi : DInt;   // 任务栈台位置值,单位mmTunnel_Posi : DInt;   // 任务巷道位置值,单位mmRow_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系统能更专业,快速地处理数据并实现专业分工。

基于WMS/WCS与PLC数据交互的立体仓库控制系统案例分析相关推荐

  1. python plc_基于python的西门子plc数据采集系统

    这个是网络上别人写的,采用的opc获取数据,然后通过tcp传回,采集器以tcp服务端存在,自己再写一个tcp客户端接收数据进行处理就好了. 技术环境: (1)采用python开发环境(32位),支持W ...

  2. 基于Twitter数据的情感预测与案例分析

    导读 本次分享的是关于文本分析中的情感预测分析和主题分析的一个小科研项目,数据爬取自Twitter,主要内容分为3部分: 1.情感预测机器学习模型选择及建立 2.情感预测深度学习模型LSTM的介绍和建 ...

  3. 大数据高效复制的处理案例分析总结

    一个老客户提出这样的需求,希望将SQLServer中的某个表的数据快速复制到SQLite数据库里面以便进行定期的备份处理,数据表的记录大概有50多万条记录,表有100个字段左右,除了希望能够快速做好外 ...

  4. 大数据如何改善社会治理:国外“大数据社会福祉”运动的案例分析和借鉴

    一.背景 今年,国务院印发<促进大数据发展行动纲要>明确指出大数据将成为提升政府治理能力的新途径,提出:建立"用数据说话.用数据决策.用数据管理.用数据创新"的管理机制 ...

  5. mysql load data infile 导入数据 某一列 空_Sql数据挑战赛amp;网络销售案例分析

    SQL挑战赛 第一期: 1: 编写一个查询,列出员工姓名列表,员工每月工资超过2000美元且员工工作时间少于10个月.通过提升employee_id对结果进行排序 select name from e ...

  6. C++静态数据成员与静态函数(案例分析)

    文章目录 一.静态数据成员 二.静态函数 一.静态数据成员 #include <iostream> using namespace std;class Box {public:Box(in ...

  7. Android 数据存储和文件使用案例分析

    很多时候我们的软件需要对处理后的数据进行存储或再次访问.Android为数据存储提供了如下几种方式: 文件 SharedPreferences(参数) SQLite数据库 内容提供者(Content ...

  8. 数据中心现场施工管理难点案例分析

    众所周知安全是每个企业生存与发展的涵盖与前提,由此安全显得非常重要.对于数据中心现场的施工管理来说,实现安全生产所面临的难度更大,因为其施工项目安全生产有不同于其他行业的特点.数据中心中机电安装工程的 ...

  9. 合作式智能运输系统 车用通信系统应用层及应用数据交互标准 第二阶段_为什么一定要了解OPC UA TSN——未来的工业通信标准...

    ↑ 点击上方 "智能制造之家" 关注我们 写在面前 前面我们介绍了很多OPC UA的相关知识: OPC UA-面向未来的工业通讯规范 OPC UA服务器和客户端的安全机制你明白吗? ...

最新文章

  1. 人工智能浪潮正席卷全球
  2. react显示隐藏动画
  3. 重新上课,学习HTML的第一天
  4. 新浪微博和CRM Interaction Center的集成
  5. 牛逼了!PDF 版本 5000 页 Java 技术栈手册开放下载!
  6. 5G技术将加速智能网联汽车产业化进程
  7. Flask mysql
  8. Java\学习——字符串
  9. NYOJ477 - A+B Problem III
  10. 翻译:图解HTTPS工作原理、秘钥、握手、HTTPS,SSL,TLS的区别、证书
  11. 大数据之路、阿里巴巴大数据实践读书笔记目录
  12. Android APK实现WIFI协议包抓取(上)-实现思路
  13. 学习笔记-网络安全(二)
  14. Leftist Heaps 习题解
  15. 《学习的本质》读后感
  16. Gym - 100886F 2015-2016 Petrozavodsk Winter Training Camp, Saratov SU Contest F - Empty Vessels
  17. Python基础第六天:函数进阶
  18. js iframe 打印 打印预览 页眉页脚的设置
  19. 【微信支付】Java实现微信APP支付流程
  20. 区块链的大问题有救了!

热门文章

  1. 为啥SpringBoot更多普遍采用Controller+Service接口层+ServiceImpl接口实现层
  2. 为什么普遍使用Linux做服务器?
  3. 2d有限元计算机仿真,超导感应电机的建模与分析
  4. 代理ip最新识别方法及代理ip有效性检测方法
  5. idea:Build或Rebuild项目特别慢
  6. 流浪的阿猫阿狗我要怎么帮助你?
  7. 阿猫阿狗的爱情游戏2
  8. Tio消息服务器,tio-websocket-spring-boot-starter 的简单使用
  9. 免费网络电话App 传统通信破冰者
  10. 微信分享朋友圈的标题和图片