Compare commits

..

No commits in common. "main" and "v0.0.23" have entirely different histories.

4 changed files with 103 additions and 258 deletions

Binary file not shown.

View File

@ -4,45 +4,29 @@
"action": "Off" "action": "Off"
}, },
"measure": { "measure": {
"action": "On" "action": "On",
"duration": 20
}, },
"mixed": { "mixed": {
"action": "Off" "action": "Off",
"duration": 7
}, },
"pure": { "pure": {
"action": "Off", "action": "Off",
"duration": 1.5 "duration": 10,
}, "holding": 5
"enter":{
"action": "Off"
}, },
"enter":{
"action": "Off",
"duration": 10
},
"vent": { "vent": {
"action": "On" "action": "Off",
"duration": 30,
"holding": 2
}, },
"motor": { "motor": {
"action": "Off" "action": "Off"
},
"main": {
"action": "Off",
"duration": 1.5
}
},
"working-time":{
"step0": 5,
"step1": 10,
"step2": 6,
"step3": 7,
"step4": 20,
"step5": 10,
"step6": 6,
"step7": 6,
"step8": 10,
"step9": 0.5
},
"maintenance": {
"clean": {
"duration": 20,
"time": 25
} }
}, },
"type": "manual" "type": "manual"

View File

@ -7,5 +7,5 @@ spec:
virtualEnv: base # 사용할 가상환경 이름입니다. virtualEnv: base # 사용할 가상환경 이름입니다.
package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.) package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.)
stackbase: stackbase:
tagName: v0.0.49 # Stackbase(gitea)에 릴리즈 태그명 입니다. tagName: v0.0.23 # Stackbase(gitea)에 릴리즈 태그명 입니다.
repoName: sampyo-dio # Stackbase(gitea)에 저장될 저장소 이릅니다. repoName: sampyo-dio # Stackbase(gitea)에 저장될 저장소 이릅니다.

289
main.py
View File

