"TR6143-bas"의 두 판 사이의 차이

 
1번째 줄: 1번째 줄:
10    ! [[Advantest TR6143]] <pre>
+
[[Advantest TR6143]]  
 +
<pre>
 +
10    !
 
20    ! 2020-01-17 배터리 충방전 프로그램
 
20    ! 2020-01-17 배터리 충방전 프로그램
21     ! 2020-01-26 PTC용 표준 VI 측정추가
+
30     ! 2020-01-26 PTC용 표준 VI 측정추가
30     OPTION BASE 1
+
40     OPTION BASE 1
40     INTEGER No_cycle  !충반전 실험 횟수
+
50     INTEGER No_cycle  !충반전 실험 횟수
50     INTEGER Size,Length,Btn
+
60     INTEGER Size,Length,Btn
60     DIM Msg$[25]
+
70     DIM Msg$[25]
70     No_cycle=5
+
80     No_cycle=2  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
80  ! Wait=.01  !계측기 세팅을 한 후, 첫 측정에서 측정값이 0이 나오는 현상 때문에 잠시 대기 시간
+
90    Wait=.1   !계측기 세팅을 한 후, 첫 측정에서 측정값이 0이 나오는 현상 때문에 잠시 대기 시간
90    GOSUB Dut_select
+
100   GOSUB Dut_select
100    GOSUB Stimulus_select
+
110   GOSUB Stimulus_select
110    GOSUB Fileopen
+
120   GOSUB Fileopen
120    GOSUB Inst6143_open
+
130    GOSUB Inst6143_open
130    GOSUB Measure
+
140   GOSUB Measure
140    GOSUB Fileclose
+
150   GOSUB Fileclose
150    PAUSE
+
160  ! PAUSE
160    STOP
+
170   STOP
170 Dut_select:  !
+
180 Dut_select:  !
180    INTEGER Dut_no
+
190   INTEGER Dut_no
190    Size=2
+
200   Size=4
200    Length=7
+
210   Length=7
210    ALLOCATE Dut$(Size)[Length]
+
220   ALLOCATE Dut$(Size)[Length]
220   Dut$(1)="BATTERY"
+
230   Dut$(1)="BATTERY"
230   Dut$(2)="PTC"
+
240   Dut$(2)="EDLC"
240   Msg$="DUT 종류"
+
250   Dut$(3)="PTC"
250   DIALOG "LIST",Msg$,Btn;SET("ITEMS":Dut$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Dut_no)
+
260   Dut$(4)="tau"
260   Dut_no=Dut_no+1
+
270   Msg$="DUT 종류"
270   SELECT Dut$(Dut_no)
+
280   DIALOG "LIST",Msg$,Btn;SET("ITEMS":Dut$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Dut_no)
280   CASE "BATTERY"
+
290   Dut_no=Dut_no+1
290      GOSUB Battery_select
+
300   SELECT Dut$(Dut_no)
300   CASE "PTC"
+
310    CASE "BATTERY"
310      GOSUB Ptc_select
+
320      GOSUB Battery_select
320   END SELECT
+
330   CASE "EDLC"
330    RETURN
+
340      GOSUB Edlc_select
340 Battery_select:    !
+
350   CASE "PTC"
350    INTEGER Battery_no
+
360      GOSUB Ptc_select
360    Size=6
+
370   CASE "tau"
370   Length=6
+
380      GOSUB Tau_select
380   ALLOCATE Battery$(Size)[Length]
+
390   END SELECT
390   Battery$(1)="Li"
+
400    RETURN
400   Battery$(2)="NiCd"
+
410 Battery_select:    !
410   Battery$(3)="3-NiCd"
+
420    INTEGER Battery_no
420   Battery$(4)="EDLC"
+
430    Size=7
430    Battery$(5)="BAT"
+
440    Length=8
440    Battery$(6)="Li-S4"  !4개 직렬, 각셀을 34970A로 측정
+
450   ALLOCATE Battery$(Size)[Length]
450   Msg$="배터리 종류"
+
460   Battery$(1)="Li"
460   DIALOG "LIST",Msg$,Btn;SET("ITEMS":Battery$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Battery_no)
+
470   Battery$(2)="NiCd"
470   Battery_no=Battery_no+1
+
480    Battery$(3)="3-NiCd"
480   RETURN
+
490    Battery$(4)="   "
490 Ptc_select:  !
+
500    Battery$(5)="BAT"
500    INTEGER Ptc_no
+
510   Battery$(6)="Li-S4"  !4개 직렬, 각셀을 34970A로 측정
510   Size=6
+
520   Battery$(7)="GrandMax"
520    Length=6
+
530   Msg$="배터리 종류"
530   ALLOCATE Ptc$(Size)[Length]
+
540    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Battery$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Battery_no)
540    Ptc$(1)="SPL1"
+
550    Battery_no=Battery_no+1
550   Ptc$(2)="   "
+
560    RETURN
560   Ptc$(3)="   "
+
570 Edlc_select:  !
570   Msg$="PTC 종류"
+
580    INTEGER Edlc_no
580   DIALOG "LIST",Msg$,Btn;SET("ITEMS":Ptc$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Ptc_no)
+
590    Size=4
590   Ptc_no=Ptc_no+1
+
600    Length=10
600    RETURN
+
610    ALLOCATE Edlc$(Size)[Length]
610 Stimulus_select: !
+
620    Edlc$(1)="2.7V 0~1F"
620   SELECT Dut$(Dut_no)
+
630    Edlc$(2)="2.7V 1~10F"
630   CASE "BATTERY"
+
640    Edlc$(3)="5.5V 0~1F"
640      SELECT Battery$(Battery_no)
+
650    Edlc$(4)="5.5V 1~10F"
650      CASE "Li"
+
660    Msg$="EDLC 종류"
660        Vc=4.2!4.2V 충전전압        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
670    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Edlc$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Edlc_no)
670        Vd=3.2!3.2V 방전종료전압    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
680    Edlc_no=Edlc_no+1
680        Ic=1 !100mA 충전전류      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
690    RETURN
690        Ic_end=.5 !충전 종료 전류  !!내부 저항 !!!!!!!!!!!!!!!!!!!!!!!!
+
700 Ptc_select:  !
700        Id=-1 !100mA 방전전류 음수  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
710    INTEGER Ptc_no
710      CASE "NiCd"!표준 1.2V
+
720    Size=6
720        Vc=1.3!1.5V 충전전압
+
730    Length=6
730        Vd=.9!0.9V 방전종료전압
+
740    ALLOCATE Ptc$(Size)[Length]
740        Ic=.001!100mA 충전전류
+
750    Ptc$(1)="SPL1"
750        Ic_end=.0005!충전 종료 전류
+
760    Ptc$(2)="   "
760        Id=-.0001!100mA 방전전류 음수
+
770    Ptc$(3)="    "
770      CASE "3-NiCd"!표준 3.6V
+
780    Msg$="PTC 종류"
780        Vc=4.7!4.1V 충전전압
+
790    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Ptc$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Ptc_no)
790        Vd=1.5!3.1V 방전종료전압
+
800    Ptc_no=Ptc_no+1
800        Ic=.0005!100mA 충전전류
+
810    RETURN
810        Ic_end=.00035!충전 종료 전류
+
820 Tau_select:  !
820        Id=-5.E-5!100mA 방전전류 음수
+
830    INTEGER Tau_no
830      CASE "BAT"!표준 3.6V
+
840    Size=6
840        Vc=3.5!4.1V 충전전압
+
850   Length=25
850       Vd=2.5!1.V 방전종료전압
+
860   ALLOCATE Tau$(Size)[Length]
860       Ic=.02!100mA 충전전류
+
870   Tau$(1)="V12T100"  !12V 100sec
870       Ic_end=.006!충전 종료 전류
+
880   Tau$(2)="V12T10"
880       Id=-.005!-10mA 방전전류 음수
+
890   Tau$(3)="   "
890     CASE "Li-S4"
+
900   Msg$="Tau(Time-Constant) 종류"
900       Vc=16.8!4.2x4 충전전압        4.2x4=16.8    3.7x4=14.8 nominal
+
910   DIALOG "LIST",Msg$,Btn;SET("ITEMS":Tau$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Tau_no)
910       Vd=12.8!3.2x4 방전종료전압    3.2x4=12.8
+
920   Tau_no=Tau_no+1
920       Ic=2  !2A 충전전류
+
930   RETURN
930       Ic_end=1!충전 종료 전류
+
940 Stimulus_select: !
940        Id=-2 !-2A 방전전류 음수
+
950    SELECT Dut$(Dut_no)
950     CASE ""
+
960    CASE "BATTERY"
960       Msg$="충전전류[A], 방전전류[A], 충전종료전류[A], "
+
970      SELECT Battery$(Battery_no)
970      END SELECT
+
980     CASE "Li"
980    CASE "PTC"
+
990       Vc=4.2!4.2V 충전전압        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
990      SELECT Ptc$(Ptc_no)
+
1000      Vd=3.2!3.2V 방전종료전압    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1000     CASE "SPL1"
+
1010       Ic=2  !100mA 충전전류       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1010       Wait=3
+
1020       Ic_end=.5  !충전 종료 전류   !!내부 저항 !!!!!!!!!!!!!!!!!!!!!!!!
1020      Volt_start=0
+
1030      Id=-2  !100mA 방전전류 음수  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1030       Volt_stop=1
+
1040    CASE "GrandMax"
1040       Volt_step=.01
+
1050      Vc=4.4!4.2V 충전전압        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1050       Limit=2      !2A
+
1060      Vd=3.2!3.2V 방전종료전압     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1060    CASE "    "
+
1070      Ic=1 !1A 충전전류      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1070    CASE "    "
+
1080      Ic_end=.2 !200mA 충전 종료 전류  !!내부 저항 !!!!!!!!!!!!!!!!!!!!!!!!
1080    END SELECT
+
1090      Id=-1 !1A 방전전류 음수  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1090   END SELECT
+
1100     CASE "NiCd"!표준 1.2V
1100 !GOSUB Dialog_string3
+
1110      Vc=1.3!1.5V 충전전압
1110  RETURN
+
1120      Vd=.9!0.9V 방전종료전압
1120 Fileopen:!
+
1130       Ic=.001!100mA 충전전류
1130  DIM Dhms$[8]
+
1140       Ic_end=.0005!충전 종료 전류
1140  DIM Filename1$[20],Filename2$[20],Filename3$[20]
+
1150       Id=-.0001!100mA 방전전류 음수
1150  T=TIMEDATE
+
1160    CASE "3-NiCd"!표준 3.6V
1160  Time$=TIME$(T) !하루 추가 +24*3600
+
1170       Vc=4.7!4.1V 충전전압
1170  Date$=DATE$(T)
+
1180       Vd=1.5!3.1V 방전종료전압
1180  Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
+
1190       Ic=.0005!100mA 충전전류
1190  Filename1$=Dhms$&".txt"
+
1200       Ic_end=.00035!충전 종료 전류
1200  CREATE Filename1$,1
+
1210      Id=-5.E-5!100mA 방전전류 음수
1210  ASSIGN @File1 TO Filename1$;FORMAT ON
+
1220    CASE "BAT"!표준 3.6V
1220  SELECT Dut$(Dut_no)
+
1230      Vc=3.5!4.1V 충전전압
1230  CASE "BATTERY"
+
1240      Vd=2.5!1.V 방전종료전압
1240    T=T+1      !1초 늦게
+
1250       Ic=.02!100mA 충전전류
1250     Time$=TIME$(T)
+
1260      Ic_end=.006!충전 종료 전류
1260    Date$=DATE$(T)
+
1270      Id=-.005!-10mA 방전전류 음수
1270    Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
+
1280    CASE "Li-S4"
1280     Filename2$=Dhms$&".txt"
+
1290      Vc=16.8!4.2x4 충전전압        4.2x4=16.8    3.7x4=14.8 nominal
1290    CREATE Filename2$,1
+
1300      Vd=12.8!3.2x4 방전종료전압    3.2x4=12.8
1300    ASSIGN @File2 TO Filename2$;FORMAT ON
+
1310      Ic=2  !2A 충전전류
1310    IF Battery$(Battery_no)="Li-S4" THEN!직렬배터리 4개에 대한 각 셀별 전압 기록용
+
1320      Ic_end=1!충전 종료 전류
1320       T=T+1    !1초 늦게
+
1330      Id=-2 !-2A 방전전류 음수
1330       Time$=TIME$(T)
+
1340    CASE ""
1340       Date$=DATE$(T)
+
1350      Msg$="충전전류[A], 방전전류[A], 충전종료전류[A], "
1350       Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
+
1360     END SELECT
1360       Filename3$=Dhms$&".txt"
+
1370   CASE "EDLC"
1370       CREATE Filename3$,1
+
1380     SELECT Edlc$(Edlc_no)
1380       ASSIGN @File3 TO Filename3$;FORMAT ON
+
1390    CASE "2.7V 0~1F"
1390    END IF
+
1400      Vc=2.7        ! 충전전압
1400  END SELECT
+
1410      Ic=.1        ! 충전전류
1410  RETURN
+
1420      Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1420 Fileclose:!
+
1430      Id=-.1       ! 100mA 방전전류 음수
1430  ASSIGN @File1 TO *
+
1440      Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1440  SELECT Dut$(Dut_no)
+
1450     CASE "2.7V 1~10F"
1450  CASE "BATTERY"
+
1460      Vc=2.7        ! 충전전압
1460    ASSIGN @File2 TO *
+
1470      Ic=.5        ! 충전전류
1470    IF Battery$(Battery_no)="Li-S4" THEN
+
1480      Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1480       ASSIGN @File3 TO *
+
1490      Id=-.5        ! 500mA 방전전류 음수
1490    END IF
+
1500      Vd=Vc*.05    ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1500  END SELECT
+
1510     CASE "5.5V 0~1F"
1510  RETURN
+
1520      Vc=5.5        ! 충전전압
1520 Measure: !
+
1530      Ic=.1        ! 충전전류
1530  INTEGER I
+
1540      Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1540  DIM Cmd$[25],A1$[14],A2$[14],Test$[1]
+
1550      Id=-.1        ! 100mA 방전전류 음수
1550  OUTPUT @File1;"No.,Time[m],Volt[V],Curr[A]"
+
1560      Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1560  GOSUB Chart_var
+
1570     CASE "5.5V 1~10F"
1570  GOSUB Init_chart
+
1580      Vc=5.5        ! 충전전압
1580  Count=0
+
1590      Ic=.5        ! 충전전류
1590  Time_zero=TIMEDATE
+
1600      Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1600  SELECT Dut$(Dut_no)
+
1610      Id=-.5        ! 500mA 방전전류 음수
1610  CASE "BATTERY"
+
1620      Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1620     GOSUB Measure_battery
+
1630     END SELECT
1630   CASE "PTC"
+
1640   CASE "PTC"
1640     GOSUB Measure_vi
+
1650    SELECT Ptc$(Ptc_no)
1650  END SELECT  
+
1660    CASE "SPL1"
1660  RETURN
+
1670      Wait=1
1670 Measure_battery: !
+
1680      Volt_start=0
1680  OUTPUT @File2;"Cycle,Charge Time[m],Charge i Capa[mAh],Charge W Capa[Wh], Discharge Time[m],Discharge i Capa[mAh], Discharge W Capa[Wh]"
+
1690      Volt_stop=12
1690  FOR I=1 TO No_cycle  !배터리 충방전실험을 5회 실시
+
1700      Volt_step=.05
1700    C_i_capa=0
+
1710      Limit=2      !2A
1710     C_w_capa=0
+
1720    END SELECT
1720     D_i_capa=0
+
1730   CASE "tau"
1730    D_w_capa=0
+
1740    SELECT Tau$(Tau_no)
1740    GOSUB Cycle
+
1750    CASE "V12T100"
1750    OUTPUT @File2;I,C_time,C_i_capa,C_w_capa,D_time,-D_i_capa,-D_w_capa
+
1760      Volt_set=12  !12V
1760  NEXT I
+
1770      Time_set=100 !100sec
1770  RETURN
+
1780      Limit=2      !2A
1780 Measure_vi:  !
+
1790    CASE "V12T10"
1790  FOR Volt=Volt_start TO Volt_stop STEP Volt_step
+
1800      Volt_set=12  !12V
1800     Cmd$="V5" !32V
+
1810      Time_set=10  !100sec
1810    Cmd$=Cmd$&" D "&VAL$(Volt)&"V"  !D 2.0V
+
1820      Limit=2      !2A
1820    Cmd$=Cmd$&" D "&VAL$(Limit)&"A"  !D 2.0A
+
1830    END SELECT
1830    OUTPUT @Src;Cmd$  !"V5 D 1V D 2A"
+
1840  END SELECT
1840     OUTPUT @Src;"E"    !Operate ON
+
1850 !GOSUB Dialog_string3
1850     T=TIMEDATE
+
1860  RETURN
1860    Time_elapsed=(T-Time_zero)/60
+
1870 Fileopen:!
1870    GOSUB Reading
+
1880  DIM Dhms$[8]
1880    Curr=Data
+
1890  DIM Filename1$[20],Filename2$[20],Filename3$[20]
1890     GOSUB Data_process
+
1900  T=TIMEDATE
1900     WAIT Wait
+
1910  Time$=TIME$(T) !하루 추가 +24*3600
1910   NEXT Volt
+
1920   Date$=DATE$(T)
1920  OUTPUT @Src;"H"     !Operate OFF
+
1930   Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
1930  RETURN
+
1940   Filename1$=Dhms$&".txt"
1940 Cycle: !
+
1950  CREATE Filename1$,1
1950  Pre_v=0 !최초 측정 전압=0으로 가정한다.
+
1960   ASSIGN @File1 TO Filename1$;FORMAT ON
1960  GOSUB Charge1
+
1970   SELECT Dut$(Dut_no)
1970   GOSUB Charge2
+
1980   CASE "BATTERY","EDLC"
1980  GOSUB Discharge
+
1990     T=T+1      !1초 늦게
1990  RETURN
+
2000     Time$=TIME$(T)
2000 Charge1: !
+
2010     Date$=DATE$(T)
2010 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
2020     Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
2020 !충전. +부호 정전류, 전압제한(전압을 읽는다.)
+
2030     Filename2$=Dhms$&".txt"
2030 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
2040    CREATE Filename2$,1
2040   Test$="C"
+
2050    ASSIGN @File2 TO Filename2$;FORMAT ON
2050   Cmd$="I4"  !2A range
+
2060    SELECT Dut$(Dut_no)
2060  Cmd$=Cmd$&" D "&VAL$(Ic)&"A"    !D 2.0A
+
2070    CASE "BATTERY"
2070   Cmd$=Cmd$&" D "&VAL$(Vc)&"V"    !D 4.2V
+
2080      IF Battery$(Battery_no)="Li-S4" THEN!직렬배터리 4개에 대한 각 셀별 전압 기록용
2080   OUTPUT @Src;Cmd$   !"I4 D 2A D 4.2V"
+
2090        T=T+1  !1초 늦게
2090  OUTPUT @Src;"E"      !Operate ON
+
2100        Time$=TIME$(T)
2100   WAIT Wait
+
2110        Date$=DATE$(T)
2110   C_start_time=TIMEDATE
+
2120        Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
2120  Pre_t=C_start_time
+
2130        Filename3$=Dhms$&".txt"
2130  Curr=Ic
+
2140        CREATE Filename3$,1
2140  LOOP
+
2150        ASSIGN @File3 TO Filename3$;FORMAT ON
2150     T=TIMEDATE
+
2160      END IF
2160     Time_elapsed=(T-Time_zero)/60
+
2170    END SELECT
2170     GOSUB Reading
+
2180  END SELECT
2180     Volt=Data
+
2190  RETURN
2190     IF Volt>Pre_v THEN  !충전 전압이 상승하면
+
2200 Fileclose:!
2200      GOSUB Data_process
+
2210  ASSIGN @File1 TO *
2210      C_i_capa=C_i_capa+(Curr*1000)*((T-Pre_t)/3600)  !mAh = mA x hour
+
2220  SELECT Dut$(Dut_no)
2220      C_w_capa=C_w_capa+Curr*Volt*((T-Pre_t)/3600)     !Wh = A x V x hour
+
2230  CASE "BATTERY"
2230      Pre_t=T
+
2240    ASSIGN @File2 TO *
2240    END IF
+
2250    IF Battery$(Battery_no)="Li-S4" THEN
2250  EXIT IF Volt>=Vc  !측정 전압이 충전최고 전압에 도달하면
+
2260      ASSIGN @File3 TO *
2260  END LOOP
+
2270    END IF
2270  OUTPUT @Src;"H"      !Operate OFF
+
2280  CASE "EDLC"
2280  RETURN
+
2290    ASSIGN @File2 TO *
2290 Charge2:!
+
2300  END SELECT
2300 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
2310  RETURN
2310 !충전, 충전 최고전압에 도달하면. 정전압, 전류제한(전류를 읽는다.)
+
2320 Measure: !
2320 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
2330  INTEGER I
2330   Cmd$="V5"   !32V range
+
2340  DIM Cmd$[25],A1$[14],A2$[14],Test$[1]
2340  Cmd$=Cmd$&" D "&VAL$(Vc)&"V"    !D 4.2V
+
2350   SELECT Dut$(Dut_no)
2350  Cmd$=Cmd$&" D "&VAL$(Ic)&"A"    !D 2.0A
+
2360  CASE "tau","EDLC"
2360  OUTPUT @Src;Cmd$  !"V5 D 4.2V D 2.0A"
+
2370    OUTPUT @File1;"No.,Time[s],Volt[V],Curr[A]"
2370   OUTPUT @Src;"E"      !Operate ON
+
2380  CASE ELSE
2380   WAIT Wait
+
2390     OUTPUT @File1;"No.,Time[m],Volt[V],Curr[A]"
2390   Pre_v=Ic  !충전 전류(Ic)를 초기값으로 기억한다.
+
2400  END SELECT
2400   Volt=Vc   !충전전압은 일정하다.
+
2410   GOSUB Chart_var
2410   LOOP
+
2420   GOSUB Init_chart
2420     T=TIMEDATE
+
2430   Count=0
2430    Time_elapsed=(T-Time_zero)/60
+
2440   Time_zero=TIMEDATE
2440     GOSUB Reading   !충전전압에 도달되었기 때문에, 서서히 줄어드는 충전 전류를 측정한다.
+
2450   SELECT Dut$(Dut_no)
2450     Curr=Data
+
2460   CASE "BATTERY"
2460     IF Curr<Pre_v THEN   !측정 전류가 서서히 낮아지면
+
2470     GOSUB Measure_battery
2470      GOSUB Data_process
+
2480  CASE "EDLC"
2480      C_i_capa=C_i_capa+(Curr*1000)*((T-Pre_t)/3600)  !mAh = mA x hour
+
2490     GOSUB Measure_edlc
2490      C_w_capa=C_w_capa+Curr*Volt*((T-Pre_t)/3600)    !WA = A x V x hour
+
2500   CASE "PTC"
2500      Pre_t=T
+
2510     GOSUB Measure_vi
2510    END IF
+
2520  CASE "tau"
2520   EXIT IF Curr<=Ic_end   !현재 전류가 종료전류에 도달하면
+
2530     GOSUB Measure_tau
2530  END LOOP
+
2540   END SELECT
2540  C_time=(T-C_start_time)/60
+
2550  RETURN
2550  OUTPUT @Src;"H"      !Operate OFF
+
2560 Measure_battery: !
2560   RETURN
+
2570  OUTPUT @File2;"Cycle,Charge Time[m],Charge i Capa[mAh],Charge W Capa[Wh], Discharge Time[m],Discharge i Capa[mAh], Discharge W Capa[Wh]"
2570 Discharge: !
+
2580   FOR I=1 TO No_cycle   !배터리 충방전실험을 5회 실시
2580 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
2590    C_i_capa=0
2590 !방전 전류는 -로 표기한다.
+
2600    C_w_capa=0
2600 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
2610    D_i_capa=0
2610  Test$="D"
+
2620    D_w_capa=0
2620  Cmd$="I4"  !2A range
+
2630    GOSUB Cycle
2630  Cmd$=Cmd$&" D "&VAL$(Id)&"A"      !D -2.0A
+
2640    OUTPUT @File2;I,C_time,C_i_capa,C_w_capa,D_time,-D_i_capa,-D_w_capa
2640  Cmd$=Cmd$&" D "&VAL$(Vc)&"V"    !D 4.2V
+
2650  NEXT I
2650  OUTPUT @Src;Cmd$  !"I4 D -2A D 4.2V"
+
2660   RETURN
2660   OUTPUT @Src;"E"      !Operate ON
+
2670 Measure_edlc: !
2670   WAIT Wait
+
2680  OUTPUT @File2;"Cycle,Charge Time[s],Charge i Capa[mAh],Charge W Capa[mWh], Discharge Time[s],Discharge i Capa[mAh], Discharge W Capa[mWh], Capacity[F]"
2680  Pre_v=Vc
+
2690  FOR I=1 TO No_cycle
2690   D_start_time=TIMEDATE
+
2700    C_i_capa=0
2700  Pre_t=D_start_time
+
2710    C_w_capa=0
2710  Curr=Id    !방전전류(-값을 갖는다.)는 일정하다.
+
2720    D_i_capa=0
2720   LOOP
+
2730    D_w_capa=0
2730     T=TIMEDATE
+
2740    Capacity=0
2740    Time_elapsed=(T-Time_zero)/60
+
2750    GOSUB Cycle
2750    GOSUB Reading   !일정 전류 방전      , 전압이 측정된다.
+
2760    OUTPUT @File2;I,C_time*60,C_i_capa,C_w_capa*1000,D_time*60,-D_i_capa,-D_w_capa*1000,Capacity
2760     Volt=Data
+
2770   NEXT I
2770     IF Volt<Pre_v THEN  !측정전압이 서서히 낮아지면(방전이므로)
+
2780   RETURN
2780      GOSUB Data_process
+
2790 Measure_vi:  !
2790      D_i_capa=D_i_capa+(Curr*1000)*((T-Pre_t)/3600)  !mAh = mA x hour
+
2800   FOR Volt=Volt_start TO Volt_stop STEP Volt_step
2800      D_w_capa=D_w_capa+Curr*Volt*((T-Pre_t)/3600)    !Wh = A x V x hour
+
2810    Cmd$="V5" !32V
2810      Pre_t=T
+
2820    Cmd$=Cmd$&" D "&VAL$(Volt)&"V"   !D 2.0V
2820     END IF
+
2830     Cmd$=Cmd$&" D "&VAL$(Limit)&"A"   !D 2.0A
2830   EXIT IF Volt<=Vd  !현재 전압이 충전전압에 도달하면
+
2840     OUTPUT @Src;Cmd$  !"V5 D 1V D 2A"
2840   END LOOP
+
2850     OUTPUT @Src;"E"    !Operate ON
2850  D_time=(T-D_start_time)/60
+
2860    T=TIMEDATE
2860  OUTPUT @Src;"H"      !Operate OFF
+
2870    Time_elapsed=(T-Time_zero)/60
2870   RETURN
+
2880    GOSUB Reading
2880 Data_process: !
+
2890    Curr=Data
2890   Count=Count+1
+
2900    GOSUB Data_process
2900   SELECT Dut$(Dut_no)
+
2910     WAIT Wait
2910  CASE "BATTERY"
+
2920   NEXT Volt
2920    X1=Time_elapsed
+
2930   OUTPUT @Src;"H"      !Operate OFF
2930    Y1=(Volt*2/Vc)*100-100  !전압 [%]
+
2940   RETURN
2940    Y2=(Curr/Ic)*100  !전류 [%]
+
2950 Measure_tau: !
2950   CASE "PTC"
+
2960   Volt=Volt_set
2960    X1=Volt
+
2970   Cmd$="V5"   !32V
2970     Y1=Curr
+
2980  Cmd$=Cmd$&" D "&VAL$(Volt)&"V"    !D 12V
2980     Y2=0
+
2990  Cmd$=Cmd$&" D "&VAL$(Limit)&"A"    !D 2.0A
2990  END SELECT
+
3000   OUTPUT @Src;Cmd$    !"V5 D 1V D 2A"
3000  Y(1)=Y1
+
3010  OUTPUT @Src;"E"      !Operate ON
3010   Y(2)=Y2
+
3020  Time_zero=TIMEDATE
3020   CONTROL @Strip;SET("POINT LOCATION":X1,"VALUES":Y(*))
+
3030  LOOP
3030   PRINT "Count=";Count;", T=";PROUND(Time_elapsed,-4);"m, V=";Volt;"V, I=";Curr;"A"
+
3040     T=TIMEDATE
3040   OUTPUT @File1;Count,PROUND(Time_elapsed,-4),Volt,Curr
+
3050     Time_elapsed=(T-Time_zero)   !second
3050   Pre_v=Data
+
3060    GOSUB Reading
3060   SELECT Dut$(Dut_no)
+
3070    Curr=Data
3070  CASE "BATTERY"
+
3080    GOSUB Data_process
3080    IF Battery$(Battery_no)="Li-S4" THEN
+
3090  EXIT IF Time_elapsed>Time_set
3090      GOSUB Reading34970
+
3100   END LOOP
3100      OUTPUT @File3;Count,V(*)
+
3110   OUTPUT @Src;"H"     !Operate OFF
3110    END IF
+
3120  RETURN
3120   END SELECT
+
3130 Cycle: !
3130   RETURN
+
3140   Pre_v=0 !최초 측정 전압=0으로 가정한다.
3140 Reading: !
+
3150  GOSUB Charge1
3150   LOOP
+
3160   GOSUB Charge2
3160     GOSUB Reading1
+
3170   GOSUB Discharge
3170   EXIT IF Data<>0
+
3180   RETURN
3180   END LOOP
+
3190 Charge1: !
3190   RETURN
+
3200 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3200 Reading1: !
+
3210 !충전. +부호 정전류, 전압제한(전압을 읽는다.)
3210 ! 전압을 측정하면 나타나는 데이터 포맷
+
3220 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3220 ! 12345678901234
+
3230   Test$="C"
3230 !"DV +03.857E+0원래
+
3240  Cmd$="I4"   !2A range
3240 !" DV +03.857E+0"  앞에 공백이 하나 추가되어 나온 적이 있다.
+
3250   Cmd$=Cmd$&" D "&VAL$(Ic)&"A"     !D 2.0A
3250 ! 전압를 측정하면 나타나는 데이터 포맷
+
3260   Cmd$=Cmd$&" D "&VAL$(Vc)&"V"    !D 4.2V
3260 ! 12345678901234
+
3270   OUTPUT @Src;Cmd$   !"I4 D 2A D 4.2V"
3270 !"DI +0.6310E+0"   원래
+
3280   WAIT Wait
3280   ENTER @Src;A1$
+
3290  OUTPUT @Src;"E"     !Operate ON
3290   A2$=TRIM$(A1$)   !앞뒤 공백 모두 없앤다
+
3300  WAIT Wait
3300  Data=VAL(A2$[3,13])
+
3310   C_start_time=TIMEDATE
3310  SELECT Dut$(Dut_no)
+
3320   Pre_t=C_start_time
3320  CASE "BATTERY"
+
3330   Curr=Ic
3330 ! Data=PROUND(Data,-3) !소수점 3자리. 0.1mA까지 측정되면 너무 많은 데이터가 획득되므로
+
3340   LOOP
3340     Data=DROUND(Data,3)!유효수자 3자리
+
3350    T=TIMEDATE
3350  END SELECT
+
3360    Time_elapsed=(T-Time_zero)/60
3360  RETURN
+
3370    GOSUB Reading
3370 Reading34970: !
+
3380    Volt=Data
3380  OUTPUT @Sw;"MEAS:VOLT:DC? (@201:204)"
+
3390 ! IF Volt>Pre_v THEN  !충전 전압이 상승하면
3390  ENTER @Sw;V(*)
+
3400     IF ABS(Volt-Pre_v)>=.01 THEN    !전압차가 0.01V 이상이면
3400   RETURN
+
3410      GOSUB Data_process
3410 Inst6143_open: !
+
3420      C_i_capa=C_i_capa+(Curr*1000)*((T-Pre_t)/3600)  !mAh = mA x hour
3420  ASSIGN @Src TO 714    !advantest TR6143
+
3430      C_w_capa=C_w_capa+Curr*Volt*((T-Pre_t)/3600)    !Wh = A x V x hour
3430   OUTPUT @Src;"C"       !initialize
+
3440       Pre_t=T
3440   OUTPUT @Src;"OM1"    !ascii, OM0=set value, OM1=meas value
+
3450     END IF
3450   SELECT Dut$(Dut_no)
+
3460  EXIT IF Volt>=(Vc-.001)   !측정 전압이 충전최고 전압에 도달하면
3460  CASE "BATTERY"
+
3470  END LOOP
3470    IF Battery$(Battery_no)="Li-S4" THEN
+
3480  OUTPUT @Src;"H"     !Operate OFF
3480      GOSUB Inst34970_open
+
3490   WAIT Wait
3490     END IF
+
3500  RETURN
3500  END SELECT
+
3510 Charge2:!
3510   RETURN
+
3520 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3520 Inst34970_open: !
+
3530 !충전, 충전 최고전압에 도달하면. 정전압, 전류제한(전류를 읽는다.)
3530  DIM V(4)      !4채널 전압
+
3540 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3540  ASSIGN @Sw TO 709    !Agilent 34970A
+
3550  Cmd$="V5"   !32V range
3550  ! OUTPUT @Sw;"CONF:VOLT:DC AUTO (@201:204)"
+
3560  Cmd$=Cmd$&" D "&VAL$(Vc)&"V"     !D 4.2V
3560  OUTPUT @Sw;"SENS:VOLT:DC:RANG:AUTO ON,(@201:204)"
+
3570  Cmd$=Cmd$&" D "&VAL$(Ic)&"A"     !D 2.0A
3570  OUTPUT @Sw;"SENS:VOLT:DC:NPLC 2,(@201:204)"
+
3580  OUTPUT @Src;Cmd$  !"V5 D 4.2V D 2.0A"
3580  RETURN
+
3590  WAIT Wait
3590 Chart_var:  !
+
3600  OUTPUT @Src;"E"      !Operate ON
3600  SELECT Dut$(Dut_no)
+
3610  WAIT Wait
3610  CASE "BATTERY"
+
3620  Pre_v=Ic  !충전 전류(Ic)를 초기값으로 기억한다.
3620    X_origin=0!time=0
+
3630  Volt=Vc  !충전전압은 일정하다.
3630    X_range=1*60        !1  hours *60min  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
3640  LOOP
3640    X_axis_label$="Elapsed Time [Min]"
+
3650     T=TIMEDATE
3650    Y_origin=-110
+
3660     Time_elapsed=(T-Time_zero)/60
3660    Y_range=220
+
3670     GOSUB Reading  !충전전압에 도달되었기 때문에, 서서히 줄어드는 충전 전류를 측정한다.
3670    Y_axis_label$="Volt & Current [%]"
+
3680     Curr=Data
3680  CASE "PTC"
+
3690  !  IF Curr<Pre_v THEN   !측정 전류가 서서히 낮아지면
3690    X_origin=Volt_start
+
3700    IF ABS(Curr-Pre_v)>=.01 THEN    !전류차이가 .01A 이상이면
3700     X_range=Volt_stop-Volt_start      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
3710      GOSUB Data_process
3710     X_axis_label$="Applied Volt [V]"
+
3720      C_i_capa=C_i_capa+(Curr*1000)*((T-Pre_t)/3600!mAh = mA x hour
3720     Y_origin=0
+
3730      C_w_capa=C_w_capa+Curr*Volt*((T-Pre_t)/3600)     !WA = A x V x hour
3730     Y_range=Limit
+
3740      Pre_t=T
3740     Y_axis_label$="Current [A]"
+
3750    END IF
3750   END SELECT
+
3760  EXIT IF Curr<=Ic_end+.001  !현재 전류가 종료전류에 도달하면
3760  RETURN
+
3770  END LOOP
3770 Init_chart:  !
+
3780  C_time=(T-C_start_time)/60
3780  DIM X_axis_label$[25],Y_axis_label$[25]
+
3790  OUTPUT @Src;"H"      !Operate OFF
3790  INTEGER Trace_num
+
3800  WAIT Wait
3800  INTEGER Screen_dims(1:2),Gwindow_dims(1:4)
+
3810  RETURN
3810   REAL Y(1:2)  !Y(1) Volt, Y(2) Current
+
3820 Discharge: !
3820  GESCAPE CRT,36;Screen_dims(*) ! Get screen width and height.
+
3830 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3830 !
+
3840 !방전 전류는 -로 표기한다.
3840 ! Set the dimensions of the graphics window using GESCAPE 33 so
+
3850 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3850 ! that it is centered on the screen.
+
3860  Test$="D"
3860 !
+
3870  Cmd$="I4"  !2A range
3870   Gwindow_dims(1)=Screen_dims(1)*.25 ! X of upper left.
+
3880  Cmd$=Cmd$&" D "&VAL$(Id)&"A"      !D -2.0A
3880   Gwindow_dims(2)=Screen_dims(2)*.2  ! Y of upper left.
+
3890  Cmd$=Cmd$&" D "&VAL$(Vc)&"V"    !D 4.2V
3890   Gwindow_dims(3)=Screen_dims(1)*.7  ! Width.
+
3900  OUTPUT @Src;Cmd$  !"I4 D -2A D 4.2V"
3900   Gwindow_dims(4)=Screen_dims(2)*.6  ! Height.
+
3910  WAIT Wait
3910   GESCAPE CRT,33;Gwindow_dims(*)    ! Set graphics window geometry.
+
3920  OUTPUT @Src;"E"      !Operate ON
3920 !
+
3930  WAIT Wait
3930   GESCAPE CRT,35 ! Move the graphics window to the top.
+
3940  Pre_v=Vc
3940 !
+
3950  D_start_time=TIMEDATE
3950 ! Create a stripchart.  Make it invisible until all changes are made.
+
3960  Pre_t=D_start_time
3960 !
+
3970  Curr=Id    !방전전류(-값을 갖는다.)는 일정하다.
3970   ASSIGN @Strip TO WIDGET "STRIPCHART";SET("VISIBLE":0)
+
3980  Set80=0
3980 !
+
3990  Set40=0
3990 ! Set the overall attributes.
+
4000  LOOP
4000 !
+
4010    T=TIMEDATE
4010   CONTROL @Strip;SET("TITLE":"Data Logger")
+
4020    Time_elapsed=(T-Time_zero)/60
4020   CONTROL @Strip;SET("MINIMUM SCROLL":2)
+
4030    GOSUB Reading  !일정 전류 방전      , 전압이 측정된다.
4030   CONTROL @Strip;SET("MOVABLE":0)
+
4040    Volt=Data
4040   CONTROL @Strip;SET("MAXIMIZABLE":0)
+
4050  ! IF Volt<Pre_v THEN  !측정전압이 서서히 낮아지면(방전이므로)
4050   CONTROL @Strip;SET("X":0,"Y":0)
+
4060    IF Set80=0 AND Volt<Vc*.8 THEN        !방전전압이 충전전압의 80%가 되면 한번만 수행
4060 !
+
4070      V80=Volt
4070 ! Size the stripchart to exactly fill the graphics window.
+
4080      T80=Time_elapsed*60
4080 !
+
4090      Set80=1
4090   Vert_borders=26
+
4100    END IF
4100   Horiz_borders=8
+
4110    IF Set40=0 AND Volt<Vc*.4 THEN        !방전전압이 충전전압의 40%가 되면 한번만 수행
4110   Height=Gwindow_dims(4)-Vert_borders
+
4120      V40=Volt
4120   Width=Gwindow_dims(3)-Horiz_borders
+
4130      T40=Time_elapsed*60
4130   CONTROL @Strip;SET("WIDTH":Width,"HEIGHT":Height)
+
4140      Set40=1
4140 !
+
4150    END IF
4150   CONTROL @Strip;SET("CURRENT AXIS":"X")
+
4160    IF ABS(Volt-Pre_v)>=.01 THEN    !전압차가 0.01V 이상이면
4160   CONTROL @Strip;SET("ORIGIN":X_origin,"RANGE":X_range)
+
4170      GOSUB Data_process
4170   CONTROL @Strip;SET("AXIS LABEL":X_axis_label$)
+
4180      D_i_capa=D_i_capa+(Curr*1000)*((T-Pre_t)/3600)  !mAh = mA x hour
4180 !CONTROL @Strip;SET("DIGITS":5)
+
4190      D_w_capa=D_w_capa+Curr*Volt*((T-Pre_t)/3600)    !Wh = A x V x hour
4190 !
+
4200      Pre_t=T
4200   CONTROL @Strip;SET("CURRENT AXIS":"Y")
+
4210    END IF
4210   CONTROL @Strip;SET("ORIGIN":Y_origin,"RANGE":Y_range)
+
4220  EXIT IF Volt<=Vd+.001    !현재 전압이 방전 최저전압에 도달하면
4220   CONTROL @Strip;SET("AXIS LABEL":Y_axis_label$)
+
4230  END LOOP
4230 !
+
4240  D_time=(T-D_start_time)/60
4240   CONTROL @Strip;SET("VISIBLE":1) ! Show the stripchart.
+
4250  Capacity=Id*(T80-T40)/(V80-V40)  !기울기가 -이므로
4250 !
+
4260  OUTPUT @Src;"H"      !Operate OFF
4260   RETURN
+
4270  WAIT Wait
4270   END
+
4280  RETURN
 +
4290 Data_process: !
 +
4300  Count=Count+1
 +
4310  SELECT Dut$(Dut_no)
 +
4320  CASE "BATTERY","EDLC"
 +
4330    X1=Time_elapsed
 +
4340    Y1=(Volt*2/Vc)*100-100  !전압 [%]
 +
4350    Y2=(Curr/Ic)*100  !전류 [%]
 +
4360  CASE "PTC"
 +
4370    X1=Volt
 +
4380    Y1=Curr
 +
4390    Y2=0
 +
4400  CASE "tau"
 +
4410    X1=Time_elapsed
 +
4420    Y1=Curr
 +
4430    Y2=0
 +
4440  END SELECT
 +
4450  Y(1)=Y1
 +
4460  Y(2)=Y2
 +
4470  CONTROL @Strip;SET("POINT LOCATION":X1,"VALUES":Y(*))
 +
4480  PRINT "Count=";Count;", T=";PROUND(Time_elapsed,-5);"m, V=";Volt;"V, I=";Curr;"A"
 +
4490  OUTPUT @File1;Count,Time_elapsed,Volt,Curr
 +
4500  Pre_v=Data
 +
4510  SELECT Dut$(Dut_no)
 +
4520  CASE "BATTERY"
 +
4530    IF Battery$(Battery_no)="Li-S4" THEN
 +
4540      GOSUB Reading34970
 +
4550      OUTPUT @File3;Count,V(*)
 +
4560    END IF
 +
4570  END SELECT
 +
4580  RETURN
 +
4590 Reading: !
 +
4600  LOOP
 +
4610    GOSUB Reading1
 +
4620  EXIT IF Data<>0
 +
4630  END LOOP
 +
4640  RETURN
 +
4650 Reading1: !
 +
4660 ! 전압을 측정하면 나타나는 데이터 포맷
 +
4670 ! 12345678901234
 +
4680 !"DV +03.857E+0"  원래
 +
4690 !" DV +03.857E+0"  앞에 공백이 하나 추가되어 나온 적이 있다.
 +
4700 ! 전압를 측정하면 나타나는 데이터 포맷
 +
4710 ! 12345678901234
 +
4720 !"DI +0.6310E+0"  원래
 +
4730  ENTER @Src;A1$
 +
4740  A2$=TRIM$(A1$)  !앞뒤 공백 모두 없앤다
 +
4750  Data=VAL(A2$[3,13])
 +
4760  SELECT Dut$(Dut_no)
 +
4770  CASE "BATTERY"
 +
4780 ! Data=PROUND(Data,-3)  !소수점 3자리. 0.1mA까지 측정되면 너무 많은 데이터가 획득되므로
 +
4790    Data=DROUND(Data,3)!유효수자 3자리
 +
4800  CASE "tau"
 +
4810    WAIT .05  !이보다  빨리 측정못한다.
 +
4820  END SELECT
 +
4830  RETURN
 +
4840 Reading34970: !
 +
4850  OUTPUT @Sw;"MEAS:VOLT:DC? (@201:204)"
 +
4860  ENTER @Sw;V(*)
 +
4870  RETURN
 +
4880 Inst6143_open: !
 +
4890  ASSIGN @Src TO 714    !advantest TR6143
 +
4900  OUTPUT @Src;"C"      !initialize
 +
4910  OUTPUT @Src;"OM1"    !ascii, OM0=set value, OM1=meas value
 +
4920  SELECT Dut$(Dut_no)
 +
4930  CASE "BATTERY"
 +
4940    IF Battery$(Battery_no)="Li-S4" THEN
 +
4950      GOSUB Inst34970_open
 +
4960    END IF
 +
4970  END SELECT
 +
4980  RETURN
 +
4990 Inst34970_open: !
 +
5000  DIM V(4)      !4채널 전압
 +
5010  ASSIGN @Sw TO 709    !Agilent 34970A
 +
5020  ! OUTPUT @Sw;"CONF:VOLT:DC AUTO (@201:204)"
 +
5030  OUTPUT @Sw;"SENS:VOLT:DC:RANG:AUTO ON,(@201:204)"
 +
5040  OUTPUT @Sw;"SENS:VOLT:DC:NPLC 2,(@201:204)"
 +
5050  RETURN
 +
5060 Chart_var:  !
 +
5070  SELECT Dut$(Dut_no)
 +
5080  CASE "BATTERY"
 +
5090    X_origin=0!time=0
 +
5100    X_range=1*60        !1  hours *60min  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 +
5110    X_axis_label$="Elapsed Time [Min]"
 +
5120    Y_origin=-110
 +
5130    Y_range=220
 +
5140    Y_axis_label$="Volt & Current [%]"
 +
5150  CASE "EDLC"
 +
5160    X_origin=0!time=0
 +
5170    X_range=10          !10min  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 +
5180    X_axis_label$="Elapsed Time [Min]"
 +
5190    Y_origin=-110
 +
5200    Y_range=220
 +
5210    Y_axis_label$="Volt & Current [%]"
 +
5220  CASE "PTC"
 +
5230    X_origin=Volt_start
 +
5240    X_range=Volt_stop-Volt_start      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 +
5250    X_axis_label$="Applied Volt [V]"
 +
5260    Y_origin=0
 +
5270    Y_range=Limit
 +
5280    Y_axis_label$="Current [A]"
 +
5290  CASE "tau"
 +
5300    X_origin=0
 +
5310    X_range=Time_set                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 +
5320    X_axis_label$="Elapsed Time [m]"
 +
5330    Y_origin=0
 +
5340    Y_range=Limit
 +
5350    Y_axis_label$="Current [A]"
 +
5360  END SELECT
 +
5370  RETURN
 +
5380 Init_chart:  !
 +
5390  DIM X_axis_label$[25],Y_axis_label$[25]
 +
5400  INTEGER Trace_num
 +
5410  INTEGER Screen_dims(1:2),Gwindow_dims(1:4)
 +
5420  REAL Y(1:2)  !Y(1) Volt, Y(2) Current
 +
5430  GESCAPE CRT,36;Screen_dims(*) ! Get screen width and height.
 +
5440 !
 +
5450 ! Set the dimensions of the graphics window using GESCAPE 33 so
 +
5460 ! that it is centered on the screen.
 +
5470 !
 +
5480   Gwindow_dims(1)=Screen_dims(1)*.25 ! X of upper left.
 +
5490   Gwindow_dims(2)=Screen_dims(2)*.2  ! Y of upper left.
 +
5500   Gwindow_dims(3)=Screen_dims(1)*.7  ! Width.
 +
5510   Gwindow_dims(4)=Screen_dims(2)*.6  ! Height.
 +
5520   GESCAPE CRT,33;Gwindow_dims(*)    ! Set graphics window geometry.
 +
5530 !
 +
5540   GESCAPE CRT,35 ! Move the graphics window to the top.
 +
5550 !
 +
5560 ! Create a stripchart.  Make it invisible until all changes are made.
 +
5570 !
 +
5580   ASSIGN @Strip TO WIDGET "STRIPCHART";SET("VISIBLE":0)
 +
5590 !
 +
5600 ! Set the overall attributes.
 +
5610 !
 +
5620   CONTROL @Strip;SET("TITLE":"Data Logger")
 +
5630   CONTROL @Strip;SET("MINIMUM SCROLL":2)
 +
5640   CONTROL @Strip;SET("MOVABLE":0)
 +
5650   CONTROL @Strip;SET("MAXIMIZABLE":0)
 +
5660   CONTROL @Strip;SET("X":0,"Y":0)
 +
5670 !
 +
5680 ! Size the stripchart to exactly fill the graphics window.
 +
5690 !
 +
5700   Vert_borders=26
 +
5710   Horiz_borders=8
 +
5720   Height=Gwindow_dims(4)-Vert_borders
 +
5730   Width=Gwindow_dims(3)-Horiz_borders
 +
5740   CONTROL @Strip;SET("WIDTH":Width,"HEIGHT":Height)
 +
5750 !
 +
5760   CONTROL @Strip;SET("CURRENT AXIS":"X")
 +
5770   CONTROL @Strip;SET("ORIGIN":X_origin,"RANGE":X_range)
 +
5780   CONTROL @Strip;SET("AXIS LABEL":X_axis_label$)
 +
5790 !CONTROL @Strip;SET("DIGITS":5)
 +
5800 !
 +
5810   CONTROL @Strip;SET("CURRENT AXIS":"Y")
 +
5820   CONTROL @Strip;SET("ORIGIN":Y_origin,"RANGE":Y_range)
 +
5830   CONTROL @Strip;SET("AXIS LABEL":Y_axis_label$)
 +
5840 !
 +
5850   CONTROL @Strip;SET("VISIBLE":1) ! Show the stripchart.
 +
5860 !
 +
5870   RETURN
 +
5880   END
 +
</pre>

2020년 8월 20일 (목) 16:54 기준 최신판

Advantest TR6143

10     !
20     ! 2020-01-17 배터리 충방전 프로그램
30     ! 2020-01-26 PTC용 표준 VI 측정추가
40     OPTION BASE 1
50     INTEGER No_cycle  !충반전 실험 횟수
60     INTEGER Size,Length,Btn
70     DIM Msg$[25]
80     No_cycle=2   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
90     Wait=.1    !계측기 세팅을 한 후, 첫 측정에서 측정값이 0이 나오는 현상 때문에 잠시 대기 시간
100    GOSUB Dut_select
110    GOSUB Stimulus_select
120    GOSUB Fileopen
130    GOSUB Inst6143_open
140    GOSUB Measure
150    GOSUB Fileclose
160  ! PAUSE
170    STOP
180 Dut_select:  !
190    INTEGER Dut_no
200    Size=4
210    Length=7
220    ALLOCATE Dut$(Size)[Length]
230    Dut$(1)="BATTERY"
240    Dut$(2)="EDLC"
250    Dut$(3)="PTC"
260    Dut$(4)="tau"
270    Msg$="DUT 종류"
280    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Dut$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Dut_no)
290    Dut_no=Dut_no+1
300    SELECT Dut$(Dut_no)
310    CASE "BATTERY"
320      GOSUB Battery_select
330    CASE "EDLC"
340      GOSUB Edlc_select
350    CASE "PTC"
360      GOSUB Ptc_select
370    CASE "tau"
380      GOSUB Tau_select
390    END SELECT 
400    RETURN
410 Battery_select:     !
420    INTEGER Battery_no
430    Size=7
440    Length=8
450    ALLOCATE Battery$(Size)[Length]
460    Battery$(1)="Li"
470    Battery$(2)="NiCd"
480    Battery$(3)="3-NiCd"
490    Battery$(4)="    "
500    Battery$(5)="BAT"
510    Battery$(6)="Li-S4"  !4개 직렬, 각셀을 34970A로 측정
520    Battery$(7)="GrandMax"
530    Msg$="배터리 종류"
540    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Battery$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Battery_no)
550    Battery_no=Battery_no+1
560    RETURN
570 Edlc_select:  !
580    INTEGER Edlc_no
590    Size=4
600    Length=10
610    ALLOCATE Edlc$(Size)[Length]
620    Edlc$(1)="2.7V 0~1F"
630    Edlc$(2)="2.7V 1~10F"
640    Edlc$(3)="5.5V 0~1F"
650    Edlc$(4)="5.5V 1~10F"
660    Msg$="EDLC 종류"
670    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Edlc$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Edlc_no)
680    Edlc_no=Edlc_no+1
690    RETURN
700 Ptc_select:  !
710    INTEGER Ptc_no
720    Size=6
730    Length=6
740    ALLOCATE Ptc$(Size)[Length]
750    Ptc$(1)="SPL1"
760    Ptc$(2)="    "
770    Ptc$(3)="    "
780    Msg$="PTC 종류"
790    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Ptc$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Ptc_no)
800    Ptc_no=Ptc_no+1
810    RETURN
820 Tau_select:  !
830    INTEGER Tau_no
840    Size=6
850    Length=25
860    ALLOCATE Tau$(Size)[Length]
870    Tau$(1)="V12T100"   !12V 100sec
880    Tau$(2)="V12T10"
890    Tau$(3)="    "
900    Msg$="Tau(Time-Constant) 종류"
910    DIALOG "LIST",Msg$,Btn;SET("ITEMS":Tau$(*),"COLUMNS":Length,"ROWS":Size),RETURN("SELECTION":Tau_no)
920    Tau_no=Tau_no+1
930    RETURN
940 Stimulus_select: !
950    SELECT Dut$(Dut_no)
960    CASE "BATTERY"
970      SELECT Battery$(Battery_no)
980      CASE "Li"
990        Vc=4.2!4.2V 충전전압         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1000       Vd=3.2!3.2V 방전종료전압     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1010       Ic=2  !100mA 충전전류       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1020       Ic_end=.5  !충전 종료 전류   !!내부 저항 !!!!!!!!!!!!!!!!!!!!!!!!
1030       Id=-2  !100mA 방전전류 음수  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1040     CASE "GrandMax"
1050       Vc=4.4!4.2V 충전전압         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1060       Vd=3.2!3.2V 방전종료전압     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1070       Ic=1  !1A 충전전류       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1080       Ic_end=.2 !200mA 충전 종료 전류   !!내부 저항 !!!!!!!!!!!!!!!!!!!!!!!!
1090       Id=-1  !1A 방전전류 음수  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1100     CASE "NiCd"!표준 1.2V
1110       Vc=1.3!1.5V 충전전압
1120       Vd=.9!0.9V 방전종료전압
1130       Ic=.001!100mA 충전전류
1140       Ic_end=.0005!충전 종료 전류
1150       Id=-.0001!100mA 방전전류 음수
1160     CASE "3-NiCd"!표준 3.6V
1170       Vc=4.7!4.1V 충전전압
1180       Vd=1.5!3.1V 방전종료전압
1190       Ic=.0005!100mA 충전전류
1200       Ic_end=.00035!충전 종료 전류
1210       Id=-5.E-5!100mA 방전전류 음수
1220     CASE "BAT"!표준 3.6V
1230       Vc=3.5!4.1V 충전전압
1240       Vd=2.5!1.V 방전종료전압
1250       Ic=.02!100mA 충전전류
1260       Ic_end=.006!충전 종료 전류
1270       Id=-.005!-10mA 방전전류 음수
1280     CASE "Li-S4"
1290       Vc=16.8!4.2x4 충전전압         4.2x4=16.8     3.7x4=14.8 nominal
1300       Vd=12.8!3.2x4 방전종료전압     3.2x4=12.8
1310       Ic=2  !2A 충전전류
1320       Ic_end=1!충전 종료 전류
1330       Id=-2 !-2A 방전전류 음수
1340     CASE ""
1350       Msg$="충전전류[A], 방전전류[A], 충전종료전류[A], "
1360     END SELECT 
1370   CASE "EDLC"
1380     SELECT Edlc$(Edlc_no)
1390     CASE "2.7V 0~1F"
1400       Vc=2.7        ! 충전전압
1410       Ic=.1         ! 충전전류
1420       Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1430       Id=-.1        ! 100mA 방전전류 음수
1440       Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1450     CASE "2.7V 1~10F"
1460       Vc=2.7        ! 충전전압
1470       Ic=.5         ! 충전전류
1480       Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1490       Id=-.5        ! 500mA 방전전류 음수
1500       Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1510     CASE "5.5V 0~1F"
1520       Vc=5.5        ! 충전전압
1530       Ic=.1         ! 충전전류
1540       Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1550       Id=-.1        ! 100mA 방전전류 음수
1560       Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1570     CASE "5.5V 1~10F"
1580       Vc=5.5        ! 충전전압
1590       Ic=.5         ! 충전전류
1600       Ic_end=Ic*.05 ! 충전 종료 전류는 충전전류의 5%
1610       Id=-.5        ! 500mA 방전전류 음수
1620       Vd=Vc*.05     ! 방전 종료 전압은 충전전압의 5% 이하로 떨어지면
1630     END SELECT 
1640   CASE "PTC"
1650     SELECT Ptc$(Ptc_no)
1660     CASE "SPL1"
1670       Wait=1
1680       Volt_start=0
1690       Volt_stop=12
1700       Volt_step=.05
1710       Limit=2      !2A
1720     END SELECT 
1730   CASE "tau"
1740     SELECT Tau$(Tau_no)
1750     CASE "V12T100"
1760       Volt_set=12  !12V
1770       Time_set=100 !100sec
1780       Limit=2      !2A
1790     CASE "V12T10"
1800       Volt_set=12  !12V
1810       Time_set=10  !100sec
1820       Limit=2      !2A
1830     END SELECT 
1840   END SELECT 
1850 !GOSUB Dialog_string3
1860   RETURN
1870 Fileopen:!
1880   DIM Dhms$[8]
1890   DIM Filename1$[20],Filename2$[20],Filename3$[20]
1900   T=TIMEDATE
1910   Time$=TIME$(T) !하루 추가 +24*3600
1920   Date$=DATE$(T)
1930   Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
1940   Filename1$=Dhms$&".txt"
1950   CREATE Filename1$,1
1960   ASSIGN @File1 TO Filename1$;FORMAT ON
1970   SELECT Dut$(Dut_no)
1980   CASE "BATTERY","EDLC"
1990     T=T+1       !1초 늦게
2000     Time$=TIME$(T)
2010     Date$=DATE$(T)
2020     Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
2030     Filename2$=Dhms$&".txt"
2040     CREATE Filename2$,1
2050     ASSIGN @File2 TO Filename2$;FORMAT ON
2060     SELECT Dut$(Dut_no)
2070     CASE "BATTERY"
2080       IF Battery$(Battery_no)="Li-S4" THEN!직렬배터리 4개에 대한 각 셀별 전압 기록용
2090         T=T+1   !1초 늦게
2100         Time$=TIME$(T)
2110         Date$=DATE$(T)
2120         Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
2130         Filename3$=Dhms$&".txt"
2140         CREATE Filename3$,1
2150         ASSIGN @File3 TO Filename3$;FORMAT ON
2160       END IF 
2170     END SELECT 
2180   END SELECT 
2190   RETURN
2200 Fileclose:!
2210   ASSIGN @File1 TO *
2220   SELECT Dut$(Dut_no)
2230   CASE "BATTERY"
2240     ASSIGN @File2 TO *
2250     IF Battery$(Battery_no)="Li-S4" THEN
2260       ASSIGN @File3 TO *
2270     END IF 
2280   CASE "EDLC"
2290     ASSIGN @File2 TO *
2300   END SELECT 
2310   RETURN
2320 Measure: !
2330   INTEGER I
2340   DIM Cmd$[25],A1$[14],A2$[14],Test$[1]
2350   SELECT Dut$(Dut_no)
2360   CASE "tau","EDLC"
2370     OUTPUT @File1;"No.,Time[s],Volt[V],Curr[A]"
2380   CASE ELSE 
2390     OUTPUT @File1;"No.,Time[m],Volt[V],Curr[A]"
2400   END SELECT 
2410   GOSUB Chart_var
2420   GOSUB Init_chart
2430   Count=0
2440   Time_zero=TIMEDATE
2450   SELECT Dut$(Dut_no)
2460   CASE "BATTERY"
2470     GOSUB Measure_battery
2480   CASE "EDLC"
2490     GOSUB Measure_edlc
2500   CASE "PTC"
2510     GOSUB Measure_vi
2520   CASE "tau"
2530     GOSUB Measure_tau
2540   END SELECT 
2550   RETURN
2560 Measure_battery: !
2570   OUTPUT @File2;"Cycle,Charge Time[m],Charge i Capa[mAh],Charge W Capa[Wh], Discharge Time[m],Discharge i Capa[mAh], Discharge W Capa[Wh]"
2580   FOR I=1 TO No_cycle   !배터리 충방전실험을 5회 실시
2590     C_i_capa=0
2600     C_w_capa=0
2610     D_i_capa=0
2620     D_w_capa=0
2630     GOSUB Cycle
2640     OUTPUT @File2;I,C_time,C_i_capa,C_w_capa,D_time,-D_i_capa,-D_w_capa
2650   NEXT I
2660   RETURN
2670 Measure_edlc: !
2680   OUTPUT @File2;"Cycle,Charge Time[s],Charge i Capa[mAh],Charge W Capa[mWh], Discharge Time[s],Discharge i Capa[mAh], Discharge W Capa[mWh], Capacity[F]"
2690   FOR I=1 TO No_cycle
2700     C_i_capa=0
2710     C_w_capa=0
2720     D_i_capa=0
2730     D_w_capa=0
2740     Capacity=0
2750     GOSUB Cycle
2760     OUTPUT @File2;I,C_time*60,C_i_capa,C_w_capa*1000,D_time*60,-D_i_capa,-D_w_capa*1000,Capacity
2770   NEXT I
2780   RETURN
2790 Measure_vi:  !
2800   FOR Volt=Volt_start TO Volt_stop STEP Volt_step
2810     Cmd$="V5" !32V
2820     Cmd$=Cmd$&" D "&VAL$(Volt)&"V"   !D 2.0V
2830     Cmd$=Cmd$&" D "&VAL$(Limit)&"A"   !D 2.0A
2840     OUTPUT @Src;Cmd$   !"V5 D 1V D 2A"
2850     OUTPUT @Src;"E"    !Operate ON
2860     T=TIMEDATE
2870     Time_elapsed=(T-Time_zero)/60
2880     GOSUB Reading
2890     Curr=Data
2900     GOSUB Data_process
2910     WAIT Wait
2920   NEXT Volt
2930   OUTPUT @Src;"H"      !Operate OFF
2940   RETURN
2950 Measure_tau:  !
2960   Volt=Volt_set
2970   Cmd$="V5"   !32V
2980   Cmd$=Cmd$&" D "&VAL$(Volt)&"V"     !D 12V
2990   Cmd$=Cmd$&" D "&VAL$(Limit)&"A"     !D 2.0A
3000   OUTPUT @Src;Cmd$     !"V5 D 1V D 2A"
3010   OUTPUT @Src;"E"      !Operate ON
3020   Time_zero=TIMEDATE
3030   LOOP
3040     T=TIMEDATE
3050     Time_elapsed=(T-Time_zero)   !second
3060     GOSUB Reading
3070     Curr=Data
3080     GOSUB Data_process
3090   EXIT IF Time_elapsed>Time_set
3100   END LOOP 
3110   OUTPUT @Src;"H"      !Operate OFF
3120   RETURN
3130 Cycle: !
3140   Pre_v=0 !최초 측정 전압=0으로 가정한다.
3150   GOSUB Charge1
3160   GOSUB Charge2
3170   GOSUB Discharge
3180   RETURN
3190 Charge1: !
3200 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3210 !충전. +부호 정전류, 전압제한(전압을 읽는다.)
3220 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3230   Test$="C"
3240   Cmd$="I4"   !2A range
3250   Cmd$=Cmd$&" D "&VAL$(Ic)&"A"     !D 2.0A
3260   Cmd$=Cmd$&" D "&VAL$(Vc)&"V"     !D 4.2V
3270   OUTPUT @Src;Cmd$   !"I4 D 2A D 4.2V"
3280   WAIT Wait
3290   OUTPUT @Src;"E"      !Operate ON
3300   WAIT Wait
3310   C_start_time=TIMEDATE
3320   Pre_t=C_start_time
3330   Curr=Ic
3340   LOOP
3350     T=TIMEDATE
3360     Time_elapsed=(T-Time_zero)/60
3370     GOSUB Reading
3380     Volt=Data
3390  !  IF Volt>Pre_v THEN   !충전 전압이 상승하면
3400     IF ABS(Volt-Pre_v)>=.01 THEN     !전압차가 0.01V 이상이면
3410       GOSUB Data_process
3420       C_i_capa=C_i_capa+(Curr*1000)*((T-Pre_t)/3600)   !mAh = mA x hour
3430       C_w_capa=C_w_capa+Curr*Volt*((T-Pre_t)/3600)     !Wh = A x V x hour
3440       Pre_t=T
3450     END IF 
3460   EXIT IF Volt>=(Vc-.001)    !측정 전압이 충전최고 전압에 도달하면
3470   END LOOP 
3480   OUTPUT @Src;"H"      !Operate OFF
3490   WAIT Wait
3500   RETURN
3510 Charge2:!
3520 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3530 !충전, 충전 최고전압에 도달하면. 정전압, 전류제한(전류를 읽는다.)
3540 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3550   Cmd$="V5"   !32V range
3560   Cmd$=Cmd$&" D "&VAL$(Vc)&"V"     !D 4.2V
3570   Cmd$=Cmd$&" D "&VAL$(Ic)&"A"     !D 2.0A
3580   OUTPUT @Src;Cmd$   !"V5 D 4.2V D 2.0A"
3590   WAIT Wait
3600   OUTPUT @Src;"E"      !Operate ON
3610   WAIT Wait
3620   Pre_v=Ic  !충전 전류(Ic)를 초기값으로 기억한다.
3630   Volt=Vc   !충전전압은 일정하다.
3640   LOOP
3650     T=TIMEDATE
3660     Time_elapsed=(T-Time_zero)/60
3670     GOSUB Reading   !충전전압에 도달되었기 때문에, 서서히 줄어드는 충전 전류를 측정한다.
3680     Curr=Data
3690  !  IF Curr<Pre_v THEN   !측정 전류가 서서히 낮아지면
3700     IF ABS(Curr-Pre_v)>=.01 THEN     !전류차이가 .01A 이상이면
3710       GOSUB Data_process
3720       C_i_capa=C_i_capa+(Curr*1000)*((T-Pre_t)/3600)   !mAh = mA x hour
3730       C_w_capa=C_w_capa+Curr*Volt*((T-Pre_t)/3600)     !WA = A x V x hour
3740       Pre_t=T
3750     END IF 
3760   EXIT IF Curr<=Ic_end+.001   !현재 전류가 종료전류에 도달하면
3770   END LOOP 
3780   C_time=(T-C_start_time)/60
3790   OUTPUT @Src;"H"      !Operate OFF
3800   WAIT Wait
3810   RETURN
3820 Discharge: !
3830 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3840 !방전 전류는 -로 표기한다.
3850 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3860   Test$="D"
3870   Cmd$="I4"   !2A range
3880   Cmd$=Cmd$&" D "&VAL$(Id)&"A"      !D -2.0A
3890   Cmd$=Cmd$&" D "&VAL$(Vc)&"V"     !D 4.2V
3900   OUTPUT @Src;Cmd$   !"I4 D -2A D 4.2V"
3910   WAIT Wait
3920   OUTPUT @Src;"E"      !Operate ON
3930   WAIT Wait
3940   Pre_v=Vc
3950   D_start_time=TIMEDATE
3960   Pre_t=D_start_time
3970   Curr=Id    !방전전류(-값을 갖는다.)는 일정하다.
3980   Set80=0
3990   Set40=0
4000   LOOP
4010     T=TIMEDATE
4020     Time_elapsed=(T-Time_zero)/60
4030     GOSUB Reading   !일정 전류 방전      , 전압이 측정된다.
4040     Volt=Data
4050   ! IF Volt<Pre_v THEN   !측정전압이 서서히 낮아지면(방전이므로)
4060     IF Set80=0 AND Volt<Vc*.8 THEN        !방전전압이 충전전압의 80%가 되면 한번만 수행
4070       V80=Volt
4080       T80=Time_elapsed*60
4090       Set80=1
4100     END IF 
4110     IF Set40=0 AND Volt<Vc*.4 THEN        !방전전압이 충전전압의 40%가 되면 한번만 수행
4120       V40=Volt
4130       T40=Time_elapsed*60
4140       Set40=1
4150     END IF 
4160     IF ABS(Volt-Pre_v)>=.01 THEN     !전압차가 0.01V 이상이면
4170       GOSUB Data_process
4180       D_i_capa=D_i_capa+(Curr*1000)*((T-Pre_t)/3600)   !mAh = mA x hour
4190       D_w_capa=D_w_capa+Curr*Volt*((T-Pre_t)/3600)     !Wh = A x V x hour
4200       Pre_t=T
4210     END IF 
4220   EXIT IF Volt<=Vd+.001    !현재 전압이 방전 최저전압에 도달하면
4230   END LOOP 
4240   D_time=(T-D_start_time)/60
4250   Capacity=Id*(T80-T40)/(V80-V40)  !기울기가 -이므로
4260   OUTPUT @Src;"H"      !Operate OFF
4270   WAIT Wait
4280   RETURN
4290 Data_process: !
4300   Count=Count+1
4310   SELECT Dut$(Dut_no)
4320   CASE "BATTERY","EDLC"
4330     X1=Time_elapsed
4340     Y1=(Volt*2/Vc)*100-100  !전압 [%]
4350     Y2=(Curr/Ic)*100  !전류 [%]
4360   CASE "PTC"
4370     X1=Volt
4380     Y1=Curr
4390     Y2=0
4400   CASE "tau"
4410     X1=Time_elapsed
4420     Y1=Curr
4430     Y2=0
4440   END SELECT 
4450   Y(1)=Y1
4460   Y(2)=Y2
4470   CONTROL @Strip;SET("POINT LOCATION":X1,"VALUES":Y(*))
4480   PRINT "Count=";Count;", T=";PROUND(Time_elapsed,-5);"m, V=";Volt;"V, I=";Curr;"A"
4490   OUTPUT @File1;Count,Time_elapsed,Volt,Curr
4500   Pre_v=Data
4510   SELECT Dut$(Dut_no)
4520   CASE "BATTERY"
4530     IF Battery$(Battery_no)="Li-S4" THEN
4540       GOSUB Reading34970
4550       OUTPUT @File3;Count,V(*)
4560     END IF 
4570   END SELECT 
4580   RETURN
4590 Reading: !
4600   LOOP
4610     GOSUB Reading1
4620   EXIT IF Data<>0
4630   END LOOP 
4640   RETURN
4650 Reading1: !
4660 ! 전압을 측정하면 나타나는 데이터 포맷
4670 ! 12345678901234
4680 !"DV +03.857E+0"   원래
4690 !" DV +03.857E+0"  앞에 공백이 하나 추가되어 나온 적이 있다.
4700 ! 전압를 측정하면 나타나는 데이터 포맷
4710 ! 12345678901234
4720 !"DI +0.6310E+0"   원래
4730   ENTER @Src;A1$
4740   A2$=TRIM$(A1$)   !앞뒤 공백 모두 없앤다
4750   Data=VAL(A2$[3,13])
4760   SELECT Dut$(Dut_no)
4770   CASE "BATTERY"
4780 ! Data=PROUND(Data,-3)  !소수점 3자리. 0.1mA까지 측정되면 너무 많은 데이터가 획득되므로
4790     Data=DROUND(Data,3)!유효수자 3자리
4800   CASE "tau"
4810     WAIT .05  !이보다   빨리 측정못한다.
4820   END SELECT 
4830   RETURN
4840 Reading34970: !
4850   OUTPUT @Sw;"MEAS:VOLT:DC? (@201:204)"
4860   ENTER @Sw;V(*)
4870   RETURN
4880 Inst6143_open: !
4890   ASSIGN @Src TO 714    !advantest TR6143
4900   OUTPUT @Src;"C"       !initialize
4910   OUTPUT @Src;"OM1"     !ascii, OM0=set value, OM1=meas value
4920   SELECT Dut$(Dut_no)
4930   CASE "BATTERY"
4940     IF Battery$(Battery_no)="Li-S4" THEN
4950       GOSUB Inst34970_open
4960     END IF 
4970   END SELECT 
4980   RETURN
4990 Inst34970_open: !
5000   DIM V(4)      !4채널 전압
5010   ASSIGN @Sw TO 709     !Agilent 34970A
5020  ! OUTPUT @Sw;"CONF:VOLT:DC AUTO (@201:204)"
5030   OUTPUT @Sw;"SENS:VOLT:DC:RANG:AUTO ON,(@201:204)"
5040   OUTPUT @Sw;"SENS:VOLT:DC:NPLC 2,(@201:204)"
5050   RETURN
5060 Chart_var:   !
5070   SELECT Dut$(Dut_no)
5080   CASE "BATTERY"
5090     X_origin=0!time=0
5100     X_range=1*60        !1  hours *60min  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5110     X_axis_label$="Elapsed Time [Min]"
5120     Y_origin=-110
5130     Y_range=220
5140     Y_axis_label$="Volt & Current [%]"
5150   CASE "EDLC"
5160     X_origin=0!time=0
5170     X_range=10          !10min  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5180     X_axis_label$="Elapsed Time [Min]"
5190     Y_origin=-110
5200     Y_range=220
5210     Y_axis_label$="Volt & Current [%]"
5220   CASE "PTC"
5230     X_origin=Volt_start
5240     X_range=Volt_stop-Volt_start      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5250     X_axis_label$="Applied Volt [V]"
5260     Y_origin=0
5270     Y_range=Limit
5280     Y_axis_label$="Current [A]"
5290   CASE "tau"
5300     X_origin=0
5310     X_range=Time_set                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5320     X_axis_label$="Elapsed Time [m]"
5330     Y_origin=0
5340     Y_range=Limit
5350     Y_axis_label$="Current [A]"
5360   END SELECT 
5370   RETURN
5380 Init_chart:   !
5390   DIM X_axis_label$[25],Y_axis_label$[25]
5400   INTEGER Trace_num
5410   INTEGER Screen_dims(1:2),Gwindow_dims(1:4)
5420   REAL Y(1:2)   !Y(1) Volt, Y(2) Current
5430   GESCAPE CRT,36;Screen_dims(*) ! Get screen width and height.
5440  !
5450  ! Set the dimensions of the graphics window using GESCAPE 33 so
5460  ! that it is centered on the screen.
5470  !
5480   Gwindow_dims(1)=Screen_dims(1)*.25 ! X of upper left.
5490   Gwindow_dims(2)=Screen_dims(2)*.2  ! Y of upper left.
5500   Gwindow_dims(3)=Screen_dims(1)*.7  ! Width.
5510   Gwindow_dims(4)=Screen_dims(2)*.6  ! Height.
5520   GESCAPE CRT,33;Gwindow_dims(*)     ! Set graphics window geometry.
5530  !
5540   GESCAPE CRT,35 ! Move the graphics window to the top.
5550  !
5560  ! Create a stripchart.  Make it invisible until all changes are made.
5570  !
5580   ASSIGN @Strip TO WIDGET "STRIPCHART";SET("VISIBLE":0)
5590  !
5600  ! Set the overall attributes.
5610  !
5620   CONTROL @Strip;SET("TITLE":"Data Logger")
5630   CONTROL @Strip;SET("MINIMUM SCROLL":2)
5640   CONTROL @Strip;SET("MOVABLE":0)
5650   CONTROL @Strip;SET("MAXIMIZABLE":0)
5660   CONTROL @Strip;SET("X":0,"Y":0)
5670  !
5680  ! Size the stripchart to exactly fill the graphics window.
5690  !
5700   Vert_borders=26
5710   Horiz_borders=8
5720   Height=Gwindow_dims(4)-Vert_borders
5730   Width=Gwindow_dims(3)-Horiz_borders
5740   CONTROL @Strip;SET("WIDTH":Width,"HEIGHT":Height)
5750  !
5760   CONTROL @Strip;SET("CURRENT AXIS":"X")
5770   CONTROL @Strip;SET("ORIGIN":X_origin,"RANGE":X_range)
5780   CONTROL @Strip;SET("AXIS LABEL":X_axis_label$)
5790  !CONTROL @Strip;SET("DIGITS":5)
5800  !
5810   CONTROL @Strip;SET("CURRENT AXIS":"Y")
5820   CONTROL @Strip;SET("ORIGIN":Y_origin,"RANGE":Y_range)
5830   CONTROL @Strip;SET("AXIS LABEL":Y_axis_label$)
5840  !
5850   CONTROL @Strip;SET("VISIBLE":1) ! Show the stripchart.
5860  !
5870   RETURN
5880   END