unit DPT; interface uses gltype, glproc, mathobj, Classes,SysUtils, MVTU_TLB; function TElectro_DPT(at,adt:RealType;var time,dtime:RealType; var AU,AY:TPtrExt;var AX,ADX:array of RealType; var CU,CY : TIntArray;var Prop:TPtrArray;var Vars:Pointer; Action:Integer):Integer;export; //-------------------------------------------------------------// implementation //-------------------------------------------------------------// type PElectro_DPTRec = ^TElectro_DPTRec; TElectro_DPTRec = record R : ^realtype; L : ^realtype; km : ^realtype; kc : ^realtype; J : ^realtype; q0 : ^realtype; pq0 : ^realtype; i0 : ^realtype; AddOuts: TMultiSelect; end; function TElectro_DPTConvert(Action: integer; Vars: Pointer; Prop: TPtrArray; PropStr: TStringList; BlockId: integer; var MVTU: IMVTU_Server):integer; const RecName:PChar = 'Двигатель постоянного тока'; var Res: integer; begin case Action of //Возвращаем ссылку на имя записи в базе МВТУ-4 cnv_GetRecName: Result:=integer(RecName); cnv_Convert: with PElectro_DPTRec(Prop.arr)^do try //Присваиваем параметры для блока MVTU.SetBlockProp(BlockId,'R',PChar(PropStr[0]),Res); MVTU.SetBlockProp(BlockId,'L',PChar(PropStr[1]),Res); MVTU.SetBlockProp(BlockId,'km',PChar(PropStr[2]),Res); MVTU.SetBlockProp(BlockId,'kc',PChar(PropStr[3]),Res); MVTU.SetBlockProp(BlockId,'J',PChar(PropStr[4]),Res); MVTU.SetBlockProp(BlockId,'q0',PChar(PropStr[5]),Res); MVTU.SetBlockProp(BlockId,'pq0',PChar(PropStr[6]),Res); MVTU.SetBlockProp(BlockId,'i0',PChar(PropStr[7]),Res); MVTU.SetBlockProp(BlockId,'AddOuts',PChar(ConvertMultiSelect(AddOuts)),Res); finally end; end; end; function TElectro_DPT;export; var k : Integer; begin Result := 0; case Action of f_GetConvertFuncAdr: Result:=integer(@TElectro_DPTConvert); f_GetDeriCount : Result := 3; //три дифференциальных переменных в блоке -- //угол поворота(q), скорость вращения(q') и ток(i) f_GetInit : Result := 1; //блок приоритетный или нет??? f_GetCount : begin //for j:=0 to (CY.Count-1) do CY.arr^[j]:=1; // размер выходов строго определён for k:=0 to (CU.Count-1) do CU.arr^[k]:=1; // и входов тоже ( 1 ) CY.arr^[0]:=1;// размер выхода строго определён CY.arr^[1]:=1;// размер выхода строго определён CY.arr^[2]:= PElectro_DPTRec(Prop.arr)^.AddOuts.Selected.Count;//размер выхода меняется в зависимости от выбранных параметров end; f_UpdateJacoby, f_InitState, f_UpdateOuts, f_RestoreOuts, f_GoodStep : with PElectro_DPTRec(Prop.arr)^ do begin if Action = f_InitState then begin AX[0]:=PElectro_DPTRec(Prop.arr)^.q0^; AX[1]:=PElectro_DPTRec(Prop.arr)^.pq0^; AX[2]:=PElectro_DPTRec(Prop.arr)^.i0^; end; AY.Ptr(0).arr^[0] := AX[0]; // q AY.Ptr(1).arr^[0] := AX[1]; // pq AY.Ptr(2).arr^[0] := AX[2]; // i for k:=0 to (AddOuts.Selected.Count-1) do case AddOuts.selected.arr^[k] of 0 : AY.Ptr(2).arr^[k] := km^*AX[2]; //Te 1 : AY.Ptr(2).arr^[k] := AX[2]; else AY.Ptr(2).arr^[k] := 0; end; end; f_GetDeri : with PElectro_DPTRec(Prop.arr)^ do begin ADX[0] := AX[1]; // q ADX[1] := (km^*AX[2] - AU.Ptr(0).arr^[0]) / J^; // pq ADX[2] := (-R^*AX[2] -kc^*AX[1] + AU.Ptr(1).arr^[0]) / L^; // i end; f_EditErr : if ( (PElectro_DPTRec(Prop.arr)^.R^ < 0) OR (PElectro_DPTRec(Prop.arr)^.L^ < 0) OR (PElectro_DPTRec(Prop.arr)^.km^ < 0) OR (PElectro_DPTRec(Prop.arr)^.kc^ < 0) OR (PElectro_DPTRec(Prop.arr)^.J^ < 0) ) then Result:=er_RangeMin; end; // case end; //TElectro_DPT end.