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

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

2020년 1월 26일 (일) 14:30 판

10  ! Advantest TR6143

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