前提・実現したいこと
機械稼働状況グラフの横軸表示を7:00スタートで24:00時終了としたい。
グラフで機械が稼働している時間と停止している時間を可視化する事が目的です。
※青塗りつぶしが稼働中、無色は停止(y軸は1が最大、0が最小)
###ラズパイ光センサーのデータ記録方法
ラズパイ光センサーにて光を読み取った場合にラズパイ内のエクセルに書き込みし、matplotlibでエクセルデータ読み取り、リアルタイムにグラフ更新をかけています。このグラフにより、機械稼働状況の見える化を行っています。データ記録方法は稼働していた場合にシグナルタワーの稼働ランプを読み取り、現在時刻と1を記録、停止していた場合は停止ランプが作動するので現在時刻と0を記録、無人稼働の場合は稼働ランプと停止ランプの両方が点灯し、現在時刻と2列目に1と記録します。機械の電源が入っていない場合は記録がされないようにしています。光を読み取った時間を記録し、それをグラフにしているだけなのでその日の最初に読み取った時間がグラフにて表示される時間(画像では22:29スタート、終了23:38)となってしまってますが、グラフ表示はスタートを7:00、終了を24:00としたいです。※機械の電源が入っていない時間(シグナルタワーの点灯が全て消灯)も常に読み取るようにすることも考えましたが、休日など常に記録が続いてしまい、エクセルファイルが大量になってしまうので断念しました。
##機械稼働状況をシグナルタワーの点灯パターンにより記録しているコード
python
1dissolution=1 #計測分解能[s] 2rate=0 3def readadc(adcnum,clockpin,mosipin,misopin,cspin): 4 if adcnum> 7 or adcnum<0: 5 return -1 6 GPIO.output(cspin,GPIO.HIGH) 7 GPIO.output(clockpin,GPIO.LOW) 8 GPIO.output(cspin,GPIO.LOW) 9 commandout=adcnum 10 commandout |=0x18 11 commandout<<=3 12 for i in range(5): 13 if commandout & 0x80: 14 GPIO.output(mosipin,GPIO.HIGH) 15 else: 16 GPIO.output(mosipin,GPIO.LOW) 17 commandout<<=1 18 GPIO.output(clockpin,GPIO.HIGH) 19 GPIO.output(clockpin,GPIO.LOW) 20 21 adcout=0 22 for i in range(13) 23 GPIO.output(clockpin,GPIO.HIGH) 24 GPIO.output(clockpin,GPIO.LOW) 25 adcout<<=1 26 if i>0 and GPIO.input(misopin)==GPIO.HIGH: 27 adcout |=0x1 28 GPIO.output(cspin,GPIO.HIGH) 29 return adcout 30GPIO.setmode(GPIO.BCM) 31SPICS=8 32SPIMISO=9 33SPIMOSI=10 34SPICLK=11 35GPIO.setup(SPICLK,GPIO.OUT) 36GPIO.setup(SPIMOSI,GPIO.OUT) 37GPIO.setup(SPIMISO,GPIO.IN) 38GPIO.setup(SPICS,GPIO.OUT) 39today1=datetime.datetime.now() 40start=time.time() 41kikai='D-'+'32' 42try: 43 while True: 44 inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS) 45 inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS) 46 now=datetime.datetime.now() 47 now6=now-datetime.timedelta(hours=6) 48 nowday='{0:%Y%m%d}'.format(now6) 49 nt1=now.strftime('%H:%M') 50 nt='{0:%H%M}'.format(now) 51 52 if inputVal0>2000 and inputVal1<2000: 53 time1=time1+1 54 time2=time2+1 55 time10=time10+1 56 if time10 == 60: 57 rcd=[] 58 rcd.append(now.strftime('%H:%M')) 59 rcd.append(1) 60 rcd.append(0) 61 f=open('mydata'+nowday+'.csv','a',newline='') 62 wrtr=csv.writer(f,delimiter=',') 63 wrtr.writerow(rcd) 64 f.close() 65 time10=0 66 data=pd.read_csv('mydata'+nowday+'.csv') 67 x=data.iloc[:,0] 68 x1=x.count() 69 y=data.iloc[:,1] 70 y1=y.sum() 71 z=round(y1/x1*100,1) 72 canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') 73 canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') 74 canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') 75 canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') 76 canvas5.create_text(100,20,text=('稼働中'),font=("",30,"roman"),tag='Y') 77 canvas6.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') 78 canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') 79 canvas1.update() 80 canvas2.update() 81 canvas3.update() 82 canvas4.update() 83 canvas5.update() 84 canvas6.update() 85 canvas7.update() 86 canvas1.delete('Y') 87 canvas2.delete('Y') 88 canvas3.delete('Y') 89 canvas4.delete('Y') 90 canvas5.delete('Y') 91 canvas6.delete('Y') 92 canvas7.delete('Y') 93 if inputVal1>2000 and inputVal0<2000 94 time1=time1+1 95 time3=time3+1 96 time7=time7+1 97 time11=time11+1 98 if time11 == 60: 99 rcd=[] 100 rcd.append(now.strftime('%H:%M')) 101 rcd.append(0) 102 rcd.append(0) 103 f=open('mydata'+nowday+'.csv','a',newline='') 104 wrtr=csv.writer(f,delimiter=',') 105 wrtr.writerow(rcd) 106 f.close() 107 time11=0 108 data=pd.read_csv('mydata'+nowday+'.csv') 109 x=data.iloc[:,0] 110 x1=x.count() 111 y=data.iloc[:,1] 112 y1=y.sum() 113 z=round(y1/x1*100,1) 114 canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') 115 canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') 116 canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') . 117 canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') 118 canvas5.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') 119 canvas6.create_text(100,20,text=('停止中'),font=("",30,"roman"),tag='Y') 120 canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') 121 canvas1.update() 122 canvas2.update() 123 canvas3.update() 124 canvas4.update() 125 canvas5.update() 126 canvas6.update() 127 canvas7.update() 128 canvas1.delete('Y') 129 canvas2.delete('Y') 130 canvas3.delete('Y') 131 canvas4.delete('Y') 132 canvas5.delete('Y') 133 canvas6.delete('Y') 134 canvas7.delete('Y') 135 if inputVal1<2000 and inputVal0<2000: 136 time1=time1+1 137 time3=time3+1 138 time5=time5+1 139 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) 140 a=dissolution - elapsed_time 141 sleep(a) 142 start=time.time() 143except KeyboardInterrupt: #cntl+Cで停止 144 pass 145GPIO.cleanup()
光センサーにて記録しているエクセルデータ
ラズベリーパイ光センサーにて、60秒稼働稼働ランプを読み取った場合にエクセルデータ1列目に現在時刻、2列目に1、3列目に0と記録、停止ランプを60秒読み取った場合に1列目に現在時刻、2列目に0と記録、3列目に0、電源が入っていない場合は何も記録なし、無人稼働の場合(稼働ランプ、停止ランプが両方点灯)は2列目が0で3列目が1なります。
エクセルデータをplotしている該当のソースコード
python
1コード 2try: 3 while True: 4 inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS) 5 inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS) 6 now=datetime.datetime.now() 7 now6=now-datetime.timedelta(hours=6) 8 nowday='{0:%Y%m%d}'.format(now6) 9 if inputVal0>2000: 10 time1=time1+1 11 time2=time2+1 12 time10=time10+1 13 if time10 == 60: 14 data=pd.read_csv('mydata'+nowday+'.csv') 15 x=data.iloc[:,0] 16 x1=x.count() 17 y=data.iloc[:,1] 18 y1=y.sum()#2行目の合計 19 z=round(y1/x1*100,1) 20 w=round(y1/60,1) 21 print('稼働時間'+str(w)+'時間') 22 print('機械稼働率'+str(z)+'%') 23 s='稼働時間'+str(w)+'時間'+'機械稼働率'+str(z)+'%' 24 plt.xlabel("時刻") 25 plt.ylabel("1=稼働,0=停止") 26 plt.text(1000,0.4,s)#グラフにコメントを入れる 27 plt.bar(x,y,width=1.0) 28 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(60)) 29 plt.subplots_adjust(left=0.05, right=1, bottom=0.15, top=1) 30 plt.draw() 31 plt.pause(1) 32 plt.clf() 33 time10=0 34 35 else: 36 if inputVal1>2000: 37 time1=time1+1 38 time3=time3+1 39 time7=time7+1 40 time11=time11+1 41 print(now.strftime('%H:%M')) 42 43 if time11 == 60: 44 data=pd.read_csv('mydata'+nowday+'.csv') 45 x=data.iloc[:,0] 46 x1=x.count() 47 y=data.iloc[:,1] 48 y1=y.sum()#2行目の合計 49 z=round(y1/x1*100,1) 50 w=round(y1/60,1) 51 print('稼働時間'+str(w)+'時間') 52 print('機械稼働率'+str(z)+'%') 53 s='稼働時間'+str(w)+'時間'+'機械稼働率'+str(z)+'%' 54 plt.xlabel("時刻") 55 plt.ylabel("1=稼働,0=停止") 56 plt.text(1000,0.4,s) 57 plt.bar(x,y,width=1.0) 58 plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(60)) 59 plt.subplots_adjust(left=0, right=1, bottom=0.15, top=1) 60 plt.draw() 61 plt.pause(1) 62 plt.clf() 63 time11=0 64 else: 65 time1=time1+1 66 time3=time3+1 67 68 69 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) 70 a=dissolution - elapsed_time 71 sleep(1) 72 start=time.time() 73 74except FileNotFoundError: 75 pass
###plt.xlim(07:00,24:00)を入れた場合
7:00と24:00のデータがない場合もあるので8:06~8:23のデータを読み取りましたが、時刻の表示がありませんでした。作業者の機械稼働スタートが何らかの理由で7:30などになってしまう事もあり、逆に24時以前に機械電源オフとなり記録がなくなることもあります。常に7:00~24:00のデータがあるのであればxlimで対応出来ると思いました。
回答2件
あなたの回答
tips
プレビュー