使用上(shang)海卓嵐的(de)(de)ZLSN系列串口(kou)轉TCP/IP模塊可以方便的(de)(de)實(shi)(shi)現(xian)(xian)在(zai)下位(wei)機端的(de)(de)TCP聯網(wang)。即(ji)只(zhi)要(yao)通(tong)過(guo)串口(kou)收發(fa)數據即(ji)可實(shi)(shi)現(xian)(xian)TCP/IP數據的(de)(de)收發(fa)。那么對于上(shang)位(wei)機,即(ji)PC機、服(fu)務器等如何通(tong)過(guo)TCP實(shi)(shi)現(xian)(xian)和(he)串口(kou)轉TCP/IP模塊的(de)(de)通(tong)信(xin)呢?基本上(shang)來(lai)說有三(san)種方式:
(1)使用虛擬串口:此時用戶在上位機通過zlvircom虛擬一個com口,這個com口會在驅動底層和TCP/IP轉串口模塊建立網絡連接。上位機還是通過串口(COM口)和TCP/IP模塊通信。更多詳情參考:虛擬串口介紹。
(2)使用Modbus TCP協議:采用ZLAN5142、ZLSN2140、ZLSN3140等具備Modbus TCP轉Modbus RTU的TCP/IP模塊可以實現將Modbus TCP協議直接轉化為RTU協議。這樣用戶上位機可以使用通用的Modbus TCP協議,比如組態軟件、OPC軟件等。這些軟件都是支持Modbus TCP的,這樣用戶可以借助這些工控軟件進行開發。更多詳情參考:Modbus TCP轉RTU介紹。
(3)TCP網絡(luo)軟(ruan)件編寫:第三種方法(fa)是本文(wen)介紹的(de)(de)主要方法(fa),用(yong)戶通過VC、VB、Delphi、C++Builder等開發(fa)環(huan)境開發(fa)出(chu)TCP軟(ruan)件和(he)TCP/IP轉(zhuan)串口模(mo)塊(kuai)通信。幾乎所有(you)的(de)(de)通用(yong)操作系統都支持TCP/IP協議(yi)棧,操作系統提供了一種稱(cheng)之(zhi)為(wei)socket接口的(de)(de)通用(yong)的(de)(de)編程規范來調用(yong)操作系統的(de)(de)TCP/IP協議(yi)棧。實(shi)際中,在(zai)windows上此socket接口就是一個API接口,最終(zhong)用(yong)戶函數的(de)(de)執行,直接調用(yong)了操作系統提供的(de)(de)DLL庫的(de)(de)TCP/IP功(gong)能(neng)。
另外如果用戶需要實現ZLSN模塊特有的一些管理。比如在局域網中搜索模塊、讀取模塊的參數、修改模塊的參數,卓嵐也提供專用的設備管理函數庫DLL。
我們知道TCP/IP轉串口模塊ZLSN2002基本上有TCP服務器、TCP客戶端、UDP這幾種工作模式,對于不同的工作模式,上位機軟件也需要選擇不同的TCP/IP工作模式和他對應:即模塊為TCP服務器時上位機應該為TCP客戶端、模塊為TCP客戶端時上位機應該為TCP服務器、模塊為UDP時上位機也是UDP模式。請參考:TCP的工作模式的選擇介紹。
socket是通(tong)用(yong)(yong)的(de)(de)TCP/UDP調用(yong)(yong)接口,含有的(de)(de)主要(yao)主要(yao)函數(shu)如(ru)表所示:
我們通過socket函數的不同調用。來實現上位機工作在不同的模式:
(1)TCP客戶端模式:上位機調用connect這個socket函數實現向TCP/IP轉串口模塊發起連接,實現TCP客戶端的功能。
(2)TCP服務器模式:上位機調用listen這個socket函數實現TCP服務器功能,即在一個特定端口等待ZLSN2002模塊的連接。
(3)UDP模(mo)式(shi):無需監(jian)聽(ting)和發起連接,直(zhi)接調用send和recv函數發送和接收即(ji)可。
這里提供了免費了socket通信的源代碼程序《計算機端socket編程例子》。在該代碼中(zhong)使用了非常(chang)簡(jian)潔(jie)的代碼,實現了上(shang)位機作為TCP客戶端時的數據收發。讓用戶對socket編程馬上(shang)有一個(ge)初步的印象。
在Microsoft Visula C++中已經對底層的socket接口再進行一次封裝,即更加高級的CAsyncSocket、CSocket類。使用這兩個類可以實現更加容易的編程。在此提供免費的代碼《SocketTest的CSocket編程源代碼》。
發(fa)(fa)(fa)送(song)大(da)量數(shu)據(ju)不(bu)(bu)丟(diu)失的(de)(de)方法:一(yi)些用戶(hu)通過(guo)(guo)計算機向ZLSN模塊發(fa)(fa)(fa)送(song)大(da)批(pi)量數(shu)據(ju),此(ci)時(shi)(shi)由于(yu)網絡發(fa)(fa)(fa)送(song)的(de)(de)數(shu)據(ju)過(guo)(guo)快,而(er)串口的(de)(de)輸出(chu)速度有(you)限,經過(guo)(guo)一(yi)段時(shi)(shi)間(jian)肯定(ding)會導致發(fa)(fa)(fa)送(song)不(bu)(bu)成功(gong)。所以一(yi)般情(qing)況(kuang)下,用戶(hu)需要檢查send()的(de)(de)返(fan)回值,只有(you)返(fan)回值和(he)期望發(fa)(fa)(fa)送(song)的(de)(de)數(shu)據(ju)量一(yi)樣(yang)時(shi)(shi),才算發(fa)(fa)(fa)送(song)完(wan)畢。否則一(yi)定(ding)要繼(ji)續調用send()發(fa)(fa)(fa)送(song)未發(fa)(fa)(fa)送(song)完(wan)畢的(de)(de)數(shu)據(ju)。通過(guo)(guo)這種(zhong)檢測,可以保證發(fa)(fa)(fa)送(song)的(de)(de)數(shu)據(ju)不(bu)(bu)丟(diu)失。