当我们的POU内出现结构体时,我们如何调用它呢?之前讲过FB内部的变量以及参数要使用self->来调用,以及其他的指针知识等,但是没细说原理。所以这篇简单梳理一下这块知识。我们先新建一个FB:
用户数据类型
Struct
{
A bool;
B bool;
} TestStruct;
参数区
VAR_INPUT VAR1 Bool//值传递
VAR_INOUT VAR2 TestStruct//指针传递
VAR VAR3 TestStruct//值
VAR_OUTPUT VAR4 Bool//值传递
函数区
void POU_1_BODY(POU_1* self)
{
#define SysRegAddr_HD_D_HM_M
if(self->VAR1)
{
self->VAR2->A = 0;
self->VAR3.A = 0;
self->VAR4 = 0;
}
}
观察这个默认名为POU_1的FB,可以看看到函数是void类型,参数是一个名为self的POU_1类型结构体指针。FB是什么名字,结构体就是什么名字,结构体指针命一直为self。我们在参数声明区定义的input,inout,output,var这些类型实际上都是定义在了以函数名来命名的结构体中,这个结构体定义了一个结构体指针,用来在pou中调用定义的参数。而在外面,在全局变量表中,以这个结构体定义了一个结构体数据,相当于在内存中为结构体分配了地址。说回FB,因为self是一个指针,所以我们用“->”操作符来访问其中的成员,例如self->VAR1,但是如果访问的成员也是结构体,那么就有区别了。(下面应该是信捷IDE的死格式,C语言里对于结构体指针有其他引用形式但是报错,所以以下面的为准。)
前面讲了,POU的INOUT类型都是指针传递,INPUT与OUTPUT是值传递,所以当结构体出现在数据位置或者INPUT位置,他就是一个数据对象,我们使用“.”符号访问目标结构体数据内的成员,例如self->VAR3.A。如果出现在INOUT位置,因为这个位置是指针,所以我们写在这两个位置的结构体就变成了结构体指针,那么我们访问其内部变量就要连用两个“->”操作符,例如self->VAR2->A,这样才能访问到目标对象。十分抱歉,上一篇关于FB与FC的传递类型是有错误的,这里修正一下,FB的INPUT、OUTPUT为值传递,INOUT是指针传递。FC的INPUT是值传递,INPUT与OUTPUT是指针传递。
本篇就到这里,受本人水平所限,错漏之处请多包涵。