日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeModbus TCP传输初始化

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeModbus TCP传输初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看一下初始化函數,參數只有端口。

/* modbus協議棧初始化 */ eMBErrorCode eMBTCPInit(USHORT ucTCPPort);

在網絡通信過程中,502端口是專門為modbus保留的,其它應用不得占用該端口。在缺省配置的情況下,強制使用502端口。

?

modbus協議棧的初始化,主要工作為tcp初始化,注冊一些接口,設置節點號。

特別要注意節點號問題,由于網絡中通過IP地址尋址,因此節點號對于本機來說就沒什么用了,本機必須使用0xFF。

?

但是對于專門用于通過以太網TCP-IP網絡和MODBUS串行鏈路之間的網關對MODBUS或MODBUS+串行鏈路從站的通信來說。網關轉發數據包給串行鏈路時,節點號被用來尋址從節點。

?

modbus tcp端口初始化,主要就是創建modbus tcp服務器,監聽端口,等待客戶端連接。

/* modbus tcp端口初始化 */ BOOL xMBTCPPortInit(USHORT usTCPPort) {struct tcp_pcb *pxPCBListenNew, *pxPCBListenOld;BOOL bOkay = FALSE;USHORT usPort;/* 默認端口502 */if(usTCPPort == 0){usPort = MB_TCP_DEFAULT_PORT;}else{usPort = (USHORT)usTCPPort;}/* 創建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;}/* 監聽端口 */else if((pxPCBListenNew = tcp_listen(pxPCBListenNew)) == NULL){(void)tcp_close(pxPCBListenOld);bOkay = FALSE;}/* 注冊連接回調函數 */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服務器同時只能接受一個客戶端的連接。

/* 客戶端連接回調函數 */ err_t prvxMBTCPPortAccept(void *pvArg, struct tcp_pcb *pxPCB, err_t xErr) {err_t error;if(xErr != ERR_OK){return xErr;}/* 之前沒有客戶端連接 */if(pxPCBClient == NULL){pxPCBClient = pxPCB;/* 注冊接收回調函數 */tcp_recv(pxPCB, prvxMBTCPPortReceive);/* 注冊錯誤回調函數 */tcp_err(pxPCB, prvvMBTCPPortError);/* 回調函數參數 */tcp_arg(pxPCB, pxPCB);/* 接收字節數置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;}/* 已經有客戶端連接,不允許第二個客戶端連接 */else{prvvMBPortReleaseClient(pxPCB);error = ERR_OK;}return error; }

?

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的FreeModbus TCP传输初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。