実現したいこと
現場作業員の方が現場のPC(windows)を使用し、ワンクリックで集計プログラムを実行すること(ワンクリックは無理だとしても少しでも作業工数を減らしたい)
又は、自動実行が一番良いのですが、月の変わり目、休日などの条件あり、エラーなしで作り込む自信がありません。
###現在検討しているプログラム実行方法
①anacondaをインストール ※最初のみ
②jupyterを選びクリック
③集計プログラムを選び、クリック
④shift+enterを押す
⑤更新したい月を入力
⑥8月であれば202108と入力
⑦enterを押す
上記はプログラムを普段使用している人であればストレスなく行えますが、使用していない人からするとかなりストレスを感じるかと思います。ただし、慣れてしまえば大丈夫な気もしますが・・・このような作業をアイコンを選んでダブルクリックのみで済ませることが出来るのが理想です。
###使用する集計プログラム
以下のプログラムを実行することで一日毎の稼働率が把握出来るexcelファイルが作成されます。
PYTHON
1import pandas as pd 2from openpyxl import Workbook 3import glob 4 5t=input('更新したい月を入力してください') 6file_list=glob.glob('//192.168.1.4/pi/mydata'+t+'*') 7rcd={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 8 9for file in file_list: 10 11 a=pd.read_csv(file) 12 d=(file[23:31]) 13 x=a.iloc[:,0].count() 14 y=a.iloc[:,1].sum() 15 z=a.iloc[:,2].sum() 16 u=x-y-z 17 w=round(y/x*100,1) 18 rcd['日付'].append(d) 19 rcd['稼働時間(分)'].append(y) 20 rcd['無人稼働時間(分)'].append(z) 21 rcd['停止時間(分)'].append(u) 22 rcd['トータル時間(分)'].append(x) 23 rcd['稼働率(%)'].append(w) 24 25df=pd.DataFrame(rcd) 26print(df) 27 28monthly_file = f'{t}.xlsx' 29try: 30 df_m = pd.read_excel(monthly_file,dtype={'日付': str}) 31 df_output = pd.merge(df_m, df,how='outer') 32except FileNotFoundError: 33 df_output = df.copy() 34 df_output['コメント'] = None 35 36df_output.to_excel(monthly_file,index=False)
###機械からの稼働率取得方法
稼働率取得を1分毎に自動取得しています。ラズベリーパイの光センサーでシグナルタワーの点灯パターンに合わせて機械の稼働率状況をpythonプログラムにてエクセル書き込みをしています。1分毎に毎日稼働状況を書き込みしています。
python
1import RPi.GPIO as GPIO 2import datetime 3import time 4from time import sleep 5import csv 6import tkinter as tk 7import pandas as pd 8import matplotlib.pyplot as plt 9import numpy as np 10 11 12root1=tk.Tk() 13root1.title("機械稼働率") 14root1.geometry("1065x130")#ウインドウのサイズ 15 16la1= tk.LabelFrame(root1, width=120, height=50,font=("arial", 40, "bold"),relief=tk.RIDGE,bd=10,) 17la1.grid(row=0, column=0) 18 19la2= tk.LabelFrame(root1, width=500, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 20la2.grid(row=0, column=1,columnspan=2) 21 22 23la3= tk.LabelFrame(root1, width=500, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10) 24la3.grid(row=0, column=3) 25 26la4= tk.LabelFrame(root1, width=120, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 27la4.grid(row=1, column=0) 28 29la5= tk.LabelFrame(root1, width=200, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 30la5.grid(row=1, column=1) 31 32la6= tk.LabelFrame(root1, width=200, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 33la6.grid(row=1, column=2) 34 35la7= tk.LabelFrame(root1, width=200, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 36la7.grid(row=1, column=3) 37 38 39#以下の設定で枠の大きさが設定出来る 40canvas1=tk.Canvas(la1,width=180,heigh=45,background='orange')#キャンバスエリア 41canvas2=tk.Canvas(la2,width=400,heigh=45,background='orange')#キャンバスエリア 42canvas3=tk.Canvas(la3,width=400,heigh=45,background='orange')#キャンバスエリア] 43canvas4=tk.Canvas(la4,width=180,heigh=45)#キャンバスエリア 44canvas5=tk.Canvas(la5,width=200,heigh=45,background='green')#キャンバスエリア 45canvas6=tk.Canvas(la6,width=200,heigh=45,background='red')#キャンバスエリア] 46canvas7=tk.Canvas(la7,width=400,heigh=45)#キャンバスエリア] 47 48 49canvas1.pack()#ここを書かないとcanvasがうまく入らない. 50canvas2.pack()#ここを書かないとcanvasがうまく入らない. 51canvas3.pack()#ここを書かないとcanvasがうまく入らない. 52canvas4.pack()#ここを書かないとcanvasがうまく入らない. 53canvas5.pack()#ここを書かないとcanvasがうまく入らない. 54canvas6.pack()#ここを書かないとcanvasがうまく入らない. 55canvas7.pack()#ここを書かないとcanvasがうまく入らない. 56 57 58 59dissolution=1 #計測分解能[s] 60time1=time2=time3=time4=time5=time6=time7=time8=time9=time10=time11=0 #0秒 61rate=0 62 63t1s=t1m=t1mm=t1h=0 64t2s=t2m=t2mm=t2h=0 65t3s=t3m=t3m=t3h=0 66t6s=t6m=t6mm=t6h=0 67 68 69today1=datetime.datetime.now() 70start=time.time() 71 72kikai='D-'+'32' 73 74try: 75 while True: 76 77 inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS)# CH0の信号を取得する プログラム運転(緑) 78 inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS)#アラーム(赤) 79 80 now=datetime.datetime.now() 81 now6=now-datetime.timedelta(hours=6)#24時〜30時を前日分として保存 82 nowday='{0:%Y%m%d}'.format(now6)#6時間前の日付でcsv保存するため 83 nt1=now.strftime('%H:%M')#現在時刻 84 nt='{0:%H%M}'.format(now)#時間 85 86 87 if inputVal0>2000 and inputVal1<2000:#緑点灯で赤消灯 88 #print(inputVal0) 89 time1=time1+1 90 time2=time2+1 91 time10=time10+1#csvファイル保存用 92 print('稼働時間'+str(time10)+'秒') 93 print('緑の光量'+str(inputVal0)) 94 print('赤の光量'+str(inputVal1)) 95 print(nt) 96 97 if time10 == 60:#60秒経過した場合 98 rcd=[] 99 rcd.append(now.strftime('%H:%M'))#時間追加 100 rcd.append(1) 101 rcd.append(0) 102 f=open('mydata'+nowday+'.csv','a',newline='') 103 wrtr=csv.writer(f,delimiter=',') 104 wrtr.writerow(rcd) 105 f.close() 106 time10=0#0秒に戻す 107 data=pd.read_csv('mydata'+nowday+'.csv') 108 x=data.iloc[:,0] 109 x1=x.count()#1行目のデータ個数 110 y=data.iloc[:,1] 111 y1=y.sum()#2行目の合計 112 113 z=round(y1/x1*100,1)#機械稼働率 小数点第一位まで 114 print('稼働時間'+str(y1)+'分') 115 116 canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 117 canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') 118 canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 119 canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') 120 canvas5.create_text(100,20,text=('稼働中'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 121 canvas6.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') 122 canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') 123 124 canvas1.update() 125 canvas2.update() 126 canvas3.update() 127 canvas4.update() 128 canvas5.update() 129 canvas6.update() 130 canvas7.update() 131 canvas1.delete('Y') 132 canvas2.delete('Y') 133 canvas3.delete('Y') 134 canvas4.delete('Y') 135 canvas5.delete('Y') 136 canvas6.delete('Y') 137 canvas7.delete('Y') 138 139 if inputVal1>2000 and inputVal0<2000:#赤点灯で緑消灯 140 time1=time1+1 141 time3=time3+1 142 time7=time7+1 143 time11=time11+1 144 print('準備時間'+str(time11)+'秒') 145 print('緑の光量'+str(inputVal0)) 146 print('赤の光量'+str(inputVal1)) 147 print(nt) 148 149 150 if time11 == 60: 151 rcd=[] 152 rcd.append(now.strftime('%H:%M')) 153 rcd.append(0) 154 rcd.append(0) 155 f=open('mydata'+nowday+'.csv','a',newline='') 156 wrtr=csv.writer(f,delimiter=',') 157 wrtr.writerow(rcd) 158 f.close() 159 time11=0 160 161 162 data=pd.read_csv('mydata'+nowday+'.csv') 163 x=data.iloc[:,0] 164 x1=x.count()#1行目のデータ個数 165 166 167 y=data.iloc[:,1] 168 y1=y.sum()#2行目の合計 169 170 z=round(y1/x1*100,1)#機械稼働率 小数点第一位まで 171 172 canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 173 canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') 174 canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 175 canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') 176 canvas5.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 177 canvas6.create_text(100,20,text=('停止中'),font=("",30,"roman"),tag='Y') 178 canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') 179 180 canvas1.update() 181 canvas2.update() 182 canvas3.update() 183 canvas4.update() 184 canvas5.update() 185 canvas6.update() 186 canvas7.update() 187 canvas1.delete('Y') 188 canvas2.delete('Y') 189 canvas3.delete('Y') 190 canvas4.delete('Y') 191 canvas5.delete('Y') 192 canvas6.delete('Y') 193 canvas7.delete('Y') 194 195 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) 196 a=dissolution - elapsed_time 197 sleep(a) 198 print('プログラム待機時間'+str(a)) 199 start=time.time() 200 201 202 203except KeyboardInterrupt: #cntl+Cで停止 204 pass 205 206 207
回答2件
あなたの回答
tips
プレビュー