RS485計數器
# PinToo之RS485計數器
# 1. 說明
範例採用RS485介面,通過ModbusRTU通訊協議,讀取計數器數據並控制數據顯示。使用Modbus協議進行計數器數值的讀取,並且寫入數值0以達到清零的效果。
範例使用到的計數器為FC304N-R計數器,該計數器通過RS485協議與手機端進行連線通訊。配合該計數器使用到的配件包含USB-485轉換器,金屬接近開關感測器,電源線纜,通訊線纜。計數器的220V介面與220V電源連線,12V+,12V-與IN1分別與金屬接近開關的正極(棕色線)、負極(藍色線)、訊號極(黑色)相連。計數器的485A、485B介面分別與USB-485的正極,負極相連。USB-485轉換器在連線至計算機時會被識別為通訊埠,請記住該通訊埠的埠號,在接下來的配置過程中會使用到該埠號。
通過範例學習,可以掌握ModbusRTU的基本通訊原理,並通過RS485進行計數器的讀取與控制功能。
# 2. 設計明細
開啟PinToo設計器,分別加入下插圖之控制元件。或者點選左上角的[打開模板Lib檔案]選擇模板檔案來打開對應模板。

①:TfxImage元件,控制元件名稱為fxImageSearch。
②:TfxText元件,控制元件名稱為fxTextStatus。
③:TfxImage元件,控制元件名稱為fxImageConnect。
④:TfxWidgetLCDLabel元件,控制元件名稱為fxWidgetLCDLabel1。
⑤:TfxNumberBox元件,控制元件名稱為fxNumberBox1。
⑥:TfxText元件,控制元件名稱為fxTextWrite。
⑦:TfxUsbSerial元件,控制元件名稱為fxUsbSerial。
fxRunFrame屬性設定
Height:設定頁面高度=800。Width:設定頁面寬度=400。
fxComboBox屬性設定
Visible:是否顯示該覈取方塊,此處選擇False。Name:設定控制元件名稱=fxComboBox。
fxTimer1屬性設定
Enabled:是否啟用計時器,設定為False。Interval:設定計時器間隔(ms),設定為300ms。
①fxImageSearch屬性設定
Height:設定控制元件高度=40。Width:設定控制元件寬度=40。Name:設定控制元件名稱=fxImageSearch。WarpMode:設定影象在控制元件中顯示的模式,設定為Fit,即影象適應于控制元件大小。Bitmap:設定顯示的圖片,雙擊該屬性或者點選屬性右側的[...]打開影象編輯器。點選[Load...]打開資源管理器,選擇所需的圖片後點擊[打開],選擇的影象會顯示在預覽框中。可在該頁面下進行裁切或者縮放畫素以使影象與控制元件的寬度高度相適應,修改完成後點選[OK]按鈕完成影象修改。

②fxTextStatus屬性設定
Text:設定顯示文字=等待連線。Height:設定控制元件高度=40。Width:設定控制元件寬度=280。Name:設定控制元件名稱=fxTextStatus。TextSettings:設定文字字型的相關資訊。設定Font.Size=18。FontColor=White。HorzAlign:設定文字在控制元件中的水平位置=Center。VertAlign:設定文字在控制元件中的垂直位置=Center。
③fxWidgetLCDLabel1屬性設定
Height:設定控制元件高度=110。Width:設定控制元件寬度=360。
④fxImageConnnect屬性設定
Height:設定控制元件高度=40。Width:設定控制元件寬度=40。Name:設定控制元件名稱=fxImageConnect。WarpMode:設定影象在控制元件中顯示的模式,設定為Fit,即影象適應于控制元件大小。Bitmap:設定顯示的圖片,雙擊該屬性或者點選屬性右側的[...]打開影象編輯器。點選[Load...]打開資源管理器,選擇所需的圖片後點擊[打開],選擇的影象會顯示在預覽框中。可在該頁面下進行裁切或者縮放畫素以使影象與控制元件的寬度高度相適應,修改完成後點選[OK]按鈕完成影象修改。

