ModbusRTU控制LED燈
# Smart ModbusRTU控制LED燈
# 1. 說明
範例採用ModbusRTU通訊協議,控制駁接在Arduino上的LED燈。ModbusRTU傳輸方式為1個主機對應多個從機,此時使用從機的從機號來做識別,如果主機傳輸的從機號對應到該從機的號碼,如果格式正確該從機會作迴應。因此在Modbus傳輸中,每個從機都是被動的,在運行過程中會不斷監聽是否有收到請求。範例中的Arduino ModbusRTU設定為從機,等待主機發出指令進行各種控制活動。每個從機都有固定的保持暫存器的地址,需參照規範來進行存取。範例中也設定從機號與控制參數的地址。
範例中使用TTL轉RS-485模組(簡稱為TTL485),作為數據傳輸轉換的裝置,用於PC設備與Modbus RTU設備間的數據傳輸,單條485匯流排可以支援32個ModbusRTU設備。範例中採用TTL485擴充套件Arduino開發板在ModbusRTU的功能。TTL485與Arduino開發板的連線方式如下:
TTL485針腳 | Arduino針腳 | 功能 |
---|---|---|
RO | RX | 接受資訊 |
RE | D2 | 收發控制 |
DE | D2 | 收發控制 |
DI | TX | 發送資訊 |
VCC | 5V | 供電 |
GND | GND | 接地線 |
通過範例學習,可以掌握 ModbusRTUWriteChannel控制元件的基本設定,並結合Arduino開發板通過ModbusRTU進行LED燈的控制功能。
# 2. 零件連線圖
# 3. 使用零件
序 | 零件名稱 | 數量 |
---|---|---|
1 | Arduino UNO R3 開發板 | 1 |
2 | USB數據線 | 1 |
3 | TTL轉RS-485模組 | 1 |
4 | USB轉485接頭 | 1 |
5 | 麵包板 | 1 |
6 | 杜邦線 | 若干 |
7 | LED燈 | 1 |
8 | 220歐姆電阻 | 1 |
# 4. Arduino流程圖
# 5. Arduino程式
使用Arduino IDE 編譯並上傳以下Arduino程式。
// 使用鏈接庫 https://drive.google.com/file/d/0Bx5wWRfN_z7oMDlZMDhWbXM2VFU/view
// 使用擴充模組 Arduino Sensor Shield 感測器擴充套件板 V5 XBee RS485
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
#define LED_PIN 8 // 定義LED PIN為8
modbusDevice regBank; // 宣告 Modbus
modbusSlave slave;
#define RS485TxEnablePin 2
#define RS485Baud 9600
#define RS485Format SERIAL_8N1
void setup() {
pinMode(LED_PIN, OUTPUT); // 設定PIN 8為輸出模式
regBank.setId(3); // 設定 Modus 從機號=3
regBank.add(40001); // 設定會使用到之 Holding Register 之地址
regBank.add(40002);
slave._device = ®Bank; // 啟動 modbus RTU
slave.setBaud(&Serial,RS485Baud,RS485Format,RS485TxEnablePin);
}
void loop() {
// PIN 8輸出為HIGH or 1 ,LED點亮 輸出為LOW or 0,LED熄滅
digitalWrite(LED_PIN, regBank.get(40001));
delay(500); //延時500ms
slave.run();
delay(500);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 6. 設計明細
開啟Smart智慧控制平臺,分別加入下插圖之控制元件。或者通過點選功能表欄[檔案]-[打開專案]
選擇範例專案檔案來打開該範例。
①:TLabel元件,控制元件名稱為Label1
。
②:TImage元件,控制元件名稱為Image1
。
③:TImage元件,控制元件名稱為Image4
。
④:TModbusRTUChannel元件,控制元件名稱為ModbusRTUReadChannel1
。
⑤:TModbusConnection元件,控制元件名稱為ModbusConnection1
。
⑥:TImage元件,控制元件名稱為Image3
。
⑦:TImage元件,控制元件名稱為Image2
。
⑧:TModbusRTUWriteChannel元件,控制元件名稱為ModbusRTUWriteChannel1
。
Main窗體屬性設定
ClientHeight
:窗體客戶區高度=624
。ClientWidth
:窗體客戶區寬度=918
。
①Label1屬性設定
AutoSize
:是否根據字型調整控制元件大小,設定為True
。Caption
:標籤內容,設定為ModbusRTU之LED智能照明
。
②Image1屬性設定
Align
:設定控制元件佔滿=alClient
。Stretch
:設定圖片是否按照控制元件大小拉伸=Yes
。Picture
:設定圖片(背景)。點選Picture
屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
③Image4屬性設定
Height
:設定控制元件高度=109
。Width
:設定控制元件寬度=109
。Picture
:設定圖片(背景)。點選Picture
屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
④ModbusRTUReadChannel1屬性設定
ModbusList
:設定連線列表。點選ModbusList
屬性右側的[...]
按鈕,打開列表編輯界面。點選左上角的新增按鈕新增一項ModbusList
專案,選擇對應的項進入到專案的屬性界面。
- ModbusList[0]屬性設定
ConnectionMode
:設定連線的模式,設定為cmClient
。DataControl
:設定繫結控制元件,設定為Image3
。DataFields
:設定繫結的控制元件屬性,設定為Visible
。DataType
:設定Modbus讀取/寫入的數據型別,設定為dtBinary
。FunctionCode
設定使用ModbusRTU的寫入指令,設定為fc03
。ModbusConnection
:Modbus連線的元件對象,設定為ModbusConnection1
。RegCount
:Modbus設備讀取/寫入暫存器的位數,設定為1
。StartReg
:Modbus設備讀取/寫入暫存器的起始位置,設定為0
。對應的Modbus保持暫存器的地址位為0
。ServerAddress
:Modbus設備服務的地址(從機號),定義為3
。
⑤ModbusConnection屬性設定
BaudRate
:通訊埠通訊速率設定,此處設定為br9600
。DataBits
:設定通訊埠單次傳輸的數據位數,此處設定為db8
。Parity
:設定通訊埠通訊的校驗方式,此處設定為psNone
。Port
:設定通訊埠的通訊埠,此處根據實際連線的埠設定。StopBits
:設定通訊埠通訊的停止位,此處設定為sb1
。
⑥Image3屬性設定
Height
:設定控制元件高度=367
。Width
:設定控制元件寬度=909
。Picture
:設定圖片(燈亮)。點選Picture
屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
⑦Image2屬性設定
Height
:設定控制元件高度=366
。Width
:設定控制元件寬度=909
。Picture
:設定圖片(燈滅)。點選Picture
屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
⑧ModbusRTUWriteChannel1屬性設定
ModbusList
:設定連線列表。 點選ModbusList
屬性右側的[...]
按鈕,打開列表編輯界面。點選左上角的新增按鈕新增一項ModbusList
專案,選擇對應的項進入到專案的屬性界面。
- ModbusList[0]屬性設定
ConnectionMode
:設定連線的模式,設定為cmClient
。DataType
:設定Modbus讀取/寫入的數據型別,設定為dtBinary
。FunctionCode
設定使用ModbusRTU的寫入指令,此處設定為fc06
。ModbusConnection
:Modbus連線的元件對象,此處設定為ModbusConnection1
。RegCount
:Modbus設備讀取/寫入暫存器的位數,此處設定為1
。StartReg
:Modbus設備讀取/寫入暫存器的起始位置,此處設定為0
。對應的Modbus保持暫存器的地址位為0
。ServerAddress
:Modbus設備服務的地址,此處設定為3
。
# 7. 程式設計
# 7.1. 程式初始設定
在程式初始運行時,設定連線為活動狀態,並讀取LED燈的狀態。
constructor TMyHandler.Create(AOwner: TComponent);
begin
FThis :=TBaseForm(AOwner);
//讀取目前燈狀態
FThis.ModbusConnection1.Active := True;
FThis.ModbusRTUWriteChannel1.ModbusList[0].DataValue := 1;
FThis.ModbusRTUWriteChannel1.ModbusList[0].execute;
FThis.Image3.Visible := True;
end;
2
3
4
5
6
7
8
9
# 7.2. 事件設定
- ③Image4-OnClick事件
點選Image4
時,根據程式中的LED燈顯示狀態,開啟或者關閉LED燈。
procedure TMyHandler.Image4Click;
begin
//ShowMessage(FloatToStr(FThis.ModbusRTUReadChannel1.ModbusList[0].DataValue));
if FThis.Image3.Visible then
begin
//關燈
FThis.ModbusRTUWriteChannel1.ModbusList[0].DataValue := 0;
FThis.ModbusRTUWriteChannel1.ModbusList[0].execute;
FThis.Image3.Visible := False;
end
else
begin
//開燈
FThis.ModbusRTUWriteChannel1.ModbusList[0].DataValue := 1;
FThis.ModbusRTUWriteChannel1.ModbusList[0].execute;
FThis.Image3.Visible := True;
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 8. 運行結果
通過工具欄儲存,將程式儲存為 sdb 專案檔案。
使用滑鼠點選工具欄運行(Run),測試運行結果。當點選右側開關按鈕影象時,如果底下照明燈顯示為熄滅的狀態,則會更新狀態為點亮,同時連線到Arduino的LED燈也會點亮;如果照明燈顯示為點亮的狀態,則會更新狀態為熄滅,同時連線到Arduino的LED燈會熄滅。