色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

i.MX RT1024:移植MODBUS TCP協議棧教程

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 2023-05-31 17:28 ? 次閱讀

教程簡介 MODBUS是一種基于主從結構的控制協議,由一個主機和多個從機組成。 MODBUS是施耐德電氣于1979年為可編程邏輯控制器PLC通信所開發并發布的協議,至今已有相當長的歷史。 以前它主要基于串口,但由于物聯網的發展,基于TCP的MODBUS現在被越來越廣泛地使用。恩智浦的i.MX RT 系列控制器的SDK中沒有相關的demo,本文的目標是向大家介紹如何在SDK中的lwip_ping_freertos例程基礎上添加MODBUS TCP。

MODBUS 協議棧的下載地址:

https://www.embedded-experts.at/en/freemodbus/

測試軟件QModMaster 的下載地址:

https://sourceforge.net/projects/qmodmaster/

我在本次教程使用了MIMXRT1024-EVK 作為硬件平臺,MIMXRT1024-EVK 和電腦都連接到一臺路由器組成一個測試網絡。使用 MCUXpresso IDE 作為開發環境,MIMXRT1024-EVK SDK 版本是 2.12.1。 一、文件復制

下載完協議棧后,先解壓,隨后將其中的 modbus 目錄完整復制到 lwip_ping_freertos 工程目錄下,添加 modbus 及其所有子文件夾到工程的 include paths 中。

95aac492-ff8d-11ed-90ce-dac502259ad0.png

在協議棧里有一個demo 目錄,里面是modbus 被移植到各個廠商處理器上的demo, 可惜沒有i.MX RT。仔細對比各個 demo 就可以發現,原來這些 demo 有很多就是基于freertos 和 lwip 的。我們就從 MCF5235 TCP 下手,它既有freertos 又有lwip,完美符合我們的項目。可以把它的 port 目錄復制到我們項目的modbus 目錄下。把其中的文件全部涵蓋進來。

二、修改程序

接下來首先是在 lwip_ping_freertos.c 中include “mb.h”。這個文件包含了 freemodbus 協議棧提供的所有接口函數。

1.程序結構

Lwip 協議棧為用戶應用程序的編寫提供 3 種編程接口:

第一種是Raw Callback API,這種方式下協議棧與用戶程序間通過回調函數實現通信。而且協議棧同應用程序處在同一個進程中,彼此間的執行都會互相制約。

第二種是 Sequential API 方式,用戶向內核注冊回調函數,并通過直接調用內核 UDP 或TCP 相關操作函數來完成應用程序的編寫。在這種方式下,協議棧內核運行于進程 tcpip_thread, 而應用程序進程也是一個單獨的進程。獨立的進程結構可以使協議棧和應用程序的執行互不影響。通過使用郵箱和信號量等機制,內核進程可以直接將數據遞交給應用程序郵箱中然后繼續執行,不必阻塞等待。

第三種是使用 BSD socket 函數進行應用程序開發。本來這是最簡單的方式,但是由于BSD socket 函數在實現上高度抽象,不適合小型嵌入式TCP/IP 應用,所以 lwip 里的socket 函數并不是非常完整。

為實現與 lwip 協議棧之間的相互調用,freemodbus 協議棧采用的是sequential API 方式。具體的調用順序如下:在 mb.c 中提供了 eMBTCPInit() 函數, 這個函數調用eMBTCPDoInit()函數, 隨后層層調用下去,最后在 xMBTCPPortInit()函數中調用 tcp_bind()。這個函數是 lwip 的 tcp.c 提供的。下圖反映出了 modbus 協議棧的層次結構。

95c43224-ff8d-11ed-90ce-dac502259ad0.png

最下層的tcp_bind()函數的作用是將一個連接結構與本地 IP地址addr和端口號 port 進行綁定。作為服務器端程序,執行這一步操作是必要的,服務器必須與熟知端口進行綁定才能接受客戶端的連接請求。這里可以看到,freemodbus協議棧并沒有以最標準的方式調用netconn_bind()進行綁定,而是直接調用 tcp_bind()。原因應該是這樣做可以免去IPC 通信過程,在無操作系統的環境下也能工作。

tcp_listen()的任務是讓 tcp 內核監聽這個端口;tcp_accept()是為新的連接注冊一個回調函數prvxMBTCPPortAccept()。在tcpip_thread()進程監聽到有效連接后會回調這個函數。而這個函數會把 modbus 的數據包從 tcp 數據包中復制出來,隨后發送 mailbox 信息給modbus 的進程,用來處理消息。

2. 修改接口

