我們最近想要嘗試用LabVIEW程式呼叫Fortran程式編譯的DLL資料庫,不知到LabVIEW程式可以做嗎?我們有使用過 CALL Library Function Node,可能是因為我們不會使用,一直會出現錯誤,如果方便能否提供我們解決的方法。
謝謝!
我們最近想要嘗試用LabVIEW程式呼叫Fortran程式編譯的DLL資料庫,不知到LabVIEW程式可以做嗎?我們有使用過 CALL Library Function Node,可能是因為我們不會使用,一直會出現錯誤,如果方便能否提供我們解決的方法。
謝謝!
當然可以呼叫DLL啊 不管該DLL是用那個程式寫的
比較需要注意的 就是Data Type的轉換
您可以講的更詳細嗎?
看到您的回信,真是高興,因為我已經試了好幾天,一直有問題,真是好悶,其實現在遇到的問題也是變數形式和矩陣的定義在,FORTRAN程式是國外公司撰寫的,我們之前有利用VB連結成功,但是現在想利用LV來即時顯示計算數據,我可以將FORTRAN程式中有關輸出DLL的程式碼寄給你看看嗎?
請問FORTRAN的矩陣INDEX起始值為1,而LV的為0,這會有影響嗎?
期待您的協助,謝謝!
你可以把相關訊息貼在這裡給大家瞧瞧 一起研究一下嗎?
例如一些header file之類的 或是該DLL檔的說明文件
如果是像別人買來的Fortran函式庫 應該都有一些文件可以參考
您可以擷取無洩密顧慮的部分與我們分享嗎?
平常都是呼叫C或Win32API的情形比較多
Fortran的DLL呼叫算是個新課題
如果有需要大量數值計算的應用 以Fortran的數值計算能力配上LabVIEW來設計系統
應該是個頗讚的應用
您好:
下面是Fortran程式中輸出*.DLL的部分程式內容
SUBROUTINE PMAAP(INPFILE,SEQTITLE,TIMENOW,IMDONE,IMGCH,PNUMBER,
. S_EVENTS,S_LEVELS,S_CMASS,S_OEVENTS,S_AEVENTS,
. MVVARS,MVVALS,S_CTEMP,S_SYSTEM,
. S_CRMTEMP,RADIAL,AXIAL)
IMPLICIT REAL (A-H,K-Z)
!MS$ATTRIBUTES DLLEXPORT :: PMAAP
!MS$ATTRIBUTES ALIAS: 'pmaap' :: PMAAP
!MS$ATTRIBUTES STDCALL :: PMAAP
!MS$ATTRIBUTES REFERENCE :: INPFILE
!MS$ATTRIBUTES REFERENCE :: SEQTITLE
!MS$ATTRIBUTES REFERENCE :: TIMENOW
!MS$ATTRIBUTES REFERENCE :: IMDONE
!MS$ATTRIBUTES REFERENCE :: IMGCH
!MS$ATTRIBUTES REFERENCE :: PNUMBER
INTEGER IMDONE, PNUMBER
CHARACTER*80 SEQTITLE,INPFILE,SCREENOUTPUT
CHARACTER*10 MVVARS
REAL S_EVENTS(350),S_LEVELS(350),S_CMASS(10,20),S_CTEMP(10,20)
REAL S_OEVENTS(350), S_AEVENTS(350),MVVALS(500),S_SYSTEM(25)
REAL IMGCH(25),S_CRMTEMP(10)
REAL TIMENOW
........
在REFERENCE 後面就是DLL中需要輸入的變數,每個變數都有定義型態,例如變數IMDONE的型態為INTEGER,
我在利用LV中Call Function Library Node,目前最大的困難是變數型態的定義,同時矩陣也有問題,因為FORTRAN的INDEX從1開始,而LV是從0開始,不知道該如何解決。希望有經驗的人,能提供一些作法。謝謝!
ARRAY INDEX這個好解決 加一或減一就好啊
,如謝謝您的回覆。可能是我對問題描述的不太清楚,您的LV程式好像只是將INDEX加1。FORTRAN程式在宣告陣列,如MAX(2)是表示MAX(1)與MAX(2),而LV中MAX(2)是表示MAX(0)與MAX(1),因此在將LV變數傳入FORTRAN DLL的函數中,不知道是否會造成影響呢?
你是說這樣嗎?
這就不清楚了 要試才知道 如果不用另外處理可以直接將Array傳入DLL當然最好
要是不行 我覺得您可以試試一個方法
既然Fortran是INDX是由1開始 說不一定(這我自己亂想的啦) 假設LabVIEW裡的一個Array 由0~n 您實際使用是1~n 那[0]裡面放一個隨便的值 這樣搞不好可以唷
我手上沒有任何這類的DLL可以供我試驗 所以還麻煩您自行嘗試了
我曾經嘗試過,就是把LV的矩陣加大,可是仍然會有錯誤,而且LV的錯誤訊息都太簡略,所以不確定錯誤發生在哪裡?因為現在這個DLL程式的變數太多,我目前先利用Visual Fortran寫一個簡單的DLL檔案來測試其結果。
我最近寫了一個簡單的FORTRAN程式的DLL檔案,然後用LV呼叫,在不傳入任何變數的情形下,一切OK!但是在嘗試傳入變數時,就會出錯。以下是我的FORTRAN程式
!MS$ ATTRIBUTES DLLEXPORT::TEST2
subroutine TEST2(I)
! Variables
INTEGER*4 I
! Body of TEST1
I=I*2
end subroutine
在LV中我使用Call Function Library Node,RETURN TYPE為Numeric, unsign 8-bite Interger,變數i為Numeric, unsign 8-bite Interger, point to value。不知道這樣使用有無錯誤?
Pointer to value通常用在DLL檔傳出時使用 表示DLL傳回一個Pointer指向所傳出之值
你要傳入DLL檔選value就行了
您好,我依照你建議的方式修改,可是仍會發生錯誤,請問INTEGER在LV中分為sigh與unsign,有何不同?同時我是要選擇8-bite, 16bite,32bite?
[QUOTE=bull]
您好,我依照你建議的方式修改,可是仍會發生錯誤,請問INTEGER在LV中分為sigh與unsign,有何不同?同時我是要選擇8-bite, 16bite,32bite?
[/QUOTE]
Sign是有號數 有正數和負數 unsign顧名思義 只有正數及0 無負數
8bit的unsign範圍為0~255, 16bit的unsign為0-65535 以此類推..
我今天修改FORTRAN程式中INTEGER*4 I改為INTEGER I,因為FORTRAN中TNTEGER的數值為8 bite,這樣和LV較為一致,LV的NODE定義與以前相同,第一次測試時仍會發生錯誤,後來calling conversions 由改為stdcall,居然就可以正常運算,除因為變數定義是8 bite,所以當計算值超過255時,計算數值就會亂跳,這樣的設定是否正確合理呢?