FreeModbus TCP传输初始化
先看一下初始化函數(shù),參數(shù)只有端口。
/* modbus協(xié)議棧初始化 */ eMBErrorCode eMBTCPInit(USHORT ucTCPPort);在網(wǎng)絡(luò)通信過(guò)程中,502端口是專門(mén)為modbus保留的,其它應(yīng)用不得占用該端口。在缺省配置的情況下,強(qiáng)制使用502端口。
?
modbus協(xié)議棧的初始化,主要工作為tcp初始化,注冊(cè)一些接口,設(shè)置節(jié)點(diǎn)號(hào)。
特別要注意節(jié)點(diǎn)號(hào)問(wèn)題,由于網(wǎng)絡(luò)中通過(guò)IP地址尋址,因此節(jié)點(diǎn)號(hào)對(duì)于本機(jī)來(lái)說(shuō)就沒(méi)什么用了,本機(jī)必須使用0xFF。
?
但是對(duì)于專門(mén)用于通過(guò)以太網(wǎng)TCP-IP網(wǎng)絡(luò)和MODBUS串行鏈路之間的網(wǎng)關(guān)對(duì)MODBUS或MODBUS+串行鏈路從站的通信來(lái)說(shuō)。網(wǎng)關(guān)轉(zhuǎn)發(fā)數(shù)據(jù)包給串行鏈路時(shí),節(jié)點(diǎn)號(hào)被用來(lái)尋址從節(jié)點(diǎn)。
?
modbus tcp端口初始化,主要就是創(chuàng)建modbus tcp服務(wù)器,監(jiān)聽(tīng)端口,等待客戶端連接。
/* modbus tcp端口初始化 */ BOOL xMBTCPPortInit(USHORT usTCPPort) {struct tcp_pcb *pxPCBListenNew, *pxPCBListenOld;BOOL bOkay = FALSE;USHORT usPort;/* 默認(rèn)端口502 */if(usTCPPort == 0){usPort = MB_TCP_DEFAULT_PORT;}else{usPort = (USHORT)usTCPPort;}/* 創(chuàng)建tcp控制塊 */if((pxPCBListenNew = pxPCBListenOld = tcp_new()) == NULL){bOkay = FALSE;}/* 綁定端口 */else if(tcp_bind(pxPCBListenNew, IP_ADDR_ANY, (u16_t)usPort) != ERR_OK){(void)tcp_close(pxPCBListenOld);bOkay = FALSE;}/* 監(jiān)聽(tīng)端口 */else if((pxPCBListenNew = tcp_listen(pxPCBListenNew)) == NULL){(void)tcp_close(pxPCBListenOld);bOkay = FALSE;}/* 注冊(cè)連接回調(diào)函數(shù) */else{tcp_accept(pxPCBListenNew, prvxMBTCPPortAccept);pxPCBListen = pxPCBListenNew;#ifdef MB_TCP_DEBUGvMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Protocol stack ready.\r\n" ); #endif}bOkay = TRUE;return bOkay; }modbus tcp服務(wù)器同時(shí)只能接受一個(gè)客戶端的連接。
/* 客戶端連接回調(diào)函數(shù) */ err_t prvxMBTCPPortAccept(void *pvArg, struct tcp_pcb *pxPCB, err_t xErr) {err_t error;if(xErr != ERR_OK){return xErr;}/* 之前沒(méi)有客戶端連接 */if(pxPCBClient == NULL){pxPCBClient = pxPCB;/* 注冊(cè)接收回調(diào)函數(shù) */tcp_recv(pxPCB, prvxMBTCPPortReceive);/* 注冊(cè)錯(cuò)誤回調(diào)函數(shù) */tcp_err(pxPCB, prvvMBTCPPortError);/* 回調(diào)函數(shù)參數(shù) */tcp_arg(pxPCB, pxPCB);/* 接收字節(jié)數(shù)置0 */usTCPBufPos = 0;#ifdef MB_TCP_DEBUGvMBPortLog(MB_LOG_DEBUG, "MBTCP-ACCEPT", "Accepted new client %d.%d.%d.%d\r\n",ip4_addr1(&(pxPCB->remote_ip)), ip4_addr2(&(pxPCB->remote_ip)),ip4_addr3(&(pxPCB->remote_ip)), ip4_addr4(&(pxPCB->remote_ip))); #endiferror = ERR_OK;}/* 已經(jīng)有客戶端連接,不允許第二個(gè)客戶端連接 */else{prvvMBPortReleaseClient(pxPCB);error = ERR_OK;}return error; }?
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的FreeModbus TCP传输初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 张泉灵:时代抛弃你时,连一声再见都不会说
- 下一篇: 果断收藏!156页PPT全景展现全球区块