Python,使用 pymodbus.utilities.computeCRC 中的变量
Python, using variables in pymodbus.utilities.computeCRC
我搜索了几天,如果我用错了搜索字符串,对不起。
我想使用 "pymodbus.utilities.computeCRC" 计算 CRC 值来与使用专有代码的 Modbus 设备通信,因此不能使用默认的 "read register" 函数。
正确的 CRC 是 0x34bb
问题是,它只适用于版本 1,将十六进制值直接提供给 computeCRC,但是 "variable" 选项中的 none 有效。
import pymodbus.utilities
meins=[]
meins.append('10')
meins.append('33')
meins.append('01')
meins.append('01')
meins1=''
for i in meins:
meins1 = meins1 + "\x" + i
meins2='\x10\x33\x01\x01'
meins3=bytearray.fromhex("10330101")
crc=hex(pymodbus.utilities.computeCRC('\x10\x33\x01\x01'))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins1))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins2))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins3))
print(crc)
输出:
- 0x34bb
- 0x2a9c
- 0xdc0b
- 0x9c0a
- 0x5dca
以下是您可以根据需要使用 CRC 生成器的方法,根据 python 版本(2.7 或 3.x),需要如何传递输入存在细微差别.
Python3 和 Pymodbus==1.3.2
注意 python3 并且 pymodbus 需要字节串来生成 CRC。
import pymodbus.utilities
from pymodbus.compat import int2byte
meins=[]
meins.append(0x10)
meins.append(0x33)
meins.append(0x01)
meins.append(0x01)
meins1=b''
for i in meins:
meins1 = meins1 + int2byte(i)
meins2=b'\x10\x33\x01\x01'
meins3=bytearray.fromhex("10330101")
crc=hex(pymodbus.utilities.computeCRC(b'\x10\x33\x01\x01'))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins1))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins2))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins3))
print(crc)
输出
0x34bb
0x34bb
0x34bb
0x34bb
0x34bb
Python2 和 pymodbus==1.3.2
import pymodbus.utilities
from pymodbus.compat import int2byte
meins=[]
meins.append(int2byte(0x10))
meins.append(int2byte(0x33))
meins.append(int2byte(0x1))
meins.append(int2byte(0x1))
meins1=''
for i in meins:
meins1 = meins1 + i
meins2='\x10\x33\x01\x01'
meins3=bytearray.fromhex("10330101")
meins3=''.join(str(meins3))
crc=hex(pymodbus.utilities.computeCRC('\x10\x33\x01\x01'))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins1))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins2))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins3))
print(crc)
输出
0x34bb
0x34bb
0x34bb
0x34bb
0x34bb
有关信息,这里是我对设备的请求的 "ugly python beginner" 版本。在这种情况下,请求将电池逆变器的输出功率设置为 50 瓦。该值已正确存储在设备中。
代码
import minimalmodbus
import struct
import sys
import string
import serial
import pymodbus.payload
import time
#Wattage to program to the modbus device in hex format
watt = '{0:04X}'.format(50)
#combine the wattage to the rest of the string
string='103F0D'+watt+'01AE01F400960000000000'
#convert to a format computeCRC can work with
stringh=bytearray.fromhex(string)
stringh=''.join(str(stringh))
crc=pymodbus.utilities.computeCRC(stringh)
#convert crc to HEX String
crc='{0:04X}'.format(crc)
#combine Payload with CRC
string=string+crc
#debug:
#print(string)
#convert to a Format ser.write can send
stringh=bytearray.fromhex(string)
stringh=''.join(str(stringh))
ser = serial.Serial('/dev/ttyUSB0', 57600)
ser.write(stringh)
time.sleep(0.1)
anz=ser.inWaiting()
str=ser.read(anz)
for char in str:
mm = int(char.encode('hex'), 16)
print(hex(mm))
# Wait for inverter to accept command
time.sleep(1)
# Status 3E
# Send Status check command
ser.write("\x10\x3E\x01\x01\xA5\x78")
# wait for answer
time.sleep(0.1)
# how many bytes came back
anz=ser.inWaiting()
# read all bytes
str=ser.read(anz)
# extract the 2 bytes with the current load setting
str1=str[13]+str[14]
# convert
p=int(str1.encode('hex'), 16) / 10
print(p)
输出
0x10
0x3f
0x1
0x1
0xf4
0xb8
50
字节是
- 0x10 - 设备地址
- 0x3F - 我们之前发送的命令
- 0x1 0x1 - 命令已接受
0xf4 0xb8 - CRC
50 - 从设备读取的值
我搜索了几天,如果我用错了搜索字符串,对不起。
我想使用 "pymodbus.utilities.computeCRC" 计算 CRC 值来与使用专有代码的 Modbus 设备通信,因此不能使用默认的 "read register" 函数。
正确的 CRC 是 0x34bb
问题是,它只适用于版本 1,将十六进制值直接提供给 computeCRC,但是 "variable" 选项中的 none 有效。
import pymodbus.utilities
meins=[]
meins.append('10')
meins.append('33')
meins.append('01')
meins.append('01')
meins1=''
for i in meins:
meins1 = meins1 + "\x" + i
meins2='\x10\x33\x01\x01'
meins3=bytearray.fromhex("10330101")
crc=hex(pymodbus.utilities.computeCRC('\x10\x33\x01\x01'))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins1))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins2))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins3))
print(crc)
输出:
- 0x34bb
- 0x2a9c
- 0xdc0b
- 0x9c0a
- 0x5dca
以下是您可以根据需要使用 CRC 生成器的方法,根据 python 版本(2.7 或 3.x),需要如何传递输入存在细微差别.
Python3 和 Pymodbus==1.3.2
注意 python3 并且 pymodbus 需要字节串来生成 CRC。
import pymodbus.utilities
from pymodbus.compat import int2byte
meins=[]
meins.append(0x10)
meins.append(0x33)
meins.append(0x01)
meins.append(0x01)
meins1=b''
for i in meins:
meins1 = meins1 + int2byte(i)
meins2=b'\x10\x33\x01\x01'
meins3=bytearray.fromhex("10330101")
crc=hex(pymodbus.utilities.computeCRC(b'\x10\x33\x01\x01'))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins1))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins2))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins3))
print(crc)
输出
0x34bb
0x34bb
0x34bb
0x34bb
0x34bb
Python2 和 pymodbus==1.3.2
import pymodbus.utilities
from pymodbus.compat import int2byte
meins=[]
meins.append(int2byte(0x10))
meins.append(int2byte(0x33))
meins.append(int2byte(0x1))
meins.append(int2byte(0x1))
meins1=''
for i in meins:
meins1 = meins1 + i
meins2='\x10\x33\x01\x01'
meins3=bytearray.fromhex("10330101")
meins3=''.join(str(meins3))
crc=hex(pymodbus.utilities.computeCRC('\x10\x33\x01\x01'))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins1))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins2))
print(crc)
crc=hex(pymodbus.utilities.computeCRC(meins3))
print(crc)
输出
0x34bb
0x34bb
0x34bb
0x34bb
0x34bb
有关信息,这里是我对设备的请求的 "ugly python beginner" 版本。在这种情况下,请求将电池逆变器的输出功率设置为 50 瓦。该值已正确存储在设备中。
代码
import minimalmodbus
import struct
import sys
import string
import serial
import pymodbus.payload
import time
#Wattage to program to the modbus device in hex format
watt = '{0:04X}'.format(50)
#combine the wattage to the rest of the string
string='103F0D'+watt+'01AE01F400960000000000'
#convert to a format computeCRC can work with
stringh=bytearray.fromhex(string)
stringh=''.join(str(stringh))
crc=pymodbus.utilities.computeCRC(stringh)
#convert crc to HEX String
crc='{0:04X}'.format(crc)
#combine Payload with CRC
string=string+crc
#debug:
#print(string)
#convert to a Format ser.write can send
stringh=bytearray.fromhex(string)
stringh=''.join(str(stringh))
ser = serial.Serial('/dev/ttyUSB0', 57600)
ser.write(stringh)
time.sleep(0.1)
anz=ser.inWaiting()
str=ser.read(anz)
for char in str:
mm = int(char.encode('hex'), 16)
print(hex(mm))
# Wait for inverter to accept command
time.sleep(1)
# Status 3E
# Send Status check command
ser.write("\x10\x3E\x01\x01\xA5\x78")
# wait for answer
time.sleep(0.1)
# how many bytes came back
anz=ser.inWaiting()
# read all bytes
str=ser.read(anz)
# extract the 2 bytes with the current load setting
str1=str[13]+str[14]
# convert
p=int(str1.encode('hex'), 16) / 10
print(p)
输出
0x10
0x3f
0x1
0x1
0xf4
0xb8
50
字节是
- 0x10 - 设备地址
- 0x3F - 我们之前发送的命令
- 0x1 0x1 - 命令已接受
0xf4 0xb8 - CRC
50 - 从设备读取的值