指针和数组在PLC 数据传送逻辑中的应用
2023-09-27张新杰
张新杰
(上海振华重工(集团)股份有限公司,上海 200125)
在大型自动化生产线项目中,每个自动化工位之间和工位内部都会涉及到数据的存储、读写和传送问题。PLC 具有结构简单、编程方便、可靠性高等特点,在工业及生产过程中得到广泛应用[1]。但是PLC 常用的编程语言功能简单,无法实现复杂的控制逻辑和算法运算[1-2]。随着我国生产水平的不断发展与进步,传统工业制造对电气自动化控制也有了新的需求。信息技术与传统工业制造行业的结合是必然趋势[3],PLC对复杂的控制逻辑和算法运算的需求势必会日益增大。随着高级编程语言在PLC 中的应用日益普遍[4],研究在PLC 编程中应用高级编程语言具有重要的现实意义。
本文在PLC 编程中应用高级编程语言的数组和指针编程方式,用来解决实际控制逻辑中大量数据的传送问题。寄希望本文能起到抛砖引玉的效果,引起读者对PLC 编程中的高级编程语言学习的重视。
1 产线概述及工况分析
某大型剪叉自动焊接生产线项目中,由剪叉激光切割工位、剪叉人工组队工位、剪叉半成品板链线工位、剪叉自动焊接工位、搬运机器人、剪叉成品板链线工位、剪叉成品缓存工位和AGV 运输小车驻车工位组成。其中,剪叉成品缓存工位上游“联接”剪叉成品板链线工位和剪叉自动焊接工位,下游“衔接”AGV 运输小车。该剪叉成品缓存工位有伺服电机驱动的“桁架”,负责从板链线工位上抓取剪叉成品,经过RFID 识别后分别存放至剪叉成品缓存工位的缓存区域。根据剪叉成品不同的型号规格,缓存区域设置有20 个剪叉缓存位置;每个缓存位置可以叠放至8 层。同时,AGV 运输小车上有可以叠放8 层的10 个剪叉存放位置。“桁架”不仅负责从剪叉成品板链线工位抓取剪叉成品存放于剪叉缓存区域,同时也负责从剪叉缓存区域抓取剪叉成品至AGV 运输小车的剪叉存放位置。
在剪叉成品缓存工位中,有一个剪叉成品板链线取料点位置,一个桁架停车位;有20 个剪叉成品缓存区域位置以及10 个AGV 的剪叉存放位置,共计32 个位置点。每个位置点有4 个位置数据值需要存储,分别是:大车方向位置值(X 方向),小车方向位置值(Y 方向),起升方向位置值(Z 方向)及叠放层数的数值。综上,该工位仅存取位置值所需位置数据量已经多达128 个。而剪叉成品缓存工位能否正确运行的关键,取决于PLC 控制系统能否给到正确的大车方向、小车方向和起升方向的位置数据值至大车、小车和起升伺服控制器。剪叉成品缓存工位的总览图如图1 所示。
图1 剪叉成品缓存工位总览
2 数据传送逻辑分析和优化
2.1 数据传送逻辑分析
剪叉成品缓存工位一旦剪叉成品板链线位置、20个剪叉成品缓存区域以及AGV 停车位置确定,那么这32 个位置点相对于桁架的“零点”的数据值就会确定;这些数据值就是伺服控制器运行的目标值。
抛开其他的PLC 控制逻辑不谈,如果按照常规的PLC 编程方式把每个位置点的位置数据传送到伺服控制器,这就需要使用“MOVE”指令。把上述确定的位置数据值发送至伺服控制器,一个位置点需要使用4 次“MOVE”指令;32 个位置点需要使用128 次“MOVE”指令。编写完成这段数据传送逻辑后,会发现以下2 个问题。
2.1.1 数据传送逻辑篇幅冗长,不够简练
仅仅一个传送位置数据到伺服控制器的逻辑,就需要重复使用“MOVE”指令128 次。篇幅过长,增加查看逻辑、寻找故障上的困难。如果存储的位置点再增加的话,这段数据传送逻辑篇幅需要得更长。
2.1.2 数据传送逻辑修改不方便、易出错
现场调试阶段不确定因素较多,位置点的增加、减少或者调整的情况屡见不鲜。在这种情况下就会出现大量的逻辑增加、删除或者数据修改工作。稍有不慎,很容易出错;给调试工作带来诸多不便。对于大型复杂的控制系统,修改某一局部控制逻辑时,很可能会牵涉到整个系统的每个环节,给系统其他部分造成意料不到的影响[2]。
2.2 数据传送逻辑优化
常规的编程方式需要大量的重复使用“MOVE”指令,而且一旦修改或删除即有可能对整个控制系统造成严重的影响。能否简化仅使用一个“标识”就能同时发送多个数据呢?高级编程语言中的“指针”和“数组”不就是利用指针来传送数据的吗[5-6]?利用“指针和数组”的思维,重新梳理下位置数据传送的这段逻辑。
首先在PLC 控制程序中,建立4 个一维数组;分别对应32 个位置点大车方向位置值、小车方向位置值、起升方向位置值和叠放层数的数值。数组内的元素初步设定为40 个,从0~39;并规定板链线大车位置[0]作为板链线的位置数据值,板链线大车位置[1]~[20]作为存储区1 号至20 号位置数据,板链线大车位置[24]作为桁架停车位位置数据,板链线大车位置[25]~[34]作为AGV 存储区10 个位置值数据(板链线大车位置[21]~[23]和[35]~[39]作为备用)。将32 个位置点的大车方向位置值、小车方向位置值、起升方向位置值和叠放数量值分别填入对应的数据内,并把这些数据的属性设置为断电保持;防止这些位置数据值的丢失。
现在,只需要一个“指针”指向想要读取或者写入的位置数据即可;这样位置数据传送的这段逻辑就极大地简化。位置数据的修改只需要到相应的数组内修改即可。同时,位置点的数量也可以通过调整数组内元素的数量来调整。极大方便了现场的调试,也降低现场修改逻辑的工作量及发生错误的机率。
3 数据传送逻辑的实现
3.1 利用系统功能块实现数据传送逻辑
在西门子PLC 中,S1500 系列相对高等级的PLC中使用FileRead:读取域的功能块就可以实现上述功能。从该功能块的帮助文档中可以得知,INDEX 是要读取数据值的索引值,MEMBER 是要读取数据数组的第一个元素;而VALUE 则是读取到索引值对应数据值[7]。PLC 程序中读取桁架大车位置数据的程序逻辑,如图2所示。
图2 FileRead 读取域功能块
根据FileRead 读取域的帮助文档说明,当需要板链线大车方向位置数据时,只需要把INDEX 输入“指令变量”的值设置为0;VALUE 输出的值就把板链线大车位置值数组内第一个数值(板链线)自动传送到“自动运行大车目标值”的变量中。而当需要AGV 存储区10 号位置时,需要把“指令变量”的值设置为34 即可。这里的“指令变量”就类似高级编程语言中的“指针”,利用修改“指针”的数值,得到想要的数组内的数值[5-6]。
以此类推,利用FileRead 读取域的功能块同样可以很方便得到桁架所需要的小车方向位置数据、起升方向位置数据及叠放数量值,进行数据计算和下一步的逻辑处理。
3.2 编写程序块实现数据传送逻辑
如果PLC 中没有FileRead 读取域的系统功能块时,则可以利用“指针和数组”的编程方式编写功能块来实现相同的功能。在西门子PLC 中,使用高级编程语言SCL(结构化控制语言)编写相应程序逻辑就可以实现和FileRead 读取域系统功能块相同的功能。
首先是读取功能块输入的数据(整型数据的一维数组),把一维数组内的数据存入临时的一维数组内(Temp_Int_Arr)。利用Index_Data 的“指针”变量指向要读取的数据,并通过#Temp_REF_Data:= REF(#Temp_Int_Arr [#index_Data]) 以及#Int_DataOut:=#Temp_REF_ Data^;语句输出。功能块逻辑及功能对比测试左侧部分的控制逻辑,如图3 所示。
图3 功能块逻辑及功能对比测试
编写完成功能块后,在主程序中分别调用ArrayDataRead 功能块和FieldRead 系统功能块。在“指针”变量输入侧填入相同的变量(Pointer1),数据输入侧填入相同的一维数组(Test_DB.Test_Int_Data)。下载程序后运行并在线监控,从图3 功能块逻辑及功能对比测试的右侧部分可以看到,编写的ArrayDataRead 功能块和FieldRead 系统功能块运行输出的结果相同,证明编写的功能块ArrayDataRead 和系统功能块FieldRead 有相同的功能。
综上所述,无论是采用FieldRead 系统功能块还是使用自主编写的ArrayDataRead 功能块,都能极大地简化桁架位置数据传送的控制逻辑;降低桁架位置数据传送控制逻辑的编写量,使PLC 程序更易于查看、修改和故障排查。
4 “指针和数组”应用的拓展
无独有偶,在某项目设备的编码器参数传送逻辑中,同样也应用到“指针和数组”编程方式,实现了根据设备ID 进行编码器参数传动功能的逻辑。根据项目控制逻辑的需求,通过设备的ID 进行判断,从而传送出左右2 个不同的编码器参数并进行长度数据的运算。
首先,在PLC 中设置128 个整形量编码器参数的一维整型变量数组Paramter_Array;并根据需要设置相应的编码器参数(按照先右侧编码器参数后左侧编码器参数排列,共64 组)。然后,将设备的ID 作为“指针”进行转换并计算,把计算结果放入临时变量Temp 中;即Temp:=(Byte_To_Int(SP_ID)-1)*4;。紧接着获得一维数据的首地址ADR(Patameter_Array);那么右侧编码器参数数据的地址为Ptr:=ADR(Patameter_Array)+Temp;,左侧编码器参数数据的地址为Ptr1:=ADR(Patameter_Array)+Temp+2;。最后把左右两侧编码器的数参数据分别输出,即R_Encode_Para:=Ptr^;和L_Encode_Para:=Ptr1^;。这样就可以实现以设备的ID 作为“指针”;来获取对应的左右两侧编码器参数的功能。图4 为获取设备编码器参数图片内所示的控制逻辑。
图4 获取设备编码器参数
5 结束语
在PLC 控制逻辑中采用高级编程语言中的“指针和数组”编程方式,不仅顺利解决了剪叉成品缓存工位中桁架定位数据的存储和传送问题,以及实现用设备ID 选择编码器参数的功能,而且极大地简化数据传送的控制逻辑。增加了PLC 控制逻辑的可读性,降低桁架位置数据传送和编码器参数选择控制逻辑的编写量,使PLC 程序更易于查看、修改和故障排查。随着科学技术的不断进步,PLC 的控制系统将会日趋庞大和复杂;其势必会面临更为复杂的控制逻辑及算法计算。因此,对PLC 编程中高级编程语言的学习愈发紧迫和重要。