SINT 或 INT 转换为 DINT
对于将 SINT 或 INT 值转换为 DINT 值的指令,操作数部分指明转换方法。
转换方法: | 具体处理方式: |
符号扩展 | 将最高有效位的值(值的符号位)放在现有位左侧的每一位,直至达到 32 位。 |
填零 | 在现有位左侧填零,直至达到 32 位。 |
以下示例显示使用符号扩展和填零方式转换某个值后所得的结果。
参数: | 2#1111_1111_1111_1111 | (-1) |
通过符号扩展转换为该值 | 2#1111_1111_1111_1111_1111_1111_1111_1111 | (-1) |
通过填零转换为该值 | 2#0000_0000_0000_0000_1111_1111_1111_1111 | (65535) |
由于立即数始终填零,因此 SINT 或 INT 值的转换可能会产生意外结果。在以下示例中,比较为 false,因为 Source A(一个 INT)通过符号扩展进行转换,而 Source B(一个立即数)会被填零。

如果在指令中使用 SINT 或 INT 标签和立即数,而该指令通过符号扩展方式进行数据转换,则应使用以下一种方法处理立即数:
以十进制基数形式指定立即数
如果输入基数形式而非十进制形式的值,应指定该立即数的全部 32 位。为此,应将最高有效位的值输入其左侧的每一位,直至达到 32 位。
为每个操作数创建一个标签,并在指令中使用相同的数据类型。要分配常数值,可采用两种方法:
- 将值输入一个标签
- 增加一个 MOV 指令,将值移动到一个标签中。
使用 MEQ 指令仅检查所需位
以下示例介绍两种混用立即数与 INT 标签的方法。在两个示例中,均通过检查 1771 I/O 模块的位,来确认是否使用了所有位。1771 I/O 模块的输入数据字为 INT 标签,因此最简单的方法是使用 16 位常数值
示例 1
混用 INT 标签与立即数。
由于 remote_rack_1:I.Data[0] 为 INT 标签,用于对照检查该标签的值也输入为 INT 标签。

示例 2
混用 INT 标签与立即数。
由于 remote_rack_1:I.Data[0] 为 INT 标签,用于对照检查该标签的值首先移至 int_0(同样为 INT 标签)中。随后,EQU 指令会对两个标签进行比较。

提供反馈