一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用協(xié)議棧實(shí)現(xiàn)Modbus ASCII主站應(yīng)用

CHANBAEK ? 來(lái)源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-13 17:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

自從開(kāi)源了我們自己開(kāi)發(fā)的Modbus協(xié)議棧之后,有很多朋友建議我針對(duì)性的做幾個(gè)示例。所以我們就基于平時(shí)我們的應(yīng)用整理了幾個(gè)簡(jiǎn)單但可以說(shuō)明基本的應(yīng)用方法的示例,這一篇中我們來(lái)使用協(xié)議棧實(shí)現(xiàn)Modbus ASCII主站應(yīng)用。

1 、何為ASCII主站

我們知道Modbus協(xié)議是一個(gè)主從協(xié)議,所以就存在主站和從站之分。所謂主站,簡(jiǎn)單來(lái)說(shuō)就是能夠主動(dòng)發(fā)起通訊的站點(diǎn),所以我們可以說(shuō)主站就是發(fā)起通訊的一方。

對(duì)于ASCII主站來(lái)說(shuō),它的數(shù)據(jù)需要從從站獲取,所以主站要通過(guò)通訊的方式與從站實(shí)現(xiàn)數(shù)據(jù)交流。在Modbus ASCII協(xié)議中從站不會(huì)主動(dòng)向外發(fā)送數(shù)據(jù),所以只有在ASCII主站發(fā)送數(shù)據(jù)請(qǐng)求,從站才會(huì)向其返回請(qǐng)求的數(shù)據(jù)。這一過(guò)程如下圖所示:

從上圖我們不難看出,首先主站要主動(dòng)發(fā)起數(shù)據(jù)請(qǐng)求,這也是它為什么被稱之為主站的緣由。它首先告訴從站我需要哪些數(shù)據(jù)。然后從站按照主站的請(qǐng)求返回?cái)?shù)據(jù)。主站得到響應(yīng)后解析數(shù)據(jù),這樣就完成了主從站之間的一次數(shù)據(jù)通訊。所以主站就需要主動(dòng)發(fā)起每一次數(shù)據(jù)通訊的對(duì)象。

雖然Modbus ASCII與Modbus RTU都是基于串行鏈路來(lái)實(shí)現(xiàn)的,但在數(shù)據(jù)傳輸?shù)膱?bào)文格式上存在較大區(qū)別。相比于Modbus RTU,Modbus ASCII采用ASCII碼的形式來(lái)發(fā)送報(bào)文,并且有確定的起始字符和結(jié)束字符。具體結(jié)構(gòu)如下:

在ASCII模式下,每個(gè)8位的字節(jié)被拆分成兩個(gè)ASCII字符進(jìn)行發(fā)送。對(duì)于數(shù)據(jù)部分,根據(jù)具體發(fā)送的數(shù)據(jù)量來(lái)確定長(zhǎng)度。校驗(yàn)方式則采用的是LRC校驗(yàn)方式。LRC校驗(yàn)較為簡(jiǎn)單,把每一個(gè)需要傳輸?shù)臄?shù)據(jù)字節(jié)迭加后取反加1即可。

2 、如何實(shí)現(xiàn)ASCII主站

我們已經(jīng)簡(jiǎn)單的說(shuō)明了什么是ASCII的主站,那么如何實(shí)現(xiàn)這一主站呢?其實(shí)在協(xié)議棧中,我們已經(jīng)實(shí)現(xiàn)了主站的數(shù)據(jù)請(qǐng)求命令的合成以及響應(yīng)數(shù)據(jù)的解析,所以我們使用協(xié)議棧來(lái)實(shí)現(xiàn)ASCII主站時(shí),我們需要做的就是控制何時(shí)將協(xié)議棧合成的主站請(qǐng)求命令發(fā)出以及如何解析數(shù)據(jù)響應(yīng)進(jìn)而得到想要的數(shù)據(jù)的過(guò)程。

