unit DS; interface uses gltype, glproc, mathobj, Classes,SysUtils, MVTU_TLB; function TElectro_DS(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_DSRec = ^TElectro_DSRec; TElectro_DSRec = record R : ^realtype; Ld : ^realtype; Lq : ^realtype; l : ^realtype; J : ^realtype; p : ^integer; phi : ^integer; q0 : ^realtype; pq0 : ^realtype; id0 : ^realtype; iq0 : ^realtype; AddOuts: TMultiSelect; end; PElectro_DSVars = ^TElectro_DSVars; TElectro_DSVars = record K1,K2,K3,K4,K5,K6,K7,K8,K9,K10 : realtype; end; function TElectro_DSConvert(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_DSRec(Prop.arr)^ do try //Присваиваем параметры для блока MVTU.SetBlockProp(BlockId,'R',PChar(PropStr[0]),Res); MVTU.SetBlockProp(BlockId,'Ld',PChar(PropStr[1]),Res); MVTU.SetBlockProp(BlockId,'Lq',PChar(PropStr[2]),Res); MVTU.SetBlockProp(BlockId,'l',PChar(PropStr[3]),Res); MVTU.SetBlockProp(BlockId,'J',PChar(PropStr[4]),Res); MVTU.SetBlockProp(BlockId,'p',PChar(PropStr[5]),Res); MVTU.SetBlockProp(BlockId,'phi',PChar(PropStr[6]),Res); MVTU.SetBlockProp(BlockId,'q0',PChar(PropStr[7]),Res); MVTU.SetBlockProp(BlockId,'pq0',PChar(PropStr[8]),Res); MVTU.SetBlockProp(BlockId,'id0',PChar(PropStr[9]),Res); MVTU.SetBlockProp(BlockId,'iq0',PChar(PropStr[10]),Res); MVTU.SetBlockProp(BlockId,'AddOuts',PChar(ConvertMultiSelect(AddOuts)),Res); finally end; end; end; function TElectro_DS;export; var kk : Integer; // iqs,ids : realtype; V1, V2, thetam, sin_thetam, cos_thetam : realtype; begin Result := 0; case Action of f_GetConvertFuncAdr: Result:=integer(@TElectro_DSConvert); // Выделяем память под переменные блока f_Create : Vars := New(PElectro_DSVars); // Освобождаем память переменных блока f_Free : Dispose(Vars); // Указываем количесво переменных состояния f_GetDeriCount : Result := 4; f_GetInit : Result := 1; f_GetCount : begin for kk:=0 to (CU.Count-1) do CU.arr^[kk]:=1; CY.arr^[0]:=1;// размер выхода строго определён CY.arr^[1]:=1;// размер выхода строго определён CY.arr^[2]:= PElectro_DSRec(Prop.arr)^.AddOuts.Selected.Count;//размер выхода меняется в зависимости от выбранных параметров end; f_UpdateJacoby, f_InitState, f_UpdateOuts, f_RestoreOuts, f_GoodStep : with PElectro_DSRec(Prop.arr)^ do begin if Action = f_InitState then begin // Подсчёт констант (через вновь введённые свойства блока): PElectro_DSVars(Vars)^.K1 := 1/Ld^; PElectro_DSVars(Vars)^.K2 := R^/Ld^; PElectro_DSVars(Vars)^.K3 := p^*Lq^/Ld^; PElectro_DSVars(Vars)^.K4 := 1/Lq^; PElectro_DSVars(Vars)^.K5 := R^/Lq^; PElectro_DSVars(Vars)^.K6 := p^*Ld^/Lq^; PElectro_DSVars(Vars)^.K7 := p^*l^/Lq^; PElectro_DSVars(Vars)^.K8 := 0.5*p^*phi^*l^; PElectro_DSVars(Vars)^.K9 := 0.5*p^*phi^*(Ld^-Lq^); PElectro_DSVars(Vars)^.K10:= 1/J^; //инициальзация переменных состояния из вновь введённых начальных условий: AX[0]:=q0^; AX[1]:=pq0^; AX[2]:=id0^; AX[3]:=iq0^; end; //Расчёт выходов (на каждом шаге): AY.Ptr(0).arr^[0] := AX[0]; //q AY.Ptr(1).arr^[0] := AX[1]; //pq for kk:=0 to AddOuts.Selected.Count-1 do case AddOuts.selected.arr^[kk] of 0 : AY.Ptr(2).arr^[kk] := PElectro_DSVars(Vars)^.K8*AX[3] + PElectro_DSVars(Vars)^.K9*AX[3]*AX[2]; //Te = ... 1 : AY.Ptr(2).arr^[kk] := AX[2]; 2 : AY.Ptr(2).arr^[kk] := AX[3]; else AY.Ptr(2).arr^[kk] := 0; end; end; //расчёт приращений: f_GetDeri : begin thetam := PElectro_DSRec(Prop.arr)^.p^ * AX[0]; sin_thetam := sin(thetam); cos_thetam := cos(thetam); V1 := AU.Ptr(0).arr^[0]*sin_thetam-AU.Ptr(1).arr^[0]*cos_thetam; //Vd V2 := AU.Ptr(0).arr^[0]*cos_thetam+AU.Ptr(1).arr^[0]*sin_thetam; //Vq //расчёт приращений: with PElectro_DSRec(Prop.arr)^ do begin ADX[0] := AX[1]; ADX[1] := PElectro_DSVars(Vars)^.K10*( PElectro_DSVars(Vars)^.K8*AX[3] + PElectro_DSVars(Vars)^.K9*AX[3]*AX[2] - AU.Ptr(2).arr^[0]); ADX[2] := PElectro_DSVars(Vars)^.K1*V1-PElectro_DSVars(Vars)^.K2*AX[2]+PElectro_DSVars(Vars)^.K3*AX[3]*AX[1]; ADX[3] := PElectro_DSVars(Vars)^.K4*V2-PElectro_DSVars(Vars)^.K5*AX[3]-PElectro_DSVars(Vars)^.K6*AX[2]*AX[1]-PElectro_DSVars(Vars)^.K7*AX[1]; end; end; f_EditErr : if ( (PElectro_DSRec(Prop.arr)^.R^ < 0) OR (PElectro_DSRec(Prop.arr)^.Ld^ < 0) OR (PElectro_DSRec(Prop.arr)^.Lq^ < 0) OR (PElectro_DSRec(Prop.arr)^.L^ < 0) OR (PElectro_DSRec(Prop.arr)^.J^ < 0) OR (PElectro_DSRec(Prop.arr)^.p^ < 0) OR (PElectro_DSRec(Prop.arr)^.phi^ < 0) ) then Result:=er_RangeMin; end; // case end; //TElectro_DS end.