问题描述
基本上,我现在应该测试 modbus 功能,无论出于何种原因,modbus 都无法在第二次调用时读取寄存器,例如: 功能:
# Modbus functions
def read_system_uptime(c,ssh):
try:
# Get uptime with ubus
ssh_result = str(exec_ssh("ubus call system info",ssh))
ssh_obj = json.loads(ssh_result)
uptime = str(ssh_obj['uptime'])
regs = c.read_holding_registers(1,2)
if (regs != None and regs[0] == 0):
result = check_match(uptime,regs[1])
logger("System uptime",uptime,regs[1],result)
elif (regs != None and regs[0] != 0):
#Check results
temp = regs[0] * 65536 + regs[1]
result = check_match(uptime,temp)
logger("System uptime",temp,result)
else:
error_logger("System hostname","Could not read register value")
except Exception as error:
error_logger("system uptime",error)
def read_mobile_strength(c,ssh):
try:
regs = c.read_holding_registers(3,2)
if regs != None:
bits = decimal_To_Binary(regs[1])
a = str(binary_To_Complement(bits)).strip()
#Check results
gsmctl = str(exec_ssh("gsmctl -q",ssh)).strip()
result = check_match(gsmctl,a)
logger("Mobile signal strength",gsmctl,a,result)
else:
error_logger("Mobile signal strength","Could not read register value")
except Exception as error:
error_logger("Mobile signal strength",error)
def read_system_hostname(c,ssh):
try:
regs = c.read_holding_registers(7,16)
if regs != None:
a = str(dec_to_text(regs)).strip()
#Check results
name = str(exec_ssh("uci get system.system.hostname",ssh)).strip()
result = check_match(name,a)
logger("System hostname",name,"Could not read register value")
except Exception as error:
error_logger("System hostname",error)
主要内容:
# Main fuction
def main():
#router_ip,router_port,router_username,router_password = run_args(sys.argv[1:])
ssh = paramiko.SSHClient()
if ssh_connect(ssh,router_ip,router_password) != False:
modbus = modbus_start(router_ip,modbus_port,modbus_id)
if modbus != False:
read_system_hostname(modbus,ssh)
read_system_uptime(modbus,ssh)
read_mobile_strength(modbus,ssh)
# Run main()
if __name__ == '__main__':
main()
if modbus != False:
read_system_hostname(modbus,ssh)
现在我不会得到移动强度值,这种情况每隔一个函数就会发生,我可以移动这些函数,比如将它们移动到第一个位置,它会起作用,所以它不是功能错误,我猜是 pyModbusTCP 或甚至可能是我使用的设备有问题,但我不确定。有谁知道如何处理这个问题?因为我以前从未使用过这个库。我是否必须清除我阅读的数据或类似的东西?目前,我有一个愚蠢的解决方案,即放置一个“假”函数,该函数读取寄存器而不对其执行任何操作并将其放在其他函数之间,因此重要的函数会起作用,但如果可能,我想避免这种情况。
编辑: Modbus 启动功能:
def modbus_start(ip,port,device):
try:
client = ModbusClient(host=ip,port=port,unit_id=device,auto_open=True)
print("Modbus client start: Success")
logging.info("Started Modbus client")
return client
except Exception as error:
print("ERROR: Failed to start Modbus client: ")
print(error)
logging.error("Failed to start Modbus client: %s",error)
return False
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)