在我們的協(xié)議棧中實(shí)現(xiàn)了0x01、0x02、0x03、0x04、0x05、0x06、0x0F以及0x10等功能碼。也就是說(shuō)主站對(duì)象可以生成面向這些功能碼的從站數(shù)據(jù)請(qǐng)求。也可以解析面向這些功能碼的從站數(shù)據(jù)響應(yīng)??梢员硎緸橄聢D所示:

從上圖我們很清楚,協(xié)議棧已經(jīng)實(shí)現(xiàn)了面向這些功能碼的數(shù)據(jù)請(qǐng)求命令的生成以及數(shù)據(jù)響應(yīng)消息的解析。我們使用協(xié)議棧時(shí)需要做的就是要告訴協(xié)議棧我要生成哪些數(shù)據(jù)請(qǐng)求命令以及如何解析數(shù)據(jù)響應(yīng)消息。

2.1 、怎么生成數(shù)據(jù)請(qǐng)求

對(duì)于數(shù)據(jù)請(qǐng)求,我們不一定需要面向全部功能碼的請(qǐng)求,我們只需要根據(jù)我們的需求合成我們想要的請(qǐng)求。

在協(xié)議棧中,針對(duì)數(shù)據(jù)請(qǐng)求的生成我們定義了一個(gè)從站訪問(wèn)命令生成函數(shù)。該函數(shù)的原型如下:

uint16_t CreateAccessAsciiSlaveCommand(ObjAccessInfo objInfo, void*dataList, uint8_t *commandBytes)

該函數(shù)有3個(gè)參數(shù),其中ObjAccessInfo objInfo為對(duì)象訪問(wèn)信息;void*dataList為數(shù)據(jù)列表指針,該參數(shù)主要用于寫(xiě)從站功能的命令生成;uint8_t *commandBytes為返回的從站訪問(wèn)命令。

ObjAccessInfo是一個(gè)結(jié)構(gòu)體,向函數(shù)傳遞我們想要生成的從站訪問(wèn)命令的相關(guān)信息,包括站地址,功能碼,起始地址和數(shù)量。該結(jié)構(gòu)體的定義如下:

/*定義用于傳遞要訪問(wèn)從站(服務(wù)器)的信息*/
typedef struct{
  uint8_t unitID;
  FunctionCode functionCode;
  uint16_t startingAddress;
  uint16_t quantity;
}ObjAccessInfo;

2.2 、怎么解析數(shù)據(jù)響應(yīng)

對(duì)于數(shù)據(jù)響應(yīng),我們同樣不需要考慮全部的操作碼,我們一般需要考慮讀請(qǐng)求的響應(yīng),因?yàn)樗麄兊臄?shù)據(jù)需要解析。而對(duì)于寫(xiě)請(qǐng)求返回?cái)?shù)響應(yīng)只是告訴主站成功或者不成功,即使不成功只需要在寫(xiě)一次就可以了,不存在數(shù)據(jù)更新的問(wèn)題。

在協(xié)議棧中,我們實(shí)現(xiàn)了主站解析從站數(shù)據(jù)響應(yīng)的解析函數(shù)。使用這一函數(shù)我們只需要將收到的數(shù)據(jù)響應(yīng)報(bào)文傳遞給解析函數(shù)就可以完成解析。該函數(shù)的原型定義如下:

void ParsingAsciiSlaveRespondMessage(AsciiLocalMasterType master,uint8_trecievedMessage, uint8_t *command,uint16_t rxLength)

這個(gè)函數(shù)有4個(gè)參數(shù),其中RTULocalMasterType master為主站對(duì)象;uint8_trecievedMessage為接收到的響應(yīng)消息;uint8_t *command為發(fā)送的命令序列。uint16_t rxLength是接受到的數(shù)據(jù)響應(yīng)消息的長(zhǎng)度。將這幾個(gè)參數(shù)傳遞給解析函數(shù)就可實(shí)現(xiàn)數(shù)據(jù)響應(yīng)的解析。

AsciiLocalMasterType 是一個(gè)結(jié)構(gòu)體,用以生命一個(gè)主站對(duì)象,這個(gè)對(duì)象就是我們要實(shí)現(xiàn)各種操作的主站,這一結(jié)構(gòu)體的定義如下:

