如何在 Java 代码中接收 Simulink 常量值?
How to receive a Simulink constant value in Java code?
我在使用 "UDP Send" 块发送的 Simulink 模型中有一个常量值。有一个 Java 套接字程序可以在特定端口上侦听任何输入值。现在,我在 Java 代码中收到的值与从 Simulink 模块发送的值不同。例如,如果我从 Simulink 模型发送值 1,在 Java 代码中我收到 1072693248。
我使用 ByteBuffer.wrap(...) 将字节数组转换为整数。我在 Java 代码中有什么错误吗?
数字 1072693248 = 1023 * 2^20(或 1023 << 20 使用 Java 表示法)是您将表示 1.0 的双精度数的 32 位作为整数处理时得到的结果。要获得此值,如果数字以大端方式存储,则需要采用 first 32 位,如果数字以大端方式存储,则需要采用 last 32 位以小端方式存储。有关此示例,请参阅 this question - 我认为这是小端版本。
所以问题是由 Simulink 在您的 Java 代码需要整数时发送双精度值引起的。这很容易意外发生,因为 Simulink 和 MATLAB 通常将数字视为双精度数,除非您另有说明。假设您确实想要发送 32 位整数,最简单的解决方法是更新 Constant 块的设置。您可以从模块参数对话框的 Signal Attributes 选项卡中明确设置输出数据类型,或者将该设置保留为 "Inherit from Constant Value" 并将值本身从“1”更改为例如"int32(1)".
我在使用 "UDP Send" 块发送的 Simulink 模型中有一个常量值。有一个 Java 套接字程序可以在特定端口上侦听任何输入值。现在,我在 Java 代码中收到的值与从 Simulink 模块发送的值不同。例如,如果我从 Simulink 模型发送值 1,在 Java 代码中我收到 1072693248。
我使用 ByteBuffer.wrap(...) 将字节数组转换为整数。我在 Java 代码中有什么错误吗?
数字 1072693248 = 1023 * 2^20(或 1023 << 20 使用 Java 表示法)是您将表示 1.0 的双精度数的 32 位作为整数处理时得到的结果。要获得此值,如果数字以大端方式存储,则需要采用 first 32 位,如果数字以大端方式存储,则需要采用 last 32 位以小端方式存储。有关此示例,请参阅 this question - 我认为这是小端版本。
所以问题是由 Simulink 在您的 Java 代码需要整数时发送双精度值引起的。这很容易意外发生,因为 Simulink 和 MATLAB 通常将数字视为双精度数,除非您另有说明。假设您确实想要发送 32 位整数,最简单的解决方法是更新 Constant 块的设置。您可以从模块参数对话框的 Signal Attributes 选项卡中明确设置输出数据类型,或者将该设置保留为 "Inherit from Constant Value" 并将值本身从“1”更改为例如"int32(1)".