<p>文档中的<em>说明</em>告诉您如何解释值的每一位。<br/>
<em>pymodbus</em>的<code>read_input_registers()</code>为每个寄存器返回一个<em>units16</em>(unsigned int 2字节)(请参见<a href="https://media.readthedocs.org/pdf/pymodbus/latest/pymodbus.pdf" rel="nofollow noreferrer">official documentation</a>),这意味着它可以是0到65535之间的值。在</p>
<pre><code>result = client.read_input_registers(0x3200, 2, unit=1)
value1 = result.registers[0] # 33059
value2 = result.registers[1] # 9359
</code></pre>
<p>此值可以转换为二进制值:</p>
^{pr2}$
<p>这些位中的每一位都可以从0到15(从右到左)进行索引,然后我们可以按照文档中的说明拆分它们:</p>
<blockquote>
<p>value1 D3-D0: 0011<br/>
Value1 D7-D4: 0010<br/>
Value1 D8: 1<br/>
Value1 D15: 1 </p>
</blockquote>
<p>对于每一位的子集,文档为我们提供了一个十六进制值的数字,并且每个十六进制值的数字都可以转换成二进制:</p>
<blockquote>
<p>D3-D0:<br/>
00H (bin: 0000) Normal<br/>
01H (bin: 0001) Overvolt<br/>
02H (bin: 0010) Undervolt<br/>
03H (bin: 0011) Low Volt Disconnect<br/>
04H (bin: 0100) OverTemp<br/>
and same for other sets...</p>
</blockquote>
<p>如果集合只包含一个位,我们考虑<code>True(1)/False(0)</code>行为。在</p>
<p>将此值与我们的设置进行比较,我们了解到33059意味着:低压断开、低温、蓄电池内阻异常、额定电压识别错误(<em>灾难!</em>)或在您的情况下,0表示额定电压的正常、正常、正常、正确标识。在</p>
<p>如果我们对<code>value2</code>(9359)应用相同的方法,我们将理解:</p>
^{3}$
<p>显然,您不希望手工完成所有这些工作:即使有许多方法可以编写这项工作,我建议您使用<a href="https://en.wikipedia.org/wiki/Mask_(computing)" rel="nofollow noreferrer">bitmask</a>:</p>
<pre><code># Define each mask as a tuple with all the bit at 1 and distance from the right:
D3_D0_mask = (0b1111, 0)
D7_D4_mask = (0b1111, 4)
D8_mask = (0b1, 8)
D15_mask = (0b1, 15)
# compare each mask to the value, after shifting to the right position:
print D3_D0_mask[0]&(value1>>D3_D0_mask[1]) == 4 # False, Fault
print D3_D0_mask[0]&(value1>>D3_D0_mask[1]) == 3 # True, Low Volt Disconnect
print D3_D0_mask[0]&(value1>>D3_D0_mask[1]) == 2 # False, Under Volt
print D3_D0_mask[0]&(value1>>D3_D0_mask[1]) == 1 # False, Overvolt
print D3_D0_mask[0]&(value1>>D3_D0_mask[1]) == 0 # False, Normal
print D7_D4_mask[0]&(value1>>D7_D4_mask[1]) == 2 # True, Low Temp
print D7_D4_mask[0]&(value1>>D7_D4_mask[1]) == 1 # False, Over Temp
print D7_D4_mask[0]&(value1>>D7_D4_mask[1]) == 0 # False, Normal
print D8_mask[0]&(value1>>D8_mask[1]) == 1 # True, Battery internal resistance abnormal
print D15_mask[0]&(value1>>D15_mask[1]) == 1 # True, Wrong identification for rated voltage
</code></pre>
<p>此代码的优化应该很明显。<br/>
正如你所见,不管怎样,我们得到了我们期望的输出。在</p>