chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

宇電AI-BUS通訊協(xié)議的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

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

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)通常都會(huì)與外部設(shè)備進(jìn)行通訊,這就涉及到通訊協(xié)議的問題。這些通訊協(xié)議有的是標(biāo)準(zhǔn)協(xié)議有的廠家自定義的協(xié)議,如宇電的AI-BUS。在本篇中,我們將討論AI-BUS的驅(qū)動(dòng),以便于與宇電設(shè)備的通訊。

1 、功能概述

宇電的設(shè)備使用基于RS-485的自定義協(xié)議,該協(xié)議稱為AI-BUS。AI-BUS協(xié)議采用16進(jìn)制數(shù)據(jù)格式來表示各種指令代碼。數(shù)據(jù)協(xié)議本身比較簡單,標(biāo)準(zhǔn)的通訊指令只有兩條,一條為讀指令,一條為寫指令:

讀:地址代號(hào) +52H 82 + 要讀的參數(shù)代號(hào) +0+0+ 校驗(yàn)碼

寫:地址代號(hào) +43H 67 + 要寫的參數(shù)代號(hào) + 寫入數(shù)低字節(jié) + 寫入數(shù)高字節(jié) + 校驗(yàn)碼

具體結(jié)構(gòu)如下圖所示:

Dingtalk_20221206154648.jpg

地址代號(hào):為了在一個(gè)通訊接口上連接多臺(tái) AI 儀表,需要給每臺(tái) AI 儀表編一個(gè)互不相同的通訊地址。有效的地址為 080(部分型號(hào)為 0100),所以一條通訊線路上最多可連接 81 臺(tái) AI 儀表,儀表的通訊地址由參數(shù) Addr 決定。儀表內(nèi)部采用兩個(gè)重復(fù)的 128208(16 進(jìn)制為 80HD0H)之間數(shù)值來表示地址代號(hào),由于大于 128 的數(shù)較少用到(如 ASC 方式的協(xié)議通常只用 0-127 之間的數(shù)),因此可降低因數(shù)據(jù)與地址重復(fù)造成沖突的可能性。 AI 儀表通訊協(xié)議規(guī)定,地址代號(hào)為兩個(gè)相同的字節(jié),數(shù)值為(儀表地址+80H)。例如:儀表參數(shù) Addr=10

(16 進(jìn)制數(shù)為 0AH,0A+80H=8AH),則該儀表的地址代號(hào)為:8AH 8AH

參數(shù)代號(hào):儀表的參數(shù)用 1 個(gè) 8 位二進(jìn)制數(shù)(一個(gè)字節(jié),寫為 16 進(jìn)制數(shù))的參數(shù)代號(hào)來表示。它在指令中表示要讀/寫的參數(shù)名。

校驗(yàn)碼:校驗(yàn)碼采用16 位求和校驗(yàn)方式,其中讀指令的校驗(yàn)碼計(jì)算方法為:要讀參數(shù)的代號(hào) ×256+82+ADDR 。寫指令的校驗(yàn)碼計(jì)算方法為以下公式做16位二進(jìn)制加法計(jì)算得出的余數(shù)(溢出部分不處理):要寫的參數(shù)代號(hào) ×256+67+ 要寫的參數(shù)值 +ADDR 。

公式中的數(shù)字都為十進(jìn)制;公式中 ADDR 為儀表地址參數(shù)值,范圍是 0~80(注意不要加上 80H)。校驗(yàn)碼為以上公式做二進(jìn)制 16 位整數(shù)加法后得到的余數(shù),余數(shù)為 2 個(gè)字節(jié),其低字節(jié)在前,高字節(jié)在后。要寫的參數(shù)值用 16 位二進(jìn)制整數(shù)表示。

返回的數(shù)據(jù)格式更是固定的,無論是讀還是寫,儀表都返回以下10個(gè)字節(jié)數(shù)據(jù):

測量值 ** PV+** 給定值 ** SV+** 輸出值 ** MV ** 及報(bào)警狀態(tài) + 所讀 / 寫參數(shù)值 + 校驗(yàn)碼。

Dingtalk_20221206154648.jpg

其中 PV、 SV 及所讀參數(shù)值均各占 2 個(gè)字節(jié),代表一個(gè) 16 位二進(jìn)制有符號(hào)補(bǔ)碼整數(shù),低位字節(jié)在前,高位字節(jié)在后,整數(shù)無法表示小數(shù)點(diǎn),要求用戶在上位機(jī)處理; MV 占一個(gè)字節(jié),按 8 位有符號(hào)二進(jìn)制數(shù)格式,數(shù)值范圍-110~+110,狀態(tài)位占一個(gè)字節(jié),校驗(yàn)碼占 2 個(gè)字節(jié),共 10 個(gè)字節(jié)。

