unit R2; INTERFACE uses gltype, glproc, mathobj, Classes,SysUtils, MVTU_TLB; function TElectro_R2(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_R2Rec = ^TElectro_R2Rec; TElectro_R2Rec = record i : ^realtype; //коэффициент передачи редуктора J2 : ^realtype; //момент инерции a : ^realtype; //половина ширины люфта c : ^realtype; //коэффициент упругости, используется в зоне нечувствительности F1 : ^realtype; //Коэффициент силы вязкого трения в упругости G1 : ^realtype; //Момент силы сухого трения в упругости F2 : ^realtype; //Коэффициент силы вязкого трения на выходном валу G2 : ^realtype; //Момент силы сухого трения на выходном валу dq0: ^realtype; //Начальный люфт между входным и выходным валом q20: ^realtype; //Начальная частота вращения выходного вала pq20: ^realtype; //Начальная частота вращения выходного вала end; PElectro_R2Vars = ^TElectro_R2Vars; TElectro_R2Vars = record n, kJ: realtype; b, dlt, M_y, temp,sum1,sum2 : realtype; end; function TElectro_R2Convert(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: try //Присваиваем параметры для блока MVTU.SetBlockProp(BlockId,'i',PChar(PropStr[0]),Res); MVTU.SetBlockProp(BlockId,'J2',PChar(PropStr[1]),Res); MVTU.SetBlockProp(BlockId,'a',PChar(PropStr[2]),Res); MVTU.SetBlockProp(BlockId,'c',PChar(PropStr[3]),Res); MVTU.SetBlockProp(BlockId,'F1',PChar(PropStr[4]),Res); MVTU.SetBlockProp(BlockId,'G1',PChar(PropStr[5]),Res); MVTU.SetBlockProp(BlockId,'F2',PChar(PropStr[6]),Res); MVTU.SetBlockProp(BlockId,'G2',PChar(PropStr[7]),Res); MVTU.SetBlockProp(BlockId,'dq0',PChar(PropStr[8]),Res); MVTU.SetBlockProp(BlockId,'q20',PChar(PropStr[9]),Res); MVTU.SetBlockProp(BlockId,'pq20',PChar(PropStr[10]),Res); finally end; end; end; function TElectro_R2;export; var j : Integer; begin Result := 0; with PElectro_R2Vars(Vars)^ do case Action of f_GetConvertFuncAdr: Result:=integer(@TElectro_R2Convert); // Выделяем память под переменные блока: f_Create : Vars := New(PElectro_R2Vars); // Освобождаем память переменных блока: f_Free : Dispose(Vars); f_GetDeriCount : Result := 3; f_GetStateCount : Result := 0; f_GetInit : Result := 0; f_GetCount : begin for j:=0 to (CY.Count-1) do CY.arr^[j]:=1; for j:=0 to (CU.Count-1) do CU.arr^[j]:=1; end; f_UpdateJacoby, f_InitState, f_UpdateOuts, f_RestoreOuts, f_GoodStep : with PElectro_R2Rec(Prop.arr)^ do begin if Action = f_InitState then begin AX[0] := dq0^; // угол скручивания AX[1] := pq20^;// скорость AX[2] := q20^; // угол поворота b := -a^; n := 1 / i^; kJ:= 1 / J2^; end; dlt := n * AU.Ptr(0).arr^[0] - AX[1]; {I - BEGIN -----------} if (dlt < 0) then M_y := F1^ * dlt + G1^ else if (dlt > 0) then M_y := F1^ * dlt - G1^ else M_y := 0; {II ------------------} if (AX[0] < b) then begin sum1 := c^ * (AX[0] - b) + M_y; end else if (AX[0] > a^) then begin sum1 := c^ * (AX[0] - a^) + M_y; end else begin sum1 := 0; end; {III -----------------} if AX[1] < 0 then sum2 := sum1 + AU.Ptr(1).arr^[0] - AX[1] * F2^ + G2^ else if AX[1] > 0 then sum2 := sum1 + AU.Ptr(1).arr^[0] - AX[1] * F2^ - G2^ else {+V - END ------------} sum2 := sum1 + AU.Ptr(1).arr^[0]; AY.Ptr(0).arr^[0] := AX[2]; // q2 AY.Ptr(1).arr^[0] := AX[1]; // pq2 AY.Ptr(2).arr^[0] := - n * sum1; // -M1 end; f_GetDeri : begin ADX[0] := dlt; ADX[1] := kJ * sum2; // угол ADX[2] := AX[1]; end; f_EditErr : with PElectro_R2Rec(Prop.arr)^ do if ( (J2^ <= 0) OR (a^ < 0) OR (c^ < 0) ) then Result:=er_RangeMin; end; // case end; //TElectro_R2 end.