久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6568|回復: 12
收起左側(cè)

我的ModBus主機-調(diào)度篇

  [復制鏈接]
ID:446156 發(fā)表于 2021-11-15 13:29 | 顯示全部樓層 |閱讀模式
開始本篇之前我想先談一下為什么要把一個ModBus主機分成4篇來寫,一是代碼的分層理念,隨著工作時間的增長以及工作的深入你會發(fā)現(xiàn)分層是那么的至關重要不僅僅是代碼的可讀性更重要的是更方便的維護。初期寫代碼一個文件中甚至一個函數(shù)中既有功能代碼又有底層代碼,當增刪功能或者平臺移植的時候都不知道去哪里哭,分層也許在初期會增加代碼量顯得很麻煩但是當你的架構建立起來之后會變得十分方便,解決問題得心應手。操作系統(tǒng)幫你做好了底層的分層和軟件層面的任務調(diào)度,但是應用層面依然需要個人來做好。分層理念需要時時有處處有。二是ModBus的一對多特性,當一個主機任務讀取某個從機的數(shù)據(jù)并等待從機應答時,必須保證別的主機任務不要來動ModBus總線,如果有個不長眼的主機任務過來咔咔操作了總線那么之前等待從機應答的任務就崩潰了?赡苡腥苏f了等待應答的時候我直接while死等不就行了,直接斷了別的主機任務的念想,當然這樣是可以解決問題的不過要是某個從機不在線就會導致整個系統(tǒng)卡死一段時間,要是你用了操作系統(tǒng)還好如果是裸機那就非常影響用戶體驗并且會使其他任務比如刷屏按鍵出現(xiàn)一些莫名其妙的問題,我們都知道人的新陳代謝越快身體越強壯,同樣任務輪詢越快系統(tǒng)也越強壯。無論你使用操作系統(tǒng)還是裸機都要避免使用阻塞式的寫法。所以我們才大費周章分4層來解決一個ModBus主機問題。本篇調(diào)度篇內(nèi)容很少但是整個ModBus主機系統(tǒng)的重中之重。
我們先來看代碼。
  1. #ifndef __RS485_H
  2. #define __RS485_H

  3. #include "Header.h"
  4. #include "THP.h"
  5. #include "EPC.h"
  6. #include "Delay.h"

  7. extern uint16_t RS485BusSilentTime1;

  8. void RS485Device1Init(void);
  9. void RS485Device1Handle(void);

  10. #endif
復制代碼
  1. #include "RS485Device.h"

  2. uint16_t RS485BusSilentTime1;

  3. void RS485Device1Init(void)
  4. {
  5.         THPInit();
  6.         EPCInit();
  7. }

  8. static uint8_t TaskHandle(uint8_t En, uint8_t (*Task)(void*), void *Dev, uint8_t *BusTake, uint8_t TaskID, uint16_t *DelayTime)
  9. {
  10.         if((En!=0) && ((*BusTake==0)||(*BusTake==TaskID)))
  11.         {
  12.                 if(Task(Dev) != 0)
  13.                 {
  14.                         /*釋放總線*/
  15.                         *BusTake = 0;
  16.                         Set_Delay_Time(10,DelayTime);
  17.                 }
  18.                 else
  19.                 {
  20.                         /*占用總線*/
  21.                         *BusTake = TaskID;
  22.                         return 1;
  23.                 }
  24.         }
  25.         return 0;
  26. }
  27. void RS485Device1Handle(void)
  28. {
  29.         static uint8_t BusTake=0;
  30.        
  31.         if(CheckDelay(&RS485BusSilentTime1) == 0)
  32.         {
  33.                 if(TaskHandle(EPC1.S_P_En,SetPreVal,&EPC1,&BusTake,1,&RS485BusSilentTime1) != 0)
  34.                 {
  35.                         return;
  36.                 }
  37.                 if(TaskHandle(THP1.Enable,ReadTHP,&THP1,&BusTake,2,&RS485BusSilentTime1) != 0)
  38.                 {
  39.                         return;
  40.                 }
  41.                 if(TaskHandle(EPC1.R_En,ReadEPC,&EPC1,&BusTake,3,&RS485BusSilentTime1) != 0)
  42.                 {
  43.                         return;
  44.                 }
  45.         }
  46. }
