国产亚洲欧美一区二区三区_深夜福利一区二区三区_日韩欧美高清_国产一区二区三区四区五区入口

Hi,歡迎來到黃頁88網!
當前位置:首頁 > 廈門雄霸電子商務有限公司漳州分公司 > 供應產品 > GEIO控制包DCS輸出設備模塊煩死

GEIO控制包DCS輸出設備模塊煩死

更新時間:2025-09-12 [舉報]

. Modbus協議源代碼簡介



2.1 關于modbus中的常見兩種寄存器區別

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

輸入寄存器:指只能讀不能寫的寄存器,通常是狀態寄存器或者是輸入結果寄存器等。

線圈寄存器,可以類比為開關量,每一個bit都對應一個信號的開關狀態。所以一個byte就可以同時控制8路的信號。

離散輸入寄存器:相當于線圈寄存器的只讀模式,每個bit表示一個開關量,而他的開關量只能讀取輸入的開關信號,無法寫入。

2.2 Modbus開源庫常用配置接口

1)modbus_t* modbus_new_rtu(const char *device,

int baud, char parity, int data_bit,

int stop_bit)

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

信協議中的波特率、校驗位、數據長度以及停止位,其返回值為通過設置后生成的句柄,用于在讀寫數據時使用,每個句柄可以執行一個modbus指令。如果這些配置參數有誤,就會返回一個空指針。

2)static int _modbus_rtu_connect(modbus_t *ctx)

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

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

本函數設置本句柄的從機號。



2.3 Modbus主機通信常用接口

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

本函數為將數組中的數據寫入到遠端設備(從機)的寄存器中,寫入的地址位addr,長度為nb個寄存器。

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

本函數將遠端設備(從機)保持寄存器中的數據復制到數組dest中。

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

uint16_t *dest)

本函數讀取遠端設備(從機)地址為addr輸入寄存器中的數據,數據長度為nb。



2.4 Modbus從機通信主要接口

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

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



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

int req_length, modbus_mapping_t *mb_mapping)

本函數負責在接受到請求后,分析請求并生成響應消息,并且發送到主機。如果請求屬性為廣播,那么不發送響應消息。

三、 調試問題分享

  在調試中,從機的Server進程會經常出現崩潰,后發現在Server經常每次處理配置變更時,都會重新new出新的modbus句柄,但卻不釋放原有句柄,這種處理會導致多次修改Modbus通信配置時,從機Server進程崩潰。

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

注釋:需要管理超時,以便明確地等待可能不會出現的應答。

串行鏈路上個MODBUS 執行的長度約束限制了MODBUS PDU 大小(大RS485ADU=256字節)。

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

從而:

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

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

MODBUS 協議定義了三種 PDU。它們是:

MODBUS 請求 PDU,mb_req_pdu
MODBUS 響應 PDU,mb_rsp_pdu
MODBUS 異常響應 PDU,mb_excep_rsp_pdu
定義 mb_req_pdu 為:
mb_req_pdu = { function_code, request_data},其中

function_code - [1 個字節] MODBUS 功能碼

request_data - [n 個字節],這個域與功能碼有關,并且通常包括諸如可變參考、變量、數據偏移量、子功能碼等信息。

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

function_code - [1 個字節] MODBUS 功能碼

response_data - [n 個字節],這個域與功能碼有關,并且通常包括諸如可變參考、變量、數據偏移量、子功能碼等信息。

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

function_code - [1 個字節] MODBUS 功能碼 + 0x80

exception_code - [1 個字節],在下表中定義了 MODBUS 異常碼。

4.2 數據編碼

MODBUS 使用一個‘big-Endian’ 表示地址和數據項。這意味著當發射多個字節時,發送高有效位。例如:

寄存器大小 值

16 – 比特 0x1234 發送的字節為 0x12 然后 0x34

請求參數描述:

指配號為14的MODBUS封裝接口識別讀識別碼請求。定義四種訪問類型:

01:請求獲得基本設備識別碼(流訪問)

02:請求獲得正常設備識別碼(流訪問)

03:請求獲得擴展設備識別碼(流訪問)

04:請求獲得特定識別碼對象(訪問)

在識別碼數據不適合單響應的情況下,可以需要幾個請求/響應事務處理。對象id字節給出了獲得的個對象識別碼。對于個事物處理來說,客戶機設置對象id為0,以便獲得設備識別碼數據的開始。對于下列事務來說,客戶機設置對象id為前面響應中服務器的返回值。

如果對象id不符合任何已知對象,那么服務器象指向對象0那樣響應(從頭開始)。

在單個訪問的情況下:ReadDevId代碼04,請求中的對象id給出了獲得的對象識別碼。

如果對象id不符合任何已知對象,那么服務器返回一個異常碼=02(非法數據地址)的異常響應。

響應參數描述:

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

MEI 類型: 為設備識別碼接口指配號的 14 (0x0E) MEI 類型

ReadDevId 碼: 與請求 ReadDevId 碼相同:01、02、03 或 04

一致性等級: 設備的識別碼一致性等級和支持訪問的類型

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

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

03:擴展識別碼(僅流訪問)

81:基本識別碼(流訪問和單個訪問)

82:正常識別碼(流訪問和單個訪問)

83:擴展識別碼(流訪問和單個訪問)

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

如果識別碼數據不符合單個響應,那么需要幾個請求/響應事務處理。

00:對象不再是可利用的

FF:其它識別碼對象是可利用的,并且需要更多 MODBUS 事務處理

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

設置這個域為00。

下一個對象 Id: 如果“隨后更多=FF”,那么請求下一個對象的識別碼

如果“隨后更多=00”,那么設置為00(無用的)對象號

在響應中返回的對象識別碼號

(對于單個訪問,對象號碼= 1)

對象 0.id: PDU 中返回的個對象識別碼(流訪問)或請求對象的識別碼(單個訪問)

Object0.長度: 個對象的字節長度

Object0.值: 個對象的值(對象0.長度字節)



ObjectN.id: 后對象的識別碼(在響應中)

ObjectN.長度: 后對象的字節長度

ObjectN.值: 后對象的值(對象N.長度字節)

“基本設備識別碼”的讀設備識別碼請求的實例:在這個實例中,一個響應PDU中發送所有的報文。

標簽:GEIO控制包IO控制包原裝
廈門雄霸電子商務有限公司漳州分公司
信息由發布人自行提供,其真實性、合法性由發布人負責。交易匯款需謹慎,請注意調查核實。
留言詢價
×
主站蜘蛛池模板: 望都县| 峨边| 阜城县| 出国| 洪湖市| 靖江市| 汉寿县| 德江县| 沈阳市| 太保市| 祁阳县| 克东县| 饶河县| 北京市| 沅江市| 巫溪县| 偃师市| 青州市| 察雅县| 基隆市| 诸暨市| 靖西县| 黄骅市| 定远县| 开平市| 滕州市| 婺源县| 琼海市| 余姚市| 泾川县| 宣武区| 西乌珠穆沁旗| 宁国市| 定边县| 九江市| 安远县| 堆龙德庆县| 许昌市| 揭西县| 泗洪县| 沂南县|