如果连接失败,如何保持 python 脚本 运行 24/7 并向 Oracle DB 输入默认值

How to keep the python script running 24/7 and enter default value to Oracle DB if connection fails

我有一个 python 脚本,它通过 modbus 从我的太阳能控制器收集数据(太阳能、电池、负载、当前时间)并将数据写入我的 oracle 数据库。当前时间来自我的系统时间。目前,代码全天候运行(间隔一分钟),如果连接丢失,代码会尝试 5 次重新连接,然后停止执行。

我的目标:目前我有空白数据,因为脚本在连接断开时停止。有没有一种方法可以保留脚本 运行(即使没有连接)并将 0 之类的值放入太阳能和电池值中,并将当前时间定期传递给数据库,这样我就可以绘制基于 24 的图表小时。有没有办法让我的脚本也可以自动重新连接?非常感谢您的宝贵时间!!

或者有没有办法在没有 modbus 连接的情况下保留脚本 运行。然后我可以写如果没有连接输入值 0 到电池和太阳能。

我的代码

from pymodbus.constants import Defaults
from pymodbus.constants import Endian
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from datetime import datetime
from datetime import date
import schedule
import time


import cx_Oracle
con = cx_Oracle.connect("user/pas")  #connects to database
cursor = con.cursor()


Defaults.Timeout = 25
Defaults.Retries = 5

def loaddata():

  today = date.today()
  now = datetime.now()
  client = ModbusClient('10.8.0.14', port='83')

  result = client.read_input_registers(840, 2) # Read battery voltage

  trailerone = 1
   
  decoder = BinaryPayloadDecoder.fromRegisters(result.registers, byteorder=Endian.Big)
  voltage=decoder.decode_16bit_uint()

  ####################### Battery voltage ####################################
  battery1 = str("{0:.1f}".format(voltage/10.0)) #battery1 has current battery voltage
 #############################################################################
  
  result2 = client.read_input_registers(776,3,unit=226)  # Read Solar data
  decoder2 = BinaryPayloadDecoder.fromRegisters(result2.registers, byteorder=Endian.Big)
  voltage2=decoder2.decode_16bit_uint()
  
#######################Solar voltage#####################################
  solar1 = str("{0:.1f}".format(voltage2/100.0)) # has solar voltage
##########################################################################
 

  result3 = client.read_input_registers(860, 1)  #Load Watts data
  decoder3 = BinaryPayloadDecoder.fromRegisters(result3.registers, byteorder=Endian.Big)
  voltage3=decoder3.decode_16bit_uint()
 
#########################LOAD, DATE , TIME #####################################
  load1 = str("{0:.1f} W".format(voltage3)) # has load wattage
 

  date1 = today.strftime("%d/%m/%Y") # has todays date
 

  current_time = now.strftime("%H:%M:%S") # has current time
#################################################################################

  
  
  
##################### Inserting values into database table ####################
  
  cursor.execute('INSERT INTO Mytable(TRAILERID,PANELVOLTAGE,BATTERYVOLTAGE,DATADATE,DATATTIME) VALUES ( :trailerone,:solar1,:battery1,:date1, :current_time)',[trailerone,solar1,battery1,date1,current_time])

  con.commit()
  
  
  f.close()


schedule.every(60).seconds.do(loaddata)    #runs script every one minute endlessly 

while 1:
  schedule.run_pending()
  time.sleep(1)

schedule.every(60).seconds.do(loaddata)

不要使用 schedule 库,您应该在 Linux 系统中选择 cronjob

loaddata周围添加try...catch,当异常发生时,将默认值0保存到solar。

任何想知道如何做的人。我已经使用 try 和 except 方法来实现我正在寻找的东西。