Передача массива через OLE
Добавлено: 17 авг 2023, 07:05
Всем добрый день!
Возникла проблема. В нашей организации есть метод расчета массы нефти (методы ПОкМИ), который вызывается через OLE. Данный метод принимает в себя как простые типы данных, так и данные типа массив либо double, либо integer. Во время выполнения интерфейса, который вызывает работу этого метода, галактика вылетает с ошибкой:
"Runtime error 216 (rtl: попытка обращения к некоректному дескриптору) in streams_.dll at 0002AC53".
В логах находится следующая информация:
Необработанная исключительная ситуация
Код исключения: C0000005 (Общее нарушение защиты доступа к памяти)
Параметры исключения (2): 00000000 00000008
Адрес исключения: 013CAC53 streams_.dll.1:00029C53\
В отладчике удалось отследить, что передача в OLE простых данных идет без вылета, а проблема возникает, как только происходит попытка передать через OLE массив.
Часть кода вызова представлена ниже
В данном коде идет непосредственное обращение к ПОкМИ через OLE. Место, где происходит вылет - попытка передачи параметра "Масса порожней цистерны"
Подозреваю, что я как-то не так передаю массив, но в чем конкретно - не понимаю. Прошу вас помочь
Возникла проблема. В нашей организации есть метод расчета массы нефти (методы ПОкМИ), который вызывается через OLE. Данный метод принимает в себя как простые типы данных, так и данные типа массив либо double, либо integer. Во время выполнения интерфейса, который вызывает работу этого метода, галактика вылетает с ошибкой:
"Runtime error 216 (rtl: попытка обращения к некоректному дескриптору) in streams_.dll at 0002AC53".
В логах находится следующая информация:
Необработанная исключительная ситуация
Код исключения: C0000005 (Общее нарушение защиты доступа к памяти)
Параметры исключения (2): 00000000 00000008
Адрес исключения: 013CAC53 streams_.dll.1:00029C53\
В отладчике удалось отследить, что передача в OLE простых данных идет без вылета, а проблема возникает, как только происходит попытка передать через OLE массив.
Часть кода вызова представлена ниже
Код: Выделить всё
type
doubleArr = array [1..1] of double;
intArr = array [1..1] of integer;
Function CalcMI44(wPlotn :double; wMEmpty :double; wMLoaded :double; wName :string): double;
{
var MI44_TankCount : integer = 0; // Число цистерн в составе INT 0 >= 1
var MI44_ScaleLimit_empty : double = 0; // Наибольший предел взвешивания средства измерений массы порожней цистерны кг DOUBLE 0.0 >= 1
var MI44_ScaleLimit_loaded : double = 0; // Наибольший предел взвешивания средства измерений массы груженой цистерны кг DOUBLE 0.0 >= 1
var MI44_M_empty : doubleArr; // Масса порожней цистерны кг DOUBLE NULL >= 1
var MI44_M_loaded : doubleArr; // Масса груженой цистерны кг DOUBLE NULL >= M_empty[i] + 1
var MI44_R : doubleArr; // Плотность нефтепродукта в цистерне кг/м? DOUBLE NULL 470.4..1209.5
var MI44_Tr : doubleArr; // Температура нефтепродукта при измерении плотности °С DOUBLE NULL -40..150
var MI44_Tcy : doubleArr; // Температура, к которой приводится плотность и объем (15°С, 20°С) °С DOUBLE NULL 15; 20
var MI44_Pr : doubleArr; // Избыточное давление нефтепродукта в рабочих условиях МПа DOUBLE NULL 0..10.34214
var MI44_ToolType : intArr; // Тип средства измерения плотности ToolTypeEnum NULL
var MI44_DeltaAbs_R : doubleArr; // Абсолютная погрешность измерений плотности кг/м? DOUBLE NULL 0..1.5|0.5|0.5
var MI44_DeltaOtn_R : doubleArr; // Относительная погрешность измерений плотности % DOUBLE NULL 0..100
var MI44_DeltaAbs_M_empty : doubleArr; // Абсолютная погрешность измерений массы порожней цистерны кг DOUBLE NULL
var MI44_DeltaAbs_M_loaded : doubleArr; // Абсолютная погрешность измерений массы груженой цистерны кг DOUBLE NULL
var MI44_M : doubleArr; // Масса нефтепродукта в цистерне кг DOUBLE NULL
var MI44_DeltaOtn_M : doubleArr; // Относительная погрешность измерений массы нефтепродукта в цистерне % DOUBLE NULL <= 2.5
var MI44_Rcy : doubleArr; // Плотность нефтепродукта в цистерне, приведенная к стандартным условиям кг/м? DOUBLE NULL
var MI44_Vcy : doubleArr; // Объем нефтепродукта в цистерне, приведенный к стандартным условиям м? DOUBLE NULL
var MI44_DeltaOtn_Vcy : doubleArr; // Относительная погрешность измерений объема нефтепродукта в цистерне, приведенного к стандартным условиям % DOUBLE NULL
var MI44_CTL_obs_base : doubleArr; // Поправочный коэффициент, учитывающий влияние температуры на плотность нефтепродукта, CTL DOUBLE NULL
var MI44_CPL_obs_base : doubleArr; // Поправочный коэффициент, учитывающий влияние давления на плотность нефтепродукта, CPL DOUBLE NULL
var MI44_CTPL_obs_base : doubleArr; // Поправочный коэффициент, учитывающий влияние температуры и давления на плотность нефтепродукта, CTPL DOUBLE NULL
var MI44_Fp_obs_base : doubleArr; // Коэффициент сжимаемости нефтепродукта, учитывающий влияние на плотность нефтепродукта, Fp 1/Па DOUBLE NULL
var MI44_VolumetricExpansion : doubleArr; // Коэффициент объемного расширения нефтепродукта 1/°С DOUBLE NULL
var MI44_M_empty_total : double = 0; // Масса порожнего состава (партии) кг DOUBLE 0.0
var MI44_M_loaded_total : double = 0; // Масса груженого состава (партии) кг DOUBLE 0.0
var MI44_M_total : double = 0; // Масса нефтепродукта в составе (партии) кг DOUBLE 0.0
var MI44_Vcy_total : double = 0; // Объем нефтепродукта в составе (партии), приведенный к стандартным условиям м? DOUBLE 0.0
var MI44_DeltaOtn_M_total : double = 0; // Относительная погрешность измерений массы нефтепродукта в составе (партии) % DOUBLE 0.0
var MI44_DeltaOtn_Vcy_total : double = 0; // Относительная погрешность измерений объема нефтепродукта в составе (партии), приведенного к стандартным условиям % DOUBLE 0.0
var MI44_DllVersion : string = '';
var MI44_Result : longint = 0;
var MI44_ResultDetail : string = '';
var MI44_Warnings : string = '';
var Res : variant;
var wRez : double = 0;
// var wGrad : string = '';
// var sTmp : string = '';
Result := 0;
if not IsValid(#TabNC) OR ( wCalcMassa <> 0 ) then Exit;
SetLimit(MI44_M_empty,1);
SetLimit(MI44_M_loaded,1);
SetLimit(MI44_R,1);
SetLimit(MI44_Tr,1);
SetLimit(MI44_Tcy,1);
SetLimit(MI44_Pr,1);
SetLimit(MI44_ToolType,1);
SetLimit(MI44_DeltaAbs_R,1);
SetLimit(MI44_DeltaOtn_R,1);
SetLimit(MI44_DeltaAbs_M_empty,1);
SetLimit(MI44_DeltaAbs_M_loaded,1);
SetLimit(MI44_M,1);
SetLimit(MI44_DeltaOtn_M,1);
SetLimit(MI44_Rcy,1);
SetLimit(MI44_Vcy,1);
SetLimit(MI44_DeltaOtn_Vcy,1);
SetLimit(MI44_CTL_obs_base,1);
SetLimit(MI44_CPL_obs_base,1);
SetLimit(MI44_CTPL_obs_base,1);
SetLimit(MI44_Fp_obs_base,1);
SetLimit(MI44_VolumetricExpansion,1);
//Входные данные
MI44_TankCount := 1; // Число цистерн в составе INT 0 >= 1 //1 - константа
MI44_ScaleLimit_empty := 1; // Наибольший предел взвешивания средства измерений массы порожней цистерны кг DOUBLE 0.0 >= 1
MI44_ScaleLimit_loaded := 1; // Наибольший предел взвешивания средства измерений массы груженой цистерны кг DOUBLE 0.0 >= 1
MI44_M_empty[1] := wMEmpty; // Масса порожней цистерны кг DOUBLE NULL >= 1
MI44_M_loaded[1] := wMLoaded; // Масса груженой цистерны кг DOUBLE NULL >= M_empty[i] + 1
MI44_R[1] := wPlotn * 1000; // Плотность нефтепродукта в цистерне кг/м? DOUBLE NULL 470.4..1209.5
MI44_Tr[1] := 20; // Температура нефтепродукта при измерении плотности °С DOUBLE NULL -40..150
MI44_Tcy[1] := 20; // Температура, к которой приводится плотность и объем (15°С, 20°С) °С DOUBLE NULL 15; 20
MI44_Pr[1] := 0; // Избыточное давление нефтепродукта в рабочих условиях МПа DOUBLE NULL 0..10.34214
MI44_ToolType[1] := 2; // Тип средства измерения плотности ToolTypeEnum NULL // 2 - Ареометр, откалиброванный при 20°С
MI44_DeltaAbs_R[1] := 0.5; // Абсолютная погрешность измерений плотности кг/м? DOUBLE NULL 0..1.5|0.5|0.5
MI44_DeltaOtn_R[1] := 0; // Относительная погрешность измерений плотности % DOUBLE NULL 0..100
MI44_DeltaAbs_M_empty[1] := 0;
MI44_DeltaAbs_M_loaded[1] := 0;
MI44_M[1] := 0;
MI44_DeltaOtn_M[1] := 0;
MI44_Rcy[1] := 0;
MI44_Vcy[1] := 0;
MI44_DeltaOtn_Vcy[1] := 0;
MI44_CTL_obs_base[1] := 0;
MI44_CPL_obs_base[1] := 0;
MI44_CTPL_obs_base[1] := 0;
MI44_Fp_obs_base[1] := 0;
MI44_VolumetricExpansion[1] := 0;
case wName of // запросили входные параметры
'TankCount' : wRez := MI44_TankCount ;
'ScaleLimit_empty' : wRez := MI44_ScaleLimit_empty ;
'ScaleLimit_loaded' : wRez := MI44_ScaleLimit_loaded ;
'M_empty' : wRez := MI44_M_empty[1] ;
'M_loaded' : wRez := MI44_M_loaded[1] ;
'R' : wRez := MI44_R[1] ;
'Tr' : wRez := MI44_Tr[1] ;
'Tcy' : wRez := MI44_Tcy[1] ;
'Pr' : wRez := MI44_Pr[1] ;
'ToolType' : wRez := MI44_ToolType[1] ;
'DeltaAbs_R' : wRez := MI44_DeltaAbs_R[1] ;
'DeltaOtn_R' : wRez := MI44_DeltaOtn_R[1] ;
else
{ // выполнить расчет
if MI_Method44( // параметры
MI44_TankCount , // Число цистерн в составе INT 0 >= 1
MI44_ScaleLimit_empty , // Наибольший предел взвешивания средства измерений массы порожней цистерны кг DOUBLE 0.0 >= 1
MI44_ScaleLimit_loaded , // Наибольший предел взвешивания средства измерений массы груженой цистерны кг DOUBLE 0.0 >= 1
MI44_M_empty , // Масса порожней цистерны кг DOUBLE NULL >= 1
MI44_M_loaded , // Масса груженой цистерны кг DOUBLE NULL >= M_empty[i] + 1
MI44_R , // Плотность нефтепродукта в цистерне кг/м? DOUBLE NULL 470.4..1209.5
MI44_Tr , // Температура нефтепродукта при измерении плотности °С DOUBLE NULL -40..150
MI44_Tcy , // Температура, к которой приводится плотность и объем (15°С, 20°С) °С DOUBLE NULL 15; 20
MI44_Pr , // Избыточное давление нефтепродукта в рабочих условиях МПа DOUBLE NULL 0..10.34214
MI44_ToolType , // Тип средства измерения плотности ToolTypeEnum NULL
MI44_DeltaAbs_R , // Абсолютная погрешность измерений плотности кг/м? DOUBLE NULL 0..1.5|0.5|0.5
MI44_DeltaOtn_R , // Относительная погрешность измерений плотности % DOUBLE NULL 0..100
// Выходные значения
MI44_DeltaAbs_M_empty , // Абсолютная погрешность измерений массы порожней цистерны кг DOUBLE NULL
MI44_DeltaAbs_M_loaded , // Абсолютная погрешность измерений массы груженой цистерны кг DOUBLE NULL
MI44_M , // Масса нефтепродукта в цистерне кг DOUBLE NULL
MI44_DeltaOtn_M , // Относительная погрешность измерений массы нефтепродукта в цистерне % DOUBLE NULL <= 2.5
MI44_Rcy , // Плотность нефтепродукта в цистерне, приведенная к стандартным условиям кг/м? DOUBLE NULL
MI44_Vcy , // Объем нефтепродукта в цистерне, приведенный к стандартным условиям м? DOUBLE NULL
MI44_DeltaOtn_Vcy , // Относительная погрешность измерений объема нефтепродукта в цистерне, приведенного к стандартным условиям % DOUBLE NULL
MI44_CTL_obs_base , // Поправочный коэффициент, учитывающий влияние температуры на плотность нефтепродукта, CTL DOUBLE NULL
MI44_CPL_obs_base , // Поправочный коэффициент, учитывающий влияние давления на плотность нефтепродукта, CPL DOUBLE NULL
MI44_CTPL_obs_base , // Поправочный коэффициент, учитывающий влияние температуры и давления на плотность нефтепродукта, CTPL DOUBLE NULL
MI44_Fp_obs_base , // Коэффициент сжимаемости нефтепродукта, учитывающий влияние на плотность нефтепродукта, Fp 1/Па DOUBLE NULL
MI44_VolumetricExpansion , // Коэффициент объемного расширения нефтепродукта 1/°С DOUBLE NULL
MI44_M_empty_total , // Масса порожнего состава (партии) кг DOUBLE 0.0
MI44_M_loaded_total , // Масса груженого состава (партии) кг DOUBLE 0.0
MI44_M_total , // Масса нефтепродукта в составе (партии) кг DOUBLE 0.0
MI44_Vcy_total , // Объем нефтепродукта в составе (партии), приведенный к стандартным условиям м? DOUBLE 0.0
MI44_DeltaOtn_M_total , // Относительная погрешность измерений массы нефтепродукта в составе (партии) % DOUBLE 0.0
MI44_DeltaOtn_Vcy_total , // Относительная погрешность измерений объема нефтепродукта в составе (партии), приведенного к стандартным условиям % DOUBLE 0.0
MI44_DllVersion ,
MI44_Result ,
MI44_ResultDetail ,
MI44_Warnings ,
Res ) then
{ // расчет без ошибок
case wName of
'DeltaAbs_M_empty' : wRez := MI44_DeltaAbs_M_empty[1] ;
'DeltaAbs_M_loaded' : wRez := MI44_DeltaAbs_M_loaded[1] ;
'M' : wRez := MI44_M[1] ;
'DeltaOtn_M' : wRez := MI44_DeltaOtn_M[1] ;
'Rcy' : wRez := MI44_Rcy[1] ;
'Vcy ' : wRez := MI44_Vcy[1] ;
'DeltaOtn_Vcy' : wRez := MI44_DeltaOtn_Vcy[1] ;
'CTL_obs_base' : wRez := MI44_CTL_obs_base[1] ;
'CPL_obs_base' : wRez := MI44_CPL_obs_base[1] ;
'CTPL_obs_base' : wRez := MI44_CTPL_obs_base[1] ;
'Fp_obs_base' : wRez := MI44_Fp_obs_base[1] ;
'VolumetricExpansion' : wRez := MI44_VolumetricExpansion[1] ;
'M_empty_total' : wRez := MI44_M_empty_total ;
'M_loaded_total' : wRez := MI44_M_loaded_total ;
'M_total' : wRez := MI44_M_total ;
'Vcy_total' : wRez := MI44_Vcy_total ;
'DeltaOtn_M_total' : wRez := MI44_DeltaOtn_M_total ;
'DeltaOtn_Vcy_total' : wRez := MI44_DeltaOtn_Vcy_total ;
end;
}
}
end;
Result := wRez;
}
Код: Выделить всё
function MI_Method44(
_MI44_TankCount : integer; // Число цистерн в составе INT 0 >= 1
//ScaleClass_empty // Класс точности средства измерений массы порожней цистерны ScalePrecisionEnum ScalePrecision_Unknown
//ScaleClass_loaded // Класс точности средства измерений массы груженой цистерны ScalePrecisionEnum ScalePrecision_Unknown
_MI44_ScaleLimit_empty : double; // Наибольший предел взвешивания средства измерений массы порожней цистерны кг DOUBLE 0.0 >= 1
_MI44_ScaleLimit_loaded : double; // Наибольший предел взвешивания средства измерений массы груженой цистерны кг DOUBLE 0.0 >= 1
_MI44_M_empty : doubleArr; // Масса порожней цистерны кг doubleArr NULL >= 1
_MI44_M_loaded : doubleArr; // Масса груженой цистерны кг DOUBLE NULL >= M_empty[i] + 1
_MI44_R : doubleArr; // Плотность нефтепродукта в цистерне кг/м? DOUBLE NULL 470.4..1209.5
_MI44_Tr : doubleArr; // Температура нефтепродукта при измерении плотности °С DOUBLE NULL -40..150
_MI44_Tcy : doubleArr; // Температура, к которой приводится плотность и объем (15°С, 20°С) °С DOUBLE NULL 15; 20
_MI44_Pr : doubleArr; // Избыточное давление нефтепродукта в рабочих условиях МПа DOUBLE NULL 0..10.34214
_MI44_ToolType : intArr; // Тип средства измерения плотности ToolTypeEnum NULL
//ToolAutomationLevel_R Степень автоматизации средства измерения плотности AutomationLevelEnum NULL
_MI44_DeltaAbs_R : doubleArr; // Абсолютная погрешность измерений плотности кг/м? DOUBLE NULL 0..1.5|0.5|0.5
_MI44_DeltaOtn_R : doubleArr; // Относительная погрешность измерений плотности % DOUBLE NULL 0..100
var _MI44_DeltaAbs_M_empty : doubleArr; // Абсолютная погрешность измерений массы порожней цистерны кг DOUBLE NULL
var _MI44_DeltaAbs_M_loaded : doubleArr; // Абсолютная погрешность измерений массы груженой цистерны кг DOUBLE NULL
var _MI44_M : doubleArr; // Масса нефтепродукта в цистерне кг DOUBLE NULL
var _MI44_DeltaOtn_M : doubleArr; // Относительная погрешность измерений массы нефтепродукта в цистерне % DOUBLE NULL <= 2.5
var _MI44_Rcy : doubleArr; // Плотность нефтепродукта в цистерне, приведенная к стандартным условиям кг/м? DOUBLE NULL
var _MI44_Vcy : doubleArr; // Объем нефтепродукта в цистерне, приведенный к стандартным условиям м? DOUBLE NULL
var _MI44_DeltaOtn_Vcy : doubleArr; // Относительная погрешность измерений объема нефтепродукта в цистерне, приведенного к стандартным условиям % DOUBLE NULL
var _MI44_CTL_obs_base : doubleArr; // Поправочный коэффициент, учитывающий влияние температуры на плотность нефтепродукта, CTL DOUBLE NULL
var _MI44_CPL_obs_base : doubleArr; // Поправочный коэффициент, учитывающий влияние давления на плотность нефтепродукта, CPL DOUBLE NULL
var _MI44_CTPL_obs_base : doubleArr; // Поправочный коэффициент, учитывающий влияние температуры и давления на плотность нефтепродукта, CTPL DOUBLE NULL
var _MI44_Fp_obs_base : doubleArr; // Коэффициент сжимаемости нефтепродукта, учитывающий влияние на плотность нефтепродукта, Fp 1/Па DOUBLE NULL
var _MI44_VolumetricExpansion : doubleArr; // Коэффициент объемного расширения нефтепродукта 1/°С DOUBLE NULL
var _MI44_M_empty_total : double; // Масса порожнего состава (партии) кг DOUBLE 0.0
var _MI44_M_loaded_total : double; // Масса груженого состава (партии) кг DOUBLE 0.0
var _MI44_M_total : double; // Масса нефтепродукта в составе (партии) кг DOUBLE 0.0
var _MI44_Vcy_total : double; // Объем нефтепродукта в составе (партии), приведенный к стандартным условиям м? DOUBLE 0.0
var _MI44_DeltaOtn_M_total : double; // Относительная погрешность измерений массы нефтепродукта в составе (партии) % DOUBLE 0.0
var _MI44_DeltaOtn_Vcy_total : double; // Относительная погрешность измерений объема нефтепродукта в составе (партии), приведенного к стандартным условиям % DOUBLE 0.0
var _MI44_DllVersion : string;
var _MI44_Result : longint;
var _MI44_ResultDetail : string;
var _MI44_Warnings : string;
var _Res : variant
) : boolean;
var MM_Ptr: TPtr;
{ // Расчет массы и объема нефтепродуктов в железнодорожных цистернах
// Косвенный метод статических измерений
Result := false;
MM_Ptr := 0;
SetLimit(_MI44_M_empty,1);
SetLimit(_MI44_M_loaded,1);
SetLimit(_MI44_R,1);
SetLimit(_MI44_Tr,1);
SetLimit(_MI44_Tcy,1);
SetLimit(_MI44_Pr,1);
SetLimit(_MI44_ToolType,1);
SetLimit(_MI44_DeltaAbs_R,1);
SetLimit(_MI44_DeltaOtn_R,1);
SetLimit(_MI44_DeltaAbs_M_empty,1);
SetLimit(_MI44_DeltaAbs_M_loaded,1);
SetLimit(_MI44_M,1);
SetLimit(_MI44_DeltaOtn_M,1);
SetLimit(_MI44_Rcy,1);
SetLimit(_MI44_Vcy,1);
SetLimit(_MI44_DeltaOtn_Vcy,1);
SetLimit(_MI44_CTL_obs_base,1);
SetLimit(_MI44_CPL_obs_base,1);
SetLimit(_MI44_CTPL_obs_base,1);
SetLimit(_MI44_Fp_obs_base,1);
SetLimit(_MI44_VolumetricExpansion,1);
_try
{
MM_Ptr := OleCreate('Rosneft.MethodOfMetering44');
OleCall1(MM_Ptr, ocPut, 'TankCount' , _MI44_TankCount ); // Число цистерн в составе INT 0 >= 1
OleCall1(MM_Ptr, ocPut, 'ScaleLimit_empty' , _MI44_ScaleLimit_empty ); // Наибольший предел взвешивания средства измерений массы порожней цистерны кг DOUBLE 0.0 >= 1
OleCall1(MM_Ptr, ocPut, 'ScaleLimit_loaded' , _MI44_ScaleLimit_loaded ); // Наибольший предел взвешивания средства измерений массы груженой цистерны кг DOUBLE 0.0 >= 1
//Ниже находится оператор, в котором происходит ошибка
OleCall1(MM_Ptr, ocPut, 'M_empty' , _MI44_M_empty ); // Масса порожней цистерны кг DOUBLE NULL >= 1
OleCall1(MM_Ptr, ocPut, 'M_loaded' , _MI44_M_loaded ); // Масса груженой цистерны кг DOUBLE NULL >= M_empty[i] + 1
OleCall1(MM_Ptr, ocPut, 'R' , _MI44_R ); // Плотность нефтепродукта в цистерне кг/м? DOUBLE NULL 470.4..1209.5
OleCall1(MM_Ptr, ocPut, 'Tr' , _MI44_Tr ); // Температура нефтепродукта при измерении плотности °С DOUBLE NULL -40..150
OleCall1(MM_Ptr, ocPut, 'Tcy' , _MI44_Tcy ); // Температура, к которой приводится плотность и объем (15°С, 20°С) °С DOUBLE NULL 15; 20
OleCall1(MM_Ptr, ocPut, 'Pr' , _MI44_Pr ); // Избыточное давление нефтепродукта в рабочих условиях МПа DOUBLE NULL 0..10.34214
OleCall1(MM_Ptr, ocPut, 'ToolType' , _MI44_ToolType ); // Тип средства измерения плотности ToolTypeEnum NULL
OleCall1(MM_Ptr, ocPut, 'DeltaAbs_R' , _MI44_DeltaAbs_R ); // Абсолютная погрешность измерений плотности кг/м? DOUBLE NULL 0..1.5|0.5|0.5
OleCall1(MM_Ptr, ocPut, 'DeltaOtn_R' , _MI44_DeltaOtn_R ); // Относительная погрешность измерений плотности % DOUBLE NULL 0..100
OleCall1(MM_Ptr, ocFunc,'Exec' , _Res );
OleCall1(MM_Ptr, ocGet, 'Result' , _MI44_Result );
OleCall1(MM_Ptr, ocGet, 'ResultDetail' , _MI44_ResultDetail );
OleCall1(MM_Ptr, ocGet, 'Warnings' , _MI44_Warnings );
OleCall1(MM_Ptr, ocGet, 'DllVersion' , _MI44_DllVersion );
OleCall1(MM_Ptr, ocGet, 'DeltaAbs_M_empty' , _MI44_DeltaAbs_M_empty ); // Абсолютная погрешность измерений массы порожней цистерны кг DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'DeltaAbs_M_loaded' , _MI44_DeltaAbs_M_loaded ); // Абсолютная погрешность измерений массы груженой цистерны кг DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'M' , _MI44_M ); // Масса нефтепродукта в цистерне кг DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'DeltaOtn_M' , _MI44_DeltaOtn_M ); // Относительная погрешность измерений массы нефтепродукта в цистерне % DOUBLE NULL <= 2.5
OleCall1(MM_Ptr, ocGet, 'Rcy' , _MI44_Rcy ); // Плотность нефтепродукта в цистерне, приведенная к стандартным условиям кг/м? DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'Vcy' , _MI44_Vcy ); // Объем нефтепродукта в цистерне, приведенный к стандартным условиям м? DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'DeltaOtn_Vcy' , _MI44_DeltaOtn_Vcy ); // Относительная погрешность измерений объема нефтепродукта в цистерне, приведенного к стандартным условиям % DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'CTL_obs_base' , _MI44_CTL_obs_base ); // Поправочный коэффициент, учитывающий влияние температуры на плотность нефтепродукта, CTL DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'CPL_obs_base' , _MI44_CPL_obs_base ); // Поправочный коэффициент, учитывающий влияние давления на плотность нефтепродукта, CPL DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'CTPL_obs_base' , _MI44_CTPL_obs_base ); // Поправочный коэффициент, учитывающий влияние температуры и давления на плотность нефтепродукта, CTPL DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'Fp_obs_base' , _MI44_Fp_obs_base ); // Коэффициент сжимаемости нефтепродукта, учитывающий влияние на плотность нефтепродукта, Fp 1/Па DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'VolumetricExpansion', _MI44_VolumetricExpansion ); // Коэффициент объемного расширения нефтепродукта 1/°С DOUBLE NULL
OleCall1(MM_Ptr, ocGet, 'M_empty_total' , _MI44_M_empty_total ); // Масса порожнего состава (партии) кг DOUBLE 0.0
OleCall1(MM_Ptr, ocGet, 'M_loaded_total' , _MI44_M_loaded_total ); // Масса груженого состава (партии) кг DOUBLE 0.0
OleCall1(MM_Ptr, ocGet, 'M_total' , _MI44_M_total ); // Масса нефтепродукта в составе (партии) кг DOUBLE 0.0
OleCall1(MM_Ptr, ocGet, 'Vcy_total' , _MI44_Vcy_total ); // Объем нефтепродукта в составе (партии), приведенный к стандартным условиям м? DOUBLE 0.0
OleCall1(MM_Ptr, ocGet, 'DeltaOtn_M_total' , _MI44_DeltaOtn_M_total ); // Относительная погрешность измерений массы нефтепродукта в составе (партии) % DOUBLE 0.0
OleCall1(MM_Ptr, ocGet, 'DeltaOtn_Vcy_total' , _MI44_DeltaOtn_Vcy_total ); // Относительная погрешность измерений объема нефтепродукта в составе (партии), приведенного к стандартным условиям % DOUBLE 0.0
OleDestroy(MM_Ptr);
if Trim(_MI44_DllVersion) = '1.0.4.0' then
Result := true;
else
message('Проверьте версию библиотеки для расчета массы нефтепродуктов!', Error+OkButton);
}
_except
on ExOleCantCreateObject:
{
_MI44_ResultDetail := 'OLE_ERROR!';
message('Не найдена библиотека для расчета массы нефтепродуктов!', Error+OkButton);
}
else
{
_MI44_ResultDetail := ExploreException;
message('Ошибка расчета. Проверьте версию библиотеки расчета масс!', Error+OkButton);
}
}