Python最小Modbus CRC字节顺序

2024-10-03 13:31:26 发布

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

我希望使用最小的Modbus通过RS485-USB适配器连接到我的太阳能逆变器(GivEnergy)。不幸的是,Modbus协议的实施已经反转了CRC字节,因此最小Modbus无法进行CRC检查。 有没有一种方法可以在调用中反转CRC字节,或者使用选项标志,或者我可以手动构建CRC并注入我自己的CRC


Tags: 方法协议字节标志选项手动适配器modbus
1条回答
网友
1楼 · 发布于 2024-10-03 13:31:26

你不需要注射你自己的CRC,这比解决你的问题要困难得多(当然,如果你愿意,你可以自由地做)

只需在modbus.py中更改this line

return _num_to_twobyte_string(register, lsb_first=True)

致:

return _num_to_twobyte_string(register, lsb_first=False)

您可以找到运行此命令的文件的位置:python -m site并查找site-packages文件夹

在大多数使用Python 3.x的Linux发行版上,文件夹是:

'/home/your_user_name/.local/lib/python3.x/site-packages'

如果你在问为什么要弄乱代码,你并不孤单。当我自己思考同样的问题时(在写下这个答案后,我发誓),我发现了这个issue

我想简单的答案是:你应该向你设备的开发者抱怨

完整性:如果您不想按照问题的答案所建议的那样编辑minimamodbus.py,那么您只需重载整个_calculate_crc_string(inputstring)函数,如我上面所述更改最后一行即可

为了完整起见,我在上面的链接中添加了代码。要重载函数,只需在导入Modbus后立即在Python脚本中再次编写其所有代码:

import minimalmodbus

def _calculate_crc_string(inputstring):
    """Calculate CRC-16 for Modbus.

    Args:
        inputstring (str): An arbitrary-length message (without the CRC).

    Returns:
        A two-byte CRC string, where the least significant byte is first.

    """
    minimalmodbus._check_string(inputstring, description="input CRC string")

    # Preload a 16-bit register with ones
    register = 0xFFFF

    for char in inputstring:
        register = (register >> 8) ^ minimalmodbus._CRC16TABLE[(register ^ ord(char)) & 0xFF]

    return minimalmodbus._num_to_twobyte_string(register, lsb_first=False)

minimalmodbus._calculate_crc_string = _calculate_crc_string

注意函数外的最后一行重载_calculate_crc_string。之后,您可以添加其余的代码

相关问题 更多 >