#lang "fblite" ' http://www.freebasic.net/ WindowTitle "http://www.FREEBASIC.net" const NoteName="NOTE" ' ', NumberSensors = 14' 14/05/2021 ADC buff added Const MaxTimeError=60 ' Between reopen COM port Const MaxAvgNum=256 ' Average up limit Const MaxDelayNum=20 ' Delay limit Const ScrWMax=1800, StrHMax=128 ' '13/03/2022 на единицу меньше половины байт в буфере Const NumberSensors = 8+3+4+3'+1' 13/05/2022 'movlw MaxW1Sensors*2+6+8+6+2 ;d'14',W1_Temp_Count,BANKED ; счётчик Const DisplaySensors=15' 8 1W temp + 4 ADC + 1 Flow' + 1 SummFlow + PID_TargetTemp Const SavedLogSensors=15' Const MathGrafLines=2' StageDist and FlegmaNumber #include "string.bi" ';Need For Format$ Dim shared As Short W1_Temp(NumberSensors) ' Must have Exact lenght with USB CDC Data Packet from Pic18F Dim shared As Short Display(ScrWMax,NumberSensors+MathGrafLines),DispStr(NumberSensors+MathGrafLines), LineBusy(StrHMax) ' Number 1W sensors Dim shared As Short TagReOpen, TagDisplayMode,PauseToggle,StateNumber Dim Shared As Single Proof,AvgFlow(MaxAvgNum+1),AvgValve(MaxAvgNum+1),AvgFlegma(MaxAvgNum+1) Dim Shared As Single SensorRange, SensorValue, SensorAbove,AvgSumm dim Shared as string KeyString,ComPortNameMode,argv Dim Shared thread1 As Any Ptr Dim Shared As Integer ScrW, ScrH, ScrHB, StrH, k, L Dim Shared As Integer DelayNum,Column,ClearScreenTag,AvgNumV,AvgNumFl,FlegAvg,FlegDiff Dim Shared As Double TimerOld,TimerNew Dim Shared As UByte SymbolSend Dim Shared SensorColor (NumberSensors+MathGrafLines) As Short => {10, 11, 12, 13, 14, 15, 10, 11,_ 4, 15, 6, 3,_ 10, 11, 12, 13, 14, 15,_ 12, 14 } ' + MathGrafLines Dim Shared SensorMinTemp (NumberSensors+MathGrafLines) As Short => {10, 15, 15, 15, 10, 10, 7, 10,_ -2, -2, -2, -2,_ -1, -1, 10, -4, 10, 10,_ 0, -1 } ' + MathGrafLines Dim Shared SensorMaxTemp (NumberSensors+MathGrafLines) As Short => {104, 104, 104, 104, 90, 85, 75, 104,_ 104, 104, 104, 104,_ 2, 4, 100, 260, 10, 10,_ 10, 10 } ' + MathGrafLines Dim Shared SensorFixDot (NumberSensors+MathGrafLines) As Short => {16, 16, 16, 16, 16, 16, 16, 16,_ 327, 327, 327, 327,_ 100, 100, 16, 1, 100, 100,_ 100, 1000 } ' + MathGrafLines Dim Shared SensorCorrector (NumberSensors) As Short => {0, 4, 8, 12, 8, 8, 8, 0,_ 0, 0, 0, 0,_ 0, 0, 0, 0, 0, 0 }',_ '0, 0 } ' + MathGrafLines Dim Shared SensorName (NumberSensors+MathGrafLines) As String*5 => {"Tank ", "1 st ", "2 st ", "Steam", "TopHE",_ "Centr", "BotHE", "Out W",_ "PropR", "IntgW", "DiffY", "Blue ",_ "FloW", "Wolum", "Targt", "Valve", "Res 1", "Res 2",_ "FlegN", "DistP" } ' + MathGrafLines Dim Shared SensorFormat (NumberSensors+MathGrafLines) As String*5 => {"0.0", "0.0", "0.0", "0.0", "0.0",_ "0.0", "0.0", "0.0",_ "0.0", "0.0", "0.0", "0.0",_ "0.00", "0.00", "0.0", "0", "0.0", "0.0",_ "0.00", "0.00" } ' + MathGrafLines #include "Tab_Fun_Stab_1976.bi" ' Tables Stabnikov 1976 Spirt and Functions ' Subroutine before main prog Sub CloseFiles() Close #1 Close #2 Close #3 End Sub Sub ReOpenCom() End Sub Sub InputKeyThread (ByVal param As Any Ptr) 'Preemptive multitasking time slot ~1-10 mSec 'Dim As Double t = Timer dim as string Key,Key1,a dim As integer MouseX, MouseY, MouseWheel, MouseBut, MouseClip While( 1 ) Sleep 100 ' 10 keys/seconds If TagReOpen > 1 Or Timer-TimerOld > 1.99 Then' Device and Port dont send data properly TagReOpen=0 ' Close #1 Sleep 500 ' Wait ~0.5 seconds Open COM ComPortNameMode AS 1 ' USB virtual Com EndIf ' TagReOpen > 1 Or Timer-TimerOld > 1.99 'Key=inkey$ 'Key1=GetMouse(MouseX, MouseY, MouseWheel, MouseBut, MouseClip) 'InputKeyboard: a=InKey() If Len(a)>0 Then Select Case a Case Chr$(13)' Enter If Val(KeyString)>3 And Val(KeyString)<96.6 Then Proof=Val(KeyString) EndIf ' Val(KeyString)>3 And Val(KeyString)<96.6 KeyString="" Case "s" PauseToggle= -1*PauseToggle 'GoTo OneStepForward Case Chr$(27)' Escape 'GoTo ExitProg Call CloseFiles Stop(55) Case " " PauseToggle= -1 * PauseToggle Case "c" ClearScreenTag=1 Case "q" 'DelayNum=DelayNum+1 AvgNumV=AvgNumV+1 If AvgNumV > MaxAvgNum Then AvgNumV = MaxAvgNum Case "w" 'DelayNum=DelayNum-1 AvgNumV=AvgNumV-1 If AvgNumV < 0 Then AvgNumV = 0 Case "e" If DelayNum < MaxDelayNum Then DelayNum=DelayNum+1 Case "r" If DelayNum > 0 Then DelayNum=DelayNum-1 Case "t" 'FlegAvg=20 ' Average Flegma Number If FlegAvg < MaxAvgNum Then FlegAvg=FlegAvg+1 Case "y" 'FlegAvg=20 ' Average Flegma Number If FlegAvg > 0 Then FlegAvg=FlegAvg-1 Case "u" 'FlegDiff=20 ' Diff Flegma Scale If FlegDiff < MaxAvgNum Then FlegDiff=FlegDiff+1 Case "i" 'FlegDiff=20 ' Diff Flegma Scale If FlegDiff > 0 Then FlegDiff=FlegDiff-1 Case "o" '' Average Flow AvgNumFl=AvgNumFl+1 If AvgNumFl > MaxAvgNum Then AvgNumFl = MaxAvgNum Case "p" '' Average Flow AvgNumFl=AvgNumFl-1 If AvgNumFl < 0 Then AvgNumFl = 0 ' Test sending byte to CDC Pic18F Case "d" SymbolSend=100 Put #1,,SymbolSend 'One byte to send Case "f" SymbolSend=101 Put #1,,SymbolSend 'One byte to send Case "g" SymbolSend=102 Put #1,,SymbolSend 'One byte to send Case "h" SymbolSend=103 Put #1,,SymbolSend 'One byte to send Case "j" SymbolSend=104 Put #1,,SymbolSend 'One byte to send Case "k" SymbolSend=105 Put #1,,SymbolSend 'One byte to send Case "l" SymbolSend=106 Put #1,,SymbolSend 'One byte to send Case "z" 'Column=0 Case "l" 'ColumnSinchroToggle=-1*ColumnSinchroToggle Case "x" 'GoTo ExitProg Call CloseFiles Stop(55) Case Else KeyString=KeyString+a End Select ' Select Case a EndIf ' If Len(a)>0 Then Wend ' While( 1 ) End Sub ' InputKeyThread (ByVal param As Any Ptr) Sub ScreenChange () if environ("COMPUTERNAME")=NoteName then 'BaseComp Off Line or notebook On Line Screen 20,8,1 ' Set 1024x768 mode, 256 colors windowed 'Const ScrW=1280, ScrH=1024 'ScrW = 1366: ScrH = 768:' AxleD = 10 ScrW = 1024: ScrH = 768: ScrHB=95 : StrH=48'64 'ScreenRes ScrW,ScrH,32 'ColorSpeed=RGB(0,255,0):ColorAccel=RGB(0,0,255):ColorLine=RGB(128,0,0) 'ColorCircle=RGB(255,255,255):ColorCourse=RGB(0,128,0) Else 'environ("COMPUTERNAME")=NoteName Screen 21,8,1 ' Set 1280x1024 mode, 256 colors windowed ' screen 21,8,0 ' Set 1280x1024 mode, 256 colors windowed 'ScrW = 1920: ScrH = 1080: ScrW=1280 : ScrH=1024 ScrHB=95 : StrH=64 'ScrW = 1366: ScrH = 768: ' ColorSpeed=RGB(0,255,0):ColorAccel=RGB(0,0,255):ColorLine=RGB(128,0,0) ' ColorCircle=RGB(255,255,255):ColorCourse=RGB(0,128,0) End If 'environ("COMPUTERNAME")=NoteName End Sub 'ScreenChange () sub DisplayData (ByRef RowNum As Integer, ByVal DispData As Short) ' DispData = W1_Temp(RowNum) dim as Integer i ' Local iterator SensorRange=SensorMaxTemp(RowNum)-SensorMinTemp(RowNum) ' SensorAbove=DispData - SensorMinTemp(RowNum)*SensorFixDot(RowNum) ' In 1/16 degrees If SensorAbove > 0 Then ' Sensor in display range SensorValue=SensorAbove*ScrH/(SensorRange*SensorFixDot(RowNum)) ' in 1/100 liters/min Else 'SensorAbove > 0 SensorValue=ScrH EndIf 'SensorAbove > 0 k=ScrH-SensorValue ' Reverse L=StrH-SensorValue*StrH/ScrH ' Line text output If L<1 Then L=1 ' Limit If L>StrH-1 Then L=StrH-1 ' margins 'If L>0 And L0 And L0 And L StrH/2 Then ' Target Top half screen For i=L To 1 Step -1 ' Search From wanted to zero If LineBusy(i)=0 GoTo DoneSearchLine Next i Else ' Bottom half screen For i=L To StrH 'Step -1 ' Search From wanted to max screen If LineBusy(i)=0 GoTo DoneSearchLine Next i EndIf ' L > StrH/2 Then ' half screen select ' Place not found for data on screen DoneSearchLine: LineBusy(i)=10 ' Row Busy Tag DispStr(RowNum)=i'L ' Remind for another data place Locate i,1 : Color SensorColor(RowNum),0 ' Print Format$(DispData/SensorFixDot (RowNum),SensorFormat (RowNum));" ";SensorName (RowNum) 'EndIf For i=ScrW To ScrHB Step -1 ' Screen and bufer Scroll PSet( i, Display(i,RowNum)), 0 ' Clear Old Pixel Display(i,RowNum)=Display(i-1,RowNum) ' New Pixel Value PSet( i, Display(i,RowNum)), SensorColor(RowNum) ' Set New Pixel Next i ' Set new pixels in 0 position PSet( ScrHB-1, Display(0,RowNum)), 0 ' Clear Old Pixel Display(ScrHB-1,RowNum)=k ' New Pixel Value PSet( ScrHB-1, k), SensorColor(RowNum) ' Set New Pixel End Sub 'DisplayData () ' **** Main prog ***** after subroutine dim as ubyte ComBuf dim as string a,a0,a1,FileName,FileNameTxt,FileNameBin,PrintString,PrintString1 dim as String PrintString2,PrintString3, FileStr,FileFields(SavedLogSensors) 'dim as Integer i,J,K,L,N,i1,i2,Column,ColumnFirst,TimeError',thread1 dim as Integer i,j,N,i1,i2,ColumnFirst,TimeError,NumberGets, FlegmaSumm0, FlegmaSumm1 Dim As Single LagrangeResult(5),StageDist,FlegmaNumber, FlegmaNumber0, FlegmaNumber1,FlegmaExtra Dim As Short W1_ScreenData(ScrW,NumberSensors) ' Data Copy for screen rewrite Dim As Short FlNumAdd, FlNumAvg, FlegDiffTemp ' Dim As UShort W1_Usb_Counter ' Dim As Double AmplitudeD,SinLimitedD,SinAmplifyD,PwmDutyCycleD 'Dim As Short W1_ScreenData(ScrW,NumberSensors) ' Data Copy for screen rewrite FlegAvg=97 ' Average Flegma Number AvgNumV=20 ' Average Valve AvgNumFl=30 ' Average Flow FlegmaNumber= 437 ' Fixed value /100, center line FlegDiff=117 ' Diff Scale ColumnFirst=0 Column=0 MinTemp=20:MaxTemp=30 TimerOld=Timer Print "Free memory:" Print mem \ (1024 * 1024); " megabytes" argv = Command( 1 ):FileName = Command( 2 ) If( Len( argv ) < 2 ) And Val(argv)>0 Then ' Print realtime data from USB CDC ' USB CDC Receive and write logs mode If ( Len( FileName ) < 2 ) Or Len(FileName)>18 Then FileNameTxt = "Debug_" + argv + ".dat" FileNameBin = "Debug_" + argv + ".bin" Else '( Len( FileName ) < 2 ) Or Len(FileName)>18 FileNameTxt = FileName + argv + ".dat" FileNameBin = FileName + argv + ".bin" EndIf '( Len( FileName ) < 2 ) Or Len(FileName)>18 WindowTitle "USB CDC USART out to Graf on http://www.FREEBASIC.net/index.php/download" 'Input "COM Number ? ", a0 ComPortNameMode="com"+str$(argv)+":115200,N,8,1,CS0,DS0,CD0,OP0,BIN" ' USB virtual Com Open COM ComPortNameMode AS 1 ' USB virtual Com 'open COM "com3:4800,N,8,1,CS0,DS0,CD0,OP0,BIN" AS 1 ' USB virtual Com print "Com "+str$(argv)+" Port opened";Err :'Input "Press Enter for Loop", a0 TagReOpen=0 ' Port opened Open FileNameTxt For Append As #2 Open FileNameBin For Append As #3 Else '( Len( argv ) < 2 ) And Val(argv)>0' Print saved Data From Log File ' Read logs Mode FileNameTxt = FileName + ".dat" FileNameBin = FileName + ".bin" WindowTitle "Saved Log Data Out to Graf on http://www.FREEBASIC.net" TagReOpen=0 ' Port opened Open FileNameTxt For Input As #2 ' Open FileNameBin For Input As #3 ' EndIf '( Len( argv ) < 2 ) And Val(argv)>0 ' Change mode Print "exe= "; Command( 0 );", Command= ";Command( 1 );",FileName= ";Command( 2 );" = ";FileName ScreenChange () ' Note or Base comp Line (0, ScrH/2)-(ScrW, ScrH/2), 10, , &b1010101010101010 ' center green dashed line ' 'Preemptive multitasking time slot ~1-10 mSec thread1=ThreadCreate( @InputKeyThread, 0 ) If thread1 = 0 Then Locate 27,30 Print "ThreadCreate Error= " GoTo ExitProg EndIf 'thread1 = 0 ReadDataLoop: ' ********* Begin read data from source 'If( Len( argv ) < 2 ) And Val(argv)>0 Then ' Print realtime data from USB CDC 'do 'Else '( Len( argv ) < 2 ) And Val(argv)>0' Print saved Data From Log File ' Read logs Mode 'do While Not Eof(2) 'EndIf '( Len( argv ) < 2 ) And Val(argv)>0 ' Change mode If ClearScreenTag>0 Then ClearScreenTag=0 KeyString="" Cls(1) Line (0, ScrH/2)-(ScrW, ScrH/2), 10, , &b1010101010101010 ' center green dashed line EndIf 'ClearScreenTag>0 If( Len( argv ) < 2 ) And Val(argv)>0 Then ' Print realtime data from USB CDC Sleep 500 ' Wait ~0.7 seconds 'Locate 30,30 'Print "Proof= ";Format$(Proof,"0.0");" " Locate 30,50: 'print Asc(a); Print KeyString;" " get #1,,W1_Temp()'ComBuf ' In device side USB stack always send NumberSensors*2 byte buff TimerNew=Timer If TimerNew-TimerOld > 0.99 Or TimerNew-TimerOld < 0.71 Then TimeError=TimeError+1 Locate 28,30 Print "Time Error= ";Format$(TimeError,"0");" " If TimeError>MaxTimeError Then TimeError=0 TagReOpen=10 ' Device and Port dont send data properly Sleep 2000 ' Wait ~2 seconds EndIf 'TimeError>MaxTimeError Else 'TimerNew-TimerOld > 0.99 Or TimerNew-TimerOld < 0.91 TimeError=0 Locate 28,30 Print " "' Clear Err Msg EndIf 'TimerNew-TimerOld > 0.99 Or TimerNew-TimerOld < 0.91 W1_Usb_Counter=W1_Temp(NumberSensors) ' Type Change W1_Temp(15)= Int(W1_Temp(15)/256) ' PWM Valve = High Byte Unsigned If W1_Temp(15) < 0 Then W1_Temp(15)=W1_Temp(15)+256 ' SensorFixDot (15),SensorFormat (15)) Else '( Len( argv ) < 2 ) And Val(argv)>0' Print saved Data From Log File ' Read logs Mode ReadTxtData: Sleep 10*DelayNum ' Playing Speed regulate If PauseToggle < 0 Then Sleep 100 GoTo ReadTxtData EndIf 'PauseToggle < 0 If Eof(2)<0 Then GoTo ExitProg ' -1=True Input #2,FileFields(0),FileFields(1),FileFields(2),FileFields(3),FileFields(4),FileFields(5),FileFields(6),_ FileFields(7),FileFields(8),FileFields(9),FileFields(10),FileFields(11),FileFields(12) ' 12 fields ' Next i i=InStr(FileFields(12),"Num=") If i>0 Then W1_Usb_CounTXT=Val(Mid(FileFields(12),i+4)) W1_Usb_Counter=W1_Usb_CounTXT'W1_Temp(NumberSensors) ' Type Change EndIf If W1_Usb_CounTXT<=0 GoTo ReadTxtData ' Read string not valid For i=1 To 8 ' Number temp sensor data if Trim(Mid(FileFields(i),1,5))=Trim(SensorName(i-1)) Then ' Additional control W1_Temp(i-1) = SensorCorrector(i-1) + SensorFixDot(i-1) * Val(Mid(FileFields(i),7)) 'FileFields(i) endif 'Trim(Mid(FileFields(i),1,5))=Trim(SensorName(i-1)) Next i '=1 To 8 ' Number temp sensor data 'Locate 4,10 : Color 11, 0 : Print FileFields(8);",";W1_Temp(7);" " ' 'If Val(Mid(FileFields(9),7))>1 And Val(Mid(FileFields(9),7))<97 Then ' Proof=Val(Mid(FileFields(9),7)) 'EndIf EndIf '( Len( argv ) < 2 ) And Val(argv)>0 ' Change mode ' ******* Data Reading is done ***** LagrangeResult(1)=StabnikovLagrange(W1_Temp(0)/16,4,2,9) ' VolPart in Tank liquid LagrangeResult(2)=StabnikovLagrange(W1_Temp(2)/16,4,2,9) ' VolPart in Top Plate liquid LagrangeResult(3)=StabnikovLagrange(W1_Temp(3)/16,4,6,9) ' VolPart in Product vapor LagrangeResult(4)=StabnikovLagrange(W1_Temp(0)/16,4,6,9) ' VolPart in Tank vapor If LagrangeResult(1)>0 And LagrangeResult(3)>0 And LagrangeResult(3)> LagrangeResult(1) Then ' Tank and Prod Vapor Proof StageDist=1000*LagrangeStage(LagrangeResult(1),LagrangeResult(3),4) '(ProofInput as single, ProofOutput as Single, Number as Short) as Single ' Locate 35,15: Color 15,0 ' ' Print StageTemp;" Stage=";StageDist;", 0=";LagrangeResult(5);", 1=";LagrangeResult(6);", 2=";LagrangeResult(7);_ ' ", 3=";LagrangeResult(8);", 4=";LagrangeResult(9);", 5=";LagrangeResult(10);", 6=";LagrangeResult(11);_ ' ", 7=";LagrangeResult(12);", 8=";LagrangeResult(13); ';", Tank %ABV=";LagrangeResult(1) EndIf ' If LagrangeResult(1)>0 And LagrangeResult(3)>0 And LagrangeResult(3)> LagrangeResult(1) Then ' Tank and Prod Vapor Proof If AvgNumV>0 Then ' Average Valve For i=AvgNumV+1 To 1 Step -1 AvgValve(i)=AvgValve(i-1) Next i '=AvgNumV+1 To 1 Step -1 AvgValve(0)=W1_Temp(15) ' New Value PWM Valve Locate 3,125 : Color 13, 0 : Print AvgValve(0)'AvgNumV ' Valve Average Count ' Locate 2,140 : Color 10, 0 : Print AvgNumFl ' Valve Average Count AvgSumm=0 For i=1 To AvgNumV AvgSumm=AvgSumm+AvgValve(i) Next i '=1 To AvgNumV W1_Temp(15)=Int(0.5+AvgSumm/AvgNumV) Locate 3,135 : Color 13, 0 : Print W1_Temp(15)'AvgValve(0)'AvgNumV ' Valve Average Count EndIf ' Average Valve If AvgNumFl>0 Then ' Average Flow For i=AvgNumFl+1 To 1 Step -1 AvgFlow(i)=AvgFlow(i-1) Next i'=AvgNumFl+1 To 1 Step -1 AvgFlow(0)=W1_Temp(12) ' New Value Flow*100 AvgSumm=0 For i=1 To AvgNumFl AvgSumm=AvgSumm+AvgFlow(i) Next i'=1 To AvgNumFl W1_Temp(12)=Int(0.5+AvgSumm/AvgNumFl) EndIf ' Average Flow ' ****** Flegma Number calculate ******* ' Dim As Short FlegmaNumber, FlegmaNumber0, FlegmaSumm0, FlegmaNumber1, FlegmaSumm1, FlNumAdd, FlNumAvg ' ' FlegmaNumber=(10*(W1_Temp(1)+W1_Temp(7)-W1_Temp(6)-W1_Temp(3)))/(W1_Temp(3)-W1_Temp(7)) FlNumAdd=FlNumAdd+1: FlegmaSumm0=FlegmaSumm0+(W1_Temp(1)+W1_Temp(7)-W1_Temp(2)-W1_Temp(6))' =Product power/flow FlegmaSumm1=FlegmaSumm1+(W1_Temp(2)-W1_Temp(7))' =Flegma power/flow If FlNumAdd>FlegAvg Then '9 FlNumAdd=0 FlegmaNumber0=FlegmaSumm0 ' Type change from int*32 to fload*32 FlegmaSumm0=0 FlegmaNumber1=SensorFixDot(NumberSensors+MathGrafLines-2)* FlegmaSumm1 ' Type change from int*32 to fload*32 FlegmaSumm1=0 FlegDiffTemp=W1_Temp(4) ' Top out from condencer temp If LagrangeResult(1)>0 And LagrangeResult(3)>0 And LagrangeResult(3)> LagrangeResult(1) Then ' Tank and Prod Vapor Proof FlegmaNumber=FlegmaNumber1/FlegmaNumber0 '/FlegAvg If FlegmaNumber < 0 Then FlegmaNumber = 0 If FlegmaNumber > SensorMaxTemp(NumberSensors+MathGrafLines-2) * SensorFixDot(NumberSensors+MathGrafLines-2) Then FlegmaNumber = SensorMaxTemp(NumberSensors+MathGrafLines-2) * SensorFixDot(NumberSensors+MathGrafLines-2) EndIf Locate 2,10 : Color 12, 0 : Print FlegmaNumber0;",";FlegmaNumber1;",";FlegmaNumber;" " ' 'Else ' ' If LagrangeResult(1)>0 And LagrangeResult(3)>0 And LagrangeResult(3)> LagrangeResult(1) Then ' Tank and Prod Vapor Proof ' FlegmaNumber= 437 ' Fixed value /100, center line endif ' If LagrangeResult(1)>0 And LagrangeResult(3)>0 And LagrangeResult(3)> LagrangeResult(1) Then ' Tank and Prod Vapor Proof EndIf ' ' FlegmaNumber0=(W1_Temp(1)+W1_Temp(7)-W1_Temp(6)-W1_Temp(3)) ' FlegmaNumber1=(W1_Temp(3)-W1_Temp(7)) ' FlegmaNumber=10*FlegmaNumber1/FlegmaNumber0 FlegmaExtra=FlegmaNumber+FlegDiff*(FlegDiffTemp-W1_Temp(4))/100 ' Try Extrapolate from Top Condencer temp '' If FlegAvg>0 Then ' Average Flegma Number ' FlegAvg=10 ' ' For i=FlegAvg+1 To 1 Step -1 ' AvgFlegma(i)=AvgFlegma(i-1) ' Next i'=AvgNumFl+1 To 1 Step -1 ' ' AvgFlegma(1)=FlegmaNumber1/FlegmaNumber0 ' W1_Temp(12) ' New Value Flow*100 ' AvgSumm=0 ' ' For i=1 To FlegAvg ' AvgSumm=AvgSumm+AvgFlegma(i) ' Next i'=1 To FlegAvg ' '' FlegmaNumber=Int(0.5+AvgSumm) '/FlegAvg ' EndIf ' Average Flegma Number PrintString=", ": PrintString2="": PrintString3="" ' For i=0 To 7' - 1Ware sensors 'Format$(W1_Temp(j)/SensorFixDot (j),SensorFormat (j));" ";SensorName (j) PrintString=PrintString+SensorName(i)+"="+Format$(W1_Temp(i)/SensorFixDot (i),SensorFormat (i))+", "' Next i 'i=0 To 7' First portion - 1Ware sensors For i=8 To 11'DisplaySensors '14 PrintString2=PrintString2+SensorName(i)+"="+Format$(W1_Temp(i)/SensorFixDot (i),SensorFormat (i))+", "' Next i 'i=8 To 11' Second portion For i=12 To DisplaySensors '14 PrintString3=PrintString3+SensorName(i)+"="+Format$(W1_Temp(i)/SensorFixDot (i),SensorFormat (i))+", "' Next i 'i=12 To DisplaySensors ' Last portion If( Len( argv ) < 2 ) And Val(argv)>0 Then ' Put to log realtime data from USB CDC 'Copy TXT data to log file PrintString1=_ Format$(Int(W1_Temp(NumberSensors-1)/256),"00") + ":" +_ Format$(Int(W1_Temp(NumberSensors-1)-256*Int(W1_Temp(NumberSensors-1)/256)),"00") + ":" +_ Format$(Int(W1_Temp(NumberSensors-2)/256),"00") + "_" +_ Format$(Int(W1_Temp(NumberSensors-2)-256*Int(W1_Temp(NumberSensors-2)/256)),"0") + ", " +_ Format$(TimerNew-TimerOld,"0.000") + ", Num=" +_ Format$(W1_Usb_Counter,"0") Put #3,,"=="+Format$(W1_Usb_Counter,"0")+"$$" ' Put #3,,W1_Temp()' Copy Bin data to log file PrintString1=PrintString + "Proof= " + Format$(Proof,"0.0") + ", " + PrintString1 ' All Data Print #2, PrintString1 ' Out to text log Else '( Len( argv ) < 2 ) And Val(argv)>0' Print saved Data From Log File ' Read logs Mode PrintString1= FileFields(10) + " " +_ FileFields(11) + " " +_ FileFields(12) + " D=" +_ Format$(DelayNum,"00") + " " EndIf '( Len( argv ) < 2 ) And Val(argv)>0 ' Change mode Locate 1,55 : Color 15, 0 : Print PrintString ' Sensors value #1 Locate 1,23 : Color 15, 0 : Print PrintString1 ' Time and number Locate 2,33 : Color 15, 0 : Print PrintString2 ' Sensors value #2 Locate 2,85 : Color 15, 0 : Print PrintString3 ' Sensors value #3 Locate 2,130 : Color 13, 0 : Print AvgNumV;" " ' Valve Average Count Locate 2,135 : Color 10, 0 : Print AvgNumFl;" " ' Valve Average Count Locate 2,140 : Color 12, 0 : Print FlegAvg;" " ' Flegma number average counter Locate 2,145 : Color 11, 0 : Print FlegDiff;" " ' Flegma number diff extrapolate scale 'For j=0 To StrH' DisplaySensors 'NumberSensors ' LineBusy(j)=0 ' All Lines Free 'Next j ' DisplayData (0,800) '(ByRef RowNum As Integer, ByRef DispData As Short) ' DispData = W1_Temp(RowNum) For j=0 To DisplaySensors 'NumberSensors DisplayData (j,W1_Temp(j)) '(ByRef RowNum As Integer, ByRef DispData As Short) ' DispData = W1_Temp(RowNum) Next j 'j=0 To DisplaySensors 'NumberSensors DisplayData (NumberSensors+MathGrafLines-2,FlegmaExtra) '(ByRef RowNum As Integer, ByRef DispData As Short) ' DispData = W1_Temp(RowNum) ' DisplayData (NumberSensors+MathGrafLines-2,FlegmaNumber) '(ByRef RowNum As Integer, ByRef DispData As Short) ' DispData = W1_Temp(RowNum) DisplayData (NumberSensors+MathGrafLines-1,StageDist) ' Number of Theoretical Plates TimerOld=TimerNew Column=Column+1 : If Column>ScrW Then Column=0 ' LineEraseToggle=-100 EndIf 'Column>ScrW If( Len( argv ) < 2 ) And Val(argv)>0 Then ' Print realtime data from USB CDC goto ReadDataLoop: 'loop while 1 'len(a0)=0 Else '( Len( argv ) < 2 ) And Val(argv)>0' Print saved Data From Log File ' Read logs Mode 'loop while Not Eof(2) if Not Eof(2) GoTo ReadDataLoop: 'loop while 1 'len(a0)=0 Input "Repeat ? ", a0 ' EndIf '( Len( argv ) < 2 ) And Val(argv)>0 ' Change mode ExitProg: 'close #1 'Close #2 'Close #3 Call CloseFiles end