請問LV可以呼叫Fortran程式的DLL檔嗎?

我們最近想要嘗試用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時,計算數值就會亂跳,這樣的設定是否正確合理呢?