2024-10-03 13:31:26 发布
网友
我希望使用最小的Modbus通过RS485-USB适配器连接到我的太阳能逆变器(GivEnergy)。不幸的是,Modbus协议的实施已经反转了CRC字节,因此最小Modbus无法进行CRC检查。 有没有一种方法可以在调用中反转CRC字节,或者使用选项标志,或者我可以手动构建CRC并注入我自己的CRC
你不需要注射你自己的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 -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)函数,如我上面所述更改最后一行即可
_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。之后,您可以添加其余的代码
_calculate_crc_string
你不需要注射你自己的CRC,这比解决你的问题要困难得多(当然,如果你愿意,你可以自由地做)
只需在modbus.py中更改this line:
致:
您可以找到运行此命令的文件的位置:
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脚本中再次编写其所有代码:
注意函数外的最后一行重载
_calculate_crc_string
。之后,您可以添加其余的代码相关问题 更多 >
编程相关推荐