1. 程式人生 > 其它 >H7-TOOL的LUA小程式教程第5期:串列埠開發,含Modbus(2022-01-16)

H7-TOOL的LUA小程式教程第5期:串列埠開發,含Modbus(2022-01-16)

LUA指令碼的好處是使用者可以根據自己註冊的一批API(當前TOOL已經提供了幾百個函式供大家使用),實現各種小程式,不再限制Flash裡面已經下載的程式,就跟手機安裝APP差不多,所以在H7-TOOL裡面被廣泛使用,支援線上除錯執行,支援離線執行。

TOOL的LUA教程爭取做到大家可以無痛呼叫各種功能函式,不需要學習成本。


Lua Uart API 函式說明

目錄:

uart_cfg(port, BaudRate, Parity, WordLength, StopBits)
uart_send(port, bin)
len, bin_str = uart_recive(prot, maxlen, TotalTimeout, ByteTimeout)
uart_clear_rx(prot)
err = modbus_write_u16(port, timeout, addr485, regaddr, value0, value1, value2 ...)
err = modbus_write_u32(port, timeout, addr485, regaddr, value0, value1, value2 ...)
err = modbus_write_float(port, timeout, addr485, regaddr, value0, value1, value2 ...)
err, data1, data2 ... = modbus_read_u16(port, timeout, addr485, regaddr, regnum)
err, data1, data2 ... = modbus_read_s16(port, timeout, addr485, regaddr, regnum)
err, data1, data2 ... = modbus_read_u32(port, timeout, addr485, regaddr, regnum)
err, data1, data2 ... = modbus_read_s32(port, timeout, addr485, regaddr, regnum)
err, data1, data2 ... = modbus_read_float(port, timeout, addr485, regaddr, regnum)
err = modbus_write_do(port, timeout, addr485, regaddr, value0, value1 ...)
err, data1, data2 ... = modbus_read_do(port, timeout, addr485, regaddr, regnum)
err, data1, data2 ... = modbus_read_di(port, timeout, addr485, regaddr, regnum)

詳細說明:

uart_cfg(port, BaudRate, Parity, WordLength, StopBits)
功能: 配置串列埠硬體引數
引數:
- port : 串列埠號, 1 或 7
- BaudRate : 波特率
- Parity : 0-無校驗1-奇校驗2-偶校驗
- WordLength : 字長 8或9
- StopBits : 停止位 1,2

返回: 無
範例: uart_cfg(1, 115200, 0, 8, 1)
----------------------------------------------------------
uart_send(port, bin)


功能: 傳送資料
引數:
- port : 串列埠號, 1 或 7
- bin : 二進位制字串

返回: 無
範例:
uart_send(1, "12345678")
uart_send(1, "\x04\x00\0x12")

bin = "\x00\x12\x34\x56"
uart_send(1, bin)
----------------------------------------------------------
uart_recive(prot, maxlen, TotalTimeout, ByteTimeout)
功能: 接收串列埠資料。退出條件滿足任意1條:
(1)讀到指定個數
(2)沒有收到位元組,總超時到達 TotalTimeout
(3)收到位元組後,字元間超時到達 ByteTimeout
引數:
- port : 串列埠號, 1 或 7
- maxlen : 最長長度
- TotalTimeout : 總超時,ms
- ByteTimeout : 位元組間超時, ms。不提供該引數時,位元組間超時等於總超時

返回:長度, 讀取到的二進位制字串
範例:
local str
local len

len, str = uart_recive(1, 200, 2000, 10) --讀最大200位元組, 總超時2秒, 字元間超時10ms
len, str = uart_recive(1, 200, 2000) --讀最大200位元組, 總超時2秒,字元間超時2秒

----------------------------------------------------------
uart_clear_rx(prot)

功能: 清空接收緩衝區
引數:
- port : 串列埠號, 1 或 7

返回: 無
範例:
uart_clear_rx(1)
----------------------------------------------------------
int modbus_write_u16(port, timeout, addr485, regaddr, value0, value1, value2 ...)
功能: 發0x06功能碼寫1個暫存器或者發0x10功能碼多個寫暫存器,函式收到應答或等待超時才會返回
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址
- value0 : 暫存器值,可以羅列多個暫存器,函式自動識別暫存器個數

返回: err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local re
re = modbus_write_u16(1, 100, 1, 0x0000, 0x1234, 0x4567, 0x8888)

local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
re = modbus_write_u16(port, timeout, addr485, regaddr, 0x1234, 0x4567, 0x8888)
print(re)
beep()

----------------------------------------------------------
int modbus_write_u32(port, timeout, addr485, regaddr, value0, value1, value2 ...)
功能: 發0x10功能碼寫32位整數暫存器, 2個16位暫存器組合為1個32位暫存器,大端模式
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址
- value0 : 暫存器值,可以羅列多個暫存器,函式自動識別暫存器個數

返回: err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local re
re = modbus_write_u32(1, 100, 1, 0x0000, 0x12345678, 0x45678888)