⑤fxNumebrBox1屬性設定
Height:設定控制元件高度=50。Width:設定控制元件寬度=100。
⑥fxTextWrite屬性設定
Height:設定控制元件高度=80。Width:設定控制元件寬度=80。TextSettings:文字樣式設定,Font.Size=24,Font.Style中勾選fsBold。Text:設定顯示的文字內容=寫入。
⑦fxUsbSerial屬性設定
UsbSerialType:通訊埠通訊型別,此處選擇RS485。Info:是否顯示除錯資訊,進行除錯操作時可用。
# 3. 程式設計
點選程式設計界面右下角的按鈕,切換至單元選擇界面,勾選需要使用的單元。該程式需要引用uUSBSerial單元。
# 3.1. 程式初始設定
程式啟動時,數字儀表盤中非填充部分的內容設定為透明,並設定預設的數字顯示格式。
Begin
fxWidgetLCDLabel1.Caption.FillOff.Color := NULL;
fxWidgetLCDLabel1.Caption.Format := '00000';
End.
2
3
4
# 3.2. 事件設定
- ①fxImageSearch-OnClick事件
點選搜索按鈕,載入設備列表並彈出顯示在下拉選單框中。
Procedure fxImageSearchOnClick(Sender: TObject);
//點選搜索按鈕尋找埠
Begin
if fxUsbSerial.Devices.Text = '' Then
begin
fxTextStatus.Text := '請檢查通訊埠是否連線';
Exit;
End;
fxComboBox.Items := fxUsbSerial.Devices;
fxComboBox.DropDown;
End;
2
3
4
5
6
7
8
9
10
11
- fxComboBox-OnChange事件
點選切換埠,並顯示。
Procedure fxComboBoxOnChange(Sender: TObject);
Begin
fxUsbSerial.UsbDevice := fxComboBox.Items.Strings[fxComboBox.ItemIndex];
fxTextStatus.Text := '已選擇埠';
End;
2
3
4
5
- ④fxImageConnect-OnClick事件
當點選連線按鈕后,開啟通訊埠連線並啟用計時器。
Procedure fxImageConnectOnClick(Sender: TObject);
//連線
Begin
fxUsbSerial.Open(True);
if fxUsbSerial.Devices.Text <> '' Then
begin
fxTextStatus.Text := '計數器已連線';
fxTimer1.Enabled := True;
End;
End;
2
3
4
5
6
7
8
9
10
- fxTimer1-OnTimer事件
當計時器觸發時,讀取計數器中的保持暫存器數據。
Procedure fxTimer1OnTimer(Sender: TObject);
//連續讀取
Begin
fxUsbSerial.ReadHoldingRegisters(1,0,10);
End;
2
3
4
5
- ⑦fxUsbSerial-OnReadHoldingRegisters事件
當讀取保持暫存器數據時返回數據解析顯示在儀表中。
Procedure fxUsbSerialOnReadHoldingRegisters(Sender: TObject; ReceiveData: string; UserData: string);
//返回數值
var
s:Tstrings;
Begin
s := TStringlist.Create;
s.CommaText := UserData;
if s.Count=10 Then
begin
fxWidgetLCDLabel1.Caption.Value := StrToInt(s[1]);
End;
End;
2
3
4
5
6
7
8
9
10
11
12
- ⑥fxTextWrite-OnClick事件
點選[寫入]按鈕,執行寫入多個保持暫存器命令,將計數器的數值修改爲數值編輯框中的值。
Procedure fxTextWriteOnClick(Sender: TObject);
Begin
fxUsbSerial.WriteMultipleRegisters(1,1,1,fxNumberBox1.Text);
End;
2
3
4
# 4. 運行結果
使用滑鼠在 PinToo 功能表,點選[儲存至資料庫]按鈕,將其儲存至資料庫,點選[除錯運行]確認能夠正常打開。

通過同步中心,將程式上傳至手機PinToo運行;同步時,請確保手機已經運行PinToo,並且已經登陸。

將計數器連線好后,USB轉485模組的USB端與手機的USB端連線。打開程式,點選[搜索]按鈕獲取通訊埠設備列表,在彈出的下拉框中選擇對應的設備名稱,然後點選右側的[連線]按鈕開啟連線,通過觸動金屬接近開關,計數器的數值發生變化,手機端的數字儀表顯示的值也會對應發生變化。編輯數字框中的數字(例如設定為0,則將計數器清零),點選下方的寫入按鈕,計數器的值會變為0,同時手機上顯示的數值也會變為0。