import threading import time import logging import serial import minimalmodbus import serial.rs485 import subprocess import json import queue import argparse import paho.mqtt.client as mqtt ''' 전달해야할 데이터 들 mes code | 상태 | 전압 | 전류 | 4pin (DO) | ER1 | ER2 tube 번호| 상태 | volt | curr | do | cnt | cnt tube 번호: 1 - 128 , chamber / slot - slot(n) - tube(n) - 1-1 ~ 8-16 : 128개다 상태: 정상이냐, 초기화, 불량 ER1: 1초동안 판별, 판별할 동안 counting 할 예정 2V 이하라면 CNT UP if) er: 10이 되었음 (1초 유지) -> 0으로 변환, ER2 cnt up if) 2v 이상인 경우가 발생했다 -> 0으로 변환 ER2: OFF 횟수 ''' parser = argparse.ArgumentParser() parser.add_argument('-config',help='') args = parser.parse_args() ROOT_PATH = f"/usr/local/sdt/app/{args.config}" ############################################################################### # JSON FILE READ # ############################################################################### with open(f"{args.config}/connect_info.json","r") as f: info = json.load(f) ############################################################################### # MQTT Broker Setting # ############################################################################### MQTT_TOPIC = info['mqtt']['topic'] MQTT_ID = info['mqtt']['id'] MQTT_PW = info['mqtt']['pw'] MQTT_HOST_IP = info['mqtt']['host_ip'] MQTT_PORT = info['mqtt']['port'] def publish_json_message(client, data): topic = MQTT_TOPIC client.publish(topic, payload=data) client = mqtt.Client("python_pub") client.username_pw_set(MQTT_ID, MQTT_PW) client.connect(host=MQTT_HOST_IP,port=MQTT_PORT) client.loop(2) # timeout = 2초 serial_dev1 = "" serial_dev2 = "" # chip0_lock = threading.Lock() # chip1_lock = threading.Lock() _serial_port1 = serial.Serial("/dev/ttyMAX1", 115200, parity= serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = 1, rtscts=True) _serial_port1.rs485_mode = serial.rs485.RS485Settings() _serial_port2 = serial.Serial("/dev/ttyMAX0", 115200, parity= serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = 1, rtscts=True) _serial_port2.rs485_mode = serial.rs485.RS485Settings() #_serial_port3 = serial.Serial("/dev/ttyMAX2", 115200, parity= serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = 1, rtscts=True) #_serial_port3.rs485_mode = serial.rs485.RS485Settings() #_serial_port4 = serial.Serial("/dev/ttyMAX3", 115200, parity= serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = 1, rtscts=True) #_serial_port4.rs485_mode = serial.rs485.RS485Settings() #data_queue = queue.Queue() ######################################### thread 함수 작성 ################################################ dict_1={} def read_cihp0(e,port_num1,port_num2,id1,id2,id3,id4,id5,id6): serial_dev1 = "/dev/ttyMAX1" serial_dev2 = "/dev/ttyMAX0" # lock = chip1_lock #_serial_port3 = serial.Serial("/dev/ttyMAX2", 115200, parity= serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = 1, rtscts=True) #_serial_port3.rs485_mode = serial.rs485.RS485Settings() #_serial_port4 = serial.Serial("/dev/ttyMAX3", 115200, parity= serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout = 1, rtscts=True) #_serial_port4.rs485_mode = serial.rs485.RS485Settings() port1_AI1 = minimalmodbus.Instrument(serial_dev1, id1, debug=False, close_port_after_each_call=False) # port name, slave address (in decimal) port1_AI1.serial.baudrate = 115200 # baudrate port1_DO = minimalmodbus.Instrument(serial_dev1, id2, debug=False, close_port_after_each_call=False) # port name, slave address (in decimal) port1_DO.serial.baudrate = 115200 # baudrate port1_AI2 = minimalmodbus.Instrument(serial_dev1, id3, debug=False, close_port_after_each_call=False) # port name, slave address (in decimal) port1_AI2.serial.baudrate = 115200 # baudrate port2_AI1 = minimalmodbus.Instrument(serial_dev2, id4, debug=False, close_port_after_each_call=False) # port name, slave address (in decimal) port2_AI1.serial.baudrate = 115200 # baudrate port2_DO = minimalmodbus.Instrument(serial_dev2, id5, debug=False, close_port_after_each_call=False) # port name, slave address (in decimal) port2_DO.serial.baudrate = 115200 # baudrate port2_AI2 = minimalmodbus.Instrument(serial_dev2, id6, debug=False, close_port_after_each_call=False) # port name, slave address (in decimal) port2_AI2.serial.baudrate = 115200 # baudrate global read_cnt_ch0 read_cnt_ch0 = 0 global suc_cnt_ai global suc_cnt_do global suc_cnt_ai2 global suc_cnt_do2 suc_cnt_ai = 0 suc_cnt_do = 0 suc_cnt_ai2 = 0 suc_cnt_do2 = 0 global lists lists = [] while True: e.wait() #print("read thread get even") e.clear() read_cnt_ch0 = read_cnt_ch0 +1 #value list on -> do control data #추후에 do power on 할 리스트는 어디선가 읽어서 와야 해요 #do1 do2 나눠야 해요 value_list_ON = [1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0] # lock.acquire() timenow = time.time() ''' | AI1 | AI2 | DO1 | DO2 | Success | 0 | 0 | x | x | Success | 0 | 1 | x | x | Success | 1 | 0 | x | x | Success | 1 | 1 | x | x | => 유효한 데이터 최소 한개 이상 실패 했을 때 -> retry 해볼 것이냐 -> 데이터를 어떻게 할 것이냐 -> 이전 데이터가 있다면, 이전 데이터를 가지고 더미 데이터로 사용하는 방법 => 안하기로 했었음 ''' try: ai1=port1_AI1.read_registers(0x32, 32) suc_cnt_ai = suc_cnt_ai +1 except: # pass None # print("Port3 AI1 Fail") try: #print("try") port1_DO.write_bits(0, value_list_ON) suc_cnt_do = suc_cnt_do +1 #print("do1") except: None # print("Port3 DO Fail") # try: # ai2 = port3_AI2.read_registers(0x32, 32) # except: # print("Port3 AI2 Fail") #print(ai1) #print(ai2) try: global ai2 ai2=port2_AI1.read_registers(0x32, 32) suc_cnt_ai2 = suc_cnt_ai2 +1 except: pass # print("Port4 AI1 Fail") try: do2 = port2_DO.write_bits(0, value_list_ON) suc_cnt_do2 = suc_cnt_do2 +1 except: pass # print("Port4 DO Fail, ") # try: # ai2 = port4_AI2.read_registers(0x32, 32) # except: # print("Port4 AI2 Fail") #print(ai1) #print(ai2) # lock.release() ''' 리스트를 생성, 10개를 딱 잘라서 어떻게 해야 할ㅈ지 모르겠음 ''' ##데이터 생성 할 때 # ai1, ai2 # -> ai1 [32] -> [curr, volt, curr, volt ...] data_for_list = { "slot" : 1, "timestamp": int(timenow*1000), "data":{ "current": ai1, "volatge": ai2, "do1": value_list_ON, "err1": value_list_ON, "err2": value_list_ON #err1, 2 } } lists.append(data_for_list) ### 여기서 보냄 # 10번 시그널 받으면 # # list mqtt send # list clear if read_cnt_ch0 % 10 == 0: data = { "modelCode":"test4", "assetCode":"NQ-R04-TEST-003", "dataType":"DATA", "data": { "chamber":1, "list": lists } } global dict_1 data_json_str = json.dumps(data, indent=0) publish_json_message(client, data_json_str) #print(data_json_str) # time.sleep(1) # PRINT("CHip1 read count:", read_cnt) ######################################### thread 함수 작성 ################################################ def event_trigger_thread(): print("inpuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuut\r\n") if input("Enter to exit(): "): e.set() #exit() return def timer_event_loop(e): cnt = 0 # global read_cnt while True: # print("event set, meanning : periodic sensing") e.set() time.sleep(0.1) #cnt = cnt +1 #if cnt > 6000: # print("chip0 read count:", read_cnt_ch0) #print("\r\nchip1 read count:", read_cnt_ch0) #print("\r\nai1:", suc_cnt_ai, "\r\nai2:", suc_cnt_ai2) #print(ai2) #break #print(cnt) # print(read_cnt) exit() # timer = threading.Timer(3, lambda: print("test event")) # timer.start() # timer.join() # # timer = threading.Timer(3, lambda: e.set()) ################################# 작성 중 ##################################### # def publish_json_message(client, data): # topic = "devicedata/axr/nodeq1" # client.publish(topic, payload=data) # client = mqtt.Client("python_pub") # client.username_pw_set("sdt", "251327") # client.connect(host="13.209.39.139",port=32259) # # get_value() # data = json.dumps(dict_1) # #publish_json_message(client, data) # client.loop(2) # timeout = 2초 ################################# 작성 중 ###################################### if __name__ == '__main__': e = threading.Event() read_data_chip0 = threading.Thread(target=read_cihp0,args=(e,1,2,1,2,3,5,6,7)) # read_data_chip1 = threading.Thread(target=read_cihp1,args=(e,2,3,9,10,11,13,14,15)) # read_data_ch3 = threading.Thread(target=read_thread,args=(e,3,9,10,11)) # read_data_ch4 = threading.Thread(target=read_thread,args=(e,4,13,14,15)) event_trigger = threading.Thread(target=event_trigger_thread) event_thread = threading.Thread(target=timer_event_loop, args=(e,)) # timer = threading.Timer(3,lambda: e.set()) # 1 time # read_data_ch1.start() # read_data_ch2.start() # read_data_chip1.start() read_data_chip0.start() # timer.start() event_trigger.start() event_thread.start() # wait_and_timer.start() # while True: # input("Enter to trigger the event: ") # exit(): # e.set() # time.sleep(600