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.
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.
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
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


0