前已介绍了简单线性链表用于顺序控制的算法。以下将介绍这个算法的实现及应用实例。同时还将介绍带分支的算法及其实现。
1.简单线性链表程序实现及实例
(1)用间接地址程序实现。图2-102所示为欧姆龙、西门子及三菱PLC间接地址实现的控制程序。与图2-96程序不同的是,它不用计数器,而增加一个标号设定与链接数据。其反馈输入用“计算输入”处理,其他的处理也与图2-96程序相同。
图2-102a为欧姆龙PLC程序。这里每次(也可与图2-102b类似只在初始化时读取一次)总是先读取所存放的,设定输入、设定输出及设定标号的DM区的初始地址,继而与标号(inDx)相加得到指向设定数据的指针值,最后用指针值作为地址读取设定值。
图2-102b为西门子PLC程序。它先用仅在初始工作ON一个周期的SM0.0特殊继电器,读取所存放的设定输入、设定输出及设定标号的数据的初始字节地址,继而与标号相加得到指向设定数据的指针值,最后用指针值作为地址读取设定值。
图2-102c为三菱PLC程序。它用变址器处理间接地址,直接用inDx与初始地址合用,不必单独读取初始地址。
执行上述程序,当计算输入与设定输入一致,则把该数表的标号传送给下标(inDx),产生新的输出、输入及标号数据,进而进行新的控制。这样一步步推进,直到新的标号为0,说明控制已完成(工作完成ON),结束本循环。如设置为自动工作(自动ON),则又重新开始新的循环,否则,工作停止。程序复原。
要提及的是,西门子地址是按字节分配的。而这里用的设定输入、输出为字,所以其标号设定应按双字节编排。而标号为双字,故标号赋值给Indx后,要自加一次。这相当于按4字节编排。
(2)用数组或结构数组程序实现
首先,要定义一个结构(STRUCT)。以和利时PLC为例为
再就是,声明所使用的变量。最主要的是声明一个结构数组“kz”。
其他PLC类似也做以上结构与变量或标签定义。具体略。
图2-103所示为这个算法实现的多个品牌PLC梯形图程序。本程序除了用结构数组代替间接寻址,也与图2-97程序一样,把输入分为ON有效输入及OFF有效输入,分别用2个数组设定,而不用“计算输入”处理。
图2-102 间接地址实现线性数表控制程序
图2-103 实现线性链表算法梯形图程序
图2-103a为和利时PLC程序。其第1、2节为工作控制及生成虚拟输出。节3为ON与OFF虚拟输入与设定值比较。如果比较不一致,则继续实施原标号指向的数据控制。如果结果一致,则ON_wfsh及OFF_wfsh均ON,说明反馈输入完成。之后将在节4把新的标号赋值给下标(inDx),进而生成新的控制输出、反馈输入等数据,以实现进一步控制。而如果新的下标值为0,说明整个控制完成,则wF(工作完成)ON,与以前混合控制介绍的一样,视自动工作(Auto)ON否,或重新开始新的循环,或停止工作。执行节5,将使程序复原。
图2-103b为AB PLC程序。它的梯级从0开始,其0~4与和利时的1~5对应。1、2节为工作控制及生成虚拟输出。图2-103c为施耐德PLC程序,与图2-103a也类似。图2-103d为三菱PLC程序,使用它的DX work2软件编写的,大体也类似。
图2-104所示为欧姆龙PLC程序。因为它不能定义结构以及数组的下标也不能用变量访问,所以只能沿用图2-97的办法,用定义一个数组功能块处理。这里不用结构,只是分别定义多个数组,而不是定义含有多个成分的一个数组结构,本质上是相同的。
从图2-104可知,它不用计数器,而多了一个标号数组。用它指向次一步要使用的控制以及反馈数据。本程序定义的功能块除了定义变量,要有4个语句,即
其功能也是根据下标变量转换为设定控制输出、设定ON反馈输入及设定OFF反馈输入。但增加一个标号输出。功能块定义有内部、输入、输出及标号4种变量。内部变量为AT(与地址关联)变量,直接可访问实际数组所使用的地址,见表2-30。
输入变量idd,为功能块读取的下标(inDx)值。输出变量见表2-31。用以输出设定控制输出、设定ON反馈输入、设定OFF反馈输入及设定标号。
表2-30 内部变量
表2-31 输出变量
调用此功能块(该程序使用名称为mm)后,这里yOO、xON、xOFF及n实际即为sdOut[indx]、sdONin[indx]、sdOFFin[indx]及n[inDx]。它的梯级从0开始,而不是和利时从1开始。其他说明略。
提示:欧姆龙PLC新推出的CJ2系列,梯形图语言也可用下标变量访问数组。可不必使用这里的功能块。
(3)应用实例。本例与本章2.3.4节例3相同。
对比混合控制应用例2,本例所用的控制逻辑为线性链接数表,要用设定标号替代计数器,所以,要在结构数组中增加有关标号的设定。其他的,如有关ON及OFF输入、输出设定,以及实际ON及OFF输入、输出到虚拟ON及OFF输入、输出转换程序则完全相同的。这个标号数组设定见表2-32。
图2-104 欧姆龙PLC实现线性链表算法梯形图程序
这样,只要运行图2-103及图2-99程序,也完全可实现所要求的控制。
表2-32 标号数组设定
2.分支线形链表程算法要点及程序实现
(1)算法要点。图2-105所示为线形链表算法的框图。
从图中可知,启动之后,启用链表中标号0的数据。用它的指向,生成设定输出,再由设定输出产生虚拟输出,进而通过逻辑转换变为实际输出,以进行对系统第一步控制。
图2-105 分支线形链表算法的框图(www.daowen.com)
之后等待控制效果的反馈。过程是,先把判断设定输入1或2各是否为0。哪个为0,则退出输入判断。如都不为0,则可都参与输入判断。之后将根据虚拟输入结果选定哪个的设定标号作为下一步的控制数据。进而生成分支。
这个过程重复进行,直到次一标号为0,或2个输入设定均为0(该图未画出),则过程结束(停止),完成整个的顺序控制。
可知,这里实现分支顺序控制的算法很简洁。
(2)程序实现。可以用间接地址实现,也可用数组实现。
1)间接地址实现。图2-106~图2-108分别为西门子及三菱PLC的相关程序。用的都是间接地址。但方法各不相同。欧姆龙PLC用DM指针的值作为间接访问DM区。西门子用软元件(这里用数据区D)的实际地址访问。三菱用变址器与D存储器配合使用,也很简便。各个程序都有8个梯级(西门子多一个读取软原件实际地址的梯级)。
第1个梯级都是初始化,只要“工作”OFF,而“工作完成”又处ON状态,将复位。这是因为这个程序的“工作完成”是多输出,只好用置位置ON。
第2梯级为工作起停。
图2-106 欧姆龙PLC间接地址实现线性数表分支控制程序
第3梯级西门子程序为读取软元件实际首地址的程序,其他的为确定设定输出间接地址并生成虚拟输出。西门子程序的这个功能在梯级4实现。
第4梯级(西门子为第5,以下也都是相差的一个梯级)为确定设定ON、OFF输入1间接地址,生成设定输入值,并检查是否为0。如有一不为0,则进一步与相应虚拟输入做“与”运算,再进行比较。如比较相等,则分别使“ON_wfsh1”及“OFF_wfsh1”ON。
第5梯级与第4梯级相似,但针对设定ON、OFF输入2而言,分别确定“ON_wfsh2”及“OFF_wfsh2”是否ON。
图2-107 西门子PLC间接地址实现线性数表分支控制程序
第6、7梯级,根据“ON_wfsh1”、“OFF_wfsh1”ON、“ON_wfsh2”及“OFF_wfsh2”ON的情况,确定次一设定标号赋值,进而生成控制分支。但如赋给指针(inDx)的值为0,则把“工作完成”置位。要说明的是,西门子设定PLC标号是双字的,其取值前要对inDx值乘2,即这里用inDx自加一次。
图2-108 三菱PLC间接地址实现线性数表分支控制程序
第8梯级根据“工作完成”置位与否,如不是自动工作,则将在第2梯级停止工作,如自动工作,又可重新开始新的循环。当然,这里未工作时指针及设定输出置为0也是程序初始化的需要,以避免出现“指针”值及设定输出值不确定可能出现的问题。
2)数组实现。以下先对和利时PLC做说明。它先声明一个结构,即
再对变量做声明,即
梯形图程序如图2-109所示。
图2-109a为和利时PLC程序。其中节1为复位程序。只要work OFF,而wF又为ON,则自身复位。
节2为起、保、停逻辑,用以起动work ON。
节3为生成虚拟控制输出。
节4为判定设定输入ON、OFF输入1及2是否都为0。哪个不都为0,则分别在第5、6节进行输入比较。如全为0则在第9节使wF(工作完成)置位,标志着控制完成。
节5、6先对设定ON、OFF输入与虚拟ON、OFF输出做“与运算”,其结果再与虚拟输入比较。如相等分别将使“ON_wfsh1”、“OFF_wfsh1”ON、“ON_wfsh2”及“OFF_wfsh2”置位。
节7、8根据以上比较结果,决定对指针(inDx)赋值,确定次一步骤要传递的标号。并判断新赋值的指针是否为0。
节10视Auto(自动)是否置位,决定work(工作)复位还是开始新的循环。同时它还在程序起动时,可对指针及虚拟输出做正确的初始化赋值。
图2-109b为AB PLC程序。其标签定义与和利时相同。程序也是10个梯级。含义也类似。具体不再重复解释。
图2-109c为施耐德PLC程序。它的梯级1、2、3同和利时PLC。梯级4、5同和利时PLC的4。梯级6、7同和利时PLC的5。梯级8、9同和利时PLC的6。梯级9、10同和利时PLC的7、8。梯级11、12同和利时PLC的9、10。含意完全相同。这么处理只是画图的原因。
(3)应用
本例用两组单按钮起停控制。按钮为A、A1,以分别控制Out、Out1起停。其实际输入、输出与虚拟输入、输出转换程序如图2-110所示。
其数据设定及其分支实现如图2-111所示。
从图2-111可知,开始时,处状态0。这时有两个可能:按钮A1或A2一按一松。如前者则输出为1,即OUT1 ON,并进入状态2;否则输出为2,即OUT2 ON,并进入状态5。进入状态2又有两个可能:按钮A1或A2一按一松。如前者则输出为0,即OUT1 OFF,回到状态0;否则为输出为3,即OUT1、OUT2同时ON,并进入状态8。进入状态5也有两个可能……以下进程读者可以自行分析,这里不再赘述。要提及的是这里的状态0、2等实际就是次一标号。有关这些标号的相关参数设定,以和利时PLC为例,如图2-112所示。
西门子PLC的设定要麻烦一些。这是因为它的软元件地址以字节计,而实际使用的虚拟输入输出为字,标号及地址为双字(标号可以为字或字节,但运算时要转换)。所以本例设定值应为表2-33所示。
表2-33 西门子PLC线性数表分支控制数据设定
运行任一上述分支控制程序及转换程序,加上数据设定。即可实现本例要求。当然,独立用两个单按钮分别控制两组起停逻辑是很简单的。本例只是用以说明本分支控制的可能应用。
图2-109 三个品牌PLC实现分支线性链表算法梯形图程序
图2-110 分支线性数表程序实现实例
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。