信捷C语言POU的结构体

当我们的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是指针传递。

本篇就到这里,受本人水平所限,错漏之处请多包涵。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贰佰肆拾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值