unit SHIM_S; interface uses gltype, glproc, mathobj, Classes,SysUtils, MVTU_TLB; function TElectro_SHIM_S (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_SHIM_sRec = ^TElectro_SHIM_sRec; TElectro_SHIM_sRec = record T0 : ^realtype; Umax : ^realtype; end; function TElectro_SHIM_SConvert(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,'T0',PChar(PropStr[0]),Res); MVTU.SetBlockProp(BlockId,'Umax',PChar(PropStr[1]),Res); finally end; end; end; function TElectro_SHIM_S;export; var i : Integer; tt : RealType; // текущее "время" в периоде, tt == [0..T0] pila: RealType; begin Result := 0; case Action of f_GetConvertFuncAdr: Result:=integer(@TElectro_SHIM_SConvert); f_GetDeriCount: Result := 0; //дифф. переменных нет f_GetInit : Result := 0; //блок не приоритетный? f_GetCount : begin for i:=0 to (CY.Count-1) do CY.arr^[i]:=1; // размер выходов строго определён for i:=0 to (CU.Count-1) do CU.arr^[i]:=1; // и входов тоже ( 1 ) end; f_InitState, f_GoodStep : with PElectro_SHIM_sRec(Prop.arr)^ do begin //считаем значение функции пилы при текущем времени: tt := 4 * frac (at / T0^); if (tt < 2) then pila := tt - 1 else pila := -tt + 3; //"разнормируем" пилу pila := pila*Umax^; //сравниваем пилу и нормированный сигнал на входе: if (AU.Ptr(0).arr^[0]) > -pila then AY.Ptr(0).arr^[0] := Umax^ else if (AU.Ptr(0).arr^[0] = pila) then AY.Ptr(0).arr^[0] := 0 else AY.Ptr(0).arr^[0] := -Umax^; end; end; // case end; //TElectro_SHIM_S end.