西门子博途:使用 DB_ANY 数据类型
使用 DB_ANY 数据类型 (S7-1200/1500)
DB_ANY 数据类型用来标识任意数据块。对于 S7-1200/1500 系列的 CPU,可以选择访问编程期间尚不可用的数据块。为此,请在访问块的块接口中创建一个 DB_ANY 数据类型的块参数。数据块名称或先前分配给数据块名称的 DB_ANY 数据类型的变量将在运行期间传送到此参数。可以通过以下指令,处理数据块中用符号表示的内容:
VARIANT_TO_DB_ANY:将 VARIANT 转换为 DB_ANY
DB_ANY_TO_VARIANT:将 DB_ANY 转换为 VARIANT
有关这些指令的更多信息,请参见“基本指令 > STL/SCL > 转换操作 > VARIANT”(Basic instructions > STL/SCL > Conversion operations > VARIANT)。
该过程具有以下优势:不需要知道将要处理的数据块就能创建程序代码。
在本示例中需要使用以下对象:
编程示例
以下示例说明了如何使用 DB_ANY 数据类型:
冲孔机可以冲出各种各样的几何形状。冲孔作业将传送到机器,每个作业有特定的作业数据。作业数据的作业类型和数据值各有不同。
操作步骤 - 创建 PLC 数据类型
在个作业中,将在一块金属板上冲出一个圆孔。要使冲孔机能够执行此作业,需要提供中心点坐标以及圆孔的半径。可以通过 PLC 数据类型 (UDT) 将这些作业数据一起传送到冲孔机。
创建 PLC 数据类型“UDT_Hole”以传送作业数据:
在项目树中,双击“PLC 数据类型”(PLC data types) 文件夹中的命令“新增数据类型”(Add new data type)。 这样,将创建并打开一个用于创建 PLC 数据类型的新声明表。 在 PLC 数据类型中声明以下行: X-coordinate > REAL Y-coordinate > REAL Diameter > REAL |
在第二个作业中,将在一块金属板上冲出一个矩形。对于此作业,需要提供两个坐标,分别定义此矩形的左上角和右下角。可以通过 PLC 数据类型“UDT_RectangleWindowStatic”将这些作业数据一起传送到冲孔机。
创建 PLC 数据类型“UDT_RectangleWindowStatic”:
这样,将创建并打开一个用于创建 PLC 数据类型的新声明表。
在 PLC 数据类型中声明以下行:
X1-coordinate > REAL
Y1-coordinate > REAL
X2-coordinate > REAL
Y2-coordinate > REAL
“UDT_RectangleWindowStatic”的作业数据只能用于冲出其边沿分别与 x 和 y 轴平行对齐的矩形。
如果要冲出具有不同对齐设置的矩形(即不与 x 和 y 轴平行对齐),则需要其它 PLC 数据类型。例如,在其它 PLC 数据类型中,可以指定高度和宽度,以及矩形与 x 轴的角度。
创建 PLC 数据类型“UDT_RectangleWindowFlexible”:
这样,将创建并打开一个用于创建 PLC 数据类型的新声明表。
在 PLC 数据类型中声明以下行:
X-coordinate > REAL
Y-coordinate > REAL
Height > REAL
Width > REAL
Angle > REAL
用于指定矩形中心位置的 x 轴和 y 轴坐标。
操作步骤 - 创建数据块
在下一部分,您将学习如何将简单的几何形状(其作业数据已在 PLC 数据类型中定义)传送到冲孔机。冲孔作业在程序代码中被细分成多个冲孔操作,这些冲孔操作由冲孔机连续执行。冲孔机有一个十字工作台,金属板将紧紧地夹在这个工作台上。可以将十字工作台沿 x 轴和/或 y 轴移动,就像在坐标系中一样。十字工作台由两个电机推动。该工具有不同的印模用来在金属板上冲出各种形状,例如大小不同的圆形和矩形。该工具还可以多旋转 90 度来切出具有不同对齐角度的矩形。
现在,可使用 PLC 数据类型创建多个背景数据块。之后,该背景数据块将包含具体值,如圆孔的值。
创建背景数据块“DB_OrderHole”:
双击“程序块”(Program blocks) 文件夹下方的命令“添加新块”(Add new block)。 “添加新块”(Add new block) 对话框随即打开。 |
单击“数据块 (DB)”(Data block (DB)) 按钮。 指定名称“DB_OrderHole”。 选择数据块“UDT_Hole”作为类型。 单击“确定”(OK)。 |
输入相应的起始值:
要制造特定的金属板部件,例如控制柜的侧面板,则将必需的几何形状加载到冲孔机。为此需要创建另一个包含数据块列表的数据块。
创建数据块“DB_OrderList”:
双击“添加新块”(Add new block) 命令。 “添加新块”(Add new block) 对话框随即打开。 单击“数据块 (DB)”(Data block (DB)) 按钮。 指定名称“DB_OrderList”。 选择“全局数据块”(Global DB) 作为该数据块的类型。 单击“确定”(OK)。 |
在数据块中创建以下作业列表:
操作步骤 - 创建程序代码
为每个作业类型,创建一个单独的函数。在此,将冲孔作业细分为具体的各个冲孔操作,并包含在 ARRAY 中。
创建 PLC 数据类型“UDT_Punch”。 双击“PLC 数据类型”(PLC data types) 下方的命令“添加新数据类型”(Add new data type)。 将创建一个名为“UserDataType_x”的新 PLC 数据类型。 将 PLC 数据类型重命名为“UDT_Punch”。 在 PLC 数据类型中声明以下行: Tool > DINT x > REAL y > REAL w > REAL 创建 ARRAY 数据块“DB_PunchList”。 |
要为一个孔洞准备冲孔作业并将其细分为具体的各个冲孔操作,则需创建一个 SCL 函数并命名为“FC_PrepareHole”。
声明该块接口,如下所示: 编写以下程序代码: |
要为一个窗口准备冲孔作业,则需通过一个函数将四个冲孔操作序列组合到一个冲孔作业中。创建一个 SCL 函数并命名为“FC_PrepareWindowStatic”。
声明该块接口,如下所示: 编写以下程序代码: |
要为一个可变矩形准备冲孔作业,则需通过一个函数将四个冲孔操作序列组合到一个冲孔作业中。创建一个 SCL 函数并命名为“FC_PrepareWindowFlexible”。
声明该块接口,如下所示: 编写以下程序代码: |
冲孔机现在应该会开始处理作业。如果它已经在处理作业,则应从作业列表中获取下一个作业并进行准备。
创建一个 SCL 函数块。 双击“添加新块”(Add new block) 命令。 “添加新块”(Add new block) 对话框随即打开。 单击“函数块 (FB)”(Function block (FB)) 按钮。 指定名称“FB_PrepareNextOrder”。 声明该块接口,如下所示: 声明全局变量“AllOrdersDone”: 编写以下程序代码: |
通过将当前冲孔作业细分成几个冲孔操作,为列表中的下一个作业做好了准备。冲孔机必须能够识别当前正在处理哪个冲孔作业。
创建一个 SCL 函数。 双击“添加新块”(Add new block) 命令。 “添加新块”(Add new block) 对话框随即打开。 单击“函数 (FC)”(Function (FC)) 按钮。 指定名称“FC_PrepareOrder”。 声明该块接口,如下所示: 编写以下程序代码: |
在 SCL 函数块“FB_PrepareNextOrder”中调用 SCL 函数“FC_PrepareOrder”
之后,在 OB1 中调用“FB_PrepareNextOrder”:
除了上述的操作方式之外,还通过在预定义作业中使用数据块“DB_OrderList”将作业加载到冲孔设备中,动态生成作业列表。此外,也可选择不同的作业列表。在执行一个作业列表后,再将新的作业列表加载到冲孔设备中。为此,需额外编写以下代码:
为函数块“FB_PrepareNextOrder”创建一个背景数据块。
“添加新块”(Add new block) 对话框随即打开。
单击“数据块 (DB)”(Data block (DB)) 按钮。
指定名称“DB_FB_PrepareNextOrder”。
选择数据块“FB_PrepareNextOrder”作为类型。
单击“确定”(OK)。
如需交换作业列表,则需额外创建一个 SCL 函数:
创建 STL函数“FC_SwapOrderList”。 声明该块接口,如下所示: 声明全局变量“NewModelNr”: 编写以下程序代码: |
创建数据块“DB_OrderRepository”:
“添加新块”(Add new block) 对话框随即打开。
单击“数据块 (DB)”(Data block (DB)) 按钮。
指定名称“DB_OrderRepository”。
选择“全局数据块”(Global DB) 作为该数据块的类型。
单击“确定”(OK)。
之后,在 OB1 中调用“FC_SwapOrderList”:
结果
以下示例说明了如何使用指令“DB_ANY_TO_VARIANT:将 DB_ANY 转换为 VARIANT”来确定数据块的 PLC 数据类型,以及如何据此选择和执行适当的函数。