unit DA; interface uses gltype, glproc, mathobj, Classes,SysUtils, MVTU_TLB; function TElectro_DA(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_DARec = ^TElectro_DARec; TElectro_DARec = record R1 : ^realtype; R2 : ^realtype; L1 : ^realtype; L2 : ^realtype; Lm : ^realtype; J : ^realtype; p : ^integer; phi : ^integer; q0 : ^realtype; pq0 : ^realtype; PSIqs0 : ^realtype; PSIqr0 : ^realtype; PSIds0 : ^realtype; PSIdr0 : ^realtype; AddOuts: TMultiSelect; end; PElectro_DAVars = ^TElectro_DAVars; TElectro_DAVars = record IJ,Lt,K1,K2,K3,K4,K5,K6 : realtype; end; function TElectro_DAConvert(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_DARec(Prop.arr)^do try //Присваиваем параметры для блока MVTU.SetBlockProp(BlockId,'R1',PChar(PropStr[0]),Res); MVTU.SetBlockProp(BlockId,'R2',PChar(PropStr[1]),Res); MVTU.SetBlockProp(BlockId,'L1',PChar(PropStr[2]),Res); MVTU.SetBlockProp(BlockId,'L2',PChar(PropStr[3]),Res); MVTU.SetBlockProp(BlockId,'Lm',PChar(PropStr[4]),Res); MVTU.SetBlockProp(BlockId,'J',PChar(PropStr[5]),Res); MVTU.SetBlockProp(BlockId,'p',PChar(PropStr[6]),Res); MVTU.SetBlockProp(BlockId,'phi',PChar(PropStr[7]),Res); MVTU.SetBlockProp(BlockId,'q0',PChar(PropStr[8]),Res); MVTU.SetBlockProp(BlockId,'pq0',PChar(PropStr[9]),Res); MVTU.SetBlockProp(BlockId,'PSIqs0',PChar(PropStr[10]),Res); MVTU.SetBlockProp(BlockId,'PSIqr0',PChar(PropStr[11]),Res); MVTU.SetBlockProp(BlockId,'PSIds0',PChar(PropStr[12]),Res); MVTU.SetBlockProp(BlockId,'PSIdr0',PChar(PropStr[13]),Res); MVTU.SetBlockProp(BlockId,'AddOuts',PChar(ConvertMultiSelect(AddOuts)),Res); finally end; end; end; function TElectro_DA;export; var i,k : Integer; iqs,ids : realtype; begin Result := 0; case Action of f_GetConvertFuncAdr: Result:=integer(@TElectro_DAConvert); // Выделяем память под переменные блока f_Create : Vars := New(PElectro_DAVars); // Освобождаем память переменных блока f_Free : Dispose(Vars); // Указываем количесво переменных состояния f_GetDeriCount: Result := 6; f_GetInit : Result := 1; f_GetCount : begin for i:=0 to (CU.Count-1) do CU.arr^[i]:=1; // размер трёх входов строго определён CY.arr^[0]:=1;// размер выхода строго определён CY.arr^[1]:=1;// размер выхода строго определён CY.arr^[2]:= PElectro_DARec(Prop.arr)^.AddOuts.Selected.Count;//размер выхода меняется в зависимости от выбранных параметров end; f_UpdateJacoby, f_InitState, f_UpdateOuts, f_RestoreOuts, f_GoodStep : with PElectro_DARec(Prop.arr)^ do begin if Action = f_InitState then with PElectro_DAVars(Vars)^ do begin Lt := L1^*L2^*Lm^/(L1^*L2^+L1^*Lm^+L2^*Lm^); IJ := 1/J^; K1 := R1^/L1^*(1-Lt/L1^); K2 := R1^*Lt/(L1^*L2^); K3 := R2^/L2^*(1-Lt/L1^); K4 := R2^*Lt/(L1^*L2^); K5 := (1-Lt/L1^)/L1^; K6 := Lt/(L2^*L1^); AX[0]:=PSIqs0^; //инициальзация переменных состояния AX[1]:=PSIqr0^; //из начальных условий AX[2]:=PSIds0^; AX[3]:=PSIdr0^; AX[4]:=pq0^; AX[5]:=q0^; end; AY.Ptr(0).arr^[0] := AX[5]; // q AY.Ptr(1).arr^[0] := AX[4]; // pq iqs := PElectro_DAVars(Vars)^.K5*AX[0]-PElectro_DAVars(Vars)^.K6*AX[1]; ids := PElectro_DAVars(Vars)^.K5*AX[2]-PElectro_DAVars(Vars)^.K6*AX[3]; for k:=0 to (AddOuts.Selected.Count-1) do begin case AddOuts.selected.arr^[k] of 0 : AY.Ptr(2).arr^[k] := phi^*p^/2*(ids*AX[0]-iqs*AX[2]); //Te 1 : AY.Ptr(2).arr^[k] := iqs; 2 : AY.Ptr(2).arr^[k] := ids; else AY.Ptr(2).arr^[k] := 0; end; end; end; f_GetDeri : with PElectro_DARec(Prop.arr)^ do begin ADX[0] := -PElectro_DAVars(Vars)^.K1*AX[0]+PElectro_DAVars(Vars)^.K2*AX[1]+AU.Ptr(0).arr^[0]; // PSIqs ADX[1] := -PElectro_DAVars(Vars)^.K3*AX[1]+PElectro_DAVars(Vars)^.K4*AX[0]-p^*AX[4]*AX[3]; // PSIqr ADX[2] := -PElectro_DAVars(Vars)^.K1*AX[2]+PElectro_DAVars(Vars)^.K2*AX[3]-AU.Ptr(1).arr^[0]; // PSIds ADX[3] := -PElectro_DAVars(Vars)^.K3*AX[3]+PElectro_DAVars(Vars)^.K4*AX[2]+p^*AX[4]*AX[1]; // PSIdr iqs := PElectro_DAVars(Vars)^.K5*AX[0]-PElectro_DAVars(Vars)^.K6*AX[1]; ids := PElectro_DAVars(Vars)^.K5*AX[2]-PElectro_DAVars(Vars)^.K6*AX[3]; ADX[4] := (phi^*p^/2*(ids*AX[0]-iqs*AX[2]) -AU.Ptr(2).arr^[0])*PElectro_DAVars(Vars)^.IJ; // pq ADX[5] := AX[4]; //q end; f_EditErr : if ( (PElectro_DARec(Prop.arr)^.R1^ < 0) OR (PElectro_DARec(Prop.arr)^.R2^ < 0) OR (PElectro_DARec(Prop.arr)^.L1^ < 0) OR (PElectro_DARec(Prop.arr)^.L2^ < 0) OR (PElectro_DARec(Prop.arr)^.Lm^ < 0) OR (PElectro_DARec(Prop.arr)^.J^ < 0) OR (PElectro_DARec(Prop.arr)^.p^ < 0) OR (PElectro_DARec(Prop.arr)^.phi^ < 0) ) then Result:=er_RangeMin; end; // case end; //TElectro_DA end.