Python - Fallo comunicación modbus TCPIP

 
Vista:

Fallo comunicación modbus TCPIP

Publicado por Rob (3 intervenciones) el 04/12/2021 13:00:27
Hola, estoy haciendo una app utilizando una interface gráfica , con Tkinter, y en una parte de dicha app tengo que comunicarme con un micro mediante comunicación modbus 485 y en otro momento mediante modbus TCPIP.
La primera va perfectamente llamando a la función desarrollada que se llama cada vez que quiero comunicarme con el micro y leer o escribir en su mapa de memoria.
Cuando llega la parte de comunicarme para escribir y/o leer el mapa de memoria del micro he desarrollado otra función con la misma estructura que la anterior y no me comunica, por lo que cuando leo un registro me da "NONE" . Auqnue esta función en un programa a parte y sola va bien.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def conexion_TCP_IP ():
 
    SERVER_HOST = "192.168.100.200"
    SERVER_PORT = 502
    #SERVER_U_ID = 1
 
    cliente = ModbusClient()
 
    cliente.debug(True)
    cliente.host(SERVER_HOST)
    cliente.port(SERVER_PORT)
    #cliente.unit_id(SERVER_U_ID)
    cliente.open()  ##########???
    #cliente.auto_close(True)  ##########???
 
 
    reintentar_TCPIP = True
    comunicacion_TCPIP_OK = False
 
    while not comunicacion_TCPIP_OK and reintentar_TCPIP:
        contador = 0
        while contador < 2:
            contador += 1
            if not cliente.is_open():
                if not cliente.open():
                    print("unable to connect to " + SERVER_HOST + " PORT:" + str(SERVER_PORT))
 
                    if contador == 2:
                        reintentar_TCPIP = messagebox.askretrycancel("Pregunta", "Quieres intentarlo de nuevo?")
                        if reintentar_TCPIP:
                            contador = 0
                        else:
                            prueba = ['TCP/IP', 'TCP/IP_COMUNICACIÓN', '_', '_', 'BOOLEANO', 'TCP/IP_COMUNICACIÓN','FAIL']
                            registro_test.append(prueba)
 
                            finalizar_o_continuar()
            if cliente.is_open():
 
                comunicacion_TCPIP_OK = True
 
                prueba = ['TCP/IP', 'TCP/IP_COMUNICACIÓN', '_', '_', 'BOOLEANO', 'TCP/IP_COMUNICACIÓN', 'PASS']
                registro_test.append(prueba)
            time.sleep(2)
 
def comprobar_TCP_IP ():
 
    conexion_TCP_IP()
    if comunicacion_TCPIP_OK:
        contenido_registro_ZBAssociationIndication = (cliente.read_input_registers(direccion_registro_ZBAssociationIndication, 1))  # Leer el registro de esa dirección, solo uno
 
        contenido_limite_inferior_ZBAssociationIndication,contenido_limite_superior_ZBAssociationIndication,contenido_limite_panel_on_ZBAssociationIndicationg = obtener_valor_limites('ZBAssociationIndication', Mapa_con_limites)
        mask_ZBAssociationIndication = 0b1111111100000000
        nombre_del_registro = 'ZBAssociationIndication'
        nombre_de_la_prueba = 'ZBAssociationIndication'
        limite_inferior = contenido_limite_inferior_ZBAssociationIndication
        limite_superior = contenido_limite_superior_ZBAssociationIndication
        pos_x = 670
        pos_y = 30
        texto = 'BOOLEANO'
        status_ZBAssociationIndication = crea_frame_prima (contenido_registro_ZBAssociationIndication[0], mask_ZBAssociationIndication, nombre_del_registro, nombre_de_la_prueba, limite_inferior,limite_superior, pos_x, pos_y, texto)

