亚洲欧美色一区二区三区,久久精品国内一区二区三区,久久精品国产一区二区三,四虎成人国产精品永久在线,欧美性大战xxxxx久久久

Hi,歡迎來到黃頁(yè)88網(wǎng)!
當(dāng)前位置:首頁(yè) > 廈門雄霸電子商務(wù)有限公司漳州分公司 > 供應(yīng)產(chǎn)品 > GEIO控制包DCS輸出設(shè)備模塊煩死

GEIO控制包DCS輸出設(shè)備模塊煩死

更新時(shí)間:2025-10-06 [舉報(bào)]

. Modbus協(xié)議源代碼簡(jiǎn)介



2.1 關(guān)于modbus中的常見兩種寄存器區(qū)別

保持寄存器:指可以通過通信命令讀或者寫的寄存器;通常是一些功能控制寄存器或者輸出寄存器等。不同的設(shè)計(jì)中,有些保持寄存器是掉電保持;有些則不然。

輸入寄存器:指只能讀不能寫的寄存器,通常是狀態(tài)寄存器或者是輸入結(jié)果寄存器等。

線圈寄存器,可以類比為開關(guān)量,每一個(gè)bit都對(duì)應(yīng)一個(gè)信號(hào)的開關(guān)狀態(tài)。所以一個(gè)byte就可以同時(shí)控制8路的信號(hào)。

離散輸入寄存器:相當(dāng)于線圈寄存器的只讀模式,每個(gè)bit表示一個(gè)開關(guān)量,而他的開關(guān)量只能讀取輸入的開關(guān)信號(hào),無法寫入。

2.2 Modbus開源庫(kù)常用配置接口

1)modbus_t* modbus_new_rtu(const char *device,

int baud, char parity, int data_bit,

int stop_bit)

modbus_new_rtu函數(shù)用于生成Modbus的句柄,在本函數(shù)中可以設(shè)置通

信協(xié)議中的波特率、校驗(yàn)位、數(shù)據(jù)長(zhǎng)度以及停止位,其返回值為通過設(shè)置后生成的句柄,用于在讀寫數(shù)據(jù)時(shí)使用,每個(gè)句柄可以執(zhí)行一個(gè)modbus指令。如果這些配置參數(shù)有誤,就會(huì)返回一個(gè)空指針。

2)static int _modbus_rtu_connect(modbus_t *ctx)

本函數(shù)主要功能是將通信串口設(shè)置為rtu模式。

3)int modbus_set_slave(modbus_t *ctx, int slave)

本函數(shù)設(shè)置本句柄的從機(jī)號(hào)。



2.3 Modbus主機(jī)通信常用接口

1)int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src)

本函數(shù)為將數(shù)組中的數(shù)據(jù)寫入到遠(yuǎn)端設(shè)備(從機(jī))的寄存器中,寫入的地址位addr,長(zhǎng)度為nb個(gè)寄存器。

2)int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)

本函數(shù)將遠(yuǎn)端設(shè)備(從機(jī))保持寄存器中的數(shù)據(jù)復(fù)制到數(shù)組dest中。

3)int modbus_read_input_registers(modbus_t *ctx, int addr, int nb,

uint16_t *dest)

本函數(shù)讀取遠(yuǎn)端設(shè)備(從機(jī))地址為addr輸入寄存器中的數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為nb。



2.4 Modbus從機(jī)通信主要接口

1)int _modbus_receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type)

本函數(shù)可以用于處理來自主機(jī)的請(qǐng)求,返回接受到的字符的數(shù)量,如果成功,則返回uint8_t數(shù)組中的消息(即主機(jī)發(fā)送的命令),否則返回-1。



2)int modbus_reply(modbus_t *ctx, const uint8_t *req,

int req_length, modbus_mapping_t *mb_mapping)

本函數(shù)負(fù)責(zé)在接受到請(qǐng)求后,分析請(qǐng)求并生成響應(yīng)消息,并且發(fā)送到主機(jī)。如果請(qǐng)求屬性為廣播,那么不發(fā)送響應(yīng)消息。