返回校驗(yàn)碼的計(jì)算公式: PV+SV+ (報(bào)警狀態(tài) *256+MV + 參數(shù)值 +ADDR

2 、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

我們已經(jīng)清楚了AI-BUS協(xié)議的的基本規(guī)則,對(duì)于通訊協(xié)議的驅(qū)動(dòng)開發(fā),只需要按照通訊協(xié)議來實(shí)現(xiàn)代碼就可以了。

2.1 、對(duì)象定義

同樣的我們?cè)诓僮鰽I-BUS設(shè)備之前,我們先需要定義AI-BUS設(shè)備對(duì)象。然后針對(duì)AI-BUS設(shè)備的操作就是針對(duì)該對(duì)象的操作。

2.1.1 、對(duì)象的抽象

根據(jù)AI-BUS設(shè)備對(duì)象的特點(diǎn),我們抽象對(duì)象類型。該對(duì)象各類型包括設(shè)備地址和狀態(tài)2個(gè)屬性和發(fā)送命令一個(gè)操作。而對(duì)于消息的接收我們一般采用串口中斷方式。對(duì)象類型定義如下:

/* 定義AI-BUS設(shè)備對(duì)象 */
typedef struct AIbusObject {
      uint8_t deviceAddr;
      uint8_t status;
      void(*SendBytes)(uint8_t *cmd,uint16_t size);
}AIbusObjectType;

2.1.2 、對(duì)象初始化

定義了AI-BUS對(duì)象類型后,我們就可以使用該類型聲明不同的對(duì)象,但是聲明的對(duì)象僅為一個(gè)對(duì)象變量,在使用之前必須對(duì)其進(jìn)行初始化,初始化函數(shù)如下:

/* AI-BUS對(duì)象初始化 */
void AIbusInitialization(AIbusObjectType*aibus,uint8_t addr,AiBusSendBytessend)
{
      if((aibus==NULL)||(send==NULL))
      {
             return;
      }

      aibus->deviceAddr=addr;
      aibus->SendBytes=send;
}

2.2 、對(duì)象操作

完成了對(duì)象的初始化后就可以實(shí)現(xiàn)對(duì)對(duì)象的操作了。根據(jù)前面對(duì)AI-BUS協(xié)議的了解,我們所需要完成的操作實(shí)際上就是3個(gè)方面。一是對(duì)目標(biāo)設(shè)備參數(shù)的讀操作;二是對(duì)目標(biāo)設(shè)備參數(shù)的寫操作;三是對(duì)接收到的消息進(jìn)行解析。

2.2.1 、讀對(duì)象操作

對(duì)AI-BUS對(duì)象的讀就是將讀命令按一定格式下發(fā)就好了。讀命令的格式為**:地址代號(hào)** +52H 82 + 要讀的參數(shù)代號(hào) +0+0+ 校驗(yàn)碼 。可以據(jù)此編寫讀操作如下:

/*讀取目標(biāo)設(shè)備的參數(shù)值*/
void ReadAiBusDeviceParameter(AIbusObjectType *aibus,uint8_tparaAddr)
{
 uint8_t readCommand[INSTRUCTION_LENGTH];
 uint16_t index=0;
 readCommand[index++]=0x80+aibus->deviceAddr;
 readCommand[index++]=0x80+aibus->deviceAddr;
 readCommand[index++]=READ_INSTRUCTION;
 readCommand[index++]=paraAddr;
 readCommand[index++]=0x0;
 readCommand[index++]=0x0;
 
 uint16_tcheckSum=(uint16_t)paraAddr*256+READ_INSTRUCTION+(uint16_t)aibus->deviceAddr;
 
 readCommand[index++]=checkSum;
 readCommand[index++]=(checkSum>>8);
 
 aibus->SendBytes(readCommand,INSTRUCTION_LENGTH);
}

2.2.2 、寫對(duì)象操作

同樣,對(duì)AI-BUS對(duì)象的寫操作也是按照寫命令的格式下發(fā)命令就可以了。寫對(duì)象的命令格式為**:地址代號(hào)** +43H 67 + 要寫的參數(shù)代號(hào) + 寫入數(shù)低字節(jié) + 寫入數(shù)高字節(jié) + 校驗(yàn)碼 。我們據(jù)此可以編寫寫操作函數(shù):