@ -35,34 +35,13 @@ def Valve_MixedWater(chip, status, action):
chip.set_values(status) chip.set_values(status)
def Valve_PureWater(chip, status, action, duration=7): def Valve_PureWater(chip, status, action):
global pure_valve_status if action == 'On':
status[2] = 0
status[3] = 0
chip.set_values(status)
time.sleep(0.05)
if pure_valve_status != 0 and action == 'Off':
status[2] = 0
status[3] = 1 status[3] = 1
chip.set_values(status) else: # action == 'Off'
time.sleep(7)
pure_valve_status = 0
elif pure_valve_status == 0 and action == 'On':
status[2] = 1
status[3] = 0 status[3] = 0
chip.set_values(status)
time.sleep(duration)
if duration >= 7:
pure_valve_status = 2
elif duration < 7:
pure_valve_status = 1
status[2] = 0
status[3] = 0
chip.set_values(status) chip.set_values(status)
time.sleep(0.05)
def Valve_EnterWater(chip, status, action): def Valve_EnterWater(chip, status, action):
if action == 'On': if action == 'On':
@ -72,49 +51,19 @@ def Valve_EnterWater(chip, status, action):
chip.set_values(status) chip.set_values(status)
def Valve_MainWater(chip, status, action, duration=7):
global main_valve_status
status[5] = 0
status[6] = 0
chip.set_values(status)
time.sleep(0.05)
if main_valve_status != 0 and action == 'Off':
status[5] = 0
status[6] = 1
chip.set_values(status)
time.sleep(7)
main_valve_status = 0
elif main_valve_status == 0 and action == 'On':
status[5] = 1
status[6] = 0
chip.set_values(status)
time.sleep(duration)
if duration >= 7:
main_valve_status = 2
elif duration < 7:
main_valve_status = 1
status[5] = 0
status[6] = 0
chip.set_values(status)
time.sleep(0.05)
def Measure_Weight(client): def Measure_Weight(client):
# print('in') # print('in')
val = 0 val = 0
try: try:
result = client.read_holding_registers(1, 1) result = client.read_holding_registers(1, 1)
if not result: if result.iserror():
print(f'Error: {result}') print(f'Error: {result}')
else: else:
val = result.registers[0] val = result.registers[0]
val -= 1000 val -= 1000
val /= 1000 val /= 1000
# print(f'value: {val}') #print(f'value: {val}')
except Exception as e: except Exception as e:
print(f'Measure_Weight Error: {e}')
pass pass
return float(val) return float(val)
@ -130,125 +79,109 @@ def Set_Zero(client):
client.write_coil(1, 1) client.write_coil(1, 1)
def Command_Read(): def Command_Read():
global client, main_valve_status
with open('./control.json', 'r') as f: with open('./control.json', 'r') as f:
cmd = json.load(f) cmd = json.load(f)
if cmd['type'] == 'auto': if cmd['type'] == 'auto':
main_duration = float(cmd['device']['main']['duration'])
pure_duration = float(cmd['device']['pure']['duration'])
step0_duration = float(cmd['working-time']['step0'])
step1_duration = float(cmd['working-time']['step1'])
step2_duration = float(cmd['working-time']['step2'])
step3_duration = float(cmd['working-time']['step3'])
step4_duration = float(cmd['working-time']['step4'])
step5_duration = float(cmd['working-time']['step5'])
step6_duration = float(cmd['working-time']['step6'])
step7_duration = float(cmd['working-time']['step7'])
step8_duration = float(cmd['working-time']['step8'])
step9_duration = float(cmd['working-time']['step9'])
Valve_Vent(chip=output_lines, status=status, action='Off')
Motor(chip=output_lines, status=status, action='Off')
# Step 0. Mesure init weight before starting the sequence mixed_duration = int(cmd['device']['mixed']['duration'])
time.sleep(step0_duration) pure_duration = int(cmd['device']['pure']['duration'])
pure_holding = int(cmd['device']['pure']['holding'])
vent_duration = int(cmd['device']['vent']['duration'])
vent_holding = int(cmd['device']['vent']['holding'])
measure_duration = int(cmd['device']['measure']['duration'])
enter_duration = int(cmd['device']['enter']['duration'])
time.sleep(7)
start = Measure_Weight(client=client) start = Measure_Weight(client=client)
time.sleep(5)
# Step 1. Vent pured water before input mixed water # input mixed water
# Target valve status: [Motor: Off, Vent: On, Pure: Off, Enter: On, Main: On] Valve_MixedWater(chip=output_lines, status=status, action='On')
time.sleep(0.5)
Valve_EnterWater(chip=output_lines, status=status, action='On') Valve_EnterWater(chip=output_lines, status=status, action='On')
time.sleep(0.5) time.sleep(0.5)
Valve_Vent(chip=output_lines, status=status, action='On') Valve_Vent(chip=output_lines, status=status, action='On')
time.sleep(0.5) time.sleep(vent_holding)
Valve_MainWater(chip=output_lines, status=status, action='On', duration=main_duration)
time.sleep(step1_duration)
# Step 2. Empty the remaining pure water
# Target valve status: [Motor: Off, Vent: On, Pure: Off, Enter: Off, Main: On]
Valve_EnterWater(chip=output_lines, status=status, action='Off')
time.sleep(step2_duration)
# Step 3. Input the mixed water
# Target valve status: [Motor: Off, Vent: Off, Pure: Off, Enter: On, Main: On]
Valve_Vent(chip=output_lines, status=status, action='Off') Valve_Vent(chip=output_lines, status=status, action='Off')
time.sleep(mixed_duration)
Valve_MixedWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5) time.sleep(0.5)
Valve_EnterWater(chip=output_lines, status=status, action='On')
time.sleep(step3_duration)
# Step 4. Mesure the weight
# Target valve status: [Motor: Off, Vent: Off, Pure: Off, Enter: Off, Main: Off]
Valve_EnterWater(chip=output_lines, status=status, action='Off') Valve_EnterWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5) time.sleep(measure_duration)
Valve_MainWater(chip=output_lines, status=status, action='Off')
time.sleep(step4_duration) # measure weight
end = Measure_Weight(client=client) end = Measure_Weight(client=client)
time.sleep(1) time.sleep(1)
Calculate_Concentration(weight=(float(end)-float(start))) Calculate_Concentration(weight=(float(end)-float(start)))
# Step 5. Drain the mixed water and add pure water. # # vent mixed water
# Target valve status: [Motor: Off, Vent: On, Pure: On, Enter: On, Main: Off] # Valve_Vent(chip=output_lines, status=status, action='On')
Valve_EnterWater(chip=output_lines, status=status, action='On') # time.sleep(0.5)
# Motor(chip=output_lines, status=status, action='On')
# time.sleep(vent_duration)
# Motor(chip=output_lines, status=status, action='Off')
# time.sleep(0.5)
# Valve_Vent(chip=output_lines, status=status, action='Off')
# time.sleep(0.5)
# # input pure water
# Valve_PureWater(chip=output_lines, status=status, action='On')
# time.sleep(pure_duration)
# Valve_PureWater(chip=output_lines, status=status, action='Off')
# time.sleep(0.5)
# # vent pure water
# Valve_Vent(chip=output_lines, status=status, action='On')
# time.sleep(0.5)
# Motor(chip=output_lines, status=status, action='On')
# time.sleep(vent_duration)
# Motor(chip=output_lines, status=status, action='Off')
# time.sleep(0.5)
# Valve_Vent(chip=output_lines, status=status, action='Off')
# time.sleep(1)
# Vent and Clear sequence
# 1) Motor On
Motor(chip=output_lines, status=status, action='On')
time.sleep(0.5) time.sleep(0.5)
# 2) Input Pure Water
Valve_PureWater(chip=output_lines, status=status, action='On')
time.sleep(0.5)
Valve_EnterWater(chip=output_lines, status=status, action='On')
time.sleep(vent_holding)
# 3) Open Vent
Valve_Vent(chip=output_lines, status=status, action='On') Valve_Vent(chip=output_lines, status=status, action='On')
time.sleep(pure_duration)
Valve_PureWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5) time.sleep(0.5)
Valve_PureWater(chip=output_lines, status=status, action='On', duration=pure_duration)
time.sleep(step5_duration)
# Step 6. Drain mixed water
# Target valve status: [Motor: Off, Vent: On, Pure: On, Enter: Off, Main: Off]
Valve_EnterWater(chip=output_lines, status=status, action='Off') Valve_EnterWater(chip=output_lines, status=status, action='Off')
time.sleep(step6_duration)
# Step 7. Input pure water and clean # 4) Wait until empty
# Target valve status: [Motor: On, Vent: Off, Pure: On, Enter: On, Main: Off] time.sleep(vent_duration)
Valve_EnterWater(chip=output_lines, status=status, action='On')
# 5) Motor Off and Vent close
Motor(chip=output_lines, status=status, action='Off')
time.sleep(0.5) time.sleep(0.5)
Valve_Vent(chip=output_lines, status=status, action='Off') Valve_Vent(chip=output_lines, status=status, action='Off')
time.sleep(0.5) time.sleep(0.5)
Motor(chip=output_lines, status=status, action='On')
time.sleep(step7_duration)
# Step 8. Drain pure Water
# Target valve status: [Motor: On, Vent: On, Pure: Off, Enter: Off, Main: Off]
Valve_EnterWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5)
Valve_Vent(chip=output_lines, status=status, action='On')
time.sleep(0.5)
Valve_PureWater(chip=output_lines, status=status, action='Off')
time.sleep(step8_duration)
# Step 9. Stop moter
# Target valve status: [Motor: Off, Vent: On, Pure: Off, Enter: Off, Main: Off]
Motor(chip=output_lines, status=status, action='Off')
time.sleep(step9_duration)
return 1 return 1
elif cmd['type'] == 'clean':
clean_system()
time.sleep(3)
else: # cmd['type'] == 'manual' else: # cmd['type'] == 'manual'
Motor(chip=output_lines, status=status, action=cmd['device']['motor']['action']) Motor(chip=output_lines, status=status, action=cmd['device']['motor']['action'])
Valve_Vent(chip=output_lines, status=status, action=cmd['device']['vent']['action']) Valve_Vent(chip=output_lines, status=status, action=cmd['device']['vent']['action'])
# Valve_MixedWater(chip=output_lines, status=status, action=cmd['device']['mixed']['action']) Valve_MixedWater(chip=output_lines, status=status, action=cmd['device']['mixed']['action'])
# Valve_PureWater(chip=output_lines, status=status, action=cmd['device']['pure']['action']) Valve_PureWater(chip=output_lines, status=status, action=cmd['device']['pure']['action'])
Valve_EnterWater(chip=output_lines, status=status, action=cmd['device']['enter']['action']) Valve_EnterWater(chip=output_lines, status=status, action=cmd['device']['enter']['action'])
if cmd['device']['pure']['duration'] == 0:
Valve_PureWater(chip=output_lines, status=status, action=cmd['device']['pure']['action'])
else:
Valve_PureWater(chip=output_lines, status=status, action=cmd['device']['pure']['action'], duration=cmd['device']['pure']['duration'])
if cmd['device']['main']['duration'] == 0:
Valve_MainWater(chip=output_lines, status=status, action=cmd['device']['main']['action'])
else:
Valve_MainWater(chip=output_lines, status=status, action=cmd['device']['main']['action'], duration=cmd['device']['main']['duration'])
if cmd['device']['measure']['action'] == 'On': if cmd['device']['measure']['action'] == 'On':
result = Measure_Weight(client=client) result = Measure_Weight(client=client)
Calculate_Concentration(result) Calculate_Concentration(result)
@ -259,37 +192,6 @@ def Command_Read():
return 0 return 0
def clean_system():
global main_valve_status
with open('./control.json', 'r') as f:
cmd = json.load(f)
clean_duration = int(cmd['maintenance']['clean']['duration'])
if cmd['type'] == 'clean':
Valve_EnterWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5)
Valve_MainWater(chip=output_lines, status=status, action='On')
time.sleep(0.5)
Valve_PureWater(chip=output_lines, status=status, action='On')
time.sleep(clean_duration)
Valve_MainWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5)
Valve_EnterWater(chip=output_lines, status=status, action='On')
time.sleep(0.5)
Valve_Vent(chip=output_lines, status=status, action='On')
time.sleep(clean_duration)
Valve_PureWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5)
Valve_Vent(chip=output_lines, status=status, action='Off')
time.sleep(0.5)
Valve_EnterWater(chip=output_lines, status=status, action='Off')
time.sleep(0.5)
def runAction(): def runAction():
# Write the app's actions in the "runAction" function. # Write the app's actions in the "runAction" function.
@ -314,8 +216,8 @@ def runAction():
# - Asset Code's variable: assetCode(string) # - Asset Code's variable: assetCode(string)
# - You may need it to create a topic. # - You may need it to create a topic.
cnt = 0 cnt = 0
clean_flag = 0
while True: while True:
start = time.time() start = time.time()
result = Command_Read() result = Command_Read()
@ -329,23 +231,6 @@ def runAction():
end = time.time() end = time.time()
try:
now = datetime.now(pytz.timezone('Asia/Seoul'))
time_str = now.strftime('%H')
time_int = int(time_str)
with open('./control.json', 'r') as f:
cmd = json.load(f)
if time_int == int(cmd['maintenance']['clean']['time']):
if clean_flag < 3:
clean_flag += 1
clean_system()
else:
clean_flag = 0
except:
pass
diff = end - start diff = end - start
if diff < 3: if diff < 3:
time.sleep(3 - diff) time.sleep(3 - diff)
@ -406,22 +291,6 @@ def handle_client(conn, ip, port):
err_msg = 'STXERRORETX' err_msg = 'STXERRORETX'
conn.sendall(err_msg.encode("utf8")) conn.sendall(err_msg.encode("utf8"))
elif message[3] == 'C': # Clean sequence
try:
with open('./control.json', 'r') as f:
cmd = json.load(f)
cmd['type'] = 'clean'
with open('./control.json', 'w') as f:
json.dump(cmd, f, indent=4)
send_msg = 'STXOKETX'
conn.sendall(send_msg.encode("utf8"))
except Exception as e:
err_msg = 'STXERRORETX'
conn.sendall(err_msg.encode("utf8"))
elif message[3] == 'T': # Stop measurement elif message[3] == 'T': # Stop measurement
try: try:
with open('./control.json', 'r') as f: with open('./control.json', 'r') as f:
@ -449,7 +318,7 @@ def handle_client(conn, ip, port):
# print("Closing the connection") # print("Closing the connection")
def start_server(addr, port): def start_server(addr, port):
host = addr # "172.17.16.201" host = addr # "25.7.57.1"
port = port # 5000 port = port # 5000
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@ -475,10 +344,8 @@ def start_server(addr, port):
def exit_handler(signum, frame): def exit_handler(signum, frame):
Motor(chip=output_lines, status=status, action='Off') Motor(chip=output_lines, status=status, action='Off')
Valve_Vent(chip=output_lines, status=status, action='Off') Valve_Vent(chip=output_lines, status=status, action='Off')
# Valve_MixedWater(chip=output_lines, status=status, action='Off') Valve_MixedWater(chip=output_lines, status=status, action='Off')
Valve_PureWater(chip=output_lines, status=status, action='Off') Valve_PureWater(chip=output_lines, status=status, action='Off')
Valve_EnterWater(chip=output_lines, status=status, action='Off')
Valve_MainWater(chip=output_lines, status=status, action='Off')
client.close() client.close()
@ -497,12 +364,6 @@ if __name__ == "__main__":
signal.signal(signal.SIGINT, exit_handler) signal.signal(signal.SIGINT, exit_handler)
main_valve_status = 0
pure_valve_status = 0
Valve_MainWater(chip=output_lines, status=status, action='Off')
Valve_PureWater(chip=output_lines, status=status, action='Off')
with open('./config.json', encoding='UTF-8') as f: with open('./config.json', encoding='UTF-8') as f:
jsonData = json.load(f) jsonData = json.load(f)