前回までのあらすじ
前回までで測定を自動化できるようになりました。今回は測定装置が機嫌が悪い時に、エラーを吐いてしまうのでそれに対応します。
Windows COMポート二桁以上許容されない問題
- マイクロソフトサポートページ
- 上記サイトでも言及されている通り、WindowsではCOMポートが、接続デバイスが増えるごとに増殖し続けるにも関わらず、10以上になると不具合が出ることがあります。私の環境ではADVANTEST社のR6441が、USBハブなどを用いて接続しているときに、COMポートが10以上だと測定に失敗することがあります。
try構文を用いて解決する
except
のあとに例外の名前(エラーのときに出力される)を書いておくと、失敗したときの挙動を決められます。今回は、ser.close()
するようにします。
try:
while 1:
if pulse >= MAX:
## 位置がMAXまで来ている場合while文を終了
break
## 現在位置の情報を記録
pulse_list.append(pulse/2)
## 電流を測定する(5回とって平均したものをその位置での値とする)
for i in range(5):
ser = serial.Serial(COMampere,bitRate,timeout=0.1)
ser.write(b"F5, R0,PR2\r\n")
time.sleep(1)
ser.write(b"MD?\r\n")
time.sleep(1)
tmp = ser.read_all()
# 電流が取れていない場合はスキップする
if len(tmp)== 0:
ser.close()
continue
ampere = float(tmp.split()[2])
ampere_average_list.append(ampere)
time.sleep(1)
ser.close()
## 電流とpulse(位置)をlistに追加
ampere_list.append(sum(ampere_average_list)/len(ampere_average_list))
ampere_average_list = []
## 光学台を動かす
pulse += 1000
position = "A:2+P"+str(pulse)+"\r\n"
ser = serial.Serial(COMpulse,bitRate,timeout=0.1)
ser.write(bytes(position, 'UTF-8'))
time.sleep(1)
ser.write(b"G:\r\n")
ser.close()
## リストをdataframeに変える
print(ampere_list)
print(pulse_list)
df = pd.DataFrame({'ampere(A)':ampere_list,'pulse':pulse_list})
def pulseToMilliMeter(pulse):
return pulse*0.006
df["position(mm)"] = df["pulse"].map(pulseToMilliMeter)
df.to_csv('./csv/result.csv',index=False)
plt.figure()
df.plot(x='position(mm)',y='ampere(A)',marker='o')
plt.savefig('./img/sample.png')
plt.close('all')
except IndexError:
ser.close()