/*設(shè)置目標(biāo)設(shè)備的參數(shù)值*/
void WriteAiBusDeviceParameter(AIbusObjectType *aibus,uint8_t paraAddr,uint16_t data)
{
 uint8_t writeCommand[INSTRUCTION_LENGTH];
 uint16_t index=0;
 writeCommand[index++]=0x80+aibus->deviceAddr;
 writeCommand[index++]=0x80+aibus->deviceAddr;
 writeCommand[index++]=WRITE_INSTRUCTION;
 writeCommand[index++]=paraAddr;
 writeCommand[index++]=data;
 writeCommand[index++]=(data>>8);
 
 uint16_t checkSum=(uint16_t)paraAddr*256+WRITE_INSTRUCTION+(uint16_t)aibus->deviceAddr+data;
 
 writeCommand[index++]=checkSum;
 writeCommand[index++]=(checkSum>>8);
 
 aibus->SendBytes(writeCommand,INSTRUCTION_LENGTH);
}

2.2.3 、消息解析

我們已經(jīng)知道AI-BUS對(duì)象的返回消息是一個(gè)固定的的格式。即:測量值 ** PV+** 給定值 ** SV+** 輸出值 ** MV ** 及報(bào)警狀態(tài) + 所讀 / 寫參數(shù)值 + 校驗(yàn)碼 。每一個(gè)字都是低字節(jié)在前,而校驗(yàn)碼則是返回的數(shù)據(jù)和加上設(shè)備地址,我們據(jù)此編寫解析函數(shù):

/*解析返回?cái)?shù)據(jù),返回值為讀或者寫的參數(shù)值*/
int ParsingReturnData(uint8_t*receiveData,uint16_t *returnData,AIbusObjectType *aibus,uint16_t deviceNum)
{
 int status=-1;
 
 uint16_t pValue=0;
 uint16_t sValue=0;
 uint16_t mValue=0;
 uint16_t alarmStatus=0;
 uint16_t paraValue=0;
 uint16_t checkSum=0;
 
 pValue=receiveData[0]+receiveData[1]*256;
 sValue=receiveData[2]+receiveData[3]*256;
 mValue=(uint16_t)receiveData[4];
 alarmStatus=(uint16_t)receiveData[5];
 paraValue=receiveData[6]+receiveData[7]*256;
 checkSum=receiveData[8]+receiveData[9]*256;
 
 uint16_t chk=pValue+sValue+alarmStatus*256+mValue+paraValue;
 
 for(int i=0;iif(checkSum==chk+aibus[i].deviceAddr)
   {
     status=i;
     returnData[0]=pValue;
     returnData[1]=sValue;
     returnData[2]=mValue;
     returnData[3]=alarmStatus;
     returnData[4]=paraValue;
     break;
   }
 }
      
 aibus[status].status=alarmStatus;
      
 return status;


}

3 、驅(qū)動(dòng)的使用

AI-BUS協(xié)議設(shè)備驅(qū)動(dòng)的使用主要按照三個(gè)步驟來操作:聲明并初始化對(duì)象;發(fā)送操作命令;接收并解析消息。接下來我們將據(jù)此完成驅(qū)動(dòng)的使用。

3.1 、聲明并初始化對(duì)象

我們需要使用AIbusObjectType類型聲明對(duì)象變量。同時(shí)我們要實(shí)現(xiàn)一個(gè)typedef void (*AiBusSendBytes)(uint8_t *cmd,uint16_t size)類型的操作函數(shù)。我們假設(shè)使用的USART1端口,則具體實(shí)現(xiàn)如下:

/*發(fā)送數(shù)據(jù)*/
void AiBusSendByte(uint8_t *instruction,uint16_t length)
{
  /*RS485設(shè)置為發(fā)送模式,準(zhǔn)備發(fā)送*/
  TEMPCTL_TRANSMIT_ALLOW();
  aiBusRxLength=0;
 
  uint16_t i;
  for(i=0;i/*傳送寄存器不為空,等待傳送結(jié)束*/
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
    {
    }
    /*寫一個(gè)字節(jié)到對(duì)應(yīng)的串口傳送數(shù)據(jù)寄存器*/
    USART_SendData(USART1, instruction[i]);
  }
  Delayms(3);
  /*發(fā)送完畢,將RS485改為接收模式準(zhǔn)備接收*/
  TEMPCTL_RECIEVE_ALLOW();
  Delayms(20);
}

