วันพุธที่ 3 กรกฎาคม พ.ศ. 2556

การแปลงผลรันแบบจำลอง MIKE11 เป็น ACSII ด้วยโปรแกรม res11read.exe

สำหรับบทความนี้ จะอธิบายการแปลงไฟล์ผลคำนวณของแบบจำลอง 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
และสำหรับการแปลงไฟล์ให้ได้ข้อมูลผลคำนวณทั้งหมด จะใช้ -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
====================================================================

2 ความคิดเห็น:

  1. Hi,
    i tried the same but getting again and again the same options window. but output text file is not getting created.

    ตอบลบ
    คำตอบ
    1. Try open CMD then run it inside that, so cmd windows not close when finish, then you can see some error if it is.

      ลบ