95cefef2-ff8d-11ed-90ce-dac502259ad0.png

95cefef2-ff8d-11ed-90ce-dac502259ad0.png

隨后是修改porttcp.c。在這個文件中的 prvxMBTCPPortReceive()函數有一個致命問題必須被改正。這個函數是 tcpip_thread()核心進程在收到 modbus 包后的回調函數。當數據處理完成后它會調用pbuf_free()函數釋放pbuf包并返回 ERR_OK。tcpip_thread()核心進程收到ERR_OK就知道數據已經處理完了,就可以放心踏實的干別的事情了。然而不知為何,這里的 prvxMBTCPPortReceive() 函數在某些時候釋放了pbuf卻并不返回 ERR_OK。于是tcpip_thread()核心進程在沒有收到正確的返回值時會認為數據包沒有被處理,會把這個實際已經廢棄的包暫存下來,下次再處理。等到下次處理時就會產生 pbuf錯誤,使得整個程序被鎖死。

以下是修改的地方:

95eac7e0-ff8d-11ed-90ce-dac502259ad0.png

3. 上層代碼編寫

接下去是為上層應用寫的示例代碼。以下 code 全部都是在 lwip_ping_freertos.c 中。 3.1 Tcpip協議棧初始化 我沒有指定 IP 地址,而是由路由器來分配。

96145ab0-ff8d-11ed-90ce-dac502259ad0.png

962106de-ff8d-11ed-90ce-dac502259ad0.png

3.2Modbus協議棧初始化

96367dde-ff8d-11ed-90ce-dac502259ad0.png

964ab6e6-ff8d-11ed-90ce-dac502259ad0.png

這個進程首先是等 DHCP 拿到路由器給的 IP 地址,隨后就可以初始化 modbus 協議,并采用輪詢方式等待連接。

3.3編寫各種命令對應的程序9662114c-ff8d-11ed-90ce-dac502259ad0.png

966f3142-ff8d-11ed-90ce-dac502259ad0.png

9686d4be-ff8d-11ed-90ce-dac502259ad0.png

96a11d92-ff8d-11ed-90ce-dac502259ad0.png

三、驗證 連接所有線路后編譯下載。我們的程序會在串口打印出路由器給它分配的 IP 地址。

96b7dffa-ff8d-11ed-90ce-dac502259ad0.png

打 開 QModMaster, Modbus 模式選 TCP;

選項->Modbus TCP->從機 IP 填獲得的 IP 地址,端口是 502;功能碼選Read Holding Register (0x03),起始地址 100;

寄存器數量選 6,Data Format 選 16 進制; 按連接按鈕,QModMaster 就能和我們的板子連上,按鈕變成連接起來的樣子;按旁邊讀寫按鈕,就能讀出register的值(見程序vTask_HoldingRegister())。 一切順利,移植成功!

96d03a14-ff8d-11ed-90ce-dac502259ad0.png

QModMaster有一個總線監視器窗口,可以看到收發的數據。

96f4fb56-ff8d-11ed-90ce-dac502259ad0.png

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16433

    瀏覽量

    178950
  • 協議棧
    +關注

    關注

    2

    文章

    144

    瀏覽量

    33677
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1044

    瀏覽量

    46123