local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
re = modbus_write_u16(port, timeout, addr485, regaddr, 0x12345678, 0x45678888)
print(re)
beep()
----------------------------------------------------------
int modbus_write_float(port, timeout, addr485, regaddr, value0, value1, value2 ...)
功能: 發0x10功能碼寫單精度浮點暫存器, 2個16位暫存器組合為1個32位浮點暫存器,大端模式 float_ABCD
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址
- value0 : 暫存器值,可以羅列多個暫存器,函式自動識別暫存器個數

返回: err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local re
re = modbus_write_float(1, 100, 1, 0x0000, -0.1234, 789.123)

local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
re = modbus_write_u16(port, timeout, addr485, regaddr, -0.1234, 789.123)
print(re)
beep()

----------------------------------------------------------
modbus_read_u16(port, timeout, addr485, regaddr, regnum)
功能: 發0x03功能碼讀16位無符號整數暫存器
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址
- regnum : 暫存器個數

返回: err_code, value0, value1 ...
err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local re
local data1
local data2
local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
local value = {}

value = {modbus_read_u16(port, timeout, addr485, regaddr, 2)}
-- value[1] : 錯誤程式碼
-- value[2] : 第1個暫存器的值
-- value[3] : 第3個暫存器的值

re. data1, data2 = modbus_read_u16(port, timeout, addr485, regaddr, 2)
-- re : 錯誤程式碼
-- data1 : 第1個暫存器的值
-- data2 : 第2個暫存器的值
----------------------------------------------------------
modbus_read_s16(port, timeout, addr485, regaddr, regnum)
功能: 讀16位有符號整數暫存器,用法同 modbus_read_u16()
----------------------------------------------------------
modbus_read_u32(port, timeout, addr485, regaddr, regnum)
功能: 讀32位無符號整數暫存器,用法同 modbus_read_u16()
2個16位暫存器組合為1個32位暫存器
----------------------------------------------------------
modbus_read_s32(port, timeout, addr485, regaddr, regnum)
功能: 讀32位有符號整數暫存器,用法同 modbus_read_u16()
2個16位暫存器組合為1個32位暫存器
----------------------------------------------------------
modbus_read_float(port, timeout, addr485, regaddr, regnum)
功能: 讀32位單精度浮點暫存器,用法同 modbus_read_u16()
2個16位暫存器組合為1個32位暫存器
----------------------------------------------------------
modbus_write_do(port, timeout, addr485, regaddr, value0, value1 ...)
功能: 發0x10功能碼寫1個或多個DO暫存器(控制繼電器)
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址
- value0 : 暫存器值,0或1. 可以羅列多個暫存器,函式自動識別暫存器個數

返回: err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
re = modbus_write_do(port, timeout, addr485, regaddr, 1, 0, 1, 1, 0) --寫0開始的5個暫存器
print(re)

----------------------------------------------------------
modbus_read_do(port, timeout, addr485, regaddr, regnum)
功能: 發0x01功能碼讀DO暫存器
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址,起始地址
- regnum : 暫存器個數

返回: err_code, value0, value1 ...
err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local re
local data1
local data2
local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
local value = {}

value = {modbus_read_do(port, timeout, addr485, regaddr, 2)}
-- value[1] : 錯誤程式碼
-- value[2] : 第1個暫存器的值
-- value[3] : 第3個暫存器的值

re. data1, data2 = modbus_read_u16(port, timeout, addr485, regaddr, 2)
-- re : 錯誤程式碼
-- data1 : 第1個暫存器的值
-- data2 : 第2個暫存器的值
----------------------------------------------------------
modbus_read_di(port, timeout, addr485, regaddr, regnum)
功能: 發0x02功能碼讀DI暫存器
引數:
- port : 串列埠號, 1 或 7
- timeout : 超時
- addr485 :485地址 0-255
- regaddr : 暫存器地址,起始地址
- regnum : 暫存器個數

返回: err_code, value0, value1 ...
err_code 錯誤程式碼
0x00OK
0x01不支援的功能碼
0x02暫存器地址錯誤
0x03資料值域錯誤
0x04寫入失敗
0x05自己定義錯誤包應答
0x06超時 自定義的 */
範例:
local re
local data1
local data2
local port = 1
local timeout = 100
local addr485 = 1
local regaddr = 0
local value = {}

value = {modbus_read_do(port, timeout, addr485, regaddr, 2)}
-- value[1] : 錯誤程式碼
-- value[2] : 第1個暫存器的值
-- value[3] : 第3個暫存器的值

re. data1, data2 = modbus_read_u16(port, timeout, addr485, regaddr, 2)
-- re : 錯誤程式碼
-- data1 : 第1個暫存器的值
-- data2 : 第2個暫存器的值


舉例說明:

我們這裡簡單做一個迴環測試,大家僅需將TOOL的TTLTX和TTLRX短接即可。

測試程式碼:

uart_cfg(1, 115200, 0, 8, 1)

uart_send(1, "12345678www.armbbs.cn")

len, str = uart_recive(1, 200, 1000, 10) 
print(str)

執行效果如下:

微信公眾號:armfly_com 安富萊論壇:www.armbbs.cn 安富萊淘寶:https://armfly.taobao.com