#lang "fblite" ' http://www.freebasic.net/ WindowTitle "http://www.FREEBASIC.net" const NoteName="NOTE" ' Const MaxTimeError=60 ' Between reopen COM port Const MaxAvgNum=256 ' Average up limit Const AvgGranB=16 ' Output Average granulation Const MaxDelayNum=20 ' Delay limit Const ScrWMax=1800, StrHMax=128 ' Const ScrHMax=1600 ' Const KegTempBegin=77 ' Минимальная температура кипения кега (смещение) Const KegTempAmp=24 ' =101-77 Размах температуры кипения кега (амплитуда) Const BifTempBegin=35 ' Минимум температуры в бифиляры (смещение) Const BifTempAmp=32 ' Размах Температуры в бифиляры (амплитуда) Const BifTabB_Old=25 ' Минимум температуры в бифиляры прежний Const B_X=5 ' смещение +5 от краёв экрана Const K_X=48 ' 23 градуса по 48 долей = 1104 точки, смещение +5 от края экрана Const K_X_Old=5 ' размах 25 градусов по 10 долей = 250 массив, смещение +5 от края экрана Const K_Y=32 ' 32 градуса по 32 доли = 1024 точек Const K_Y_Old=2 ' размах 50 градусов по 10 долей = 500 массив, 512*2 точек Const K_T=10 ' Десятые доли градуса в логе Const HandTag=12345 ' Заведомо большое уникальное число Const WhiteColor=31 ' В палитре 256 цветов, за ним градиент синий -> красный -> зелёный 16 ярких цвета ', NumberSensors = 14' 14/05/2021 ADC buff added '13/03/2022 на единицу меньше половины байт в буфере Const NumberSensors = 5'8+3+4+3'+1' 13/05/2022 'movlw MaxW1Sensors*2+6+8+6+2 ;d'14',W1_Temp_Count,BANKED ; счётчик Const DisplaySensors=5'15' 8 1W temp + 4 ADC + 1 Flow' + 1 SummFlow + PID_TargetTemp Const SavedLogSensors=5'15' Const MathGrafLines=2' StageDist and FlegmaNumber #include "string.bi" ';Need For Format$ Dim shared As Short W1_Temp(NumberSensors), W1_Read(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) Dim shared As Short TempSumm(1300,1050) ' Number 1W sensors Dim shared As Short TagReOpen, TagDisplayMode,PauseToggle,StateNumber,SaveToggle Dim Shared As Single Proof,AvgFlow(MaxAvgNum+1),AvgValve(MaxAvgNum+1),AvgFlegma(MaxAvgNum+1) Dim Shared As Single ScrW, ScrH, SensorRange, SensorValue, SensorAbove,AvgSumm dim Shared as string KeyString,ComPortNameMode,argv Dim Shared thread1 As Any Ptr Dim Shared As Integer 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 '4, 15, 6, 3,_ '10, 11, 12, 13, 14, 15,_ Dim Shared SensorColor (NumberSensors+MathGrafLines) As Short => {10, 11, 12, 13, 14,_ 12, 14 } ' + MathGrafLines '10, 7, 10,_ '-2, -2, -2, -2,_ '-1, -1, 10, -4, 10, 10,_ Dim Shared SensorMinTemp (NumberSensors+MathGrafLines) As Short => {0, 0, 60, 60, 20,_ 0, -1 } ' + MathGrafLines '85, 75, 104,_ '104, 104, 104, 104,_ ' 2, 4, 100, 260, 10, 10,_ Dim Shared SensorMaxTemp (NumberSensors+MathGrafLines) As Short => {104, 104, 104, 104, 90,_ 10, 10 } ' + MathGrafLines '16, 16, 16,_ '327, 327, 327, 327,_ '100, 100, 16, 1, 100, 100,_ Dim Shared SensorFixDot (NumberSensors+MathGrafLines) As Short => {16, 16, 16, 16, 16,_ 100, 1000} ' + MathGrafLines Dim Shared SensorCorrector (NumberSensors) As Short => {0, 0, 0, 0, 0}' '8, 8, 0,_ '0, 0, 0, 0,_ '0, 0, 0, 0, 0, 0 }',_ '0, 0 } ' + MathGrafLines '"PropR", "IntgW", "DiffY", "Blue ",_ '"FloW", "Wolum", "Targt", "Valve", "Res 1", "Res 2",_ Dim Shared SensorName (NumberSensors+MathGrafLines) As String*5 => {"TanV%", "VapV%", "Tank ", "Steam", "Out W",_ "FlegN", "DistP" } ' + MathGrafLines '"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",_ Dim Shared SensorFormat (NumberSensors+MathGrafLines) As String*5 => {"0.00", "0.00", "0.00", "0.00", "0.00",_ "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 Close #4 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 dim As Integer TankTempIndex, WaterTempIndex Dim As Single KegTemp, BifTemp, TempTemp While( 1 ) Sleep 20 ' 10 keys/seconds 'Key=inkey$ 'TempTemp=(TankTemp-77)*10+0.5 ' Type Float 'TankTempIndex=Int(TempTemp) ' Type int 'TempTemp=(OutWaterTemp-25)*10+0.5 ' Type Float 'WaterTempIndex=Int(TempTemp) ' Type int ' TankTempIndex>0 And TankTempIndex <249 And WaterTempIndex>0 And WaterTempIndex < 499 Then ' TempSumm(TankTempIndex,WaterTempIndex) += 1 ' Increment ' If TempIndexMax < TempSumm(TankTempIndex,WaterTempIndex) Then TempIndexMax = TempSumm(TankTempIndex,WaterTempIndex) ' PSet( 5+i*5,j*2) , TempSumm(i,j) ' Пара пикселей красим ' PSet( 5+i*5,j*2+1), TempSumm(i,j) ' в цвет палитры If GetMouse (MouseX, MouseY, MouseWheel, MouseBut , MouseClip) =0 And StateNumber=5 Then ' Печать накопленного массива и результата коррекции графика мышой 'TempTemp=MouseX-B_X'5 ' Type Float 'TempTemp /= K_X_Old'5 ' 'TankTempIndex=Int(TempTemp)' Type int 'TempTemp=MouseY ' Type Float 'TempTemp /= K_Y_Old'2 ' 'WaterTempIndex=Int(TempTemp)' Type int ' Индексы (координаты) в температуру KegTemp=MouseX '-B_X'5 ' Type real KegTemp /= ScrW/KegTempAmp ' K_X_Old*K_T'50=/5/10 KegTemp += KegTempBegin'77 '10*((MouseX-5)/5)+76.5 BifTemp=MouseY ' Type real BifTemp /= ScrH/BifTempAmp ' K_Y_Old*K_T'20=/2*10 BifTemp += BifTempBegin ' Прибавка смещения начала отсчёта Locate 58,3 : Color 11, 0 : Print "MouseX=";MouseX;", MouseY=";MouseY;", MouseBut=";MouseBut;"--"'", MouseWheel=";MouseWheel;", MouseClip=";MouseClip; Locate 57,3 : Color 10, 0 : Print "Tank=";KegTemp;", Water=";BifTemp;" " 'If TankTempIndex>0 And TankTempIndex <249 And WaterTempIndex>0 And WaterTempIndex < 499 Then Locate 57,30 : Color 10, 0 : Print ", Summ="; TempSumm(MouseX,MouseY);"---" ' Select Case MouseBut 'Case 0 ' Ничего не кликнуто Case 1 ' Left key = hand max TempSumm(MouseX,MouseY) = HandTag'12345' Заведомо большое уникальное число PSet( MouseX-1, MouseY) , WhiteColor ' четверо пикселей красим PSet( MouseX, MouseY) , WhiteColor ' четверо пикселей красим PSet( MouseX-1, MouseY-1) , WhiteColor ' четверо пикселей красим PSet( MouseX, MouseY-1) , WhiteColor ' четверо пикселей красим Case 2 ' Right key = hand zero TempSumm(MouseX,MouseY) = 0 ' Чистка работает PSet( MouseX-1, MouseY) , 0 ' четверо пикселей PSet( MouseX, MouseY) , 0 ' четверо пикселей PSet( MouseX-1, MouseY-1) , 0 ' четверо пикселей PSet( MouseX, MouseY-1) , 0 ' четверо пикселей 'Case 4 ' Middle key 'Case Else' More than one key End Select 'Case MouseBut 'EndIf 'TankTempIndex>0 And TankTempIndex <249 And WaterTempIndex>0 And WaterTempIndex < 499 Then EndIf ' GetMouse (MouseX, MouseY, MouseWheel, MouseBut , MouseClip) =0 Then '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" ' Save Data To analize SaveToggle= -1*SaveToggle '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,BinBuf,NumEqSign,NumBuxSign,BinReadPause, NumUsbDigits dim as string a,a0,a1,FileName,FileNameTxt,FileNameBin,PrintString,PrintString1 dim as String PrintString2,PrintString3, FileStr,FileFields(SavedLogSensors) dim as String UsbNumBuf,PrintString4,FileNameSav '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 ' Диапазон накоплений танк=101-77 шаг 0.1 = 240 вода 25-70 шаг 0.1 = 450 dim as Integer TankTempIndex , WaterTempIndex, TempIndexMin,TempIndexMax,AvgCount,TempIndexNum dim as Integer OutTankTempIndex Dim As LongInt BinFilePosition,BinFileLenght, TxtFileLineNum Dim As Single LagrangeResult(10),StageDist,FlegmaNumber, FlegmaNumber0, FlegmaNumber1,FlegmaExtra Dim As Single TankTemp, OutWaterTemp, OutWaterMin, OutWaterMax, TempTemp,KegTemp, BifTemp, AvgTemp 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 StateNumber=0 ' Инициализация проги 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( 1 ) '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_" + ".sav" Open FileNameTxt For Input As #2 ' FileNameTxt = "BifTarget_" + ".inc" Open FileNameTxt For Output As #3 ' Else '( Len( FileName ) < 2 ) Or Len(FileName)>18 FileNameTxt = FileName + ".sav" Open FileNameTxt For Input As #2 ' FileNameTxt = FileName + ".inc" Open FileNameTxt For Output As #3 ' EndIf '( Len( FileName ) < 2 ) Or Len(FileName)>18 WindowTitle "Average data out to Graf on http://www.FREEBASIC.net" 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 "+FileNameBin+" Out to Graf on http://www.FREEBASIC.net" 'TagReOpen=0 ' Port opened PauseToggle=100 TxtFileLineNum=0 OutWaterMin=100 ' Кипение температура OutWaterMax=20 ' Комнатная температура TempIndexMin=100000 ' Больше разумного TempIndexMax=0 ' 'SaveToggle=-100 ' и температуры кега и пара Print "exe= "; Command( 0 );", Command= ";Command( 1 );",FileName= ";FileName ScreenChange () ' Note or Base comp StateNumber = 1 ' Смена режима экрана ' '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) EndIf 'ClearScreenTag>0 Line (0, ScrH/2)-(ScrW, ScrH/2), 10, , &b1010101010101010 ' center green dashed line '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 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 StateNumber=2 ' Читаем входной файл до конца 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 TxtFileLineNum=TxtFileLineNum+1 ' 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 TankTemp=Val(Mid(FileFields(3),7)) ' OutWaterTemp=Val(Mid(FileFields(5),7)) ' If OutWaterMin>OutWaterTemp Then OutWaterMin=OutWaterTemp '=100 ' В начале Кипение If OutWaterMaxKegTempBegin And TankTemp < KegTempBegin+KegTempAmp Then ' Кега кипит - накапливаем данные 'ScrW=1280 : ScrH=1024 Массив накоплений разрешение как у экрана TempTemp = TankTemp-KegTempBegin ' Type Float смещение от начала координат TempTemp *= ScrW/KegTempAmp +0.5 'K_T Type Float индекс пикселя и массива TankTempIndex=Int(TempTemp) ' Type int TempTemp = OutWaterTemp-BifTabB_Old ' Type Float смещение от начала координат TempTemp *= ScrH/BifTempAmp +0.5 'K_T Type Float индекс пикселя и массива WaterTempIndex=Int(TempTemp) ' Type int If TankTempIndex>0 And TankTempIndex 0 And WaterTempIndex < ScrH Then TempSumm(TankTempIndex,WaterTempIndex) += 1 ' Increment If TempIndexMax < TempSumm(TankTempIndex,WaterTempIndex) Then TempIndexMax = TempSumm(TankTempIndex,WaterTempIndex) EndIf ' TankTempIndex>0 And TankTempIndex <249 And WaterTempIndex>0 And WaterTempIndex < 499 Then EndIf ' TankTemp>78 And TankTemp < 100.5 Then ' Кега кипит - накапливаем данные For i=1 To NumberSensors' 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 29,36 : Color 10, 0 : Print "--",FileFields(1),FileFields(2),FileFields(3),FileFields(4),FileFields(5),TxtFileLineNum' 'Locate 28,33 : Color 11, 0 : Print "OutWaterMin=";OutWaterMin;", OutWaterMax=";OutWaterMax;", TempIndexMax=";TempIndexMax;"--" ' Print ", Position=";BinFilePosition;", Pause=";BinReadPause;:Input a0 ' 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 ' 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 PrintString=", ": PrintString2="": PrintString3="" ' ' '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 DisplayPalette: StateNumber=3 ' Печать цветовой схемы (поллитры) Cls(1) Line (0, ScrH/2)-(ScrW, ScrH/2), 10, , &b1010101010101010 ' center green dashed line 'ScrW=1280 : ScrH=1024 ScrHB=95 : StrH=64 ColorSpeed=RGB(0,255,0) '31=белый, далее 16 ярких цветов переход от синего на красный и на зелёный 'ScrW=1280 : ScrH=1024 ScrHB=95 : StrH=64 ColorSpeed=RGB(0,255,0) '31=белый, далее 16 ярких цветов переход от синего на красный и на зелёный For i=0 To ScrH-1'023 For j=0 To B_X-1'3 PSet( j, i), WhiteColor+i/64 ' Set Pixel color Next j For j=ScrW-B_X To ScrW-1'1275 To 1279 PSet( j, i), i/4 ' Set Pixel color Next j Next i 'Input "Color Sheme ? ", a0 ' StateNumber=4 ' Печать графиков температуры пара от кеги при 3 и 4 ступени разделения, плюс фикс добавка 40 градусов на холодильник. ' 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 For i=0 To ScrW-1'1279 ' X axis 1280*1024 screen, top left = 0*0 ' индекс экрана и массива в температуру KegTemp=i'-B_X'5 ' Type real KegTemp /= ScrW/KegTempAmp'K_X_Old*K_T'50 '/5/10 KegTemp += KegTempBegin'77 '10*((MouseX-5)/5)+76.5 LagrangeResult(1)=StabnikovLagrange( KegTemp, 4,6,5) ' Концентрация Испарения первой ступени LagrangeResult(2)=StabnikovLagrange(LagrangeResult(1),2,4,5) ' Температура конденсата выхода 1 ступени LagrangeResult(3)=StabnikovLagrange(LagrangeResult(2),4,6,5) ' Концентрация Испарения 2 ступени LagrangeResult(4)=StabnikovLagrange(LagrangeResult(3),2,4,5) ' Температура конденсата выхода 2 ступени LagrangeResult(5)=StabnikovLagrange(LagrangeResult(4),4,6,5) ' Концентрация Испарения 3 ступени LagrangeResult(6)=StabnikovLagrange(LagrangeResult(5),2,4,5) ' Температура конденсата выхода 3 ступени 'BifTemp=MouseY ' Type real 'BifTemp /=20 '/2*10 'BifTemp +=25 '10*((MouseY)/2)+24.5 BifTemp=LagrangeResult(4)-35-BifTempBegin ' 2 stage - fix bif BifTemp *= ScrH/BifTempAmp ' K_Y_Old*K_T'20=/2*10 PSet( i,BifTemp), WhiteColor ' Set Pixel color BifTemp=LagrangeResult(6)-37-BifTempBegin ' 3 stage - fix bif BifTemp *= ScrH/BifTempAmp ' K_Y_Old*K_T'20=/2*10 PSet( i,BifTemp), WhiteColor ' Set Pixel color Next i '=0 To 1279 ' X axis 1280*1024 screen, top left = 0*0 'TempTemp=(TankTemp-77)*10+0.5 ' Type Float 'TankTempIndex=Int(TempTemp) ' Type int 'TempTemp=(OutWaterTemp-25)*10+0.5 ' Type Float 'WaterTempIndex=Int(TempTemp) ' Type int 'If TankTempIndex>0 And TankTempIndex <249 And WaterTempIndex>0 And WaterTempIndex < 499 Then ' TempSumm(TankTempIndex,WaterTempIndex) += 1 ' Increment ' If TempIndexMax < TempSumm(TankTempIndex,WaterTempIndex) Then TempIndexMax = TempSumm(TankTempIndex,WaterTempIndex) 'EndIf ' TankTempIndex>0 And TankTempIndex <249 And WaterTempIndex>0 And WaterTempIndex < 499 Then StateNumber=5 ' Печать накопленного массива и результата коррекции графика мышой 'ScrW=1280 : ScrH=1024 Массив накоплений разрешение как у экрана While( PauseToggle > 0 ) If ClearScreenTag>0 Then ClearScreenTag=0 KeyString="" 'Cls(1) GoTo DisplayPalette EndIf 'ClearScreenTag>0 For i=1 To ScrW-1'250 ' Перебор температур кеги = Ось X TempIndexMax=0: TempIndexNum=0 For j=1 To ScrH-1'500 ' Перебор температур воды = Ось Y If TempIndexMax < TempSumm(i,j) Then ' Ищем максимум TempIndexMax = TempSumm(i,j) ' TempIndexNum = j ' Индекс максимума EndIf ' TempIndexMax < TempSumm(i,j) Then ' If TempSumm(i,j) >0 Then ' Рисуем точку If TempSumm(i,j)<15 Then ' Количество попадает в цвет 'PSet( B_X+i*K_X_Old,j*K_Y_Old) , TempSumm(i,j) ' Пара пикселей красим 'PSet( B_X+i*K_X_Old,j*K_Y_Old+1), TempSumm(i,j) ' в цвет палитры PSet( i,j) , TempSumm(i,j) ' пиксель красим Else 'If TempSumm(i,j)<15 Then ' Рисуем белым 'PSet( B_X+i*K_X_Old,j*K_Y_Old) , WhiteColor ' Пара пикселей красим 'PSet( B_X+i*K_X_Old,j*K_Y_Old+1) , WhiteColor ' в белый цвет PSet( i,j) , WhiteColor ' пиксел красим в белый цвет EndIf' TempSumm(i,j)<15 Then EndIf ' TempSumm(i,j) >0 Then ' Next j '=1 To 500 ' Перебор температур воды 'For j=B_X+i*K_X_Old To B_X+i*K_X_Old+4 ' Рисуем белым максимум PSet( i-1, TempIndexNum) , WhiteColor ' четверо пикселей красим PSet( i, TempIndexNum) , WhiteColor ' четверо пикселей красим PSet( i-1, TempIndexNum-1) , WhiteColor ' четверо пикселей красим PSet( i, TempIndexNum-1) , WhiteColor ' четверо пикселей красим 'Next j '=5+i*5 To 5+i*5+4 Next i'=1 To 250 ' Перебор температур кеги Sleep 20 ' 50 frame/seconds Wend 'While( 1 ) ' Печать накопленного массива и коррекция графики мышой StateNumber=6 ' Вывод нарисованного графика в файл таблицы 'Input "Repeat ? ", a0 ' 'ScrW=1280 : ScrH=1024 Массив накоплений разрешение как у экрана 'TempTemp = TankTemp-KegTempBegin ' Type Float смещение от начала координат 'TempTemp *= ScrW/KegTempAmp +0.5 'K_T Type Float индекс пикселя и массива 'TankTempIndex=Int(TempTemp) ' Type int 'TempTemp = OutWaterTemp-BifTabB_Old ' Type Float смещение от начала координат 'TempTemp *= ScrH/BifTempAmp +0.5 'K_T Type Float индекс пикселя и массива 'WaterTempIndex=Int(TempTemp) ' Type int OutTankTempIndex=0 ' Type int PrintString1= "; Line=" + Format$(OutTankTempIndex,"000") For i=1 To ScrW-1'250 ' Перебор температур кеги = Ось X, грануляция бойлера для вывода в файл таблицы AvgGranB=16 1/16 градуса TempTemp = i ' Type Float TempTemp /= ScrW/(KegTempAmp*AvgGranB)'=16 ' Output Average granulation ' Float индекс усреднения TankTempIndex=Int(TempTemp) ' Type int, 1/16 грануляция If TankTempIndex > OutTankTempIndex Then ' Новое усреднение ' **** Надо сюда вывод старого накопления добавить If AvgCount > 0 Then ' вывод старого накопления AvgTemp /= AvgCount PrintString1 += ", AvgBif=" + Format$(AvgTemp,"00.000") + ", AvgCount=" + Format$(AvgCount,"00") ' All Data EndIf ' AvgCount > 0 Print #3, PrintString1 ' Out to include file OutTankTempIndex=TankTempIndex ' Type int AvgCount=0 : AvgTemp=0 ' Усреднённые TempTemp=i ' Type Float TempTemp /= ScrW/KegTempAmp' K_T ' Float индекс пикселя и массива TempTemp += KegTempBegin ' Type Float PrintString1= "; Line=" + Format$(OutTankTempIndex,"000") + ", Keg=" + Format$(TempTemp,"00.000")' + ", Bif=" + PrintString1 ' All Data Else ' If TankTempIndex > OutTankTempIndex EndIf ' TankTempIndex > OutTankTempIndex 'OutTankTempIndexNew=i/0 ' Type int 'TankTempIndex=Int(TempTemp) ' Type int For j=1 To ScrH-1'500 ' Перебор температур воды If TempSumm(i,j) = HandTag Then ' Ручная Точка есть ? TempTemp=j ' Type Float TempTemp /= ScrH/BifTempAmp' K_T ' Делим индекс на цену деления TempTemp += BifTempBegin ' Прибавка смещения начала отсчёта AvgCount += 1 : AvgTemp += TempTemp EndIf ' TempSumm(i,j) >0 Then ' Next j '=1 To 500 ' Перебор температур воды Next i'=1 To 250 ' Перебор температур кеги ExitProg: StateNumber=7 ' Вот и проге конец, а кто слушал - молодец. 'close #1 'Close #2 'Close #3 Call CloseFiles End