unit MCAD_MI1201_MeasureOn_Proc; interface Uses MITypes; // Соответствия клапанов и их идентификаторов --------------------------------- Const ValveStringLen = 20; type tValveRelation = record VValve, VName: string[ValveStringLen]; end; tVRelations = array[tSource]of tValveRelation; const VRelations: tVRelations = ( (VValve:'CloseAll'; VName:'All'), (VValve:'Sample1'; VName:'VE3'), (VValve:'Sample2'; VName:'VE9'), (VValve:'Standard1'; VName:'VE4'), (VValve:'Standard2'; VName:'VE5'), (VValve:'Standard3'; VName:'VE7'), (VValve:'Standart4'; VName:'VE8'), (VValve:'Pumping'; VName:'VE6'), (VValve:'BadValve'; VName:'Bad') ); function MeasureOn(Mass:tMass; Const VSt:openstring):double; implementation Uses Forms,SysUtils,Windows, Messages, Classes, Graphics, Controls, Dialogs, StdCtrls, Menus, MCAD_MI1201_FormSpectrum, MCAD_MI1201_Thread0; Var VS:string; // Маркеры --------------------------------------------------------------------- Const vmPart = '!'; // valve marker vmBegin = '+'; vmTime = '>'; Var Cur :byte; // Обработка ошибок ------------------------------------------------------------ ErrFlag:boolean; ResourceString cErrorValvesCaption = 'Ошибка в параметрах'; type tValveErrors = (veSyntaxError,veNotFound,veIncorrectChar); const ValveErrors:array[tValveErrors]of pChar = ('Неверно описана последовательность клапанов:'#13'%s'#13'Ошибка на позиции %d: "%s"!', 'Идентификатор "%s" не соответствует ни одному из клапанов!', 'Обнаружен недопустимый символ "%s" на позиции %d в строке'#13'%s'); procedure ErrorValves(ErrCode:tValveErrors; const Param:array of const); begin Application.MessageBox(PChar(Format(ValveErrors[ErrCode],Param)), PChar(cErrorValvesCaption), MB_OK+MB_ICONEXCLAMATION); ErrFlag := True; end; // Конец обработки ошибок ------------------------------------------------------ // Ищет клапан по идентификатору в наборе, если найден - TRUE function FoundVRelation(VS:openstring; Var VVar:tSource):boolean; Var V :tSource; begin Result := False; For V := Low(tSource) to High(tSource) do if UpperCase(VRelations[V].VName) = VS then if V <> sBad then begin VVar := V; Result := True; Exit; end; end; // Выполняет команду. First и Last - начало и конец команды +VVV>TTTTT procedure ProcessCommand(First,Last:word); Var CTime:cardinal; CValve:tSource; Tm,i:word; TS:string[ValveStringLen]; ResourceString // Потом удалим-с... cValv = 'Операция: %s'+#13+ 'Клапан: %s'+#13+ 'Время: %d'; begin if VS[First] <> vmBegin then begin ErrorValves(veSyntaxError,[Vs,First,VS[First]]); Exit; end; Tm := First + 1; while (Tm <= Last)and(VS[Tm] <> vmTime) do inc(Tm); if Tm >= Last then begin ErrorValves(veSyntaxError, [VS,Last,VS[Last]]); Exit; end; TS := Copy(VS, First + 1, Tm - First - 1); if not FoundVRelation(UpperCase(TS), CValve) then begin ErrorValves(veNotFound, [TS]); Exit; end; try CTime := StrToInt(Copy(VS, Tm + 1, Last - Tm)); except For i := Tm + 1 to Last - Tm do if not (VS[i] in ['0'..'9']) then Break; ErrorValves(veIncorrectChar,[VS[i],i,Copy(VS, Tm + 1, Last - Tm)]); Exit; end; // Далее открытие/закрытие клапана с заданными параметрами { With MCAD_MI1201_FormSpectrum.FormSpectrum do if assigned(MassSpectrometer) then With MassSpectrometer do begin Valve := CValve; ValveAutoCloseTimes[CValve] := CTime; if ValveAutoCloseEnabled then while ValveAutoCloseTimeLeft <> 0 do else while ValveOpenedTime <> CTime do ; end else {} Application.MessageBox(PChar( Format(cValv, [VS[First],VRelations[CValve].VName,CTime])), 'Открытие клапана', MB_OK); end; procedure ProcessValves; Var Old:byte; begin repeat Case VS[Cur] of vmBegin: begin Old := Cur; repeat // Проматываем до следующей inc(Cur) until (Cur > length(VS))or(VS[Cur] in [vmBegin, vmPart]); ProcessCommand(Old, Cur - 1); if ErrFlag then Exit; end; vmTime: begin ErrorValves(veSyntaxError, [VS,Cur,vmTime]); Exit; end; vmPart: begin inc(Cur); end else ErrorValves(veIncorrectChar,[VS[Cur],Cur,VS]); Exit; end; //Case until (Cur > Length(VS))or(VS[Cur] = vmPart); end; function MeasureOn(Mass:tMass; Const VSt:openstring):double; begin VS := Vst; Cur := 1; ErrFlag := False; ProcessValves; if ErrFlag then Exit; // Выполнение измерения Application.MessageBox('Клапаны открыты', 'Сообщение', MB_OK); ProcessValves; if ErrFlag then Exit; Result := Random * 1000; end; end.