精品视频一区二区观看,欧美一区二区视频三区,日韩一区二区三区不卡,欧美中文综合在线视频,欧美综合网亚洲综合网

      ? ? ? ?

      咨詢電話

      ENGLISH0755-88840386
      新聞中心

      咨詢電話

      0755-88840386
      您的位置:首頁 > 學(xué)習(xí)專題 > 專業(yè)技術(shù)專題 > 工業(yè)自動(dòng)化稱重儀表>詳情頁

      稱重顯示器串口通信動(dòng)態(tài)鏈接庫設(shè)計(jì)

      發(fā)布時(shí)間:2021-07-02 09:32:31 |來源:網(wǎng)絡(luò)轉(zhuǎn)載

      1概述

          隨著計(jì)算機(jī)軟硬件技術(shù)的飛速發(fā)展和廣泛應(yīng)用,微型計(jì)算機(jī)(PC)的應(yīng)用已非常普及,衡器行業(yè)也不例外,采用計(jì)算機(jī)進(jìn)行稱重管理的電子秤逐年增多。雖然各衡器廠家都有自己配套的稱重管理軟件,但是隨著各行各業(yè)對稱重管理的更高和不同的需求,特別是生產(chǎn)過程中的稱重管理與生產(chǎn)的產(chǎn)品和工藝流程密切相關(guān),無法用通用的稱重軟件來滿足不同用戶的要求,要開發(fā)適合不同行業(yè)且實(shí)用性強(qiáng)的稱重軟件,編程人員必須對不同行業(yè)的稱重過程或工藝流程非常熟悉,為了縮短開發(fā)周期增強(qiáng)軟件的實(shí)用性和便于維護(hù),用戶一般會(huì)選擇熟悉本行業(yè)的編程人員來開發(fā)此類軟件。目前,各稱重顯示器的生產(chǎn)廠家,沒有配備串口通信驅(qū)動(dòng)程序,雖然現(xiàn)在的軟件開發(fā)工具如VB. VFP等都自帶串口通信控件,較易實(shí)現(xiàn)串口通信程序的設(shè)計(jì),但是對于大多數(shù)善于編寫管理程序而對串口通信不熟悉的非衡器行業(yè)的編程人員來說,還是有一定難度的。

          為了滿足對串口通信不熟悉的編程人員盡快掌握稱熏顯示器與計(jì)算機(jī)的通信,避免接觸陌生而枯燥的串口通信術(shù)語,通過把串口通信的復(fù)雜性用較易使用的動(dòng)態(tài)鏈接庫(DLD封裝起來,編程人員只要通過幾個(gè)函數(shù)的簡單調(diào)用,就可實(shí)現(xiàn)電子秤的稱重?cái)?shù)據(jù)讀取,極大地方便了串口通信的設(shè)計(jì)。下面將介紹用Delphi編寫稱熏顯示器串口通信動(dòng)態(tài)鏈接庫的方法(以耀華XK3190-AI-I稱重顯示器為例)。

      2稱重顯示器串口通信動(dòng)態(tài)鏈接庫的實(shí)現(xiàn)

          動(dòng)態(tài)鏈接庫是一個(gè)能夠被應(yīng)用程序和其它的DLL調(diào)用的過程和函數(shù)的集合體,它里面包含的是公共代碼或資源。DLL代碼使用了內(nèi)存共享技術(shù)為不同語言間代碼共享提供了一條方便的途徑,因而DLL在編程時(shí)應(yīng)用較為廣泛。

          2 1用Delphi編寫DLL庫

          在Delphi環(huán)境中,編寫一個(gè)DLL同編寫一個(gè)一般的應(yīng)用程序并沒有太大的區(qū)別,除了在內(nèi)存、資源的管理上有所不同外并不需要其它特別的手段。

          在Delphi主菜單File中選New子菜單的0ther…項(xiàng),在彈出的窗口中雙擊DLL圖標(biāo),便會(huì)自動(dòng)繪出DLL源模塊框架如下:

      library Project1:

      {注釋  }

      uses

          SysU tils  C lasses

      {SR *res}

      begin

      end.

          接下來便可在uses和begin之間加入想在該DLL中實(shí)現(xiàn)的過程和函數(shù)的定義并用export和ex-ports保留字把它們引出,以便于模塊引用,在begin和end之間加入初始化代碼。本文編寫的動(dòng)態(tài)鏈接庫名稱及函數(shù)定義如下:

          ComD ev32 dll為動(dòng)態(tài)鏈接庫,ComD ev32 dll中包括四個(gè)對串口操作的函數(shù),分別為0penComm:打開設(shè)備;ReceiveData讀取設(shè)備數(shù)據(jù):SendData發(fā)送數(shù)據(jù)到設(shè)備;StopComm:關(guān)閉設(shè)備。

          按照定義的庫名稱并加入函數(shù)后的動(dòng)態(tài)鏈接庫的源代碼如下:

      library ComDev32:

      {注釋  }

      uses

          SysUtils, W indows, Classes;

      {$R * res}

      ∥打開通信端口函數(shù)

      function OpenComm (port, baud: integer):integer: ex-por stdcall;

       var

       hComm: Thandle;

       cc: TCOMMCONFIG;

       Temp: string;

       begin

        if  port>4 then

          M essageBox(0,’端口號不能大于4! !’,”,MB_OK);

        case port of

          1: Tempp:=’COMl’;

          2: Temp=’COM2’;

          3: Temp:=’COM 3’;

          4: Temp=’COM 4’;

          end;

          Result=0;

          hComm:=CreateFile(Pchar(temp),GENERIC_READ orGENERIC__ WRITE,0,nil OPEN EXISTING,0,0);

      //打開COM

      if( hComm =INVALID_HANDLE__ VALUD  then

      begin∥如果COM未打開

          M essageBox(0’打開通信端口錯(cuò)誤!!’,”,MB_OK);

          exit

        end;

        SetupComm( hComm , 1024, 512);

        GetCommState(hComm,cc dcb);    ∥得知目前COM的狀態(tài)

        cc dch BaudRate =baud;    ∥設(shè)置波特率為baud

        cc dch ByteSize =8;    ∥字節(jié)為8 bit

        cc dch Parity:=NOPARITY.    ∥Parity為None

        cc dcb StopB its=ONESTOPBIT    ∥1個(gè)Stop bit

        if not SetCommState(hComm,cc dcb) then begin    ∥設(shè)置COM的狀態(tài)

          M essageBox(0,’通信端口設(shè)置錯(cuò)誤?。。?rsquo;,",MB_OK);

        CloseH andle( hComm):

        exit

        end;

        R esult=hComm;

      end;

      ∥關(guān)閉通信端口函數(shù)

      function StopComm(comdev:integer):export;

       stdcall;

      begin

        Result=0;

        try

        CloseHandle( comdev):

          except

          Resu lt=-l;

        end;

      end;

      exports

        OpenComm,  S topComm,  ReceiveD ata  SendD ata;

      begin

      end

       2 2編譯生成動(dòng)態(tài)鏈接庫

          在D elph莊菜單Project中選Compile ComDev32子菜單項(xiàng)進(jìn)行編譯,最后生成所需的稱重顯示器串口通信動(dòng)態(tài)鏈接庫為:ComD ev32 dll。

      3動(dòng)態(tài)鏈接庫的使用

      ComDev32.dll 中 主 要 包 括 三 個(gè) 函 數(shù) Open-Comm、 ReceiveData、 StopComm , 函數(shù)的功能為:OpenComm: 打開設(shè)備; ReceiveData: 讀取設(shè)備數(shù)據(jù);StopComm: 關(guān)閉設(shè)備; comdev 為全局變量。

      使用時(shí),首先把ComD ev32 dll文件復(fù)制到調(diào)用程序的安裝目錄(可執(zhí)行文件所在的目錄)或操作系統(tǒng)的systemn(或system32目錄下,然后在調(diào)用它的程序中按:打開設(shè)備→讀取設(shè)備數(shù)據(jù)→關(guān)閉設(shè)備的順序調(diào)用。不同開發(fā)工具函數(shù)調(diào)用示例如下:

      在VFP中:** 在表單的初始化事件中 ( Init Event )

      DECLARE INTEGER OpenComm IN comdev32.dll INTEGER , INTEGER

      comdev=OpenComm ( 1 , 4800 ) ** 打開串口, 如稱重顯示器接計(jì)算機(jī) COM1 口, 且稱重顯示器波特率設(shè)為 4800

      ** 在讀取按鈕事件中 ( Click Event )

      DECLARE STRING ReceiveData IN comdev32.dll INTEGER

      instring=ReceiveData ( comdev ) ** 把讀取的重量數(shù)據(jù)賦給 instring 字符串變量

      ** 在表單的退出事件中 ( Destroy Event )

      DECLARE INTEGER StopComm IN comdev32.dll INTEGER

      StopComm ( comdev ) ** 關(guān)閉打開的串口

      在 VB中:

      (在通用模塊中聲明 ( Module1 )

      Option Explicit

      Global comdev As Long

      ‘ comm function

      Declare Function OpenCommLib "comdev32.dll" ( ByVal port As Long , ByVal baud As Long ) As Integer

      Declare Function StopCommLib "comdev32.dll" ( ByVal comdev As Long ) As Integer

      DeclareFunctionReceiveDataLib"comdev32.dll" ( ByVal comdev As Long ) As String

      ‘在表單的 Load 事件中

      Private Sub Form_Load ( )

      comdev=OpenComm ( 1 , 4800 )’打開串口, 如稱重顯示器接計(jì)算機(jī) COM1 口, 且稱重顯示器波特率設(shè)為 4800

      End Sub

      ‘在表單的 UnLoad 事件中

      Private Sub Form_Unload ( Cancel As Integer )

      Stop Comm ( comdev ) ‘關(guān)閉打開的串口

      End Sub

      ‘在按鈕的 Click 事件中

      Private Sub Command1_Click ( )

      Text1.Text = ReceiveData ( comdev )’在 Text1 編輯框中, 顯示電子秤數(shù)據(jù)

      End Sub

      在 Delphi中:

      // 在 implementation 中, 添加函數(shù)如下:

      var

      Form1 : TForm1 ;

      comdev : integer ; //comdev 為全局變量

      implementation

      {SR *.dfm}

      function OpenComm ( port,baud:integer ) : integer ; far ;

      stdcall ; external ‘ comdev32.dll ‘;

      function StopComm ( comdev:integer ) : integer ; stdcall ;

      external ‘comdev32.dll ‘;

      function ReceiveData ( comdev:integer ) : pchar ; stdcall ;

      external ‘ comdev32.dll’;

      // 在窗體的 Create 事件中

      procedure TForm1.FormCreate ( Sender : TObject ) ;

      begin

      comdev:=OpenComm ( 1 , 4800 ) ; // 例如打開 COM1口, 波特率為 4800

      end ;

      // 在窗體的 Destroy 事件中

      procedure TForm1.FormDestroy ( Sender : TObject ) ;

      begin

      StopComm ( comdev ) ; // 關(guān)閉打開的串口

      End

      // 在 Button1 的 Click 事件中

      procedure TForm1.Button1Click ( Sender : TObject ) ;

      begin

      edit1.Text:=ReceiveData ( comdev ) ;//在 Edit1 編輯框中, 顯示電子秤數(shù)據(jù)

      end ;

      4 結(jié)束語

      本文介紹了用動(dòng)態(tài)鏈接庫實(shí)現(xiàn)稱重顯示器與計(jì)算機(jī)通信的方法, 在實(shí)際應(yīng)用中為了可靠讀取數(shù)據(jù)應(yīng)把讀取數(shù)據(jù)模塊放到定時(shí)器的定時(shí)事件中循環(huán)讀取&其實(shí)對熟悉串口通信的編程人員來說, 有很多更好的方法來實(shí)現(xiàn)串口通信, 如利用微軟的 MSCOMM控件或 API 函數(shù) ( 本文的 DLL 就是用 API 函數(shù)實(shí)現(xiàn)的, 有關(guān) API 函數(shù)的定義和說明可查閱相關(guān)資料) 。

       

      本文源于網(wǎng)絡(luò)轉(zhuǎn)載,如有侵權(quán),請聯(lián)系刪除

      分享到