復制代碼
通過代碼可以看到該層引用了任務篇創(chuàng)建的"THP.h"和"EPC.h",在這里我們要對三個主機任務進行調(diào)度。
首先來看函數(shù)“static uint8_t TaskHandle(uint8_t En, uint8_t (Task)(void), void *Dev, uint8_t *BusTake, uint8_t TaskID, uint16_t *DelayTime)”;
該函數(shù)參數(shù)比較多,分別為任務使能信號(uint8_t En)、任務主體(uint8_t (Task)(void))、設備名稱(void *Dev)、是誰在使用總線(uint8_t *BusTake)、任務編號(uint8_t TaskID)、總線靜默時間控制(uint16_t *DelayTime);
該函數(shù)邏輯很簡單,就是判斷任務使能信號是否置位了并查看總線被哪個任務占用,若總線空閑或者被自己占用就去占用總線去執(zhí)行任務主體函數(shù),若任務主體函數(shù)返回0說明正在等待從機應答接著占用總線并返回1告知調(diào)度器我還沒用完,否則說明任務完成了釋放總線并給總線插入10ms的靜默時間然后返回0告訴調(diào)度器我完事了讓別人來吧。
函數(shù)“void RS485Device1Handle(void)”就是最終的調(diào)度器它在main函數(shù)的while循環(huán)中被執(zhí)行,它首先實現(xiàn)10ms的總線靜默然后挨個詢問主機任務的當前狀態(tài)并滿足他們的需求。
至此,我的ModBus主機就完結了。



回復

使用道具 舉報

ID:939553 發(fā)表于 2021-11-20 09:49 | 顯示全部樓層
謝謝分享,能否提供一些關于分層的思想的文章,學習。
回復

使用道具 舉報

ID:1005484 發(fā)表于 2022-2-16 21:05 | 顯示全部樓層

謝謝分享,能否提供一些關于分層的思想的文章,學習。
回復

使用道具 舉報

ID:97078 發(fā)表于 2022-3-9 08:33 | 顯示全部樓層
mark,標記學習下
回復

使用道具 舉報

ID:1012071 發(fā)表于 2022-3-21 22:25 | 顯示全部樓層
mark,標記學習下
回復

使用道具 舉報

ID:195496 發(fā)表于 2022-5-7 14:38 | 顯示全部樓層
上的操作系統(tǒng)?
回復

使用道具 舉報

ID:434978 發(fā)表于 2022-5-20 12:10 | 顯示全部樓層
謝謝分享,能否提供一些關于分層的思想的文章,學習
回復

使用道具 舉報

ID:1056996 發(fā)表于 2022-12-11 15:36 | 顯示全部樓層
mark,標記學習下
回復

使用道具 舉報

ID:821429 發(fā)表于 2023-4-16 09:43 | 顯示全部樓層
,標記學習一下,感謝分享
回復

使用道具 舉報

ID:27536 發(fā)表于 2023-5-12 16:42 | 顯示全部樓層

mark,標記學習下
回復

使用道具 舉報

ID:1045571 發(fā)表于 2023-8-6 14:58 | 顯示全部樓層
moubus在工作中我遇到了,也看了大概的基本原理,但程序?qū)懖怀鰜恚梃b一下樓主的
回復

使用道具 舉報

ID:939553 發(fā)表于 2023-8-15 14:34 來自手機 | 顯示全部樓層
思路清晰,程序扎實
回復

使用道具 舉報

ID:446156 發(fā)表于 2024-10-30 16:59 | 顯示全部樓層
大漠落日 發(fā)表于 2022-5-7 14:38
上的操作系統(tǒng)?

裸機,我自己的框架
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲综合区| 欧美男人亚洲天堂 | www.亚洲 | 春色av| 二区中文 | 久久毛片 | www.久久 | 成人免费小视频 | 国产精品久久久久aaaa樱花 | www.蜜桃av| 久久久这里都是精品 | 久久天天 | 91久久国产综合久久91精品网站 | 在线91 | 久久久精品网 | 视频国产一区 | 日韩国产一区二区三区 | 国产91一区二区三区 | 日韩伦理一区二区三区 | 欧美不卡网站 | 综合一区二区三区 | 国产成人精品一区二区三区四区 | 6996成人影院网在线播放 | 国产精品视频一区二区三区四区国 | 一区二区中文 | 国产精品久久久久久久午夜片 | 拍真实国产伦偷精品 | 亚洲欧美中文日韩在线v日本 | 久久久久久99 | 亚洲精精品 | 国产高清在线精品一区二区三区 | 偷拍自拍在线观看 | 欧美黄色网络 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 福利视频网址 | 国产精品日女人 | 亚洲精品视频在线播放 | 国产成人精品久久 | 国产精品一区二区久久 | 黄色在线免费网站 | 久久69精品久久久久久久电影好 |