合信论坛

快捷导航
查看: 584|回复: 0

读取一个字里面指定的位的状态

[复制链接]

18

主题

18

帖子

1226

积分

高级会员

Rank: 3Rank: 3

积分
1226
发表于 2025-10-13 11:33:13 | 显示全部楼层 |阅读模式
CODESYS的读取一个字里面指定的位的状态的一种方式
1、封装功能块代码
FUNCTION ReadWordBit : BOOL  // 函数返回值:读取到的位状态(TRUE=1,FALSE=0)
VAR_INPUT
    TargetWord : WORD;       // 输入1:要读取的“目标字”(16位,对应位0~15)
    BitNumber  : BYTE RANGE 0..15;  // 输入2:要读取的“位号”(强制限制0~15,避免越界)
END_VAR
VAR_TEMP
    Mask : WORD;  // 临时变量:位掩码(用于定位指定位)
END_VAR

// 核心逻辑:1. 生成“指定位为1、其他位为0”的掩码;2. 与目标字做“与运算”,判断结果是否非0
Mask := 16#0001 SHL BitNumber;  // 位1(16#0001)左移N位,生成对应位的掩码(如Bit3→16#0008)
ReadWordBit := (TargetWord AND Mask) <> 16#0000;  // 与运算后非0 → 该位为1(TRUE),否则为0(FALSE)
END_FUNCTION
2、使用实例
PROGRAM MAIN
VAR
    MyWord     : WORD := 16#1234;  // 示例:要读取的目标字(16#1234 = 二进制 0001 0010 0011 0010)
    BitToRead  : BYTE := 6;        // 示例:要读取的位号(这里读“位6”,二进制第7位,从0开始数)
    BitStatus  : BOOL;             // 存储读取到的位状态(最终结果)
END_VAR

// 调用位读取函数,获取“ MyWord 的 BitToRead 位”状态
BitStatus := ReadWordBit(TargetWord := MyWord, BitNumber := BitToRead);

// (可选)直观验证:直接通过“字.位号”语法读取(CODESYS原生支持,适合固定位号)
// BitStatus := MyWord.6;  // 与上述函数调用结果完全一致(16#1234的位6为1 → TRUE)

3、关键说明
1. 位号规则:CODESYS 中 WORD 类型默认是 16位,位号从 0(最低位/LSB) 到 15(最高位/MSB)(如 16#0001 是位0,16#8000 是位15)。

2. 越界保护:函数中  BitNumber  加了  RANGE 0..15  限制,强制位号在合法范围,避免因输入错误(如位16)导致逻辑错误。

3. 核心原理:通过  SHL (左移)生成“掩码”(只让目标位为1),再用  AND (与运算)过滤目标字——只有目标位为1时,运算结果才非0,最终转化为布尔状态。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2026-1-10 01:12 , Processed in 0.158927 second(s), 23 queries .

快速回复 返回顶部 返回列表