首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数参数中使用Union的TwinCAT 3

函数参数中使用Union的TwinCAT 3
EN

Stack Overflow用户
提问于 2022-09-26 11:59:14
回答 3查看 106关注 0票数 0

我做了合并,允许我使用与实或4字节相同的数据( profibus设备中的Module有4个字节寄存器来编写真正的浮点类型值)。

代码语言:javascript
运行
复制
The union:
TYPE U_4Bytes2Real :
UNION
    abDataBytes     :       ARRAY[0..3] OF BYTE;
    rDataFloat      :       REAL;
END_UNION
END_TYPE

当我想像REAL一样访问这个变量时,我写到:

代码语言:javascript
运行
复制
U_4Bytes2Real.rDataFloat

当我想像4字节数组一样访问这个变量时,我会写:

代码语言:javascript
运行
复制
U_4Bytes2Real.abDataBytes

我想要一个函数,它得到实际值,在它里面,我想把它作为一个字节数组写入寄存器。

如何判断我的功能,那个论点是真实的?

我用的是这样的功能:

代码语言:javascript
运行
复制
bFunResult := F_SetMod22(bDataGroup := 3, bChannel := 3, bDataFloat := 20.0, nTimeout := 100);

我会犯错误

代码语言:javascript
运行
复制
Cannot convert type 'LREAL' to type 'U_4Bytes2Real'

我是否必须将它转换为函数,还是有方法在函数参数中使用并?

EN

回答 3

Stack Overflow用户

发布于 2022-09-26 20:59:35

回答

联合是一个具有共享数据空间的结构

这意味着你可以用一个STRUCT做任何事情,你可以用一个联盟做任何事情。是否用于方法、函数、功能块的输入/输出。

代码语言:javascript
运行
复制
VAR
   Data : U_4Bytes2Real;
END_VAR

 F_Function( RealValue := Data.rDataFloat );

示例

非常简单的程序来演示这个原则。不管您使用的是UNION还是STRUCT,访问它们的方式完全相同。

代码语言:javascript
运行
复制
TYPE st_Struct :
STRUCT
    Value                       : REAL;
    Packed                      : ARRAY [ 0..3 ] OF BYTE;    
END_STRUCT
END_TYPE
代码语言:javascript
运行
复制
TYPE u_Union :
UNION
    Value                       : REAL;
    Packed                      : ARRAY[0..3] OF BYTE;
END_UNION
END_TYPE
代码语言:javascript
运行
复制
FUNCTION f_Sum : REAL
VAR_INPUT
    A, B                        : REAL;
END_VAR 

f_Sum := A + B;
代码语言:javascript
运行
复制
PROGRAM MAIN
VAR
    Str                         : st_Struct;
    Uni                         : u_Union;
    Result                      : REAL;
END_VAR

Result := f_Sum( Str.Value, Uni.Value );
票数 0
EN

Stack Overflow用户

发布于 2022-09-27 11:04:10

对于这个答案,我从你不完整的信息中推断:

声明假设

代码语言:javascript
运行
复制
VAR
bFunResult : U_4Bytes2Real;


METHOD F_SetMod22 : LREAL

然后你可以写:

代码语言:javascript
运行
复制
bFunResult.rDataFloat = TO_REAL(F_SetMod22(...));

以后再使用:

代码语言:javascript
运行
复制
bFunResult.abDataBytes

但是!:

请注意,如果返回的LREAL不适合实的话,TO_REAL将切断信息。

票数 0
EN

Stack Overflow用户

发布于 2022-10-12 20:16:56

你对这个问题的问题和描述很差。但据我所知,下面是我可以提供的关于从实际值设置数组值的内容。

创建联合数据类型:

代码语言:javascript
运行
复制
TYPE UnionType :
UNION
    fReal       : REAL;
    arrBytes    : ARRAY[0..3] OF BYTE;
END_UNION
END_TYPE

创建函数,该函数以输入为实并返回字节的ARRAY0 0..3:

代码语言:javascript
运行
复制
// What is the purpose of this function, what does it return? 
FUNCTION F_SetMod22 : ARRAY[0..3] OF BYTE;
VAR_INPUT
    fValueIn    : REAL;
END_VAR
VAR
    arrResult   : ARRAY[0..3] OF BYTE;
END_VAR

// Simply copy and paste the memory from the source address to the target address
MEMCPY(srcAddr := ADR(fValueIn), destAddr := ADR(arrResult[0]), n := SIZEOF(arrResult));
F_SetMod22 := arrResult;

现在调用main中的函数。对于输入,我们设置联合实值,并将结果返回给联合数组值的数组。要测试结果,我将设置指向联合数组变量的指针,并将值设置为真正的测试变量:

代码语言:javascript
运行
复制
PROGRAM MAIN
VAR
    uniValues   : UnionType := (fReal := 30.0);
    fResultTest : REAL;
    pointerToReal   : POINTER TO REAL;
END_VAR

uniValues.arrBytes := F_SetMod22(fValueIn := uniValues.fReal);
pointerToReal := ADR(uniValues.arrBytes[0]);
fResultTest := pointerToReal^;

两个示例:将值199.99传递给函数。设置返回的数组,测试结果也是199.99:

负值测试现在:

我希望这能帮到你。如果这不是你所需要的,请提供更多关于这个问题的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73853832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档