OSError: [WinError 10038] Была предпринята попытка выполнить операцию на чем-либо, не являющемся сокетом, с использованием opcua.client.py connect to op c ua server - PullRequest
0 голосов
/ 22 января 2020

Здравствуйте, я пытаюсь подключиться к серверу OPCUA с помощью клиента opcua.

Я использовал simati c сервер opcua.

Я пишу код, используя python

from opcua import Client

import pandas as pd import threading

__ all_ = ['communication']

df = pd.read_excel (r 'C: \ OPCUA \ Working_VF1_5.xls', sheet_name = 'Tag List')

class Связь:

def __init__(self):
    self.is_connected = False
    self.plc = ""
    self.mylock = threading.Lock()


# Connection method
def opc_client_connect(self):
    try:
        # #  Read connection string for url
        url = read_clienturl()
        self.client = Client("opc.tcp://WAP120153:55101")


        # self.client.find_servers(uris='opc.tcp://WAP120153:55101/')
        print(self.client)
        self.client.connect()
        is_connected = True
        root = self.client.get_root_node()
        print(root)
        objects = root.get_child('Objects')
        symbols = objects.get_child('1:SYM:')
        stnname,plcname = get_station_plc_name()
        stnametostring = '7:' + stnname
        plcnametostring = '7:' + plcname
        station_name = symbols.get_child(stnametostring)
        self.plc = station_name.get_child(plcnametostring)



    except Exception as e:
        is_connected = False
        print("My error is :",e.args)
        self.client.disconnect()


    finally:
        if is_connected:
            return True

def __getstate__(self):
    state = self.__dict__.copy()
    # Remove the unpicklable entries.
    del state['mylock']
    return state

# def __setstate__(self, state):
#     # Restore instance attributes.
#     self.__dict__.update(state)


# Declear property of a module
@property
def PLC(self):
    return self.plc

Чтение настроек соединения из excel

def read_clienturl ():

    data = df.iloc[2, 11]
    print(data)
    return data

def get_station_plc_name ():

station_name = df.iloc[0, 11]
plc_name = df.iloc[1, 11]
return station_name,plc_name

вызов основной функции

if name == " main ": comm = Communication ()

print(f'plc name is : {comm.PLC}')
while True:
    comm.opc_client_connect()
    browser_id = '7:' + 'AR SOV OPN LS'
    var = comm.PLC.get_child("7:AR SOV OPN LS")
    value = var.get_value()
    print("value is : ", value)
    comm.client.disconnect()

, когда я пытаюсь использовать этот код, у меня появляется ошибка: -

Файл "C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py ", строка 96, в файле _run self._receive ()" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py ", строка 114 в _receive self._call_callback (0, ua.UaStatusCodeError ( msg.Error.value)) Файл "C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py", строка 124, в _call_callback .format (request_id, self ._callbackmap.keys ()) opcua.ua.uaerrors._base.UaError: Будущий объект для запроса не найден: 0, обратные вызовы в списке являются dict_keys ([2]) Моя ошибка: () Traceback (последний последний вызов): Файл "C: / my files / python files / SMSPLCSIMULATIONV2-master (1) /SMSPLCSIMULATIONV2-master/clientcomm_v1.py", строка 28, в файле opc_client_connect self.client.connect (), файл "C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ client.py ", строка 259, в файле connect self.create_session ()" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ client.py ", строка 360, в файле create_session response = self.uaclient.create_session (params) Файл" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py ", строка 267, в create_session data = self._uasocket.send_request (req uest) Файл "C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py", строка 78, в файле send_request data = future.result (self.timeout) «C: \ Users \ chma02 \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ concurrent \ futures_base.py», строка 434, в результате повышается TimeoutError () concurrent.futures._base.TimeoutError

Во время обработки вышеупомянутого исключения произошло другое исключение:

Трассировка (последний вызов был последним): файл "C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ client.py ", строка 271, в файле отключить self.close_session ()" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ client.py ", строка 476, в close_session возвращает файл self.uaclient.close_session (True), файл "C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py", строка 291, в close_session data = self._uasocket.send_request (запрос) Файл "C: \ Users \ chma02 \ AppData \ Roaming \ Pyth в \ Python37 \ site-packages \ opcua \ client \ ua_client.py ", строка 76, в send_request future = self._send_request (запрос, обратный вызов, тайм-аут, тип сообщения) тип" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ ua_client.py ", строка 67, в файле _send_request self._socket.write (msg)" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ common \ utils.py ", строка 118, в записи self.socket.sendall (data) OSError: [WinError 10038] Была предпринята попытка выполнить операцию с чем-то, что не является сокетом

Во время При обработке вышеуказанного исключения произошло другое исключение:

Трассировка (последний последний вызов): Файл "C: / мои файлы / python файлы / SMSPLCSIMULATIONV2-master (1) / SMSPLCSIMULATIONV2-master / clientcomm_v1.py ", строка 92, в comm.opc_client_connect () Файл "C: / my files / python files / SMSPLCSIMULATIONV2-master (1) /SMSPLCSIMULATIONV2-master/clientcomm_v1.py", строка 45, в файле opc_client_connect self.client.disconnect () Файл "C: \ Пользователи \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ client.py ", строка 274, в файле отключить self.disconnect_socket ()" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ client \ client.py ", строка 283, в файле disconnect_socket self.uaclient.disconnect_socket ()" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site- пакеты \ opcua \ client \ ua_client.py ", строка 248, в файлеnectnect_socket

return self._uasocket.disconnect_socket()

" C: \ Users \ chma02 \ AppData \ Roaming \ Python \ Python37 \ site-packages \ opcua \ \ client \ ua_client.py ", строка 154, в disconnect_socket self._socket.socket.shutdown (socket.SHUT_RDWR) OSError: [WinError 10038] Была предпринята попытка выполнить операцию с чем-то, что не является сокетом

1 Ответ

0 голосов
/ 24 января 2020

Первая часть исключения. Утверждается, что время соединения истекло. Поэтому, чтобы исправить это, я бы сначала проверил, можете ли вы подключиться к серверу с помощью UA Expert. Если он работает с UA Expert, возможно, ваш брандмауэр блокирует соединение.

...