unit ElectroLib_Info; interface uses gltype,mathobj; procedure AllInit( var at, adt, atfinal : PRealType; Dirs : PDirRec );export; procedure AllDone;export; procedure GetLibInfo( Action : Integer; var BlockID, ParamID : Integer; Info : pchar );export; implementation procedure AllInit;export; begin end; procedure AllDone;export; begin end; function StrCopy(Dest: PChar; const Source: PChar): PChar; asm PUSH EDI PUSH ESI MOV ESI,EAX MOV EDI,EDX MOV ECX,0FFFFFFFFH XOR AL,AL REPNE SCASB NOT ECX MOV EDI,ESI MOV ESI,EDX MOV EDX,ECX MOV EAX,EDI SHR ECX,2 REP MOVSD MOV ECX,EDX AND ECX,3 REP MOVSB POP ESI POP EDI end; procedure GetLibInfo;export; const aNumBlocks = 12; // Общее количество блоков в библиотеке aElectro_DPTParamsCount = 9;// 5 параметров, 3 начальных условия, 1 выбор (5 + 3 + 1) aElectro_DAParamsCount = 15;// 8 + 6 + 1 aElectro_DSParamsCount = 12;// 7 + 4 + 1 aElectro_DSSParamsCount = 21; //14 + 6 + 1 aElectro_CONV23ParamsCount = 0; //преобразование по формулам без параметров aElectro_CONV32ParamsCount = 0; //преобразование по формулам без параметров aElectro_GEN2ParamsCount = 0; //преобразование по формулам без параметров aElectro_GEN3ParamsCount = 0; //преобразование по формулам без параметров aElectro_SHIM_SParamsCount = 2; // T0 и Umax aElectro_SHIM_NParamsCount = 2; // T0 и Umax aElectro_R1ParamsCount = 7; // 5 + 2 aElectro_R2ParamsCount = 11; // 8 + 3 //Имена блоков и подсказки к ним: {$IFDEF ENGLVER} aElectroNamesHints : array[1..aNumBlocks,1..2] of pchar = ( ('TElectro_DPT', 'Direct-current motor with independent excitation'), ('TElectro_DA' , 'Induction motor'), ('TElectro_DS' , 'Synchronous motor without damping magnet winding' ), ('TElectro_DSS', 'Synchronous motor with damping magnet winding'), ('TElectro_CONV23','Converter 2 phase to 3 phase'), ('TElectro_CONV32','Converter 3 phase to 2 phase'), ('TElectro_GEN2', 'Two-phase generator'), ('TElectro_GEN3', 'Three-phase generator'), ('TElectro_SHIM_S','Symmetric pulse-length modulator'), ('TElectro_SHIM_N','Asymmetric pulse-length modulator'), ('TElectro_R1', 'Reducer (simple model)'), ('TElectro_R2', 'Reducer')); {$ELSE} aElectroNamesHints : array[1..aNumBlocks,1..2] of pchar = ( ('TElectro_DPT', 'Двигатель постоянного тока с независимым возбуждением'), ('TElectro_DA' , 'Двигатель асинхронный'), ('TElectro_DS' , 'Двигатель синхронный без успокаивающих обмоток' ), ('TElectro_DSS', 'Двигатель синхронный с успокаивающими обмотками'), ('TElectro_CONV23','Преобразователь 2х-фазного напряжения (тока) в 3х-фазное'), ('TElectro_CONV32','Преобразователь 3х-фазного напряжения (тока) в 2х-фазное'), ('TElectro_GEN2', 'Генератор 2х-фазного напряжения'), ('TElectro_GEN3', 'Генератор 3х-фазного напряжения'), ('TElectro_SHIM_S','Широтно-импульсный модулятор симметричный'), ('TElectro_SHIM_N','Широтно-импульсный модулятор несимметричный'), ('TElectro_R1', 'Редуктор упрощённый'), ('TElectro_R2', 'Редуктор')); {$ENDIF} //количество входов, выходов и параметров в каждом блоке: aElectroInOutParamsCounts : array[1..aNumBlocks, 1..3] of Integer = ( (2, 3, aElectro_DPTParamsCount), (3, 3, aElectro_DAParamsCount), (3, 3, aElectro_DSParamsCount), (3, 3, aElectro_DSSParamsCount), (2, 3, aElectro_CONV23ParamsCount), (3, 2, aElectro_CONV32ParamsCount), (2, 2, aElectro_GEN2ParamsCount), (2, 3, aElectro_GEN3ParamsCount), (1, 1, aElectro_SHIM_SParamsCount), (1, 1, aElectro_SHIM_NParamsCount), (1, 3, aElectro_R1ParamsCount), (2, 3, aElectro_R2ParamsCount)); //названия свойств, встречающихся в нескольких двигателях: {$IFDEF ENGLVER} aParamCap_q = 'Initial rotor angle, radian'; aParamCap_pq = 'Initial rotor rotational speed, radian/sec'; aParamCap_p = 'Pole count'; aParamCap_phi = 'Phase count'; aParamCap_J = 'Moment of inertia, adduced to arbor of rotor, kg*m^2'; aParamCap_AddOuts = 'Additional output'; aParamCap_T0 = 'Sampling period, sec'; aParamCap_Umax = 'Maximum signal value great which begin saturation'; aParamCap_i = 'Reducer gear-ratio'; aParamCap_J2 = 'Demand moment of inertia, kg*m^2'; aParamCap_a = 'Half backlash, radian'; aParamCap_c = 'Stiffness factor of springing element, N*m'; {$ELSE} aParamCap_q = 'Начальный угол поворота ротора, рад'; aParamCap_pq = 'Начальная частота вращения ротора, рад/с'; aParamCap_p = 'Число полюсов, шт'; aParamCap_phi = 'Число фаз питающего напряжения, шт'; aParamCap_J = 'Момент инерции, приведённый к валу ротора, кг*м^2'; aParamCap_AddOuts = 'Дополнительный вывод'; aParamCap_T0 = 'Период дискретности, с'; aParamCap_Umax = 'Максимальное значение сигнала, при котором наступает насыщение'; aParamCap_i = 'Передаточное число редуктора'; aParamCap_J2 = 'Момент инерции нагрузки, кг*м^2'; aParamCap_a = 'Половина величины люфта, рад'; aParamCap_c = 'Коэффициент жёсткости упругого элемента, Н*м'; {$ENDIF} //параметры, их названия, значения по умолчанию и тип (для каждого блока): aElectro_DPTParamsCapValType : array[1..aElectro_DPTParamsCount, 1..4] of pchar = ( {$IFDEF ENGLVER} ('R' ,'Rotor circuit resistance, Ohm' ,'0.5' ,'1'), //1 ('L' ,'Rotor circuit inductance, Gn' ,'0.01','1'), //2 ('km','Torque coefficient' ,'0.36','1'), //3 ('kc','Coefficient of anti-EMF' ,'0.45','1'), //4 {$ELSE} ('R' ,'Сопротивление цепи ротора, Ом' ,'0.5' ,'1'), //1 ('L' ,'Индуктивность цепи ротора, Гн' ,'0.01','1'), //2 ('km','Моментный коэффициент' ,'0.36','1'), //3 ('kc','Коэффициент противо-ЭДС' ,'0.45','1'), //4 {$ENDIF} ('J' , aParamCap_J ,'0.04','1'), //5 ('q' , aParamCap_q ,'0' ,'1'), //6 ('pq', aParamCap_pq ,'0' ,'1'), //7 {$IFDEF ENGLVER} ('i' ,'Initial current of rotor circuit, A' ,'0' ,'1'), //8 {$ELSE} ('i' ,'Начальный ток в цепи ротора, А' ,'0' ,'1'), //8 {$ENDIF} ('AddOuts' ,aParamCap_AddOuts ,'момента:' ,'30')); aElectro_DAParamsCapValType : array[1..aElectro_DAParamsCount, 1..4] of pchar = ( {$IFDEF ENGLVER} ('R1' ,'Stator circuit resistance, Ohm' ,'0.0217' ,'1'), ('R2' ,'Rotor curcuit resistance, Ohm' ,'0.0329' ,'1'), ('L1' ,'Stator circuit inductance, Gn' ,'0.0003235' ,'1'), ('L2' ,'Rotor circuit inductance, Gn' ,'0.0003686' ,'1'), ('Lm' ,'Mutual inductance, Gn' ,'0.01315' ,'1'), {$ELSE} ('R1' ,'Сопротивление статора, Ом' ,'0.0217' ,'1'), ('R2' ,'Сопротивление ротора, Ом' ,'0.0329' ,'1'), ('L1' ,'Индуктивность статора, Гн' ,'0.0003235' ,'1'), ('L2' ,'Индуктивность ротора, Гн' ,'0.0003686' ,'1'), ('Lm' ,'Взаимная индуктивность, Гн' ,'0.01315' ,'1'), {$ENDIF} ('J' , aParamCap_J ,'11.4' ,'1'), ('p' , aParamCap_p ,'4' ,'0'), ('phi' , aParamCap_phi ,'3' ,'0'), ('q' , aParamCap_q ,'0' ,'1'), ('pq' , aParamCap_pq ,'0' ,'1'), {$IFDEF ENGLVER} ('PSIqs','Initial interlinkage in stator q-winding, V*sec', '0' ,'1'), ('PSIqr','Initial interlinkage in rotor q-winding, V*sec' , '0' ,'1'), ('PSIds','Initial interlinkage in stator d-winding, V*sec', '0' ,'1'), ('PSIdr','Initial interlinkage in rotor d-winding, V*sec' , '0' ,'1'), {$ELSE} ('PSIqs','Начальное потокосцепление в обмотке q статора, В*с','0' ,'1'), ('PSIqr','Начальное потокосцепление в обмотке q ротора, В*с' ,'0' ,'1'), ('PSIds','Начальное потокосцепление в обмотке d статора, В*с','0' ,'1'), ('PSIdr','Начальное потокосцепление в обмотке d ротора, В*с' ,'0' ,'1'), {$ENDIF} ('AddOuts' ,aParamCap_AddOuts ,'момента:' ,'30')); aElectro_DSParamsCapValType : array[1..aElectro_DSParamsCount, 1..4] of pchar = ( {$IFDEF ENGLVER} ('R' ,'Stator widings resistant, Ohm' ,'2.875' ,'1'), ('Ld' ,'Stator d-winding inductance, Gn' ,'8.5e-3','1'), ('Lq' ,'Stator q-winding inductance, Gn' ,'8.5e-3','1'), ('l' ,'Flux of permanent magnet from stator windings, Vb' {$ELSE} ('R' ,'Сопротивление обмоток статора, Ом' ,'2.875' ,'1'), ('Ld' ,'Индуктивность d-обмотки статора, Гн' ,'8.5e-3','1'), ('Lq' ,'Индуктивность q-обмотки статора, Гн' ,'8.5e-3','1'), ('l' ,'Магнитный поток от постоянного магнита через обмотки статора, Вб' {$ENDIF} ,'0.175' ,'1'), ('J' , aParamCap_J ,'0.8e-3','1'), ('p' , aParamCap_p ,'4' ,'0'), ('phi', aParamCap_phi ,'2' ,'0'), ('q' , aParamCap_q ,'0' ,'1'), ('pq' , aParamCap_pq ,'0' ,'1'), {$IFDEF ENGLVER} ('id' ,'Initial current in stator d-winding, A' ,'0' ,'1'), ('iq' ,'Initial current in stator q-winding, A' ,'0' ,'1'), ('AddOuts',aParamCap_AddOuts ,'moment:' ,'30')); {$ELSE} ('id' ,'Начальный ток в d-обмотке статора, А' ,'0' ,'1'), ('iq' ,'Начальный ток в q-обмотке статора, А' ,'0' ,'1'), ('AddOuts',aParamCap_AddOuts ,'момента:' ,'30')); {$ENDIF} aElectro_DSSParamsCapValType : array[1..aElectro_DSSParamsCount, 1..4] of pchar = ( {$IFDEF ENGLVER} ('Rds','Stator d-winding resistance, Ohm' ,'2.875' ,'1'), ('Rqs','Stator q-winding resistance, Ohm' ,'2.875' ,'1'), ('Lds','Stator d-winding inductance, Gn' ,'8.5e-3' ,'1'), ('Lqs','Stator q-winding inductance, Gn' ,'8.5e-3' ,'1'), ('l' ,'Flux of permanent magnet from stator windings, Vb' ,'0.175' ,'1'), ('J' , aParamCap_J ,'0.8e-3' ,'1'), ('Rds','Rotor d-winding resistance, Ohm' ,'2.875' ,'1'), ('Rqs','Rotor q-winding resistance, Ohm' ,'2.875' ,'1'), ('Lds','Rotor d-winding inductance, Gn' ,'8.5e-3' ,'1'), ('Lqs','Rotor q-winding inductance, Gn' ,'8.5e-3' ,'1'), ('Ldm','Mutual windings inductance by d-axis, Gn' ,'6e-3' ,'1'), ('Lqm','Mutual windings inductance by q-axis, Гн' ,'6e-3' ,'1'), {$ELSE} ('Rds','Сопротивление d-обмотки статора, Ом' ,'2.875' ,'1'), ('Rqs','Сопротивление q-обмотки статора, Ом' ,'2.875' ,'1'), ('Lds','Индуктивность d-обмотки статора, Гн' ,'8.5e-3' ,'1'), ('Lqs','Индуктивность q-обмотки статора, Гн' ,'8.5e-3' ,'1'), ('l' ,'Магнитный поток от постоянного магнита через обмотки статора, Вб' ,'0.175' ,'1'), ('J' , aParamCap_J ,'0.8e-3' ,'1'), ('Rdr','Сопротивление d-обмотки ротора, Ом' ,'4e0' ,'1'), ('Rqr','Сопротивление q-обмотки ротора, Ом' ,'4e0' ,'1'), ('Ldr','Индуктивность d-обмотки ротора, Гн' ,'8.5e-3' ,'1'), ('Lqr','Индуктивность q-обмотки ротора, Гн' ,'8.5e-3' ,'1'), ('Ldm','Взаимная индуктивность обмоток по оси d, Гн' ,'6e-3' ,'1'), ('Lqm','Взаимная индуктивность обмоток по оси q, Гн' ,'6e-3' ,'1'), {$ENDIF} ('p' , aParamCap_p ,'4' ,'0'), ('phi', aParamCap_phi ,'2' ,'0'), ('q' , aParamCap_q ,'0' ,'1'), ('pq' , aParamCap_pq ,'0' ,'1'), ('P1' ,'Начальное P1,' ,'0' ,'1'), ('P2' ,'Начальное P2,' ,'0' ,'1'), ('P3' ,'Начальное P3,' ,'0' ,'1'), ('P4' ,'Начальное P4,' ,'0' ,'1'), {$IFDEF ENGLVER} ('AddOuts' ,aParamCap_AddOuts ,'moment:' ,'30')); {$ELSE} ('AddOuts' ,aParamCap_AddOuts ,'момента:' ,'30')); {$ENDIF} aElectro_SHIM_SParamsCapValType : array[1..aElectro_SHIM_SParamsCount, 1..4] of pchar = ( ('T0' ,aParamCap_T0 ,'0.1' ,'1'), ('Umax',aParamCap_Umax , '1' ,'1')); aElectro_SHIM_NParamsCapValType : array[1..aElectro_SHIM_NParamsCount, 1..4] of pchar = ( ('T0' ,aParamCap_T0 ,'0.1' ,'1'), ('Umax',aParamCap_Umax , '1' ,'1')); aElectro_R1ParamsCapValType : array[1..aElectro_R1ParamsCount, 1..4] of pchar = ( ('i' ,aParamCap_i ,'100' ,'1'), ('J2' ,aParamCap_J2 ,'200' ,'1'), ('a' ,aParamCap_a ,'0.002' ,'1'), ('c' ,aParamCap_c ,'900000' ,'1'), {$IFDEF ENGLVER} ('F' ,'Constant of friction, N*m*sec' ,'5' ,'1'), ('q0' ,'Initial angle of load arbor, radian' ,'0' ,'1'), ('pq0','Initial rotational speed of load arbor, radian/sec' ,'0' ,'1')); {$ELSE} ('F' ,'Коэффициент трения, Н*м*с' ,'5' ,'1'), ('q0' ,'Начальный угол поворота вала нагрузки, рад' ,'0' ,'1'), ('pq0','Начальная частота вращения вала нагрузки, рад/с' ,'0' ,'1')); {$ENDIF} aElectro_R2ParamsCapValType : array[1..aElectro_R2ParamsCount, 1..4] of pchar = ( ('i' ,aParamCap_i ,'100' ,'1'), ('J2' ,aParamCap_J2 ,'200' ,'1'), ('a' ,aParamCap_a ,'0.001' ,'1'), ('c' ,aParamCap_c ,'2E6' ,'1'), {$IFDEF ENGLVER} ('F1' ,'Viscous friction coefficient in elastic element, N*m*s' ,'0' ,'1'), ('G1' ,'Fricion torque in elastic element, N*m*s' ,'0' ,'1'), ('F2' ,'Viscous friction coefficient on load arbor, N*m*s' ,'0' ,'1'), ('G2' ,'Fricion torque on load arbor, N*m*s' ,'0' ,'1'), ('dq0','Initial torsion angle of elastic element, rad' ,'0' ,'1'), ('q20','Initial output arbor angle, rad' ,'0' ,'1'), ('pq20','Initial output arbor rotational speed, radian/sec' ,'0' ,'1')); {$ELSE} ('F1' ,'Коэффициент вязкого трения в упругости, Н*м*с' ,'0' ,'1'), ('G1' ,'Момент сухого трения в упругости, Н*м*с' ,'0' ,'1'), ('F2' ,'Коэффициент вязкого трения на выходном валу, Н*м*с' ,'0' ,'1'), ('G2' ,'Момент сухого трения на выходном валу, Н*м*с' ,'0' ,'1'), ('dq0','Начальный угол скручивания упругости, рад' ,'0' ,'1'), ('q20','Начальный угол поворота выходного вала, рад' ,'0' ,'1'), ('pq20','Начальная частота вращения выходного вала, рад/с' ,'0' ,'1')); {$ENDIF} BEGIN StrCopy(Info, nul); case Action of {$IFDEF ENGLVER} i_GetPageName : StrCopy(Info, 'Motors'); {$ELSE} i_GetPageName : StrCopy(Info, 'Электромашины'); {$ENDIF} i_GetBlocksCount: BlockId := aNumBlocks; i_GetBlockIndex, i_GetHelpIndex : ParamId := 660 + BlockID; i_GetBlockType : case BlockId of 1,2,3,4, // двигатели ДПТ, ДА, ДС, ДСС 7,8, // генераторы 2 и 3 11,12: ParamId := t_din; //редуктор упрощённый и редуктор 5,6, // преобразователи 23 и 32 9,10 : ParamId := t_fun; // ШИМ_с и ШИМ_н end; i_GetBlockName, i_GetRUNName : StrCopy(Info, aElectroNamesHints[BlockId,1]); i_GetBMPName : StrCopy(Info, PChar(Copy(aElectroNamesHints[BlockId,1], 2, Length(aElectroNamesHints[BlockId,1])-1 ))); i_GetBlockHint : StrCopy(Info, aElectroNamesHints[BlockId,2]); i_GetHelpName : StrCopy(Info, 'MBTY'); i_GetChild : ParamId := 0; i_GetEditName : case BlockId of 1,2,3,4: StrCopy(Info, 'TMultiSelect'); end; //Порты расположены по умолчанию: входы слева, выходы справа: i_GetInputCount : ParamId := - aElectroInOutParamsCounts[BlockId, 1]; i_GetOutputCount: ParamId := - aElectroInOutParamsCounts[BlockId, 2]; i_GetParamsCount: ParamId := aElectroInOutParamsCounts[BlockId, 3]; i_GetParamAct : StrCopy(Info, '0'); i_GetParamCaption:case BlockId of 1: StrCopy(Info, aElectro_DPTParamsCapValType[ParamId,2]); 2: StrCopy(Info, aElectro_DAParamsCapValType[ParamId,2]); 3: StrCopy(Info, aElectro_DSParamsCapValType[ParamId,2]); 4: StrCopy(Info, aElectro_DSSParamsCapValType[ParamId,2]); 9: StrCopy(Info, aElectro_SHIM_SParamsCapValType[ParamId,2]); 10: StrCopy(Info, aElectro_SHIM_NParamsCapValType[ParamId,2]); 11: StrCopy(Info, aElectro_R1ParamsCapValType[ParamId,2]); 12: StrCopy(Info, aElectro_R2ParamsCapValType[ParamId,2]); end; i_GetParamValue : case BlockId of 1: StrCopy(Info, aElectro_DPTParamsCapValType[ParamId,3]); 2: StrCopy(Info, aElectro_DAParamsCapValType[ParamId,3]); 3: StrCopy(Info, aElectro_DSParamsCapValType[ParamId,3]); 4: StrCopy(Info, aElectro_DSSParamsCapValType[ParamId,3]); 9: StrCopy(Info, aElectro_SHIM_SParamsCapValType[ParamId,3]); 10: StrCopy(Info, aElectro_SHIM_NParamsCapValType[ParamId,3]); 11: StrCopy(Info, aElectro_R1ParamsCapValType[ParamId,3]); 12: StrCopy(Info, aElectro_R2ParamsCapValType[ParamId,3]); end; i_GetParamValues :case BlockId of {$IFDEF ENGLVER} 1: if (ParamId = 9) then StrCopy(Info, 'moment:i:'); 2: if (ParamId = 15) then StrCopy(Info, 'moment:iqs:ids:'); 3: if (ParamId = 12) then StrCopy(Info, 'moment:id:iq:'); 4: if (ParamId = 21) then StrCopy(Info, 'moment:id:iq:'); {$ELSE} 1: if (ParamId = 9) then StrCopy(Info, 'момента:i:'); 2: if (ParamId = 15) then StrCopy(Info, 'момента:iqs:ids:'); 3: if (ParamId = 12) then StrCopy(Info, 'момента:id:iq:'); 4: if (ParamId = 21) then StrCopy(Info, 'момента:id:iq:'); {$ENDIF} end; i_GetParamType : case BlockId of 1: StrCopy(Info, aElectro_DPTParamsCapValType[ParamId,4]); 2: StrCopy(Info, aElectro_DAParamsCapValType[ParamId,4]); 3: StrCopy(Info, aElectro_DSParamsCapValType[ParamId,4]); 4: StrCopy(Info, aElectro_DSSParamsCapValType[ParamId,4]); 9: StrCopy(Info, aElectro_SHIM_SParamsCapValType[ParamId,4]); 10: StrCopy(Info, aElectro_SHIM_NParamsCapValType[ParamId,4]); 11: StrCopy(Info, aElectro_R1ParamsCapValType[ParamId,4]); 12: StrCopy(Info, aElectro_R2ParamsCapValType[ParamId,4]); end; i_GetFuncsCount : BlockId := 0; end; end; END.