首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pymodbus:如何读取此输入寄存器的各个位?

Pymodbus:如何读取此输入寄存器的各个位?
EN

Stack Overflow用户
提问于 2017-06-25 19:52:05
回答 1查看 1.9K关注 0票数 2

我有一个太阳能项目和实时监测,其中使用EpSolar跟踪器充电控制器,和树莓派读取能源数据通过MODBUS。

当输入寄存器是简单的整数时,我可以很容易地读取它们,如下所示-

代码语言:javascript
运行
复制
# Request the range of registers that hold the solar/battery realtime data (3100 - 3105)
result = client.read_input_registers(0x3100,6,unit=1)

# Solar voltage is register 3100, divide by 100
sV = float(result.registers[0] / 100.0)

..but我在理解如何读取输入寄存器时遇到了问题,在输入寄存器中,每个单独的位代表不同的东西。特别是,我想读取一个‘充电状态’寄存器,它保存了12条不同的信息-

当我读取该寄存器(0x3201)时,我得到的只是数字7。如何读取该寄存器中的12个不同数据段?我认为7可能是0000000000000111的十进制表示-但我不认为这是正确的。

在这方面的任何帮助都将不胜感激!

哑光

EN

回答 1

Stack Overflow用户

发布于 2017-06-25 20:11:20

你在正确的轨道上。而且很容易就能把这些东西拿出来。下面是操作步骤:

代码语言:javascript
运行
复制
16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
                                           1  1  1

顶行是位的位置,底行是值7……假设你对第二位感兴趣,也就是右数第三位。让我们通过获取1并将其在n时间上移位来为该位创建位掩码,其中n是位位置。所以我们想把它移位2次:

内部掩码= (1 << 2);

这将产生以下结果:

代码语言:javascript
运行
复制
16 15 14 13 12 11 10 09 09 07 06 05 04 03 02 01 00
                                           1  0  0

现在,我们要确定是否设置了第2位,只需对值和掩码执行AND操作

代码语言:javascript
运行
复制
16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
                                           1  1  1   value
                                           1  0  0   mask
--------------------------------------------------
                                           1  0  0   ANDed result

所以,在C中:

代码语言:javascript
运行
复制
int value = 7;  // or any 16-bit value
int mask = (1 << 2);  // == 4

if ((value & (1 << 2)) == mask)
    // bit is set
else
    // bit is not set

现在,有时你想提取多个比特。下面是一个如何提取两位组合的示例。首先,让我们规定两位11是值3(一个1和一个2)。因此,现在w将执行类似的过程,从相同的值(7)中提取两位。

代码语言:javascript
运行
复制
16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1

现在,我们使用3而不是1进行掩码

内部掩码= (3 << 2);

这将产生以下结果:

代码语言:javascript
运行
复制
16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
 0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  0  0

现在,我们要确定是否设置了第2位,只需对值和掩码执行AND操作

代码语言:javascript
运行
复制
16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1   value
 0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  0  0   mask
--------------------------------------------------
                                        0  1  0  0   ANDed result

但是文档中可能会这样写:3-2是“状态x”。值-

代码语言:javascript
运行
复制
00 - a
01 - b
02 - c
03 - d

因此,现在我们必须从上面的ANDed结果中获得最后的值0100,并将其右移两位,以获得这些可能的值:

代码语言:javascript
运行
复制
result = (old_result >> 2);
0100 >> 2 == 01 

因为结果是01,十进制1,十六进制1,所以结果是上面的b

编辑:

现在使用python进行最终计算:

代码语言:javascript
运行
复制
>>> value = 0x0007
>>> mask = (3 << 2)
>>> result = value & mask
>>> print (result)
4
>>> shifted_result = result >> 2
>>> print (shifted_result)
1

结果相同,位3-2等于1,这意味着(根据您的数据表)诊断结果为:

位0:“运行”位1:“故障”位3-2:“浮动”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44746082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档