三、 調(diào)試問題分享

  在調(diào)試中,從機(jī)的Server進(jìn)程會(huì)經(jīng)常出現(xiàn)崩潰,后發(fā)現(xiàn)在Server經(jīng)常每次處理配置變更時(shí),都會(huì)重新new出新的modbus句柄,但卻不釋放原有句柄,這種處理會(huì)導(dǎo)致多次修改Modbus通信配置時(shí),從機(jī)Server進(jìn)程崩潰。

解決方案:在程序中判斷,當(dāng)modbus句柄已經(jīng)存在時(shí),此時(shí)更新配置后,不再new出新的句柄,而是調(diào)用接口 modbus_close(), modbus_free()釋放句柄中的配置,然后用更新后的配置重新設(shè)置句柄參數(shù)。

注釋:需要管理超時(shí),以便明確地等待可能不會(huì)出現(xiàn)的應(yīng)答。

串行鏈路上個(gè)MODBUS 執(zhí)行的長(zhǎng)度約束限制了MODBUS PDU 大?。ù驲S485ADU=256字節(jié))。

因此,對(duì)串行鏈路通信來說,MODBUS PDU=256-服務(wù)器地址(1 字節(jié))-CRC(2 字節(jié))=253字節(jié)。

從而:

RS232 / RS485 ADU = 253 字節(jié)+服務(wù)器地址(1字節(jié)) + CRC (2 字節(jié)) = 256 字節(jié)。

TCP MODBUS ADU = 249 字節(jié)+ MBAP (7 字節(jié)) = 256 字節(jié)。

MODBUS 協(xié)議定義了三種 PDU。它們是:

MODBUS 請(qǐng)求 PDU,mb_req_pdu
MODBUS 響應(yīng) PDU,mb_rsp_pdu
MODBUS 異常響應(yīng) PDU,mb_excep_rsp_pdu
定義 mb_req_pdu 為:
mb_req_pdu = { function_code, request_data},其中

function_code - [1 個(gè)字節(jié)] MODBUS 功能碼

request_data - [n 個(gè)字節(jié)],這個(gè)域與功能碼有關(guān),并且通常包括諸如可變參考、變量、數(shù)據(jù)偏移量、子功能碼等信息。

定義 mb_rsp_pdu 為:
mb_rsp_pdu = { function_code, response_ data},其中

function_code - [1 個(gè)字節(jié)] MODBUS 功能碼

response_data - [n 個(gè)字節(jié)],這個(gè)域與功能碼有關(guān),并且通常包括諸如可變參考、變量、數(shù)據(jù)偏移量、子功能碼等信息。

定義 mb_excep_rsp_pdu 為:
mb_excep_rsp_pdu = { function_code, request_data},其中

function_code - [1 個(gè)字節(jié)] MODBUS 功能碼 + 0x80

exception_code - [1 個(gè)字節(jié)],在下表中定義了 MODBUS 異常碼。

4.2 數(shù)據(jù)編碼

MODBUS 使用一個(gè)‘big-Endian’ 表示地址和數(shù)據(jù)項(xiàng)。這意味著當(dāng)發(fā)射多個(gè)字節(jié)時(shí),發(fā)送高有效位。例如:

寄存器大小 值

16 – 比特 0x1234 發(fā)送的字節(jié)為 0x12 然后 0x34

請(qǐng)求參數(shù)描述:

指配號(hào)為14的MODBUS封裝接口識(shí)別讀識(shí)別碼請(qǐng)求。定義四種訪問類型:

01:請(qǐng)求獲得基本設(shè)備識(shí)別碼(流訪問)

02:請(qǐng)求獲得正常設(shè)備識(shí)別碼(流訪問)

03:請(qǐng)求獲得擴(kuò)展設(shè)備識(shí)別碼(流訪問)

04:請(qǐng)求獲得特定識(shí)別碼對(duì)象(訪問)

在識(shí)別碼數(shù)據(jù)不適合單響應(yīng)的情況下,可以需要幾個(gè)請(qǐng)求/響應(yīng)事務(wù)處理。對(duì)象id字節(jié)給出了獲得的個(gè)對(duì)象識(shí)別碼。對(duì)于個(gè)事物處理來說,客戶機(jī)設(shè)置對(duì)象id為0,以便獲得設(shè)備識(shí)別碼數(shù)據(jù)的開始。對(duì)于下列事務(wù)來說,客戶機(jī)設(shè)置對(duì)象id為前面響應(yīng)中服務(wù)器的返回值。

