我已经开始使用AcuRev 2000的最小modbus,其寄存器映射在此链接https://www.accuenergy.com/support/modbus-map/?modbus-map=acurev-2000-modbus-map,我正在读取频率(8192-8193)和电压在第2行(8196-8197)。
当运行我的程序时,它通常在这两个参数中给我相同的值,我尝试了一些事情,比如增加读数之间的时间,或者它们之间的小延迟,但它似乎没有改善。你认为是什么问题-它可能是RS-485适配器吗?
输出是这样的,一些递归式与电压线相同,这就是问题所在:
2021-2-24-16:57:41 60.021095275878906 127.21097564697266
2021-2-24-16:57:44 127.1023178100586 127.09758758544922
2021-2-24-16:57:47 60.021095275878906 127.18592071533203
2021-2-24-16:57:50 127.1960220336914 127.19416046142578
2021-2-24-16:57:54 127.1761474609375 127.17230224609375
2021-2-24-16:57:57 59.97891616821289 127.0765609741211
2021-2-24-16:58:0 59.97891616821289 126.90221405029297
我的代码是这样的
import minimalmodbus #importamos la libreria
import time
import csv
#declaramos el instrumento
print("Respalda el archivo CSV anterior antes de seguir con el programa")
print("Si ingresas mal los datos puede entrar en un bucle infinito usa ctr+c")
print("Ingrese Puerto de conexion (windows= COMX)")
PORT=input()
print("Cuando desees parar los registros usa ctr+c y una Y para que se guarde el archivo, de otra forma se eliminará")
print("Si no aparece inmediatamente la opcion de salir despues de ctr+c espera unos segundos max(30)")
print("ingrese ID de dispositivo")
ID=int(input())
instr = minimalmodbus.Instrument(PORT, ID) #puerto COM10 de conexion y ID dispositivo
instr.serial.baudrate=9600 #modificamos el baud rate
Cabecera=('Tiempo','Frecuencia','Tensión L2')#cual es el nombre de nuestros datos
with open('Datos.csv','w',newline='') as archivocsv:
archivo=csv.writer(archivocsv)
archivo.writerow(Cabecera)
a=0
while 1:
try:
c=0
b=0
tiempo=time.localtime()
c=instr.read_float(8196, 3,2,0)#leemos un registro flotante
time.sleep(0.01)
b=instr.read_float(8192, 3,2,0)#leemos un registro flotante
Timestamp=str(tiempo.tm_year)+"-"+str(tiempo.tm_mon)+"-"+str(tiempo.tm_mday)+"-"+str(tiempo.tm_hour)+":"+str(tiempo.tm_min)+":"+str(tiempo.tm_sec)
print(Timestamp,b,c)
DA=[Timestamp,b,c]
archivo.writerow(DA)
a=a+1
time.sleep(30)
except IOError:
a=a
except KeyboardInterrupt:
print("Desea Salir? Y/N")
valor=input()
if valor=="Y":
print("Se hicieron "+str(a)+" registros correctos")
print("guarde su documento en otra ubicacion")
break
else:
continue
你可能有一个16位的字序问题,一个Endianness问题。
您使用的库假设以与实际读取顺序相反的顺序读取16位字,我不知道该库是否允许在读取32位类型时交换16位字。
出现这种情况是因为Modbus没有定义如何读取32位类型,一些制造商在开始时发送高字,而其他制造商则相反。
我终于没有出现这个错误,我使用一个缓存之间的延迟时间错误,我也改变了订单的记录,正确,程序开始阅读,但是我认为这不是一个完整的解决方案,因为如果你开始等待之间的错误你可以有一个几秒钟的延迟测量,如果你想要及时测量,随着时间的推移,它可能会导致问题。
with open('Datos.csv','w',newline='') as archivocsv:
archivo=csv.writer(archivocsv)
archivo.writerow(Cabecera)
a=0
while 1:#tiempo, frecuencia, voltaje
try:
c=0
b=0
tiempo=time.localtime()
b=instr.read_float(8192, 3,2,0)#leemos un registro flotante
time.sleep(0.01)
c=instr.read_float(8196, 3,2,0)#leemos un registro flotante
Timestamp=str(tiempo.tm_year)+"-"+str(tiempo.tm_mon)+"-"+str(tiempo.tm_mday)+"-"+str(tiempo.tm_hour)+":"+str(tiempo.tm_min)+":"+str(tiempo.tm_sec)
print(Timestamp,b,c)
DA=[Timestamp,b,c]
archivo.writerow(DA)
a=a+1
time.sleep(3)
except IOError:
a=a
time.sleep(0.5) ***#here is the modification that help***
except KeyboardInterrupt:
print("Desea Salir? Y/N")
valor=input()
if valor=="Y":
print("Se hicieron "+str(a)+" registros correctos")
print("guarde su documento en otra ubicacion")
break
else:
continue