<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<title>Calling external program from a new C++ Component</title>
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p
{mso-style-priority:99;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
span.EmailStyle18
{mso-style-type:personal;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.EmailStyle19
{mso-style-type:personal;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
{page:WordSection1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=FR link=blue vlink=purple>
<div class=WordSection1>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Well, the answer is “Yes”. (it is at the end of your question).<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Just create a Proforma in Studio, and try it out alone (return
42 as output to check it works). <o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Then, add your source to the project (don’t use a separate
compile project for it, it is much easier to use the generated one), and call
your function where it says “call N” to compute the outputs in the TYPEXX()
function, and hand the result back to TRNSYS in the out() array.<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>That’s it, a child’s play. </span><span lang=EN-US
style='font-size:11.0pt;font-family:Wingdings;color:#1F497D'>J</span><span
lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Werner<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>De :</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Bezzarga, Amine
(SCR US EXT) [mailto:amine.bezzarga.ext@siemens.com] <br>
<b>Envoyé :</b> jeudi 7 octobre 2010 23:11<br>
<b>À :</b> keilholz, werner; trnsys-users@cae.wisc.edu<br>
<b>Objet :</b> RE: [TRNSYS-users] Calling external program from a new C++
Component<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Thank
you for your quick reply Werner,<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>You
said:<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> “If
you have the source code of the exe, another option would be to recompile it as
a DLL, adding the TRNSYS TYPE function which should then just call the main()
function of your application (you can then easily pass parameters and recover
results).” <o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>That’s
a good idea, I tried to do that but can I have more explanation of how do you
do that :<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>“adding
the TRNSYS TYPE function which should then just call the main() ”<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Because
I tried to recompile my exe into a dll, then link my lib to the new component
project, it compile without problem but when I run the simulation in TRNSYS, I
get this error:<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>TRNSYS
Message 105 : A TYPE was called in the TRNSYS input file but
was either not linked into trndll.dll or was not found in an external dll. A
dummy subroutine was called in its place. Please link the TYPE or remove it
from the input file Reported information : Reported by LINKCK<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>As
you said, TRNSYS is only able to load dll that contain a type (that is
explained in that message)<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>TRNSYS
Message 199 : TRNSYS found at least one user DLL in the
UserLib directory. (Note: Only DLL's including Types that are used in the
simulation are loaded) Reported information : 1 user DLL was loaded
after searching in "C:\Program Files\Trnsys16_1\UserLib\ReleaseDLLs"<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>So
the question is, how do you add the TRNSYS type function which will call the
main function of my program ?<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Should
I create a new type with the studio, then add a function wich will do the same
as my exe, and call that function where there is that comment </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'>//*** Call N ('normal'
call) ?<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-family:"Calibri","sans-serif"'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-family:"Calibri","sans-serif"'>Thx
again<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> keilholz, werner
[mailto:werner.keilholz@cstb.fr] <br>
<b>Sent:</b> Thursday, October 07, 2010 11:19 AM<br>
<b>To:</b> Bezzarga, Amine (SCR US EXT); trnsys-users@cae.wisc.edu<br>
<b>Subject:</b> RE: [TRNSYS-users] Calling external program from a new C++
Component<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi Amine, <o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>‘Call’ is not the name of a TRNSYS API function, but just a
comment to say that at this point in the example, the C routine is called for
the Nth time.<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>To call an external program in C, you should use the Windows
API. There are many ways to do this, one is to use CreateProcess() function, as
described here: </span><a
href="http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx"><span
lang=EN-US>http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx</span></a><span
lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>One challenge is to make sure the exe has finished before you
try to recover any results it may have put somewhere.<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>If you have the source code of the exe, another option would be
to recompile it as a DLL, adding the TRNSYS TYPE function which should then
just call the main() function of your application (you can then easily pass
parameters and recover results).<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hope this helps,<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Werner<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>De :</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Bezzarga, Amine
(SCR US EXT) [mailto:amine.bezzarga.ext@siemens.com] <br>
<b>Envoyé :</b> mardi 5 octobre 2010 23:56<br>
<b>À :</b> trnsys-users@cae.wisc.edu<br>
<b>Objet :</b> [TRNSYS-users] Calling external program from a new C++
Component<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>Hi everybody,</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>I’m stuck with
TRNSYS v 16.1</span><span lang=EN-US> </span><span lang=EN-US
style='font-family:"Calibri","sans-serif"'>, the part of the API that normally
allow to call an external program (an exe written in c++)</span><span
lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>seems
to not be supported by the C++ plugin (I can just create my</span><span
lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>
own component that will basically calculate the output from the input)</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>I mean the
linker can’t find the</span><span lang=EN-US> </span><span lang=EN-US
style='font-family:"Calibri","sans-serif"'>“call”</span><span lang=EN-US> </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'> subroutine just like
described in the programmer’s guide of the manual (part 8):</span><o:p></o:p></p>
<p><b><i><span lang=EN-US style='font-size:13.5pt;font-family:"Arial","sans-serif"'>8.4.4.1.
Calling External Programs</span></i></b><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>I know</span><span
lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>the
example shown is</span><span lang=EN-US> </span><span lang=EN-US
style='font-family:"Calibri","sans-serif"'>for fortran but, in the file
..\Trnsys16_1\SourceCode\Templates\CppType.cpp we have this at the line 133:</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'> //***
Call N ('normal' call)</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>That seems to be
the function that allow me to call an external program, however there is no
reference of that function in the</span><span lang=EN-US> </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'>“TRNSYS.h”, So I’m being
stuck with a linker problem.</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>What I want to
do</span><span lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>is
to</span><span lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>start
a simulation in TRNSYS, then when it reach a certain component, TRNSYS will
call a external program with data (in</span><span lang=EN-US> </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'>argument if possible)</span><span
lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>
and wait for it to finish,</span><span lang=EN-US> </span><span lang=EN-US
style='font-family:"Calibri","sans-serif"'>and then get back value from my
program?</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>Unfortunately,
TRNSYS doesn’t seem to support Socket connection to</span><span lang=EN-US> </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'>exchange data. I see that
type66 do it (This routine calls a program called Engineering Equation
Solver (EES)) with the data exchange</span><span lang=EN-US> </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'>protocol via the windows’
clipboard. </span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>To resume:</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>So do I have to
start over with the fortran plugin to be</span><span lang=EN-US> </span><span
lang=EN-US style='font-family:"Calibri","sans-serif"'>able to call external
program?</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>Or do you</span><span
lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>know
a other way to do</span><span lang=EN-US> </span><span lang=EN-US
style='font-family:"Calibri","sans-serif"'>what I want ?</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>And</span><span
lang=EN-US> </span><span lang=EN-US style='font-family:"Calibri","sans-serif"'>do
you think I need to communicate through a file ?</span><o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>Thanks a lot for
your help.</span><o:p></o:p></p>
<p><span lang=EN-US style='font-family:"Calibri","sans-serif"'>Amine</span><o:p></o:p></p>
</div>
</body>
</html>