如果對(duì)象id不符合任何已知對(duì)象,那么服務(wù)器象指向?qū)ο?那樣響應(yīng)(從頭開始)。

在單個(gè)訪問的情況下:ReadDevId代碼04,請(qǐng)求中的對(duì)象id給出了獲得的對(duì)象識(shí)別碼。

如果對(duì)象id不符合任何已知對(duì)象,那么服務(wù)器返回一個(gè)異常碼=02(非法數(shù)據(jù)地址)的異常響應(yīng)。

響應(yīng)參數(shù)描述:

功能碼: 功能碼 43(十進(jìn)制)0x2B (十六進(jìn)制)

MEI 類型: 為設(shè)備識(shí)別碼接口指配號(hào)的 14 (0x0E) MEI 類型

ReadDevId 碼: 與請(qǐng)求 ReadDevId 碼相同:01、02、03 或 04

一致性等級(jí): 設(shè)備的識(shí)別碼一致性等級(jí)和支持訪問的類型

01:基本識(shí)別碼(僅流訪問)

02:正常識(shí)別碼(僅流訪問)

03:擴(kuò)展識(shí)別碼(僅流訪問)

81:基本識(shí)別碼(流訪問和單個(gè)訪問)

82:正常識(shí)別碼(流訪問和單個(gè)訪問)

83:擴(kuò)展識(shí)別碼(流訪問和單個(gè)訪問)

隨后更多: 在 ReadDevId 碼 01、02或03(流訪問)的情況下,

如果識(shí)別碼數(shù)據(jù)不符合單個(gè)響應(yīng),那么需要幾個(gè)請(qǐng)求/響應(yīng)事務(wù)處理。

00:對(duì)象不再是可利用的

FF:其它識(shí)別碼對(duì)象是可利用的,并且需要更多 MODBUS 事務(wù)處理

在 ReadDevId碼04(單個(gè)訪問)的情況下,

設(shè)置這個(gè)域?yàn)?0。

下一個(gè)對(duì)象 Id: 如果“隨后更多=FF”,那么請(qǐng)求下一個(gè)對(duì)象的識(shí)別碼

如果“隨后更多=00”,那么設(shè)置為00(無用的)對(duì)象號(hào)

在響應(yīng)中返回的對(duì)象識(shí)別碼號(hào)

(對(duì)于單個(gè)訪問,對(duì)象號(hào)碼= 1)

對(duì)象 0.id: PDU 中返回的個(gè)對(duì)象識(shí)別碼(流訪問)或請(qǐng)求對(duì)象的識(shí)別碼(單個(gè)訪問)

Object0.長(zhǎng)度: 個(gè)對(duì)象的字節(jié)長(zhǎng)度

Object0.值: 個(gè)對(duì)象的值(對(duì)象0.長(zhǎng)度字節(jié))



ObjectN.id: 后對(duì)象的識(shí)別碼(在響應(yīng)中)

ObjectN.長(zhǎng)度: 后對(duì)象的字節(jié)長(zhǎng)度

ObjectN.值: 后對(duì)象的值(對(duì)象N.長(zhǎng)度字節(jié))

“基本設(shè)備識(shí)別碼”的讀設(shè)備識(shí)別碼請(qǐng)求的實(shí)例:在這個(gè)實(shí)例中,一個(gè)響應(yīng)PDU中發(fā)送所有的報(bào)文。

標(biāo)簽:GEIO控制包IO控制包原裝
廈門雄霸電子商務(wù)有限公司漳州分公司
  • 何姍姍
  • 福建漳州薌城區(qū)南濱大道429號(hào)招商局芯云谷3號(hào)樓217-01
  • 18059884797
信息由發(fā)布人自行提供,其真實(shí)性、合法性由發(fā)布人負(fù)責(zé)。交易匯款需謹(jǐn)慎,請(qǐng)注意調(diào)查核實(shí)。
留言詢價(jià)
×