Lo he hecho de otra manera , para probar, y lo hace bien hasta el momento que llamo de nuevo a la función para escribir. Si uso un comando DEBUG me dice _send ERROR. Hago dos funciones, una leer (a la que le mando los parámetros necesarios) y otra escribir. En cada una de ellas la comucicación se establece antes de leer o escribir.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
def leer_comunicacion_TCP_IP (p_direccion_registro_lectura):
 
    SERVER_HOST = "192.168.100.200"
    SERVER_PORT = 502
    #SERVER_U_ID = 1
 
    cliente = ModbusClient()
 
    cliente.debug(True)
    cliente.host(SERVER_HOST)
    cliente.port(SERVER_PORT)
    #cliente.unit_id(SERVER_U_ID)
    cliente.auto_open(True)  ##########???
    #cliente.auto_close(True)  ##########???
 
 
    reintentar_TCPIP = True
    comunicacion_TCPIP_OK = False
 
    while not comunicacion_TCPIP_OK and reintentar_TCPIP:
        contador = 0
        while contador < 2:
            contador += 1
            if not cliente.is_open():
                if not cliente.open():
                    print("unable to connect to " + SERVER_HOST + " PORT:" + str(SERVER_PORT))
                    if contador == 2:
                        reintentar_TCPIP = messagebox.askretrycancel("Pregunta", "Quieres intentarlo de nuevo?")
                        if reintentar_TCPIP:
 
                            contador = 0
                        else:
                            prueba = ['TCP/IP', 'TCP/IP_COMUNICACIÓN', '_', '_', 'BOOLEANO', 'TCP/IP_COMUNICACIÓN','FAIL']
                            if len(registro_test) > 43:
                                registro_test[43] = prueba  # Si es >43 es que ya ha pasado la primera vez por aquí y ha escrito en la lista del registro TCPIP-->PASS
                            else:
                                registro_test.append(prueba)  # Si no es mayor de 43, es que aún no ha comprobado la primera vez si hay comunicación TCPIP. por lo que no ha creado la posición de memoria 43 y daría fallo si usamos lo de arriba
 
                            finalizar_o_continuar()
            if cliente.is_open():
 
                contenido_registro = (cliente.read_input_registers(p_direccion_registro_lectura,1))  # Leer el registro de esa dirección, solo uno
 
                cliente.auto_close(True)
                #comunicacion_TCPIP_OK = True
 
                prueba = ['TCP/IP', 'TCP/IP_COMUNICACIÓN', '_', '_', 'BOOLEANO', 'TCP/IP_COMUNICACIÓN', 'PASS']
 
                if len(registro_test) > 43:
                    registro_test[43] = prueba #Si es >43 es que ya ha pasado la primera vez por aquí y ha escrito en la lista del registro TCPIP-->PASS
                else:
                    registro_test.append(prueba)    #Si no es mayor de 43, es que aún no ha comprobado la primera vez si hay comunicación TCPIP. por lo que no ha creado la posición de memoria 43 y daría fallo si usamos lo de arriba
 
                return contenido_registro
            time.sleep(2)
def escribir_comunicacion_TCP_IP (p_direccion_registro_escritura,p_valor_a_escribir):
 
    SERVER_HOST = "192.168.100.200"
    SERVER_PORT = 502
    #SERVER_U_ID = 1
 
    cliente = ModbusClient()
 
    cliente.debug(True)
    cliente.host(SERVER_HOST)
    cliente.port(SERVER_PORT)
    #cliente.unit_id(SERVER_U_ID)
    cliente.auto_open(True)  ##########???
    #cliente.auto_close(True)  ##########???
 
 
    reintentar_TCPIP = True
    comunicacion_TCPIP_OK = False
 
    while not comunicacion_TCPIP_OK and reintentar_TCPIP:
        contador = 0
        while contador < 2:
            contador += 1
            if not cliente.is_open():
                if not cliente.open():
                    print("unable to connect to " + SERVER_HOST + " PORT:" + str(SERVER_PORT))
 
                    if contador == 2:
                        reintentar_TCPIP = messagebox.askretrycancel("Pregunta", "Quieres intentarlo de nuevo?")
                        if reintentar_TCPIP:
 
                            contador = 0
                        else:
                            prueba = ['TCP/IP', 'TCP/IP_COMUNICACIÓN', '_', '_', 'BOOLEANO', 'TCP/IP_COMUNICACIÓN','FAIL']
                            if len(registro_test) > 43:
                                registro_test[43] = prueba  # Si es >43 es que ya ha pasado la primera vez por aquí y ha escrito en la lista del registro TCPIP-->PASS
                            else:
                                registro_test.append(prueba)  # Si no es mayor de 43, es que aún no ha comprobado la primera vez si hay comunicación TCPIP. por lo que no ha creado la posición de memoria 43 y daría fallo si usamos lo de arriba
 
                            finalizar_o_continuar()
            if cliente.is_open():
                cliente.write_single_register(p_direccion_registro_escritura,p_valor_a_escribir)  # Leer el registro de esa dirección, solo uno
 
                cliente.auto_close(True)
                #comunicacion_TCPIP_OK = True
 
                prueba = ['TCP/IP', 'TCP/IP_COMUNICACIÓN', '_', '_', 'BOOLEANO', 'TCP/IP_COMUNICACIÓN', 'PASS']
 
                if len(registro_test) > 43:
                    registro_test[43] = prueba #Si es >43 es que ya ha pasado la primera vez por aquí y ha escrito en la lista del registro TCPIP-->PASS
                else:
                    registro_test.append(prueba)    #Si no es mayor de 43, es que aún no ha comprobado la primera vez si hay comunicación TCPIP. por lo que no ha creado la posición de memoria 43 y daría fallo si usamos lo de arriba
 
            time.sleep(2)
 
 
def comprobar_comunicacion_TCP_IP ():
    contenido_registro_ZBAssociationIndication = leer_comunicacion_TCP_IP(40022, 1)
    contenido_registro_AlarmCommLost_TCP_IP = leer_comunicacion_TCP_IP(40022, 1)
    contenido_registro_ExpandedInputOutput_TCP_IP = leer_comunicacion_TCP_IP(4002, 1)
 
    escribir_comunicacion_TCP_IP(40022,65535)

La lectura la hace bien pero en la escritura me da _send Error.

Siento la chapa, igual me he dejado algo al intentar borrar lineas de comando ya que es parte de una app.
Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder