Python 3.6 x64 OpenOPC
Я разрабатываю модель тензорного потока, чтобы сделать вывод о свойстве продукта. Я хочу, чтобы эта модель запускала онлайн-чтение данных с OPC-сервера и записывала результат обратно. Для этого я использую проект OpenOPC.
Tensorflow просто работает с Python 3.6 в 64-битной ОС. Поэтому мне нужно установить соединение OPC в той же среде.
Изначально OpenOPC был предназначен для работы с Python 2.7 в операционной системе x86. Есть несколько проектов, которые обновили его для работы с Python 3.4+. Я следовал процедуре по следующей ссылке, чтобы установить его: https://github.com/joseamaita/openopc120
Я разрабатываю свою модель на виртуальной машине с Windows 2012 Server. Для OPC-сервера я использую Matrikon OPC для симуляции.
Функция списка из OpenOPC работает нормально. Когда я запускаю следующий скрипт
import OpenOPC
open_host='10.0.2.15'
open_port='7766'
opc = OpenOPC.open_client(open_host, open_port)
opc.connect('Matrikon.OPC.Simulation.1')
aux=opc.list('Simulation Items.Random')
for item in aux:
print(item)
opc.close()
Я получил следующий результат
Random.ArrayOfReal8
Random.ArrayOfString
Random.Boolean
Random.Int1
Random.Int2
Random.Int4
Random.Money
Random.Qualities
Random.Real4
Random.Real8
Random.String
Random.Time
Random.UInt1
Random.UInt2
Random.UInt4
Что многообещающе. Но когда я попытался запустить следующий код, чтобы прочитать значение:
import OpenOPC
open_host='10.0.2.15'
open_port='7766'
opc = OpenOPC.open_client(open_host, open_port)
opc.connect('Matrikon.OPC.Simulation.1')
aux = opc.read(['Random.Int4'])
for item in aux:
print(item)
opc.close()
служба шлюза OpenOPC останавливается, и в средстве просмотра событий у меня есть следующее
Faulting application name: PythonService.exe, version: 0.0.0.0, time stamp: 0x5af24199
Faulting module name: gbda_aut.dll, version: 1.0.8.304, time stamp: 0x4d92bcca
Exception code: 0xc0000005
Fault offset: 0x000000000001b966
Faulting process id: 0xa90
Faulting application start time: 0x01d464c2264cd7ec
Faulting application path: C:\ProgramData\Anaconda3\lib\site-packages\win32\PythonService.exe
Faulting module path: c:\Windows\System32\gbda_aut.dll
Report Id: 69629dee-d0b5-11e8-8120-080027bc5cb4
Faulting package full name:
Faulting package-relative application ID: ` .
Кажется, что проблема связана с этим gbda_aut.dll. Я скачал версию для x64 с
http://gray-box.net/download_daawrapper.php?lang=en
и зарегистрировал его соответствующим образом.
Проблема также возникает, когда я пытаюсь использовать режим DCOM. При этом я получаю следующее.
Problem signature:
Problem Event Name: APPCRASH
Application Name: pythonw.exe
Application Version: 3.6.5150.1013
Application Timestamp: 5abd3212
Fault Module Name: gbda_aut.dll
Fault Module Version: 1.0.8.304
Fault Module Timestamp: 4d92bcca
Exception Code: c0000005
Exception Offset: 000000000001b966
OS Version: 6.3.9600.2.0.0.272.7
Locale ID: 1033
Additional Information 1: e0f5
Additional Information 2: e0f51433c52d71c63f2bde60bf8cf401
Additional Information 3: 1c6f
Additional Information 4: 1c6f1bc49be4e21c20f4309779c02df6
У кого-нибудь есть идея, как заставить это работать или лучший способ сделать чтение OPC, используя Python?
0 ответов
Я пытался прочитать данные из KEPWARE SERVER, используя пакет OpenOPC для python3.6, и теперь я могу это легко сделать, следуя приведенным ниже ссылкам:
Но проблема возникает, когда я пытаюсь непрерывно читать данные каждые 5 секунд для всех 4 устройств. В настоящее время сервер представляет собой машину с Windows, на которой я установил все 32-битные версии, такие как python, pywin32, pyro4.
Ниже приведены журналы, которые я получаю, которые в основном представляют собой тайм-аут при попытке прочитать данные для устройства (я вижу эту ошибку в основном после 3-4 часов непрерывного потрясающего запуска скрипта python).
2019-12-14 05:09:08,750 - loggingModule - getOPCData10thDec.py - <module> - 1368 - 170 - Exception Captured in OPC Part. Trying to reconnect.
2019-12-14 05:09:08,765 - loggingModule - getOPCData10thDec.py - opcReconnect - 1368 - 41 - Trying to reconnect to the OPC server. Max Retries: 3
2019-12-14 05:09:08,781 - loggingModule - getOPCData10thDec.py - opcReconnect - 1368 - 44 - Closing the opc connection if any and retrying to connect 0 time
2019-12-14 05:09:08,796 - loggingModule - getOPCData10thDec.py - opcReconnect - 1368 - 47 - Creating a new OPC client
2019-12-14 05:09:08,859 - loggingModule - getOPCData10thDec.py - opcReconnect - 1368 - 49 - Trying to Connect to the OPC server: Kepware.KEPServerEX.V6
2019-12-14 05:09:08,906 - loggingModule - getOPCData10thDec.py - opcReconnect - 1368 - 51 - Connected to the OPC server
2019-12-14 05:09:08,921 - loggingModule - getOPCData10thDec.py - <module> - 1368 - 174 - Available Devices on the OPC:
2019-12-14 05:09:08,937 - loggingModule - getOPCData10thDec.py - <module> - 1368 - 175 - ['_AdvancedTags', '_ConnectionSharing', '_CustomAlarms', '_DataLogger', '_EFMExporter', '_IDF_for_Splunk', '_IoT_Gateway', '_LocalHistorian', '_Redundancy', '_Scheduler', '_SecurityPolicies', '_SNMP Agent', '_System', '_ThingWorx', 'Compressor01', 'Metering-Coriolis-S3S-Active', 'Metering-Coriolis-S3S-Diesel', 'Metering-Coriolis-S3S-Frac', 'Metering-Coriolis-S3S-Water', 'MudCube01', 'MudCube02', 'MudCube03', 'Pason WITS', 'S3S Coriolis Skid']
2019-12-14 05:09:18,869 - loggingModule - getOPCData10thDec.py - readOPCData - 1368 - 101 - Error while reading the OPC data for device: Compressor01
2019-12-14 05:09:18,884 - loggingModule - getOPCData10thDec.py - readOPCData - 1368 - 102 - Callback: Timeout waiting for data
При дальнейшем изучении проблемы я просмотрел журналы средства просмотра событий, в которых обнаружил приведенную ниже ошибку приложения, относящуюся к зарегистрированной мной dll.
Faulting application name: python.exe, version: 3.6.8150.1013, time stamp: 0x5c201b63
Faulting module name: gbda_aut.dll, version: 1.2.8.508, time stamp: 0x4822c190
Exception code: 0xc0000005
Fault offset: 0x0001c088
Faulting process id: 0x1484
Faulting application start time: 0x01d5b30ce3a7a612
Faulting application path: C:\Users\OPCAdmin\AppData\Local\Programs\Python\Python36-32\python.exe
Faulting module path: C:\OpenOPC36\lib\gbda_aut.dll
Report Id: 3fd3dbef-8701-4516-87ce-bc514ee627c2
Faulting package full name:
Faulting package-relative application ID:
Я пытаюсь найти решение этой проблемы, но ничего не могу с этим поделать. Ниже приведен код, который я пытаюсь использовать, когда пытаюсь повторно подключиться к серверу OPC, как только увижу любую проблему с тайм-аутом.
def opcReconnect():
"""
reconnect to the opc server
:return: opc client
"""
global opc
logger.info("Trying to reconnect to the OPC server. Max Retries: " + str(retry_n_times))
for i in range(retry_n_times):
try:
logger.info("Closing the opc connection if any and retrying to connect " + str(i) + " time")
opc.remove(opc.groups())
opc.close() # closing all old conneciton to the OPC
logger.info("Creating a new OPC client")
opc = OpenOPC.client()
logger.info("Trying to Connect to the OPC server: " + s3sEdgeOPCServer)
opc.connect(s3sEdgeOPCServer)
logger.info("Connected to the OPC server")
return opc
except ConnectionError as e:
logger.error('OPC Connection Failure')
logger.error(e)
time.sleep(retry_threshold)
raise Exception
Я пытаюсь правильно закрыть старое соединение opc, удалив все группы opc, а затем закрывая соединение, только после чего я снова пытаюсь повторно подключиться к серверу.