3.2 程序组织单元
程序组织单元(Program Organization Unit,POU)是IEC 61131-3用户程序执行模型里定义的一个单元。一个POU包括一个本地变量表和一个算法(也就是一系列编码或逻辑),它是构成用户程序的基本单元。NJ系列CPU单元里运行的用户程序是由POU组合而成的。
POU按功能分为程序、功能块和功能。POU的标准部分(如标准功能块、标准功能等)由控制器制造商提供。用户根据POU的定义设计用户程序的POU,对POU调用和执行。
图3-23 层次关系
一个程序对应一个主路径,这是形成算法的POU的主要类型。可以将任何指令、功能、或功能块放置到程序算法中。
功能块可以输出不同的值,即使有相同的输入。功能块可以被程序或另一个功能块调用。
在相同的输入下,功能总是输出相同的值。功能可以被程序、另一个功能或功能块调用。
POU由这三种单元组合而成,可以生成许多POU。程序要分配给任务才能执行。
程序、功能块、功能与任务的层次关系如图3-23所示。
3.2.1 程序
程序由本地变量表和算法组成。在程序的算法里,可以使用任何功能块和功能。不能从其他POU中调用程序。当程序所在的任务执行时,程序才能执行。一个任务可以分配128个程序。
图3-24所示为程序结构。
在任务里,为所有的程序设置执行顺序。在Sysmac Studio“任务设置”下的“程序分配设置”指定这个顺序。
所有的程序在本地变量(也就是内部变量)中有下面3个系统定义的变量。
图3-24 程序结构
PFirstRunMode:第一次运行周期标志,BOOL型,只读。从PROGRAM模式转为RUN模式时,当CPU单元开始运行,只在第一次运行周期为TRUE,其他运行周期为FALSE,通常使用这个标志完成初始化处理。
PPRGER:指令错误标志,BOOL型,可读可写。当出现指令错误时,变为TRUE并保持。当这个标志变为TRUE时,一直保持直到程序将它变为FALSE。
PCY:进位标志,BOOL型,只读。某些指令可以修改这个标志。
3.2.2 功能块
功能块作为一种程序组织单元,需要设置名称,而且不同的功能块要设置不同的名称。功能块具有静态变量(即具有记忆功能),要占用内存区。当需要对一些状态进行记忆,比如定时器、计数器指令,则使用功能块。功能块的输出与内部变量和外部变量的状态有关,因此,即使相同的输入也能产生不同的输出结果。
功能块分为标准功能块和用户定义功能块。标准功能块由系统预先定义,可由其他功能块和程序调用。用户定义功能块则由用户根据需要自行创建,可以像标准功能块一样使用。
1.功能块结构
功能块可以用梯形图或ST来表示。在梯形图中,功能块用一个方框来表示,图3-25所示为梯形图表示的一个功能块。
功能块结构如图3-26所示。
图3-25 梯形图表示的一个功能块
图3-26 功能块结构
功能块定义由本地变量表和算法组成,如图3-27所示。
功能块各组成部分说明如下:
(1)功能块名称或指令名称
生成功能块时,在功能块定义时,分配的功能块名称或指令名称
(2)例程名称
给程序中的功能块例程一个例程名称,以便能够管理它。
(3)算法
可以用梯形图或ST编写一个算法。在算法中,可以使用任何指令、用户定义的功能,或用户定义的功能块。
(4)本地变量表
本地变量表用来定义输入变量、输出变量、输入-输出变量、内部变量和外部变量。
(5)参数
输入变量的输入参数:当功能块执行开始时,输入参数把值传给功能块中的输入变量。输入参数可以是一个变量或常数。
图3-27 功能块定义
输出变量的输出参数:当功能块执行完毕后,输出参数接收功能块中输出变量的值。
输入-输出变量共享的输入-输出参数:在功能块中改变输入-输出参数的值,同一参数既可以用作输入也可以用作输出。
2.功能块变量的指定
功能块变量的指定如图3-28所示。
图3-28 功能块变量的指定
功能块变量的说明见表3-8。
表3-8 功能块变量的说明
(续)
3.功能块调用
功能块既可用梯形图,也可用ST调用。
从ST调用功能块的方法如下
输入赋值使用“:=”;输出赋值使用“=>”;输入-输出赋值时两种都可以用,一般用“:=”。
图3-29 所示为从POU调用功能块的梯形图。
ABC:功能块例程名称。
A和B:功能块的输入或输入-输出变量名称。
x1和x2:调用功能块的POU的输入或输入-输出参数。
C:功能块的输出变量。
y1:调用功能块的POU的输出参数。
用ST调用功能块的方法有两种。
1)给出功能块的变量名程和调用功能块的POU的参数名程
ABC(A:=x1,B:=x2,C=>y1);
●括号内参数和返回值的顺序任意。
●可以省略输入变量的名称和输入参数名称。如果省略这些名称,上一次调用时分配给输入变量的值又被分配给输入变量。如果第一次调用功能块,输入变量置为它们的初始值。
●可以省略输出变量的名称和输出参数名称。如果它们被省略,输出变量的值不被分配。
图3-29 从POU调用功能块的梯形图
2)省略功能块的变量名称,给出调用功能块的POU的参数名称
ABC(x1,x2,y1);
参数的顺序基于功能块定义。顺序与功能块本地变量定义相同,从顶部到底部。
ST调用功能块的各种方式见表3-9。
表3-9 ST调用功能块的各种方式
图3-30所示为调用功能块的梯形图。
用ST调用此功能块,两种编写方法如下。
方法1:
方法2:
图3-30 调用功能块的梯形图
4.功能块的创建
除了系统提供的标准功能块外,用户可以创建自定义的功能块,由程序或其他功能块来调用。
下面创建一个时钟脉冲发生器的功能块,输入参数为接通时间和断开时间,根据输入参数输出不同占空比的脉冲。
操作步骤如下:
1)如图3-31所示,右击多视图浏览器中“编程-POUs-程序”下的“功能块”,从菜单中选择“添加-梯形图”,会默认生成一个叫做功能块0的功能块,如图3-32所示。功能块可以用梯形图或ST来编写,这里选用梯形图。
图3-31 添加功能块
图3-32 生成功能块0
2)双击功能块0,进入编程界面,上半部为变量表,有“内部”、“输入/输出”“外部”3个变量表,如图3-33所示。
在内部变量表添加两个BOOL变量a和b,如图3-34所示。在输入/输出变量表添加timeon、timeoff、pulse、in 4个变量,如图3-35所示。
3)在功能块0的编程界面输入梯形图,如图3-36所示。
BOOL变量in为控制输入,控制时钟脉冲的启动/停止。
这样就创建了一个自定义功能块。
图3-33 功能块0编程界面
图3-34 内部变量表
图3-35 输入/输出变量表
图3-36 功能块0的梯形图
创建自定义功能块后,就可以在编程时调用它。现在回到主程序下,对内部变量进行定义,如图3-37所示。
图3-37 程序中内部变量定义
输入调用功能块的梯形图程序,输入到功能块时,键入“功”,就发现刚才定义的功能块0已经存在了,如图3-38所示。
完整的调用功能块梯形图如图3-39所示。
timeondata、timeoffdata和start为功能块的输入参数,testp为输出参数。其中,timeondata为脉冲ON的时间,timeoffdata为脉冲OFF的时间,start控制脉冲发生器的启动或停止,testp为脉冲发生器的输出。
timeondata、timeoffdata的初值设为10,这是个振荡周期2s的时钟脉冲,开1s关1s,在线仿真调试后,如图3-40所示。
可以通过更改timeondata、timeoffdata的值,改变脉冲的占空比。在监视选项卡中修改,如图3-41所示,以上两个参数改为30、10后,就变成一个4s周期的脉冲信号,其中导通3s、关断1s。
图3-38 输入功能块0
图3-39 调用功能块梯形图
图3-40 仿真调试
图3-41 结果显示
3.2.3 功能
功能(FUN)也是一种程序组织单元,但与功能块不同,功能不需要设置名称,因此输入简单。功能没有静态变量,即没有记忆,不占用内存,当只需要简单的操作运算不需要对状态进行记忆的时候使用功能。功能一般只要输入相同的值就会输出一样的结果。
功能分为标准功能和用户定义功能。标准功能由系统预先定义,可由其他功能、功能块和程序调用。用户定义功能由用户根据需要自行创建,可以像标准功能一样使用。
图3-42 梯形图表示的一个功能
图3-43 功能结构
图3-44 功能定义
1.功能结构
功能可以用梯形图或ST来表示。在梯形图中,功能表示为一个方框,图3-42所示为梯形图表示的一个功能。
功能结构如图3-43所示。
功能定义由本地变量表和算法组成,如图3-44所示。
功能各组成部分说明如下:
(1)功能名称或指令名称
生成功能时,在功能定义中分配功能名称或指令名称。
(2)例程名称
功能没有例称名称。
(3)算法
可以使用梯形图或ST为算法编程。在功能的算法里,可以使用任何指令、功能或用户定义的功能。不能使用任何FB指令或用户定义的功能块。也不能使用微分指令,例如,RTRIG或UP。
(4)本地变量表
本地变量表用来定义输入变量、输出变量、输入-输出变量、内部变量和外部变量。
(5)参数
输入变量的输入参数:当功能执行开始时,输入参数把值传给功能中的输入变量,输入参数可以是一个变量或常数。
输出变量的输出参数:当功能执行完毕后,输出参数接收功能中输出变量的值。
输入-输出变量共享的输入-输出参数:输入-输出参数的值在功能内改变,同一变量既用在输入也用在输出。
2.功能变量的指定
功能变量的指定如图3-45所示。
图3-45 功能变量的指定
功能变量的说明见表3-10。
表3-10 功能变量的说明
(续)
3.功能调用
功能既可用梯形图,也可用ST调用。
从ST调用功能的方法如下
图3-46 用梯形图调用功能
图3-46 所示为用梯形图调用功能。
MyFUN:功能名称。
x0:设定是否调用功能。
A和B:功能的输入变量名称。
x1和x2:功能的输入参数。
C:功能的输出变量。
y1:功能返回值的存储位置。
y2:功能的输出参数。
用ST调用功能的方法有两种。
1)给出功能的变量名程和调用功能的POU的参数名程
IF(x0=TRUE)THEN
y1:=MyFUN(A:=x1,B:=X2,C=>y2);
ENDIF
●参数的顺序任意。
●可以省略输入变量的名称和输入参数名称。如果省略这些名称,输入变量置为它们的初始值。
●也可以省略EN,如果省略,EN分配的值为TRUE。
2)省略功能的变量名称,给出调用功能的POU的参数名称
IF(x0=TRUE)THEN
Y1:=MyFUN(x1,x2,y2);
ENDIF
参数的顺序基于功能块定义。顺序与功能块本地变量定义相同,从顶部到底部。
ST调用功能的各种方式见表3-11。
表3-11 ST调用功能的各种方式
图3-47 所示为梯形图调用功能。
图3-47 梯形图调用功能
用ST调用此功能,两种编写方法如下。
方法1:
方法2:
4.功能的创建
除了系统提供的标准功能外,用户可以创建自定义的功能,用户定义的功能同样可由程序、功能块、功能来调用。
图3-48 添加功能
图3-49 生成功能0
下面创建一个用户定义功能,将角度转换为弧度,输入参数为角度数,输出参数为弧度数。
操作步骤如下:
1)如图3-48所示,右击多视图浏览器中“编程-POUs”下的“功能”,从菜单中选择“添加-梯形图”,会默认生成一个叫功能0的功能,如图3-49所示。功能可以用梯形图或ST来编写,这里选用梯形图。
2)双击功能0,进入编程界面,如图3-50所示,上半部为变量表,有“内部”、“输入/输出”、“外部”和“返回值”4个变量表。
在内部变量表添加一个LREAL变量internals1,如图3-51所示。在输入/输出变量表添加两个LREAL变量deg和rag,deg为输入变量,rag为输出变量,如图3-52所示。
图3-50 功能0编程界面
图3-51 内部变量表
图3-52 输入/输出变量表
3)在功能0的编程界面输入梯形图,如图3-53所示。
这样就创建了一个用户定义功能。
创建自定义功能后,就可以在编程时调用它。现在回到主程序下,对内部变量进行定义,如图3-54所示。
图3-53 功能0编程
编写调用功能的梯形图程序,当输入到功能时,键入“功”,就发现刚才定义的功能0已经存在了,如图3-55所示。
完整的调用功能的梯形图如图3-56所示。
degtest为角度,是功能的输入参数。radtest为弧度,是功能的输出参数。
开始仿真测试,对a选择设置,如图3-57所示。
图3-54 程序中内部变量定义
图3-55 输入功能0
图3-56 调用功能的梯形图
图3-57 仿真测试
如图3-58所示,对degtest输入180,则radtest为3.141592,结果正确。
图3-58 显示结果