微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pyModbusTCP 每秒失败一次功能

如何解决pyModbusTCP 每秒失败一次功能

基本上,我现在应该测试 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?