/* 定義本地ASCII主站對(duì)象類型 */
typedef struct LocalASCIIMasterType{
  uint32_t flagWriteSlave[8];   //寫(xiě)一個(gè)站控制標(biāo)志位,最多256個(gè)站,與站地址對(duì)應(yīng)。
  uint16_t slaveNumber;         //從站列表中從站的數(shù)量
  uint16_t readOrder;           //當(dāng)前從站在從站列表中的位置
 AsciiAccessedSlaveType *pSlave;        //從站列表
 UpdateCoilStatusType pUpdateCoilStatus;       //更新線圈量函數(shù)
 UpdateInputStatusType pUpdateInputStatus;     //更新輸入狀態(tài)量函數(shù)
 UpdateHoldingRegisterType pUpdateHoldingRegister;     //更新保持寄存器量函數(shù)
 UpdateInputResgisterType pUpdateInputResgister;       //更新輸入寄存器量函數(shù)
}AsciiLocalMasterType;

3 ASCII****主站編碼

我們已經(jīng)設(shè)計(jì)了一個(gè)簡(jiǎn)單的ASCII主站示例,接下來(lái)我們就來(lái)編碼實(shí)現(xiàn)并驗(yàn)證這一示例。

3.1 、定義ASCII主站對(duì)象

首先我們要聲明一個(gè)主站對(duì)象,這是我們操作的基礎(chǔ)。在接下來(lái)的各種操作中我們都是基于這一對(duì)象來(lái)實(shí)現(xiàn)的。具體操作如下:

AsciiLocalMasterType asciiMaster;

定義了這個(gè)主站對(duì)象后,我們還需要對(duì)這一對(duì)象進(jìn)行初始化。協(xié)議棧同樣提供了一個(gè)主站對(duì)象的初始化函數(shù)。函數(shù)的原型定義如下:

/*初始化ASCII主站對(duì)象*/
voidInitializeASCIIMasterObject(AsciiLocalMasterType *master,
                        uint16_t slaveNumber,
                        AsciiAccessedSlaveType*pSlave,
                        UpdateCoilStatusTypepUpdateCoilStatus,
                        UpdateInputStatusTypepUpdateInputStatus,
                       UpdateHoldingRegisterType pUpdateHoldingRegister,
                       UpdateInputResgisterType pUpdateInputResgister
                        )

該函數(shù)的參數(shù)除了主站對(duì)象外,還有從站的數(shù)量即從站對(duì)象列表,還有四個(gè)數(shù)據(jù)更新函數(shù)指針。這幾個(gè)函數(shù)指針將應(yīng)用于數(shù)據(jù)響應(yīng)的解析過(guò)程中,具體在后面描述。使用這一初始化函數(shù)實(shí)現(xiàn)對(duì)主站對(duì)象的初始化,使其能夠?qū)崿F(xiàn)各項(xiàng)操作,具體如下:

/ 初始化RTU主站對(duì)象 /

InitializeASCIIMasterObject(&asciiMaster,2,asciiSlave,NULL,NULL,NULL,NULL);

這里我們將幾個(gè)數(shù)據(jù)處理函數(shù)指針變量傳入NULL,表示初始化為默認(rèn)的操作函數(shù),當(dāng)然我們也可以編寫(xiě)這些函數(shù),在后續(xù)的數(shù)據(jù)解析時(shí)將會(huì)詳細(xì)說(shuō)明。

3.2 、生成主站數(shù)據(jù)請(qǐng)求

在前面,我們已經(jīng)描述了數(shù)據(jù)請(qǐng)求命令的生成函數(shù),該函數(shù)有一個(gè)ObjAccessInfo參數(shù),這個(gè)參數(shù)用于傳遞需要生成命令的信息。這是一個(gè)結(jié)構(gòu)體,我們需要定義一個(gè)對(duì)象變量。

ObjAccessInfo asciiInfo;

