我做了合并,允许我使用与实或4字节相同的数据( profibus设备中的Module有4个字节寄存器来编写真正的浮点类型值)。
The union:
TYPE U_4Bytes2Real :
UNION
abDataBytes : ARRAY[0..3] OF BYTE;
rDataFloat : REAL;
END_UNION
END_TYPE
当我想像REAL一样访问这个变量时,我写到:
U_4Bytes2Real.rDataFloat
当我想像4字节数组一样访问这个变量时,我会写:
U_4Bytes2Real.abDataBytes
我想要一个函数,它得到实际值,在它里面,我想把它作为一个字节数组写入寄存器。
如何判断我的功能,那个论点是真实的?
我用的是这样的功能:
bFunResult := F_SetMod22(bDataGroup := 3, bChannel := 3, bDataFloat := 20.0, nTimeout := 100);
我会犯错误
Cannot convert type 'LREAL' to type 'U_4Bytes2Real'
我是否必须将它转换为函数,还是有方法在函数参数中使用并?
发布于 2022-09-26 20:59:35
回答
联合是一个具有共享数据空间的结构
这意味着你可以用一个STRUCT做任何事情,你可以用一个联盟做任何事情。是否用于方法、函数、功能块的输入/输出。
VAR
Data : U_4Bytes2Real;
END_VAR
F_Function( RealValue := Data.rDataFloat );
示例
非常简单的程序来演示这个原则。不管您使用的是UNION还是STRUCT,访问它们的方式完全相同。
TYPE st_Struct :
STRUCT
Value : REAL;
Packed : ARRAY [ 0..3 ] OF BYTE;
END_STRUCT
END_TYPE
TYPE u_Union :
UNION
Value : REAL;
Packed : ARRAY[0..3] OF BYTE;
END_UNION
END_TYPE
FUNCTION f_Sum : REAL
VAR_INPUT
A, B : REAL;
END_VAR
f_Sum := A + B;
PROGRAM MAIN
VAR
Str : st_Struct;
Uni : u_Union;
Result : REAL;
END_VAR
Result := f_Sum( Str.Value, Uni.Value );
发布于 2022-09-27 11:04:10
对于这个答案,我从你不完整的信息中推断:
声明假设
VAR
bFunResult : U_4Bytes2Real;
METHOD F_SetMod22 : LREAL
然后你可以写:
bFunResult.rDataFloat = TO_REAL(F_SetMod22(...));
以后再使用:
bFunResult.abDataBytes
但是!:
请注意,如果返回的LREAL不适合实的话,TO_REAL将切断信息。
发布于 2022-10-12 20:16:56
你对这个问题的问题和描述很差。但据我所知,下面是我可以提供的关于从实际值设置数组值的内容。
创建联合数据类型:
TYPE UnionType :
UNION
fReal : REAL;
arrBytes : ARRAY[0..3] OF BYTE;
END_UNION
END_TYPE
创建函数,该函数以输入为实并返回字节的ARRAY0 0..3:
// 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中的函数。对于输入,我们设置联合实值,并将结果返回给联合数组值的数组。要测试结果,我将设置指向联合数组变量的指针,并将值设置为真正的测试变量:
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:
负值测试现在:
我希望这能帮到你。如果这不是你所需要的,请提供更多关于这个问题的信息。
https://stackoverflow.com/questions/73853832
复制相似问题