libmodbus
Copyright 2021, 月下麒麟
文章回顧:
如何看懂Open Source : 帶你閱讀一座程式I
如何看懂Open Source : 帶你閱讀一座程式II
前面兩篇探討了一些,C語言的架構與基礎知識
此篇重點會著墨在Modbus的reply,
再帶到一些跟Modbus Specification有關的內容
以下會先提及一些libmodbus Header file,
主要會說明modbus_reply函式
會選擇modbus_reply()來探討,
主要原因為透由modbus回覆,可更清楚modbus行為與相關程式實作的對應關係
reference:stephane/libmodbus/src/modbus.h
Modbus function code
定義Modbus function code,
function code就是用來定義modbus行為,
如0x01就是指讀取遠端設備的輸出值。
quantity of bit, register, input
原著作者很貼心,還附上Spectification的出處來源
定義PDU(protocol data unit的)
(Modbus對資料格式的框架圖示)
小結:
FC 0x01 -> quanlity: 1 to 2000 Read Coil
FC 0x02 -> quanlity: 1 to 2000 Read Discrete Input
FC 0x03 -> quanlity: 1 to 125 Read Holding Register
FC 0x04 -> quanlity: 1 to 125 Read Input Register
FC 0x05 -> quanlity: 1 to 255 Write Single Coil
FC 0x06 -> quanlity: 1 to 65535 Write Single Register
FC 0x10 -> quanlity: 1 to 123 Write Multiple register
FC 0x17 -> quanlity: 1 to 125/121 Read/Write Multiple register
referenceModbus_Application_Protocol_V1_1b.pdf
以上,對於libmodbus程式位置與modbus功能碼有一些基礎的對應關係,
那麼,接著往下看reply函式
reference:stephane/libmodbus/src/modbus.c
在這個函式裡面會利用switch..case..來做一些進入哪個function code的判斷
MODBUS_FC_READ_COILS -> 0x01
MODBUS_FC_READ_DISCRETE_INPUTS -> 0x02
(小巧思,共用程式碼,故僅寫在0x02的case裡)
MODBUS_FC_READ_HOLDING_REGISTERS -> 0x03
MODBUS_FC_READ_INPUT_REGISTERS -> 0x04
(小巧思,共用程式碼,故僅寫在0x04的case裡)
MODBUS_FC_WRITE_SINGLE_COIL -> 0x05
MODBUS_FC_WRITE_SINGLE_REGISTER -> 0x06
MODBUS_FC_WRITE_MULTIPLE_COILS-> 0x0F
MODBUS_FC_WRITE_MULTIPLE_REGISTERS -> 0x10
MODBUS_FC_REPORT_SLAVE_ID -> 0x11
MODBUS_FC_READ_EXCEPTION_STATUS -> 0x07
MODBUS_FC_MASK_WRITE_REGISTER -> 0x16
MODBUS_FC_WRITE_AND_READ_REGISTERS -> 0x17
作者是怎麼做判斷的呢?
為什麼寫到這裡就斷了 我不是富堅阿~ 9/9復刊…
作者利用switch..case..去回應function code