ANSYS Classic 本身不提供外部应用程序接口,但其自身支持tcl/tk脚本,因此可以在c#与tcl之间通过Socket传递命令,然后再由tcl向ANSYS发送命令,其流程如下:
使用以下代码监听9900端口,其回调函数为EchoAccept,一旦有可读数据,调用Echo函数,若识别"/input"命令,则使用ANSYS提供给tcl的“ans_sendcommand”函数,向ANSYS发送命令,并返回命令执行结果。
5812proc Echo_Server {port} {3 global echo4 puts "****************port:$port**********"5 set echo(main) [socket -server EchoAccept $port]6}78proc EchoAccept {sock addr port} {9 global echo10 puts "Accept $sock from $addr port $port"11 set echo(addr,$sock) [list $addr $port]12 fconfigure $sock -buffering line13 fileevent $sock readable [list Echo $sock]14}1516proc Echo {sock} {17 global echo18 set len [gets $sock line]19 #puts "length of line is : $len"20 if {[eof $sock] || $len==0} {21 close $sock22 puts "Close $echo(addr,$sock)"23 unset echo(addr,$sock)24 } else {25 if {[string compare $line "quit"] == 0} {26 close $echo(main)27 return28 }29 puts "command: $line" 30 if {[string length $line] > 0} {31 # if it's a input command32 if {[string first "input," $line] >0} {33 set cmd [catch {ans_sendcommand )$line} cmsg]34 puts "cmd = $cmd"35 if {$cmd ==1 } {36 if {[string first "error" $cmsg] > 0} {37 puts "exception: $cmsg"38 puts $sock "error" 39 } elseif {[string first "warning" $cmsg] > 0 } {40 puts "exception: $cmsg"41 puts $sock "warning" 42 } else {43 puts "exception: $cmsg"44 puts $sock "other message"45 }46 } else {47 puts "success:$cmsg"48 puts $sock "success"49 }50 } 51 }52 }53}5455if {[catch {Echo_Server 9900}]} {56 if {[catch {Echo_Server 9990}]} {57 Echo_Server 999958 } 在ANSYS里运行上述tcl脚本。若上述脚本保存为server.tcl文件,则运行的方式为在ANSYS命令栏输入:~tcl,source server.tcl,启动后,在ANSYS输出窗口可以看到:

表明已经开启socket监听服务,后续可以将该过程的开启设置为自动化的,即随ANSYS启动自动运行该脚本,而无需手动输入。
由于是同一台计算机上不同程序,C#上tcp客户端请求连接127.0.0.1:9900,发送事先准备好的APDL命令流文件名,然后等待接收返回结果。
441static string sendCommand(string commandFileName)2{3 string resultFlag = string.Empty;4 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9900);5 TcpClient newClient = new TcpClient();6 try7 {8 newClient.Connect(remoteEP);9 }10 catch (SocketException)11 {12 return "SocketException";13 }14 NetworkStream nwstream = newClient.GetStream();15 StreamWriter smwriter = new StreamWriter(nwstream, Encoding.ASCII);16 StreamReader smreader = new StreamReader(nwstream, Encoding.ASCII);17 smwriter.WriteLine("/input,"+commandFileName);18 smwriter.Flush();19 Thread thread = new Thread((ThreadStart)delegate20 {21 while (true)22 {23 if (nwstream.DataAvailable)24 {25 break;26 }27 Thread.Sleep(100);28 }29 resultFlag = smreader.ReadLine();30 nwstream.Close();31 smreader.Close();32 smwriter.Close();33 newClient.Close();34 });35 thread.Name = "GetReturnFlag";36 thread.Start();37 thread.Join();38 thread.Abort();39 while (thread.ThreadState != System.Threading.ThreadState.Aborted)40 {41 Thread.Sleep(100);42 }43 return (resultFlag);44}准备一下APDL文件:
31#fileName:input.mac2a=33b=4运行以下代码:
31string commandFileName = "input.mac";2string resultFlag = sendCommand(commandFileName);3Console.WriteLine(resultFlag);得到:

ANSYS输出窗口内容为:
