如何理解位数组中哪些位被设置为1

2024-09-30 18:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python连接到一个PLC。此PLC以8位表示形式给出报警条件。例如:

0110 0010
  • bit 0=灯开/关
  • bit 1=风扇开/关
  • bit 2=报警开/关
  • bit 3=门开/关
  • 。。。你知道吗

每一位都告诉我们不同的情况。你知道吗

我想创建一个条件列表并将它们打印在一起,比如:门开着,警报器关着,灯关着等等。。你知道吗

在上面的例子中有三种不同的情况。我想把它们展示在一起,它们可以是10。如何将故障/状况与位关联?你知道吗


Tags: 报警列表bit情况条件形式例子plc
2条回答

有更优雅的方法,但这会让你走:

s = ''
if value & 1:
    s += "lights on"
else:
    s += "lights off"

if value & 2:
    s += ", fan on"
else:
    s += ", fan off"

if value & 4:
    s += ", alarm on"
else:
    s += ", alarm off"

if value & 8:
    s += ", door on"  #?  "door open"?
else:
    s += ", door off"

对于这些类型的任务,我喜欢用映射到nice文本表示的位建立一个字典。因为Python支持二进制文本,所以它可以很好地自我记录。。。你知道吗

比如:

status_lookup = { 0b00000001 : "Lights",
                  0b00000010 : "Fan",
                  0b00000100 : "Alarm",
                  0b00001000 : "Door"}

如果您想要当前“开启”状态的列表:

bits = 0x0a # or whatever your input value was
currently_on = [status_lookup[i] for i in status_lookup if i & bits]

如果要将它们连接成一个字符串:

print("; ".join(currently_on))

另外,如果您使用的是Python 3.4+,则可以使用新的enum模块执行类似的操作:

from enum import IntEnum

class Status(IntEnum):
    Lights = 0b00000001
    Fan = 0b00000010
    Alarm = 0b00000100
    Door = 0b00001000

bits = 0x0a
currently_on = [x for x in Status if x & bits]

相关问题 更多 >