o
    mit                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZm	Z	 i a
dadadaG dd dZe Zd	d
 Zdd Zdd ZdS )uL   
OPC数据读取服务
读取8个罐体的液位、密度、温度、流量
    N)datetime)Client)OPCTANKSFc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )	OPCReaderc                 C   s   d | _ d| _d | _d S )NF)clientrunningthreadself r   +/root/zhuhai-gas-opc/services/opc_reader.py__init__   s   
zOPCReader.__init__c              
   C   s   z,t d sdadaW dS tt d | _| j  dadatdt  dt d   W dS  t	yO } zdad	t
| atttjd
 W Y d}~dS d}~ww )u   连接OPC服务器enableFu$   OPC采集已禁用（开发模式）
server_urlTN[u   ] OPC服务器连接成功: u   OPC连接失败: file)r   is_connectederror_messager   r   connectprintr   now	Exceptionstrsysstderr)r   er   r   r   r      s$   
zOPCReader.connectc                 C   s(   | j rz| j   W n   Y d| _dS )u   断开连接FN)r   
disconnectr   r
   r   r   r   r   /   s   
zOPCReader.disconnectc              
   C   s   ddddd}zR| dr| j|d }| |d< | dr.| j|d }| |d< | drA| j|d }| |d< | d	rW| j|d	 }| |d
< W |S W |S  ty} } ztd|d  dt| tjd W Y d}~|S d}~ww )u   读取单个罐体数据N)leveldensitytemperatureflownode_idr   density_noder    	temp_noder!   	flow_noder"   u   读取罐体 idu    数据失败: r   )	getr   get_node	get_valuer   r   r   r   r   )r   tankdatanoder   r   r   r   read_tank_data8   s4   



,zOPCReader.read_tank_datac                 C   sD   i }t D ]}t|d }| |||< ||| d< q|at a|S )u   读取所有罐体数据r'   info)r   r   r.   latest_datar   r   last_update)r   resultr+   tank_idr   r   r   read_all[   s   zOPCReader.read_allc                    sD   d _  fdd}tj|dd _ j  tdtd  d dS )	u   后台轮询Tc               
      s    j rFts   ttd  q z   W n" ty9 }  zdt|  a	t
t	tjd daW Y d } ~ nd } ~ ww ttd   j sd S d S )Nupdate_intervalu   数据读取异常: r   F)r   r   r   timesleepr   r4   r   r   r   r   r   r   )r   r
   r   r   polling_loopm   s   z8OPCReader.start_background_polling.<locals>.polling_loop)targetdaemonu   OPC后台轮询启动，间隔 r5   u    秒N)r   	threadingThreadr	   startr   r   )r   r8   r   r
   r   start_background_pollingi   s
   
z"OPCReader.start_background_pollingN)	__name__
__module____qualname__r   r   r   r.   r4   r>   r   r   r   r   r      s    	#r   c                   C   s0   t d st  ttrt nt  ttdS )u   获取最新数据r   )r,   r1   	connectederror)	r   generate_mock_datar0   r1   	isoformatr   r   r   r   r   r   r   r   get_latest_data   s   rF   c               
   C   s   ddl } i }ddddddd	d
d}tD ]F}t|d }||d | dd}| dd}t|| dt| dddt| dddt| dddt| ddd|d||< q|at a	t
d dS )u'   生成模拟数据（带随机波动）r   Ng@g      @g333333"@g(@g333333@gffffff&@g      !@g333333+@)                        r'   rH      g      g      ?g?g)\(?rI   g      .@g      6@rG   rK   #   )r   r    r!   flow_inflow_outr/   u7   生成模拟数据完成（带波动），共8个罐体)randomr   r   r(   uniformroundr0   r   r   r1   r   )rS   	mock_data
base_levelr+   r3   base	level_varr   r   r   rD      s&   	rD   c                  C   s6   t d rt  t  dS ddl} td t  dS )u   启动OPC读取r   r   Nu'   OPC采集已禁用，使用模拟数据)r   
opc_readerr   r>   rS   r   rD   )rS   r   r   r   r=      s   
r=   )__doc__r   r6   r;   r   opcuar   configr   r   r0   r1   r   r   r   rZ   rF   rD   r=   r   r   r   r   <module>   s    p