{ Контроллер пульта управления (АК3) 5.105.184 1) Включение блоков и открытие клапанов } unit MI1201AGM_Panel_Emulator; interface USES {$IfNDef Seg16} SysUtils,{$EndIf} TimeInterval_Emulator, MI1201AGM_Hardware_Emulator, MI1201AGM_Controller_Emulator; const cDataSignature='Panel emulator data. '^M^L; cRegistrySubPath='Panel'; cValidPorts=[$33,$32,$31,$30]; cValidReadPorts=[$33,$32,$31,$30]; cValidWritePorts=[$33,$32,$31,$30]; cMaxPressureLevel=100000; cInitPressureLevel=1000; cVEUCode=$A000; cVEUCodeMask=$F000; cPressureMask=7; cAllOff=0; cProba1=1; cProba2=2; cEtalon1=3; cEtalon2=4; cEtalon3=5; cEtalon4=6; cPumping=7; cbOut2=1 shl 4; cbIn2=1 shl 5; cbOut1=1 shl 6; cbIn1=1 shl 7; cValvesValid=cPumping or cbOut2 or cbIn2 or cbOut1 or cbIn1; cBlocksValid=1+2+4+8; cSampleValves=cPumping; type tDataSignature=array[1..Length(cDataSignature)] of char; tVEUDecade=0..3; tBeamState=0..1; tFlag=(f); tFlags=set of tFlag; tData=record Signature:tDataSignature; Flags:tFlags; end; tTmpData=record end; tError=( // eNotReadyToStart, // eInvalidTimetCtrlWord, eInvalidPort, eReadFromInvalidPort, eWriteToInvalidPort ); resourcestring // rseNotReadyToStart='не готов к старту'; // rseInvalidTimetCtrlWord='неверное слово управления таймера'; rseInvalidPort='неверный порт'; rseReadFromInvalidPort='чтение из неверного порта'; rseWriteToInvalidPort='запись в неверный порт'; const cErrorDescriptions:array[tError] of string=( // rseNotReadyToStart, // rseInvalidTimetCtrlWord, rseInvalidPort, rseReadFromInvalidPort, rseWriteToInvalidPort ); type tPanel=class(tController) private prData:tData; prTmpData:tTmpData; procedure SetVEULowByte(b:Byte); procedure SetVEUHighByte(b:Byte); procedure SetBlocks(b:Byte); procedure SetValves(b:Byte); function GetVEULowByte:Byte; function GetVEUHighByte:Byte; function GetVEUDecade(n:tVEUDecade):byte; function GetVEU:word; function GetBlocks:Byte; function GetValves:Byte; protected // обязательные процедуры function SubPath:string; override; procedure prOutByte(b:Byte; port:word); override; function prInByte(port:word):Byte; override; function CheckData(Data:pointer):boolean; override; function DataSize:integer; override; function SetData(aData:pointer):boolean; override; function GetData(aData:pointer):boolean; override; // прочие процедуры public // обязательные процедуры constructor Create(Hardware:tMi1201HardwareEmulator); destructor Destroy; override; procedure ReInit; override; procedure SetDefaultData; override; function ValidPort(APort:word):boolean; function ValidReadPort(APort:word):boolean; function ValidWritePort(APort:word):boolean; // прочие процедуры end; implementation type tWord=record case byte of 0:(w:word); 1:(Lo,Hi:byte); end; function tPanel.SetData(aData:pointer):boolean; begin Result:=Inherited SetData(aData); if Result then begin Inc(Cardinal(aData),Inherited DataSize); Result:=CheckData(aData); if Result then begin Move(aData^,prData,DataSize); end; end; end; function tPanel.GetData(aData:pointer):boolean; begin Result:=Inherited GetData(aData); if Result then begin Inc(Cardinal(aData),Inherited DataSize); Result:=CheckData(aData); if Result then begin Move(prData,aData^,SizeOf(prData)); end; end; end; function tPanel.DataSize:integer; begin Result:=Inherited DataSize + SizeOf(prData); end; function tPanel.SubPath:string; begin Result:=cRegistrySubPath; end; function tPanel.CheckData(Data:pointer):boolean; begin Result:=Inherited CheckData(Data) and TRUE; end; procedure tPanel.SetDefaultData; begin prData.Signature:=cDataSignature; end; constructor tPanel.Create(Hardware:tMi1201HardwareEmulator); begin Inherited; end; destructor tPanel.Destroy; begin Inherited; end; procedure tPanel.ReInit; begin end; procedure tPanel.SetVEULowByte(b:Byte); begin Hardware.VEUSet((Hardware.VEU and $FF00) or b); end; procedure tPanel.SetVEUHighByte(b:Byte); begin Hardware.VEUSet((Hardware.VEU and $FF) or (b shl 8)); end; procedure tPanel.SetValves(b:Byte); begin Hardware.ValvesSet(b); end; function tPanel.GetVEULowByte:Byte; begin GetVEULowByte:=Lo(Hardware.VEU); end; function tPanel.GetVEUHighByte:Byte; begin GetVEUHighByte:=Hi(Hardware.VEU); end; function tPanel.GetVEUDecade(n:tVEUDecade):byte; begin n:=n and 3; GetVEUDecade:=(Hardware.VEU and ($F shl n)) shr n; end; function tPanel.GetVEU:word; begin GetVEU:=GetVEUDecade(0)+10*GetVEUDecade(1)+100*GetVEUDecade(2); end; procedure tPanel.SetBlocks(b:Byte); begin Hardware.BlocksSet(tBlocks((not b) and cBlocksValid)); end; function tPanel.GetBlocks:Byte; begin GetBlocks:=Hardware.BlocksGet; end; function tPanel.GetValves:Byte; begin GetValves:=Hardware.ValvesGet; end; procedure tPanel.prOutByte(b:byte; port:word); begin port:=port and $FF; case Port of $30: begin { состояние клапанов} SetValves(b); end; $31: begin {Вкл./выкл. блоков} SetBlocks(b); end; $32: begin {мл. тетрада - ст. тетрада ЦАПа ВЭУ; ст. тетрада - код прибора} SetVEUHighByte(b); end; $33: begin {младший байт ЦАПа ВЭУ} SetVEULowByte(b); end; else if ValidReadPort(port) then begin WriteToInvalidPort:=TRUE; ErrorCode:=Ord(eWriteToInvalidPort); end else begin InvalidPort:=TRUE; ErrorCode:=Ord(eInvalidPort); end; end; end; function tPanel.prInByte(port:word):byte; begin port:=port and $FF; Result:=$FF; case Port of $30: begin { состояние клапанов} Result:=GetValves; end; $31: begin {Вкл./выкл. блоков} Result:=Byte(GetBlocks); end; $32: begin {мл. тетрада - ст. тетрада ЦАПа ВЭУ; ст. тетрада - код прибора} Result:=GetVEUHighByte; end; $33: begin {младший байт ЦАПа ВЭУ} Result:=GetVEULowByte; end; else if ValidWritePort(port) then begin ReadFromInvalidPort:=TRUE; ErrorCode:=Ord(eReadFromInvalidPort); end else begin InvalidPort:=TRUE; ErrorCode:=Ord(eInvalidPort); end; end; end; function tPanel.ValidPort(APort:word):boolean; begin Result:= ((APort and $FF00)=cBasePort) and ((APort and $FF) in cValidPorts); end; function tPanel.ValidReadPort(APort:word):boolean; begin Result:= ((APort and $FF00)=cBasePort) and ((APort and $FF) in cValidReadPorts); end; function tPanel.ValidWritePort(APort:word):boolean; begin Result:= ((APort and $FF00)=cBasePort) and((APort and $FF) in cValidWritePorts); end; end. { Контроллер пульта управления (АК3) 5.105.184 г========T================T=====================================¬ ¦ Адрес ¦ ПОРТ ¦ ¦ ¦ порта +-------T--------+ Назначение ¦ ¦ ¦чтение ¦запись ¦ ¦ ¦--------+-------+--------+-------------------------------------¦ ¦ $33 ¦ + ¦ + ¦ младший байт ЦАПа ВЭУ ¦ ¦--------+-------+--------+-------------------------------------¦ ¦ $32 ¦ + ¦ + ¦ мл. тетрада - ст. тетрада ЦАПа ВЭУ ¦ ¦ ¦ ¦ ¦ ст. тетрада - код прибора ¦ ¦--------+-------+--------+-------------------------------------¦ ¦ $31 ¦ + ¦ + ¦ Вкл./выкл. блоков ¦ ¦ ¦ ¦ ¦ (см. рис.2) ¦ ¦--------+-------+--------+-------------------------------------¦ ¦ $30 ¦ + ¦ + ¦ Запись - управление клапанами ¦ ¦ ¦ ¦ ¦ чтение - состояние клапанов ¦ ¦ ¦ ¦ ¦ (см. рис.3) ¦ L========¦=======¦========¦=====================================- ------T-----T-----T-----T-----T-----T-----T-----¬ ¦ D7 ¦ D6 ¦ D5 ¦ D4 ¦ D3 ¦ D2 ¦ D1 ¦ D0 ¦ L--T--+--T--+--T--+--T--+--T--+--T--+--T--+--T--- X X X X ¦ ВЭУ 10kV БПГИ ¦ L-----+------ ¦ 0 - блок вкл. ¦ 1 - блок выкл. -------+-----¬ управление клапанами 0 - разрешено 1 - запрещено Рис. 2 ------T-----T-----T-----T-----T-----T-----T-----¬ ¦ D7 ¦ D6 ¦ D5 ¦ D4 ¦ D3 ¦ D2 ¦ D1 ¦ D0 ¦ L--T--+--T--+--T--+--T--+--T--+--T--+--T--+--T--- VE2 VE1 VE11 VE10 X ¦ ¦ ¦ "Вх1" "Вых1""Вх2" "Вых2" ¦ ¦ ¦ L-----+--T--+------ ¦ ¦ ¦ 0-выкл. ¦ ¦ ¦ 1-вкл. ---+--T--+--T--+--¬ все откл. -- ¦ 0 ¦ 0 ¦ 0 ¦ +-----+-----+-----+ "Проба1" VE3 вкл. -- ¦ 0 ¦ 0 ¦ 1 ¦ +-----+-----+-----+ "Проба2" VE9 вкл. -- ¦ 0 ¦ 1 ¦ 0 ¦ +-----+-----+-----+ "Эталон1" VE4 вкл. -- ¦ 0 ¦ 1 ¦ 1 ¦ +-----+-----+-----+ "Эталон2" VE5 вкл. -- ¦ 1 ¦ 0 ¦ 0 ¦ +-----+-----+-----+ "Эталон3" VE7 вкл. -- ¦ 1 ¦ 0 ¦ 1 ¦ +-----+-----+-----+ "Эталон4" VE8 вкл. -- ¦ 1 ¦ 1 ¦ 0 ¦ +-----+-----+-----+ "Откачка" VE6 вкл. -- ¦ 1 ¦ 1 ¦ 1 ¦ L-----+-----+------ Рис. 3 }