原文標題:i.MX RT1024: 移植 MODBUS TCP協議棧教程

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    i.MX RT1020到i.MX RT1010的遷移手冊

    i.MX RT1020到i.MX RT1010的遷移指南
    發表于 12-12 06:25

    i.MX RT1060到i.MX RT1064的遷移手冊

    i.MX RT1060到i.MX RT1064的遷移指南
    發表于 12-12 07:21

    i.MX RT1024功耗測量應用說明在哪里?

    NXP 文檔 i.MX RT1024工業產品跨界處理器數據表提到i.MX RT1024 功耗測量應用說明- 但該說明未在 RT1024
    發表于 03-23 08:17

    如何將i.MX RT1024與外部64MB SDRAM一起使用?

    我想將 i.MX RT1024 與外部 64MB SDRAM 一起使用。根據數據表,它支持 8/16 位 SDRAM 外部存儲器接口。從性能的角度來看,哪種模式更好?如何?如果有任何鏈接/參考可以通過此詳細信息,請告訴我。謝謝
    發表于 05-05 11:17

    01:i.MX RT的市場應用和參考解決方案

    i.MX RT產品是今年市場上最受歡迎的跨界MCU產品。i.MX RT定位為一款MCU產品,它可以重復利用傳統的Arm MCU生態系統。除此之外,本次講座還將簡要介紹
    的頭像 發表于 01-21 07:13 ?3389次閱讀
    01:<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的市場應用和參考解決方案

    恩智浦i.MX RT1170開創GHz MCU時代

    自2017年上市以來,i.MX RT系列取得了優秀的市場表現。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發表于 03-22 11:14 ?3520次閱讀

    恩智浦i.MX RT1170在將該系列帶上了更高的層面

    自2017年上市以來,i.MX RT系列取得了優秀的市場表現。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發表于 05-18 11:15 ?3830次閱讀

    i.MX RT開發筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    系列文章目錄i.MX RT開發筆記-01 | 初識 i.MX RT1062 跨界MCUi.MX RT
    發表于 12-01 13:51 ?2次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>開發筆記-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    RT-Thread & NXP 發布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界處理器系列。該系列下又包括 i.MX RT1020、i.MX
    發表于 12-07 13:06 ?2次下載
    <b class='flag-5'>RT</b>-Thread & NXP 發布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    適用于i.MX RT500和i.MX RT600 MCU的Xtensa音頻框架介紹

    在眾多的恩智浦i.MX RT跨界處理器當中,您可能會發現有些系列除了Arm內核之外還結合了高性能的DSP,利用集成DSP的技術優勢,可提供高性能音頻數字信號處理能力,并包含特定算法操作,可實現完全
    的頭像 發表于 11-10 09:39 ?2767次閱讀

    RT-Thread文檔_野火 I.MX RT1052上手指南

    RT-Thread文檔_野火 I.MX RT1052 上手指南
    發表于 02-22 18:25 ?2次下載
    <b class='flag-5'>RT</b>-Thread文檔_野火 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT</b>1052上手指南

    i.MX RT10xx使用FlexIO實現XY2-100振鏡控制協議

    本文介紹了如何使用i.MX RT系列芯片上的FlexIO實現XY2-100激光振鏡控制協議。FlexIO模塊是NXP Kinetis和i.MX RT
    的頭像 發表于 05-18 09:21 ?6039次閱讀
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>10xx使用FlexIO實現XY2-100振鏡控制<b class='flag-5'>協議</b>

    i.MX RT的FlexRAM配置問題

    i.MX RT的FlexRAM配置問題
    的頭像 發表于 10-24 15:46 ?845次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置問題

    使用LwIP協議淺析實戰分析(i.MX RT

    既可以移植到操作系統上運行,也可以在無操作系統的情況下獨立運行。? ? ?TCP/IP協議的模型結構如下圖所示,由于TCP/IP
    的頭像 發表于 02-02 17:05 ?1870次閱讀
    使用LwIP<b class='flag-5'>協議</b><b class='flag-5'>棧</b>淺析實戰分析(<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>)

    如何在i.MX RT微控制器上初始化LWIP協議

    i.MX RT微控制器上初始化LWIP協議是一個復雜但有趣的過程,它涉及多個步驟和關鍵組件的配置.
    的頭像 發表于 10-12 11:48 ?416次閱讀
    如何在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>微控制器上初始化LWIP<b class='flag-5'>協議</b><b class='flag-5'>棧</b>
    主站蜘蛛池模板: 国产精品久久久久久久A片冻果| 2021国产精品| 成人性生交片无码免费看| 国产精品久久婷婷五月色 | 女性性纵欲派对| 巨胸美女狂喷奶水www网麻豆| 国产在线精彩视频| 嗯呐啊唔高H兽交| 亚洲欧美精品一中文字幕| 亚洲欧美强伦一区二区另类| xnxnxn69日本| 国产成人在线观看网站| 妈妈的职业3完整版在线播放| 久久香蕉国产线看观看| 特级淫片大乳女子高清视频| 99在线精品免费视频| 久久国产精品久久国产精品 | 久久精品无码一区二区日韩av| 日日碰狠狠添天天爽| 四川老师边上网课边被啪视频| 97人人看碰人免费公开视频 | 99热这里只有精品8| 激情男女高潮射精AV免费| 四虎影院网红美女| old老男人野外树林tv| 免费99精品国产人妻自在线| 日韩精品亚洲专区在线影院| 97综合久久| 么么哒日本影院| 伊人色综合久久天天| 99热久久久无码国产精品性麻豆| 99久女女精品视频在线观看| 久久本道久久综合伊人| 亚洲乱码在线卡一卡二卡新区| 国产精品97久久AV色婷婷综合| 久草色在线| 亚洲精品久久久久AV无码| 2019午夜福利757视频第12集| qvod理论电影| 欧美区 bt| 啊…嗯啊好深男男小黄文|