使用上海卓嵐的ZLSN系列串口轉(zhuǎn)TCP/IP模塊可以方便的實(shí)現(xiàn)在下位機(jī)端的TCP聯(lián)網(wǎng)。即只要通過串口收發(fā)數(shù)據(jù)即可實(shí)現(xiàn)TCP/IP數(shù)據(jù)的收發(fā)。那么對(duì)于上位機(jī),即PC機(jī)、服務(wù)器等如何通過TCP實(shí)現(xiàn)和串口轉(zhuǎn)TCP/IP模塊的通信呢?基本上來說有三種方式:
(1)使用虛擬串口:此時(shí)用戶在上位機(jī)通過zlvircom虛擬一個(gè)com口,這個(gè)com口會(huì)在驅(qū)動(dòng)底層和TCP/IP轉(zhuǎn)串口模塊建立網(wǎng)絡(luò)連接。上位機(jī)還是通過串口(COM口)和TCP/IP模塊通信。更多詳情參考:虛擬串口介紹。
(2)使用Modbus TCP協(xié)議:采用ZLAN5142、ZLSN2140、ZLSN3140等具備Modbus TCP轉(zhuǎn)Modbus RTU的TCP/IP模塊可以實(shí)現(xiàn)將Modbus TCP協(xié)議直接轉(zhuǎn)化為RTU協(xié)議。這樣用戶上位機(jī)可以使用通用的Modbus TCP協(xié)議,比如組態(tài)軟件、OPC軟件等。這些軟件都是支持Modbus TCP的,這樣用戶可以借助這些工控軟件進(jìn)行開發(fā)。更多詳情參考:Modbus TCP轉(zhuǎn)RTU介紹。
(3)TCP網(wǎng)絡(luò)軟件編寫:第三種方法是本文介紹的主要方法,用戶通過VC、VB、Delphi、C++Builder等開發(fā)環(huán)境開發(fā)出TCP軟件和TCP/IP轉(zhuǎn)串口模塊通信。幾乎所有的通用操作系統(tǒng)都支持TCP/IP協(xié)議棧,操作系統(tǒng)提供了一種稱之為socket接口的通用的編程規(guī)范來調(diào)用操作系統(tǒng)的TCP/IP協(xié)議棧。實(shí)際中,在windows上此socket接口就是一個(gè)API接口,最終用戶函數(shù)的執(zhí)行,直接調(diào)用了操作系統(tǒng)提供的DLL庫的TCP/IP功能。
另外如果用戶需要實(shí)現(xiàn)ZLSN模塊特有的一些管理。比如在局域網(wǎng)中搜索模塊、讀取模塊的參數(shù)、修改模塊的參數(shù),卓嵐也提供專用的設(shè)備管理函數(shù)庫DLL。
我們知道TCP/IP轉(zhuǎn)串口模塊ZLSN2002基本上有TCP服務(wù)器、TCP客戶端、UDP這幾種工作模式,對(duì)于不同的工作模式,上位機(jī)軟件也需要選擇不同的TCP/IP工作模式和他對(duì)應(yīng):即模塊為TCP服務(wù)器時(shí)上位機(jī)應(yīng)該為TCP客戶端、模塊為TCP客戶端時(shí)上位機(jī)應(yīng)該為TCP服務(wù)器、模塊為UDP時(shí)上位機(jī)也是UDP模式。請(qǐng)參考:TCP的工作模式的選擇介紹。
socket是通用的TCP/UDP調(diào)用接口,含有的主要主要函數(shù)如表所示:
我們通過socket函數(shù)的不同調(diào)用。來實(shí)現(xiàn)上位機(jī)工作在不同的模式:
(1)TCP客戶端模式:上位機(jī)調(diào)用connect這個(gè)socket函數(shù)實(shí)現(xiàn)向TCP/IP轉(zhuǎn)串口模塊發(fā)起連接,實(shí)現(xiàn)TCP客戶端的功能。
(2)TCP服務(wù)器模式:上位機(jī)調(diào)用listen這個(gè)socket函數(shù)實(shí)現(xiàn)TCP服務(wù)器功能,即在一個(gè)特定端口等待ZLSN2002模塊的連接。
(3)UDP模式:無需監(jiān)聽和發(fā)起連接,直接調(diào)用send和recv函數(shù)發(fā)送和接收即可。
這里提供了免費(fèi)了socket通信的源代碼程序《計(jì)算機(jī)端socket編程例子》。在該代碼中使用了非常簡(jiǎn)潔的代碼,實(shí)現(xiàn)了上位機(jī)作為TCP客戶端時(shí)的數(shù)據(jù)收發(fā)。讓用戶對(duì)socket編程馬上有一個(gè)初步的印象。
在Microsoft Visula C++中已經(jīng)對(duì)底層的socket接口再進(jìn)行一次封裝,即更加高級(jí)的CAsyncSocket、CSocket類。使用這兩個(gè)類可以實(shí)現(xiàn)更加容易的編程。在此提供免費(fèi)的代碼《SocketTest的CSocket編程源代碼》。
發(fā)送大量數(shù)據(jù)不丟失的方法:一些用戶通過計(jì)算機(jī)向ZLSN模塊發(fā)送大批量數(shù)據(jù),此時(shí)由于網(wǎng)絡(luò)發(fā)送的數(shù)據(jù)過快,而串口的輸出速度有限,經(jīng)過一段時(shí)間肯定會(huì)導(dǎo)致發(fā)送不成功。所以一般情況下,用戶需要檢查send()的返回值,只有返回值和期望發(fā)送的數(shù)據(jù)量一樣時(shí),才算發(fā)送完畢。否則一定要繼續(xù)調(diào)用send()發(fā)送未發(fā)送完畢的數(shù)據(jù)。通過這種檢測(cè),可以保證發(fā)送的數(shù)據(jù)不丟失。