สำหรับบทความนี้ จะอธิบายการแปลงไฟล์ผลคำนวณของแบบจำลอง MIKE11
จากนามสกุล res11 ให้ไปเป็น text ที่สามารถเปิดอ่านได้ด้วยโปรแกรมอ่าน text ทั่วไป
ประโยชน์ที่ได้คือ เมื่อแปลงไฟล์แล้วสามารถเปิดได้ด้วยโปรแกรมอื่นๆ
ซึ่งหากเป็นไฟล์ res11 แล้วจะสามารถเปิดอ่านได้ด้วยโปรแกรม MIKE View เท่านั้น
จึงเป็นการอำนวยความสะดวกในการต่อยอดจากผลคำนวณของแบบจำลอง MIKE11
เช่นสามารถอ่านผลคำนวณไปแสดงในหน้าเวบเพจ หรือทำกราฟ หรืออื่นๆได้
โปรแกรม ที่จะแปลงไฟล์ดังกล่าวได้นั้น จะมีในคอมพิวเตอร์ที่ลงโปรแกม MIKE ไว้แล้ว
โปรแกรมสำหรับแปลงผลจะมีอยู่ใน folder ที่ลงโปรแกรม MIKE ไว้คือ
C:\Program Files (x86)\DHI\2012\bin\res11read.exe หรือ
C:\Program Files\DHI\2012\bin\res11read.exe
โดยเมื่อสั่งรันโปรแกรมนี้ใน Command prompt จะมีข้อความบอกวิธีการใช้งานดังรูป
จะพบว่ามี option ให้เลือกใช้หลากหลาย แล้วแต่ความต้องการ
โดยสามารถใช้ option ได้มากกว่า 1 อย่าง
ส่วนที่สำคัญเช่น -xy จะทำให้ได้พิกัดตำแหน่งของจุดคำนวณทั้งหมด
-minX จะทำให้ได้ค่าต่ำสุดของ item X โดยค่า X หากเป็นระดับน้ำคือ 1
และสำหรับอัตราการไหลค่า X คือ 2 ดังนั้นถ้าต้องการค่าต่ำสุดของระดับน้ำก็ใช้ -min1
โดยสามารถใช้ option ได้มากกว่า 1 อย่าง
ส่วนที่สำคัญเช่น -xy จะทำให้ได้พิกัดตำแหน่งของจุดคำนวณทั้งหมด
-minX จะทำให้ได้ค่าต่ำสุดของ item X โดยค่า X หากเป็นระดับน้ำคือ 1
และสำหรับอัตราการไหลค่า X คือ 2 ดังนั้นถ้าต้องการค่าต่ำสุดของระดับน้ำก็ใช้ -min1
และสำหรับการแปลงไฟล์ให้ได้ข้อมูลผลคำนวณทั้งหมด จะใช้ -allres
ดังนั้นตัวอย่าง code ใน batch file สำหรับ -allres เป็นดังด้านล่าง
"C:\Program Files (x86)\DHI\2012\bin\res11read.exe" -allres C:\DHI\test.res11 C:\DHI\test.txt
โดยตัวอย่าง text ที่แปลงออกมาจะมีส่วนหัวที่ตายตัว และตามด้วยรายละเอียดผลคำนวณดังรูป
และเช่นเดียวกับบทความก่อนหน้านี้เรื่องการใช้ Batch file ในการสั่งรันแบบจำลอง MIKE11
โปรแกรมแปลงผลคำนวณ ก็สามารถใช้คำสั่งที่เขียนด้วย Virtual basic ใน Excel ที่คล้ายๆกัน
ในการสั่งรันโปรแกรมแปลงผลคำนวณได้เช่นเดียวกัน ดังแสดงตัวอย่าง Code สำหรับ Macro ใน Excel
ดังด้านล่างนี้
'Option Explicit
'--------------Shell API and Constants----------
Private Const WAIT_FAILED = -1&
Private Const WAIT_OBJECT_0 = 0
Private Const WAIT_ABANDONED = &H80&
Private Const WAIT_ABANDONED_0 = &H80&
Private Const WAIT_TIMEOUT = &H102&
Private Const INFINITE = &HFFFFFFFF ' Infinite timeout
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const SYNCHRONIZE = &H100000
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Sub Button1_Click()
Call selectfile
End Sub
Sub selectfile()
Dim res11read As String
Dim res11 As String
Dim res11txt As String
Dim commandl As String
res11read = "C:\Program Files (x86)\DHI\2012\bin\res11read.exe"
res11 = "C:\DHI\Test.res11"
res11txt = "C:\DHI\Test.txt"
commandl = "-allres " + res11 + " " + res11txt
aaa = ShellAndWait(res11read, commandl, vbNormalNoFocus, -1) ' run model and wait it to finish
End Sub
'Purpose : Holds execution until application has closed.
'Inputs : sFilePath = The path to the application to run e.g. "Notepad.exe"
' [sCommandLine] = Any command line arguments
' [lState] = The Window State to run of the shelled program (A Long)
' [lMaxTimeOut] = The maximum amount of time to wait for the process to finish (in secs).
' -1 = infinate
'Outputs : Returns the True if failed open a process or complete within the specified timeout.
'Notes : Similiar to ShellAndHold, but will not get any 'spiking' effects using this method.
Function ShellAndWait(sFilePath As String, Optional sCommandLine, Optional lState As VbAppWinStyle = vbNormalFocus, Optional lMaxTimeOut As Long = -1) As Boolean
Dim lRetVal As Long, siStartTime As Single, lProcID As Long
'Check to see that the file exists
If FileExists(sFilePath) Then
'Add double quotes around the path (otherwise you can't use spaces in the path)
If Left$(sFilePath, 1) <> Chr(34) Then
sFilePath = Chr(34) & sFilePath
End If
If Right$(sFilePath, 1) <> Chr(34) Then
sFilePath = sFilePath & Chr(34)
End If
End If
'Start the shell
lRetVal = Shell(Trim$(sFilePath + " " + sCommandLine), lState)
'Open the process
lProcID = OpenProcess(SYNCHRONIZE, True, lRetVal)
siStartTime = Timer
Do
lRetVal = WaitForSingleObject(lProcID, 0)
If lRetVal = WAIT_OBJECT_0 Then
'Finished process
lRetVal = CloseHandle(lProcID)
ShellAndWait = False
Exit Do
ElseIf lRetVal = WAIT_FAILED Then
lRetVal = CloseHandle(lProcID)
'Failed to open process
ShellAndWait = True
Exit Do
End If
Sleep 100
If lMaxTimeOut > 0 Then
'Check timeout has not been exceeded
If siStartTime + lMaxTimeOut < Timer Then
'Failed, timeout exceeded
lRetVal = CloseHandle(lProcID)
ShellAndWait = True
End If
End If
Loop
End Function
'Purpose : Checks if a file exists
'Inputs : sFilePathName The path and file name e.g. "C:\Autoexec.bat"
'Outputs : Returns True if the file exists
Function FileExists(sFilePathName As String) As Boolean
On Error GoTo ErrFailed
If Len(sFilePathName) Then
If (GetAttr(sFilePathName) And vbDirectory) < 1 Then
'File Exists
FileExists = True
End If
End If
Exit Function
ErrFailed:
'File Exists
FileExists = False
On Error GoTo 0
End Function
'Purpose : Converts a File Name and Path to a Path
'Inputs : sFilePathName The path and file name e.g. "C:\Autoexec.bat"
'Outputs : Returns the path
Function PathFileToPath(sFilePathName As String) As String
Dim ThisChar As Long
For ThisChar = 0 To Len(sFilePathName) - 1
If Mid$(sFilePathName, Len(sFilePathName) - ThisChar, 1) = "\" Then
PathFileToPath = Left$(sFilePathName, Len(sFilePathName) - ThisChar)
Exit For
End If
Next
End Function
====================================================================
Hi,
ตอบลบi tried the same but getting again and again the same options window. but output text file is not getting created.
Try open CMD then run it inside that, so cmd windows not close when finish, then you can see some error if it is.
ลบ