실험 시스템에서도 Python으로 효율화하고 싶습니다. (3) Pandas에서 Excel과 같은 것을하고 싶습니다.

동기



  • (1) 참조

  • 환경


  • Windows10
  • Anaconda(3.x)
  • (2)에서 pySerial을 conda install했습니다

  • 목표


  • 내 환경에서 수동 조작 자동화를 예로 들어 자동화 방법을 보여줍니다

  • 방법



    pandas라는 Python에서 사용할 수있는 Excel과 같은 테이블 작업에 적합한 패키지가 있습니다. 이것과 matplotlib라는 그래프를 간단하게 깨끗하게 그릴 수 있는 패키지를 이용해 「자동으로 취득한 전압값을 그래프화한다」의 예를 제시합니다.



    공간에 전류가 광범위하게, 한 방향으로 흐르고 있을 때, 공간보다 작은 마토를 사용해 전류를 측정한다고 합니다. 마토를 전류에 수직으로 조금씩 가로지르고 단계별 전류를 기록할 때 pyserial에서 "이동 제어"와 "전류 측정"을 제어합니다. 이동의 제어는 시그마 광기 SHOT102 , 전류의 측정은 ADVANTEST사의 R6441 시리즈를 이용하고 있습니다.


    셀1


    import serial
    import time
    import pandas as pd
    import matplotlib.pyplot as plt
    
    serial 는 pyserial 을 사용하고, time 는 직렬 통신의 간격 시간을 만든다, pandas 는 dataframe 을 사용한다.

    셀2


    ## 定数指定 
    MAX = 42000
    COMpulse = "COM9"
    COMampere = "COM10"
    bitRate = 9600
    
    matplotlib.pyplot 에서 사용할 상수를 지정합니다.

    Cell3


    ## 変数初期化 
    pulse = 0
    ampere_list = []
    pulse_list = []
    ampere_average_list =[]
    

    사용할 변수를 초기화합니다.

    Cell4(선택사항)


    ## 奥原点移動(初期化)
    ser = serial.Serial(COMpulse, bitRate, timeout=0.1)
    ser.write(b"H:2-\r\n")
    time.sleep(0.1)
    print(ser.read_all())
    ser.close()
    

    동작 확인과 계측 원점으로 이동합니다.

    Cell5


    pyserial 는 0-42000의 값을 취하고 펄스 당 3μm 이동합니다. (실제로는 2펄스당 6μm 움직입니다만, 커맨드는 이렇게 기술하는 것 같습니다). 각 position에서 전류의 값을 5회 샘플링하고, 평균하여 그 점에서의 값으로 합니다. 평균 횟수는 선택 사항입니다. 광학대를 끝까지 움직여 끝나면, 전류와 위치의 값의 리스트를 dataframe으로서 붙여, pulse치를 실제의 길이로 변환해, matplotlib로 묘화 한다. 라는 흐름이 되고 있습니다. (이어서 dataframe을 csv에 내고 있습니다.)
    ## 測定開始
    while 1:
        if pulse >= MAX:
            ## 位置がMAXまで来ている場合while文を終了
            break
        ## 現在位置の情報を記録
        pulse_list.append(pulse/2) #pulseは何故か2倍で指定して命令するので2で割っている
        ## 電流を測定する(5回とって平均したものをその位置での値とする)
        for i in range(5):
            ser = serial.Serial(COMampere,bitRate,timeout=0.1)
            time.sleep(0.5)
            ser.write(b"MD?\r\n")
            time.sleep(0.5)
            tmp = ser.read_all()
            ampere = float(tmp.split()[1])
            ampere_average_list.append(ampere)
            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(0.5)
        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})
    ## pulse値を長さに変える
    def pulseToMilliMeter(pulse):
        return pulse*0.006
    df["position(mm)"] = df["pulse"].map(pulseToMilliMeter) # Excelの一括関数適用のようなことができる
    df.to_csv('./csv/hoge/result.csv',index=False)
    ## matplotlibを用いてグラフを描画する
    plt.figure()
    df.plot(x='position(mm)',y='ampere(A)')
    plt.savefig('./img/sample.png')
    plt.close('all')
    

    결론



    이상으로 효율화할 수 있다고 합니다. 실제로 Enter를 누르는 것만으로, 꽤 간단하게 되었고, 재현성도 높아집니다. 그 밖에도 효율화할 수 있는 재료가 생기면 계속을 씁니다.

    좋은 웹페이지 즐겨찾기