對(duì)于單個(gè)的對(duì)象我們直接使用其聲明就可:AIbusObjectType aiDev;假設(shè)其設(shè)備地址為uint8_t addr=0x01。然后調(diào)用初始化函數(shù)初始化。對(duì)于單臺(tái)設(shè)備則可直接調(diào)用:

AIbusInitialization(&aiDev,addr,AiBusSendByte);

而如果是在同一總線上有多個(gè)設(shè)備,我們也可以將其定義為數(shù)組形式。假設(shè)有4臺(tái)設(shè)備,地址我分別為:0x01,0x02,0x03,0x04,則可定義為:

AIbusObjectTypeaiDev[4];

uint8_t addr[4]={0x01,0x02,0x03,0x04};

然后同樣調(diào)用初始化函數(shù)初始化:

for(inti=0;i<4;i++)

{

AIbusInitialization(aiDev+i,addr[i],AiBusSendByte);

}

3.2 、發(fā)送操作命令

初始化完成后就可以對(duì)其進(jìn)行真正的操作:讀取或者寫某個(gè)參數(shù)的值。對(duì)于讀參數(shù)的值操作則只需要調(diào)用讀操作函數(shù)來完成:

ReadAiBusDeviceParameter(&aiDev,paraAddr);

而對(duì)于寫參數(shù)值的操作也只是簡單的調(diào)用寫操作函數(shù)來完成:

WriteAiBusDeviceParameter(&aiDev,paraAddr,data);

如果是多個(gè)對(duì)象,與前面一樣操作數(shù)組的方式來操作就可以了,再次就不贅述。

3.3 、接收并解析消息

接收消息我們采用串口中斷接收。具體實(shí)現(xiàn)如下:

void USART1_ReceiveDataHandle(void)
{
    if(aiBusRxLength>=RETURNING_DATA_LENGTH)
  {
    aiBusRxLength=0;
  }
  /*接收寄存器為空,等待字節(jié)被對(duì)應(yīng)的串口完全接收*/
  if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET)
    {  
    /*獲取接收到的字節(jié)數(shù)*/
    aiBusRxBuffer[aiBusRxLength++] =USART_ReceiveData(USART1);
  }
  }

我們知道接受的消息格式是固定的,我們調(diào)用消息解析函數(shù)來完成解析:

ParsingReturnData(receiveData,returnData,&aiDev,deviceNum);

其中receiveData是長度為10的uint8_t類型數(shù)組。returnData是長度為5的uint16_t類型數(shù)組。

4 、應(yīng)用總結(jié)

我們完成了AI-BUS驅(qū)動(dòng)的編寫及應(yīng)用。我們使用其同時(shí)操作4臺(tái)溫度控制器。我們操作數(shù)組的方式簡化函數(shù)的調(diào)用過程。當(dāng)然結(jié)果與我們的預(yù)期是相符的。

