Twincat 3:为数组位命名

问题描述

整个 PLC 方面的初学者,欢迎指正。

我正在整理我的项目,目前的情况是: 我从 modbus 接收 16 字节数组。它们充当按钮、灯、传送带,这是您在 Factory IO 中所拥有的。

GAB_FactoryIO_Inputs    AT %I*      :   ARRAY [0..15] OF BYTE;
GAB_FactoryIO_Outputs   AT %Q*      :   ARRAY [0..15] OF BYTE;

因此,我没有用它的位“IO.GAB_FactoryIO_Inputs[0].0”来指代“开始按钮”,而是做了一个笨拙的转换 POU 和 GVL 来遍历每一位并给它们一个新名称。所以它目前看起来像这样的 200 行:

IO.iSensor10_Capa   :=  IO.GAB_FactoryIO_Inputs[7].3;
IO.iSensor9_Capa    :=  IO.GAB_FactoryIO_Inputs[7].4;
IO.iPositioner_Limit    :=  IO.GAB_FactoryIO_Inputs[7].5;
IO.iPositioner_Clamped  :=  IO.GAB_FactoryIO_Inputs[7].6;
IO.iPick2_Detected  :=  IO.GAB_FactoryIO_Inputs[7].7;
IO.iPick2_MovX  :=  IO.GAB_FactoryIO_Inputs[8].0;
IO.iPick2_MovZ  :=  IO.GAB_FactoryIO_Inputs[8].1;
IO.iPick2_Rot   :=  IO.GAB_FactoryIO_Inputs[8].2;
IO.iPick2_GripRot   :=  IO.GAB_FactoryIO_Inputs[8].3;

还有这个

iPositioner_Limit   :   BOOL;
iPositioner_Clamped :   BOOL;
iPick2_Detected :   BOOL;
iPick2_MovX :   BOOL;
iPick2_MovZ :   BOOL;   
iPick2_Rot  :   BOOL;   
iPick2_GripRot  :   BOOL;   

一切正常,但我不禁感到它的业余、笨拙和拖慢速度。

我读过有关结构、枚举和别名的内容,并认为结构将是我的救星,将它们轻松地安排在“机柜”中,如下所示:

stCNC.Button1
stCNC.Button3
stCNC.Sensor1

隐藏在结构内部的是stCNC Sensor1 = IO.GAB_FactoryIO_Inputs[9].4之间的转换;

但由于某种原因,这根本不起作用。 我很可能是从完全错误的角度出发,但不知道接下来要寻找什么。


目前正在进行编辑工作。似乎我掌握了基础知识。 @kolyur 有足够简单的例子可以遵循,所以我从那里开始,并朝着@Steve 和@YAVA 的例子前进:

//sending inputs to GVL FactoryIO_Inputs AT %I* : ARRAY [0..15] OF BYTE;
fbMBReadInputs(pDestAddr := ADR(IO.FactoryIO_Inputs),//in GVL IO
FactoryIO_Inputs    AT %I*      :   U_UNION2;

//inside S_LIGHTS:
TYPE S_LIGHTS :
STRUCT
    LIGHT0  : BIT;
    LIGHT1  : BIT;
    LIGHT2  : BIT;
    LIGHT3  : BIT;
    LIGHT4  : BIT;
    LIGHT5  : BIT;
    LIGHT6  : BIT;
    LIGHT7  : BIT;
END_STRUCT
END_TYPE

//inside U_UNION1
TYPE U_UNION1 :
UNION
nArray :    ARRAY[0..15] OF BYTE;
sName :     S_NAME;

//Then instantiating in POU
VAR
sLights : S_LIGHTS;
---
sLights.LIGHT1 := TRUE;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)