然后使用這個(gè)對(duì)象來(lái)實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求的生成。具體操作如下所示:

/* 生成1號(hào)從站訪問(wèn)命令 */
 asciiInfo.unitID=asciiSlave[0].stationAddress;
 asciiInfo.functionCode=ReadCoilStatus;
  asciiInfo.startingAddress=0x0000;
  asciiInfo.quantity=8;
 
 CreateAccessAsciiSlaveCommand(asciiInfo,NULL,aSlave1ReadCommand[0]);

生成的數(shù)據(jù)請(qǐng)求什么時(shí)候發(fā)送給完全由主進(jìn)程來(lái)實(shí)現(xiàn)已經(jīng)與協(xié)議棧沒(méi)有關(guān)系了。

3.3 、解析從站數(shù)據(jù)響應(yīng)

收到數(shù)據(jù)響應(yīng)后我們需要對(duì)其進(jìn)行解析。前面我們已經(jīng)介紹了解析從站數(shù)據(jù)響應(yīng)的函數(shù)。具體的調(diào)用形式如下:

ParsingAsciiSlaveRespondMessage(&asciiMaster,asciiRxBuffer,NULL,asciiRxLength);

我們對(duì)asciiMaster主站對(duì)象收到的從站響應(yīng)asciiRxBuffer進(jìn)行解析。最后傳入的NULL表示我們不指定主站發(fā)送的數(shù)據(jù)請(qǐng)求,而是讓主站從請(qǐng)求列表中去自己查找。

當(dāng)然我們需要實(shí)現(xiàn)數(shù)據(jù)更新處理回調(diào)函數(shù)。這幾個(gè)函數(shù)是在對(duì)象初始化的時(shí)候以函數(shù)指針的形式傳遞的。原型如下:

/*更新讀回來(lái)的線圈狀態(tài)*/
__weak void UpdateCoilStatus(uint8_t salveAddress,uint16_tstartAddress,uint16_t quantity,bool *stateValue)
{
  //在客戶端(主站)應(yīng)用中實(shí)現(xiàn)
}
 
/*更新讀回來(lái)的輸入狀態(tài)值*/
__weak void UpdateInputStatus(uint8_t salveAddress,uint16_tstartAddress,uint16_t quantity,bool *stateValue)
{
  //在客戶端(主站)應(yīng)用中實(shí)現(xiàn)
}
 
/*更新讀回來(lái)的保持寄存器*/
__weak void UpdateHoldingRegister(uint8_t salveAddress,uint16_tstartAddress,uint16_t quantity,uint16_t *registerValue)
{
  //在客戶端(主站)應(yīng)用中實(shí)現(xiàn)
}
 
/*更新讀回來(lái)的輸入寄存器*/
__weak void UpdateInputResgister(uint8_t salveAddress,uint16_t startAddress,uint16_tquantity,uint16_t *registerValue)
{
  //在客戶端(主站)應(yīng)用中實(shí)現(xiàn)
}

我們可根據(jù)需要重定義這些函數(shù),當(dāng)然我們沒(méi)有響應(yīng)的數(shù)據(jù)可以不必實(shí)現(xiàn),如我們沒(méi)有使用輸入寄存器,那么更新輸入寄存器的回調(diào)函數(shù)則可以不用重定義。如下在我們的例子中重定義為:

/*更新讀回來(lái)的保持寄存器*/
 voidUpdateHoldingRegister(uint16_t startAddress,uint16_t quantity,uint16_t*registerValue)
{
  uint16_tstartRegister=HoldingResterEndAddress+1;
   
  switch(salveAddress)
  {
  case BPQStationAddress:       //更新讀取的變頻器參數(shù)
    {
      startRegister=36;
      break;
    }
  case PUMPStationAddress:      //更新蠕動(dòng)泵
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case JIG1StationAddress:      //更新擺臂小電機(jī)
    {
      startRegister=48;
      break;
    }
  case JIG2StationAddress:      //更新擺臂小電機(jī)
    {
      startRegister=52;
      break;
    }
  case JIG3StationAddress:      //更新擺臂小電機(jī)
    {
      startRegister=56;
      break;
    }
  case HLPStationAddress:       //更新紅外溫度
    {
     aPara.phyPara.hlpObjectTemperature=registerValue[0]/100.0;
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case ROL1StationAddress:      //更新擺臂控制
    {
     startRegister=quantity<3?60:62;
      break;
    }
  case ROL2StationAddress:      //更新擺臂控制
    {
     startRegister=quantity<3?70:72;
      break;
    }
  case ROL3StationAddress:      //更新擺臂控制
    {
     startRegister=quantity<3?80:82;
      break;
    }
  case DRUMStationAddress:      //更新滾筒電機(jī)
    {
     startRegister=quantity<3?90:92;
      break;
    }
  default:                      //故障態(tài)
    {
      startRegister=HoldingResterEndAddress+1;
      break;
    }
  }
 
 if(startRegister<=HoldingResterEndAddress)
  {
    for(int i=0;i/*更新讀回來(lái)的輸入寄存器*/
void UpdateInputResgister(uint16_t startAddress,uint16_tquantity,uint16_t *registerValue)
{
  uint16_tstartRegister=HoldingResterEndAddress+1;
   
  switch(salveAddress)
  {
  case BPQStationAddress:       //更新讀取的變頻器參數(shù)
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case PUMPStationAddress:      //更新蠕動(dòng)泵
    {
      aPara.phyPara.pumpRotateSpeed=(uint16_t)((float)registerValue[1]*6.0/128.0+0.5);//第二版背板
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case JIG1StationAddress:      //更新擺臂小電機(jī)
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case JIG2StationAddress:      //更新擺臂小電機(jī)
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case JIG3StationAddress:      //更新擺臂小電機(jī)
    {
      startRegister=HoldingResterEndAddress+1;
      break;
    }
  case ROL1StationAddress:      //更新擺臂控制
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case ROL2StationAddress:      //更新擺臂控制
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case ROL3StationAddress:      //更新擺臂控制
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  case DRUMStationAddress:      //更新滾筒電機(jī)
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  default:                      //故障態(tài)
    {
     startRegister=HoldingResterEndAddress+1;
      break;
    }
  }
 
 if(startRegister<=HoldingResterEndAddress)
  {
    for(int i=0;i

4 、 ASCII****主站小結(jié)

我們實(shí)現(xiàn)了這個(gè)ASCII主站實(shí)例,我們可以使用如Modsim這樣的軟件在PC上模擬Modbus ASCII從站來(lái)測(cè)試這個(gè)主站應(yīng)用。如果自己編寫(xiě)報(bào)文也可使用如串口助手之類的軟件測(cè)試。這里我們使用Modsim模擬從站,以AccessPort監(jiān)視其收發(fā)狀態(tài),測(cè)試結(jié)果如下圖:

在使用協(xié)議棧實(shí)現(xiàn)ASCII主站時(shí)需要注意,協(xié)議棧支持在同一設(shè)備上以不同的通訊端口實(shí)現(xiàn)不同的主站應(yīng)用,而且每一臺(tái)主站都支持多個(gè)從站。具體實(shí)現(xiàn)只需要根據(jù)協(xié)議棧定義就可以了。

我們來(lái)總結(jié)一下使用協(xié)議棧實(shí)現(xiàn)主站應(yīng)用的步驟,以方便大家使用協(xié)議棧實(shí)現(xiàn)Modbus ASCII主站應(yīng)用。

第一步,使用主站對(duì)象類型聲明一個(gè)主站對(duì)象。然后對(duì)這個(gè)主站對(duì)象進(jìn)行初始化。初始化主站對(duì)象時(shí)。需要指定從站數(shù)量,從站列表以及更新數(shù)據(jù)的回調(diào)函數(shù)指針。

第二步,生成訪問(wèn)從站的數(shù)據(jù)請(qǐng)求列表。這個(gè)數(shù)據(jù)請(qǐng)求列表是按每一臺(tái)從站來(lái)劃分的,將列表的指針存在對(duì)應(yīng)的從站對(duì)象中。然后在需要的時(shí)候發(fā)送相應(yīng)的數(shù)據(jù)請(qǐng)求。

第三步,解析接收的從站數(shù)據(jù)響應(yīng)。協(xié)議棧已經(jīng)定義好了解析函數(shù),只需傳入消息就可自動(dòng)解析。但是更新數(shù)據(jù)的回調(diào)函數(shù)必須根據(jù)具體的變量來(lái)編寫(xiě)??梢悦颗_(tái)主站獨(dú)立編寫(xiě)也可使用默認(rèn)的函數(shù)。不過(guò)建議每臺(tái)主站獨(dú)立編寫(xiě),這樣比較清晰。

源碼下載: https://download.csdn.net/download/foxclever/12882021

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    2123

    瀏覽量

    79595
  • ASCII
    +關(guān)注

    關(guān)注

    5

    文章

    172

    瀏覽量

    35874
  • 協(xié)議棧
    +關(guān)注

    關(guān)注

    2

    文章

    145

    瀏覽量

    34106
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Modbus RTU的設(shè)計(jì)與實(shí)現(xiàn)

    前面我們已經(jīng)詳細(xì)講解過(guò)Modbus協(xié)議的開(kāi)發(fā)過(guò)程,并且利用協(xié)議封裝了Modbus RTU
    的頭像 發(fā)表于 12-13 15:27 ?2359次閱讀
    <b class='flag-5'>Modbus</b> RTU的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    使用協(xié)議實(shí)現(xiàn)Modbus RTU應(yīng)用

    自從開(kāi)源了我們自己開(kāi)發(fā)的Modbus協(xié)議之后,有很多朋友建議我針對(duì)性的做幾個(gè)示例。所以我們就基于平時(shí)我們的應(yīng)用整理了幾個(gè)簡(jiǎn)單但可以說(shuō)明基本的應(yīng)用方法的示例,在這一篇中我們先來(lái)使用協(xié)議
    的頭像 發(fā)表于 12-13 16:10 ?1983次閱讀
    使用<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>Modbus</b> RTU<b class='flag-5'>主</b><b class='flag-5'>站</b>應(yīng)用

    使用協(xié)議實(shí)現(xiàn)Modbus RTU從應(yīng)用

    自從開(kāi)源了我們自己開(kāi)發(fā)的Modbus協(xié)議之后,有很多朋友建議我針對(duì)性的做幾個(gè)示例。所以我們就基于平時(shí)我們的應(yīng)用整理了幾個(gè)簡(jiǎn)單但可以說(shuō)明基本的應(yīng)用方法的示例,這一篇中我們將使用協(xié)議
    的頭像 發(fā)表于 12-13 16:14 ?2506次閱讀
    使用<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>Modbus</b> RTU從<b class='flag-5'>站</b>應(yīng)用

    使用協(xié)議實(shí)現(xiàn)Modbus ASCII應(yīng)用

    自從開(kāi)源了我們自己開(kāi)發(fā)的Modbus協(xié)議之后,有很多朋友建議我針對(duì)性的做幾個(gè)示例。所以我們就基于平時(shí)我們的應(yīng)用整理了幾個(gè)簡(jiǎn)單但可以說(shuō)明基本的應(yīng)用方法的示例,這一篇中我們來(lái)使用協(xié)議
    的頭像 發(fā)表于 12-13 17:12 ?1600次閱讀
    使用<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>Modbus</b> <b class='flag-5'>ASCII</b>從<b class='flag-5'>站</b>應(yīng)用

    linux平臺(tái)實(shí)現(xiàn)modbus主機(jī)協(xié)議的動(dòng)態(tài)庫(kù)libMbpoll

    libMbopll動(dòng)態(tài)庫(kù)是面向linux平臺(tái)設(shè)計(jì)的modbus主機(jī)協(xié)議,可以運(yùn)行在x86平臺(tái)以及各種嵌入式linux平臺(tái);協(xié)議提供了簡(jiǎn)單
    發(fā)表于 05-28 14:23

    linux平臺(tái)實(shí)現(xiàn)modbus主機(jī)協(xié)議的動(dòng)態(tài)庫(kù)libMbpoll

    libMbopll動(dòng)態(tài)庫(kù)是面向linux平臺(tái)設(shè)計(jì)的modbus主機(jī)協(xié)議,可以運(yùn)行在x86平臺(tái)以及各種嵌入式linux平臺(tái);協(xié)議提供了簡(jiǎn)單
    發(fā)表于 05-28 14:55

    Modbus 模擬器 !

    使用STM32F0開(kāi)發(fā)的RS485變送器(使用Modbus RTU協(xié)議),為了調(diào)試,需要用 Modbus 模擬器 來(lái)調(diào)試。在網(wǎng)上 沒(méi)找到
    發(fā)表于 01-08 23:36

    Modbus問(wèn)題

    ,但是該設(shè)備特殊,只能做modbus,只能給上位機(jī)不停寫(xiě)值的傳遞方式,這樣和上位機(jī)就形成了兩個(gè)之間通訊的架構(gòu)了。1.這種通訊機(jī)制可以
    發(fā)表于 11-24 16:36

    基于RT-Thread實(shí)現(xiàn)的Agile Modbus協(xié)議

    1、Agile Modbus介紹  Agile Modbus 即:輕量型 modbus 協(xié)議,滿足用戶任何場(chǎng)景下的使用需求?! xamp
    發(fā)表于 10-08 15:04

    基于Modbus RTU協(xié)議實(shí)現(xiàn)的1多從自組網(wǎng)無(wú)線通信形式

      本方案是基于Modbus RTU協(xié)議實(shí)現(xiàn)的1多從自組網(wǎng)無(wú)線通信形式,為S7-1200
    發(fā)表于 03-10 14:54

    Modbus協(xié)議的理解

    和使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。標(biāo)準(zhǔn)的Modicon控制器使用RS232C實(shí)現(xiàn)串行的Modbus。ModbusASCII和RTU
    發(fā)表于 05-05 16:47

    MODBUS/從協(xié)議

    MODBUS/從協(xié)議:MODBUS協(xié)議是MODICOM公司1979年開(kāi)發(fā)的一個(gè)為很多廠商支持的開(kāi)放規(guī)約。它用來(lái)為各種智能設(shè)備建立相互通信
    發(fā)表于 09-20 18:09 ?131次下載

    S7200 Modbus通訊協(xié)議遠(yuǎn)程終端設(shè)備RTU和從示例

    本文檔的主要內(nèi)容詳細(xì)介紹的是S7200 Modbus通訊協(xié)議遠(yuǎn)程終端設(shè)備RTU和從示例。
    發(fā)表于 10-25 08:00 ?33次下載
    S7200 <b class='flag-5'>Modbus</b>通訊<b class='flag-5'>協(xié)議</b>遠(yuǎn)程終端設(shè)備RTU<b class='flag-5'>主</b><b class='flag-5'>站</b>和從<b class='flag-5'>站</b>示例

    如何實(shí)現(xiàn)Modbus與CAN總線連接

    廣成科技GCAN-204型號(hào)Modbus RTU轉(zhuǎn)CAN模塊可以實(shí)現(xiàn)Modbus與CAN總線連接。
    的頭像 發(fā)表于 10-25 11:29 ?8307次閱讀

    Profibus DP協(xié)議轉(zhuǎn)Modbus協(xié)議模塊連接馬達(dá)保護(hù)器案例

    ,Profibus DP協(xié)議,EtherCAT協(xié)議,EtherNET協(xié)議等。本案例介紹了如何使用Profibus DP轉(zhuǎn)
    的頭像 發(fā)表于 06-27 09:53 ?804次閱讀
    Profibus DP<b class='flag-5'>主</b><b class='flag-5'>站</b><b class='flag-5'>協(xié)議</b>轉(zhuǎn)<b class='flag-5'>Modbus協(xié)議</b>模塊連接馬達(dá)保護(hù)器案例