使用本驅(qū)動(dòng)程序操作AI-BUS設(shè)備,有一點(diǎn)需要注意:對(duì)于不懂的設(shè)備類型,參數(shù)的具體地址是用所不同的,需要查看廠家的參數(shù)定義來操作。

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

    關(guān)注

    89

    文章

    37975

    瀏覽量

    295897
  • bus
    bus
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    49246
  • 通訊協(xié)議
    +關(guān)注

    關(guān)注

    10

    文章

    294

    瀏覽量

    21323
  • 驅(qū)動(dòng)設(shè)計(jì)

    關(guān)注

    1

    文章

    111

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    #伺服電機(jī) #PLC 30秒初步學(xué)習(xí)modbus通訊協(xié)議

    plcbus通訊協(xié)議
    學(xué)習(xí)電子知識(shí)
    發(fā)布于 :2022年10月24日 00:05:40

    STM32應(yīng)用實(shí)例七:與設(shè)備實(shí)現(xiàn)AI-BUS通訊

    的設(shè)備使用基于RS-485的自定義協(xié)議,協(xié)議本身比較簡單,只有2條指令:讀:地址代號(hào)+52H(82) +要讀的參數(shù)代號(hào)+0+0+校驗(yàn)碼寫:地址代號(hào)+43H(67)+要寫的參數(shù)代號(hào)+
    發(fā)表于 03-19 18:55

    基于LabVIEW的Modbus串口通訊協(xié)議實(shí)現(xiàn)

    基于LabVIEW 的Modbus 串口通訊協(xié)議實(shí)現(xiàn)附件基于LabVIEW 的Modbus 串口通訊協(xié)議
    發(fā)表于 10-16 10:50

    S.BUS是什么?S.BUS協(xié)議有何特點(diǎn)

    S.BUS是什么?S.BUS協(xié)議有何特點(diǎn)?
    發(fā)表于 12-15 07:40

    S.BUS協(xié)議原理

    內(nèi)容本篇文章主要是S.BUS協(xié)議原理介紹,并實(shí)現(xiàn)了arduino輸出S.BUS數(shù)據(jù)。S.BUS簡介SBUS是一個(gè)接收機(jī)串行總線輸出,通過這根
    發(fā)表于 01-20 08:06

    采用socket形式進(jìn)行通訊的ec20驅(qū)動(dòng)是需要自己實(shí)現(xiàn)mqtt協(xié)議嗎?

    看了下ec20的AT組件包,驅(qū)動(dòng)是采用socket的形式進(jìn)行通訊的,那么這個(gè)通訊的開發(fā)是需要在rtt上自己實(shí)現(xiàn)mqtt,http,ftp等應(yīng)用層的協(xié)
    發(fā)表于 03-07 14:19

    Modbus通訊協(xié)議的幾種實(shí)現(xiàn)方式

    RTU和TCP兩種協(xié)議中轉(zhuǎn)換,根據(jù)需要選擇不同協(xié)議。這是LabVIEW多態(tài)的一個(gè)非常好的示例。程序見下圖。   5.LabVIEW 采用TCP模塊實(shí)現(xiàn)Modbus通訊   在沒有DSC
    發(fā)表于 05-05 16:19

    基于DSP的CANopen通訊協(xié)議實(shí)現(xiàn)

    CANopen 是一種開放的應(yīng)用層協(xié)議,其應(yīng)用可以進(jìn)一步提高系統(tǒng)的可靠性、通訊效率及靈活性,而且可以使產(chǎn)品具有很好的兼容性。本文采用CANopen 通訊協(xié)議
    發(fā)表于 09-03 09:19 ?19次下載

    基于C++的modbus通訊協(xié)議模型實(shí)現(xiàn)

    基于C++的modbus通訊協(xié)議模型實(shí)現(xiàn),很好的資料,快來下載學(xué)習(xí)吧。
    發(fā)表于 03-21 17:27 ?55次下載

    AIBUS及MODBUS通訊協(xié)議說明V80

    AIBUS及MODBUS通訊協(xié)議說明,word文檔,包括變量地址及輸入輸出指令格式
    發(fā)表于 03-23 15:31 ?9次下載

    一種新型通訊管理裝置的研究與實(shí)現(xiàn)_丁志

    一種新型通訊管理裝置的研究與實(shí)現(xiàn)_丁志
    發(fā)表于 02-07 18:11 ?0次下載

    ModbusRTU通訊協(xié)議(主站)通訊聯(lián)機(jī)便利指令

    FUN150(M-BUS)指令提供永宏P(guān)LC(主站)透過Port1,2,3或4以ModbusRTU通訊協(xié)議與具有該通訊協(xié)議之智能型外圍(仆站
    發(fā)表于 09-29 17:38 ?17次下載
    ModbusRTU<b class='flag-5'>通訊</b><b class='flag-5'>協(xié)議</b>(主站)<b class='flag-5'>通訊</b>聯(lián)機(jī)便利指令

    海為PLC與AI-706M多路巡檢儀通訊介紹

    因?yàn)?b class='flag-5'>宇AI-706M多路巡檢儀的通訊協(xié)議公司
    發(fā)表于 10-09 11:26 ?11次下載
    海為PLC與<b class='flag-5'>宇</b><b class='flag-5'>電</b><b class='flag-5'>AI</b>-706M多路巡檢儀<b class='flag-5'>通訊</b>介紹

    智能儀 讓溫控系統(tǒng)更簡單

    。觸摸屏電腦上的并行口還可以直接和打印機(jī)連接實(shí)時(shí)或定時(shí)打印當(dāng)前或歷史數(shù)據(jù)。利用觸摸屏中電腦內(nèi)置的RS485通訊口與AI708、AI708M溫控表直接通訊。
    的頭像 發(fā)表于 09-26 10:20 ?4920次閱讀

    AI808與組態(tài)王6.01通訊測試教程

    AI808與組態(tài)王6.01通訊測試教程
    發(fā)表于 07-23 09:24 ?18次下載