شما اینجا هستید

خانه

نحوه ارتباط با Automation Hysys توسط MFC با استفاده از Visual Studio 2008/2010

همان طور که می دانید، نرم افزار HYSYS یکی از مهم ترین نرم افزارهای مهندسی شیمی و فرایند است که با استفاده از آن می توان بسیاری از واحدهای فرایندی را شبیه سازی نمود. از قابلیت های برجسته این نرم افزار امکان ارتباط با آن توسط OLE یا Object Linking & Embedding است. این قابلیت در واقع همان قابلیت شگرفی است که کلیه محصولات Microsoft Office را از اکسل (Excel) و Word و ... به هم متصل می کند و این قابلیت را به کاربرهای برنامه نویس می دهد که از طریق برنامه نویسی به آن دسترسی پیدا کنند. زبان برنامه نویسی Visual Basic یا VB به همین منظور و مبتنی بر برنامه نویسی COM طراحی شده است که در همه این محصولات قرار داده شده است.

این چنین قابلیتی در نرم افزار موجب می شود تا هر برنامه نویسی بتواند همه کارهایی که یک کاربر انسانی با نرم افزار انجام می دهد را به صورت اتوماسیون و با نوشتن کد انجام دهد. برای مثال تصور کنید که شما بخواهید یک شبیه سازی را بهینه سازی کنید. به هر روشی که بخواهید این کار را انجام دهید، از الگوریتم های Heuristics گرفته تا روش های Iterative و ... باید شبیه سازی را به دفعات زیادی انجام دهید که این کار به صورت دستی و انسانی امکان پذیر نیست. در نتیجه نرم افزار باید به شما این قابلیت را بدهد که توسط برنامه نویسی به المان های شبیه سازی دسترسی داشته باشید، آن ها را تغییر بدهید و شبیه سازی کنید و ...

قبلا هم در باره COM  و VB صحبت کردیم. بدون شک راحت ترین راه برای اتصال به نرم افزار HYSYS از طریق VB است. چرا که این زبان اساسا با همین هدف (COM) طراحی شده و بنای آن بر چنین ارتباطی است. برای مثال و داخل پرانتز عرض می کنم که کلیه اشیا در VB از واسط IUnknown مشتق می شوند که این واسط (Interface) مبنای همه واسط ها در پروتوکل ارتباطی COM است. و در واقع همه کلاس ها حداقل این واسط را پشتیبانی می کنند. بحث interface ها فعلا در این مبحث نمی گنجد ولی یادتان باشد هر چه قدر مباحث COM را در C++ بهتر درک کنید، زبان VB و پشت صحنه این اسکریپت نویسی شیرین را بهتر می فهمید!

اما گاهی اوقات شما مجبور هستید که برای اتصال به نرم افزار HYSYS از زبان C++ استفاده کنید. دلایل زیادی ممکن است وجود داشته باشد. برای مثال شما نرم افزاری نوشته اید که به زبان c++ است و می خواهید به hysys وصل شوید. یا ممکن است شما به performance بیشتری نیاز دارید (خصوصا در بهینه سازی ها) یا ممکن است با بخشی کار می کنید که VB در آن جواب نمی دهد. برای مثال در بخش Fluid Package ها در این نرم افزار امکان نوشتن افزونه (Extension) با استفاده از VB وجود ندارد. (ظاهرا دلیل اصلی آن performance است.)

حال که هدف از این کار مشخص شد، یک روش ساده با استفاده از Visual Studio را برای شما شرح خواهم داد. توجه کنید که برقراری ارتباط با استفاده از COM می تواند مستقیما و بدون استفاده از MFC و ATL هم صورت بگیرد ولی نوشتن این کدها پیچیده تر می شود. به همین دلیل ترجیح می دهم از کتابخانه MFC استفاده کنیم.

امیدوارم خواننده عزیز با Visual Studio قبلا کار کرده و نحوه ایجاد پروژه آشنا باشد. در نتیجه به سراغ اصل مطلب می رویم:

  1. ابتدا یک پروژه از نوع C++ MFC ایجاد می کنیم. ( نوع و تنظیمات آن مهم نیست.)
  2. روی پروژه ایجاد شده در قسمت Solution Explorer کلیک راست می کنیم و گزینه Add à Class  را انتخاب می کنیم.
  3. از گزینه های موجود باید گزینه MFC Class From TypeLib را انتخاب کرد تا پنجره زیر ظاهر شود:

Hysys Classes from TypeLibrary

      4. در پنجره بالا گزینه  File را انتخاب کنید و در بخش Location فایل tlb نرم افزار Hysys یا Aspen را انتخاب کنید:

C:\Program Files\AspenTech\Aspen HYSYS 2006\hysys.tlb

      5. از بین Interfaces واسط هایی ( کلاس)  را که لازم دارید به ستون سمت راست انتقال دهید تا Visual Studio آن ها را برای شما ایجاد نماید. (توجه کنید که انتخاب همه کلاس ها زمان زیادی طول خواهد کشید). Visual Studio به ازای هر کلاسی که انتخاب می کنید، یک فایل ایجاد کرده و تمامی متدها و خواص لازم را در قالب یک کلاس قابل دسترس ایجاد می کند.

HYSYS 2006 Type Library

        6. دکمه Finish را زده و منتظر بمانید تا همه کلاس های انتخاب شده ایجاد شوند. (بعدا هم می توان در صورت نیاز کلاس از این طریق اضافه نمود.)

        7. انتخاب کلاس ها و نحوه ارتباطات آن ها و فراخوانی متد ها نیاز به تسلط به طراحی Hysys دارد و به راهنمای این نرم افزار باید مراجعه شود. ( عموما کد ها ابتدا برای تست در VB نوشته می شود و معادل آن ها به این صورت توسط MFC ایجاد می شوند.)

        8. متاسفانه راهنمای درست و کاملی از hysys برای توسعه دهنده گان وجود ندارد، لذا با حدس و خطا و پیدا کردن کدهای نمونه در اینترنت می توان اشیا مورد نیاز را پیدا کرد! برای مثال در کد های ضمیمه شده CApplication به واسط Application اتصال می یابد (Attach) می شود و با استفاده از متد    get_SimulationCases به شیء لازم برای ایجاد و حذف simulationcase دسترسی پیدا می شود.

توجه کنید که اینترفیس های IDispatch که از متدهای hysys می آیند باید توسط متد AttachDispatch به شی مورد نظر (در این جا نمونه ایجاد شده از CSimulationCases2) متصل شوند. سپس با استفاده از متد Add یک SimulationCase جدید ایجاد خواهد شد. متاسفانه کمبود راهنما اینجا خودش را نشان می دهد. شی برگشتی از نوع VARIANT است و هیچ اطلاعی از نوع آن نیست. تنها راه فهمیدن آن کد نویسی با VB است که به راحتی به شما نشان می دهد که شی برگشتی این تابع از نوع SimulationCase است. در نتیجه می توان فهمید که یک واسط IDispatch در این جا برگشته، در نتیجه با استفاده از خاصیت pdispVal می توان به این واسط دسترسی پیدا کرد و آن را به کلاس C_SimulationCase متصل کرد. و به همین ترتیب سایر اشیا مورد نیاز را نیز می توان پیدا کرده و استفاده نمود.

 

کدهای نمونه:

 

void CMainFrame::OnFileStarthysys()

{

  CLSID clsidWMP;

  LPDISPATCH pWMPDispatch = NULL;

  CApplication hysyApp;

  CSimulationCases2 simulationCases;

  C_SimulationCase simulationCase;

 

  try

  {

    AfxCheckError(::CLSIDFromProgID(_T("hysys.application"), &clsidWMP));

 

    AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_LOCAL_SERVER,

      IID_IDispatch, (LPVOID*)&pWMPDispatch));

 

    hysyApp.AttachDispatch(pWMPDispatch, TRUE);

    pWMPDispatch = NULL; // our COleDispatchDriver now owns the interface

    hysyApp.put_Visible(TRUE);

    LPDISPATCH simCaseList = hysyApp.get_SimulationCases();

 

    simulationCases.AttachDispatch(simCaseList);

    VARIANT name;

    name.vt = VT_BSTR;

    name.bstrVal = SysAllocString(L"test simcase");

    VARIANT type;

    type.vt = VT_INT;

    type.intVal = 0;

    VARIANT simulation_case = simulationCases.Add(name, type);

    simulationCase.AttachDispatch(simulation_case.pdispVal);

    simulationCase.Activate();

  }

  catch (COleException* pe)

  {

    pe->ReportError();

    pe->Delete();

  }

  catch (CMemoryException* pe)

  {

    pe->ReportError();

    pe->Delete();

  }

}

دانلود پروژه نمونه از این لینک

 

دیدگاه‌ها

سلام

چگونه می شود 

aspen hysys 

را به متلب به صورت دینامیکی لینک کرد؟

با سلام

برای لینک شدن به برنامه Hysys با استفاده از نرم افزار MATLAB باید از دستور های مربوط به actxserver استفاده کنید.

برای مثال برای ساخت یک اکتیو ایکس ساده اکسل:

% Open Excel, add workbook, change active worksheet,

% get/put array, save, and close
% First open an Excel Server
Excel = actxserver('Excel.Application');
set(Excel, 'Visible', 1);
% Insert a new workbook
Workbooks = Excel.Workbooks;
Workbook = invoke(Workbooks, 'Add');
% Make the second sheet active
Sheets = Excel.ActiveWorkBook.Sheets;
sheet2 = get(Sheets, 'Item', 2);
invoke(sheet2, 'Activate');
% Get a handle to the active sheet
Activesheet = Excel.Activesheet;
% Put a MATLAB array into Excel
A = [1 2; 3 4];  
ActivesheetRange = get(Activesheet,'Range','A1:B2');
set(ActivesheetRange, 'Value', A);
% Get back a range.  It will be a cell array, 
% since the cell range can
% contain different types of data.
Range = get(Activesheet, 'Range', 'A1:B2');
B = Range.value;
% Convert to a double matrix.  The cell array must contain only scalars.
B = reshape([B{:}], size(B));
% Now save the workbook
invoke(Workbook, 'SaveAs', 'myfile.xls');
% To avoid saving the workbook and being prompted to do so,
% uncomment the following code.
% Workbook.Saved = 1;
% invoke(Workbook, 'Close');
% Quit Excel
invoke(Excel, 'Quit');
% End process
delete(Excel);

برای اتصال به Hysys هم به طور مشابه اپلیکیشن مربوطه رو ایجاد کرده و آبجکت ها و متد هایی رو که لازم دارید استفاده میکنید.

لینک کمکی:

http://www.codeproject.com/Articles/5848/Using-ActiveX-Control-Inside-MATLAB

 

موفق باشید

سلام .وقت بخیر.

میخواستم یه واکنش با فرمول سینتیک پیچیده به هایسیس اضافه کنم. باید چکار کنم؟

افزودن نظر جدید

درباره من

سلام. به وب سایت شخصی من خوش آمدید.

محمد ذات خواهی هستم متولد سال 66 اهل رشت. سال 89 از دانشگاه شریف با مدرک لیسانس مهندسی شیمی و سال 91 از دانشگاه علم و صنعت ایران با مدرک ارشد کنترل و شبیه سازی فرایند فارغ التحصیل شدم، و در حال حاضر به عنوان مهندس نرم افزار در شرکت گسترش فرایند شریف هستم. از اونجایی که از دبیرستان به الگوریتم و برنامه نویسی علاقه داشتم از همون موقع تو این حیطه کار می کنم. بیشترین توانایی من در طراحی نرم افزار های مهندسی شیمی، طراحی وب و کلا کد نویسی هست. خوش حال میشم بتونم به دیگران کمک کنم خصوصا در حوزه آموزش. سعی می کنم تو این وب سایت مطالب و تجربه هایی که فکر می کنم به درد علاقه مندان به حوزه نرم افزار و برنامه نویسی بخوره قرار بدم. امیدوارم شما هم با نظرات و انتقادات و بحث های علمی تون در ارتقای محتوی علمی این وب سایت من رو یاری کنید.

 

Mohammad Zatkhahi Image

 

.

?>