液化水槽監控
# FastWeb 液化水槽監控
# 1. 說明
範例採用Modbus TCP通訊協議,控制Factroy IO 的場景,場景中可進行相關操作,FastWeb 範例監控狀態的變化,執行相應的操作。
Factory IO是一款出色的虛擬模擬軟體,可以自由使用其內部的各種元器件、感測器、驅動器等搭建自己理想中的工業現場,並聯合其他工控設備進行程式設計模擬。
範例使用的 Factory IO 場景的製作方式如下:
在Factory IO 中建立一個空白場景。在工作站分類中找到 Tank
,將其拖放至場景中,使用滑鼠右鍵點選零件,將配置修改爲 Analog
。
接下來選擇驅動方式,點選功能表欄中的 檔案-驅動
,在下拉框中選擇驅動的方式為 Modbus TCP/IP Server
,點選右側的 配置
按鈕,將從站ID 修改爲 255
,輸入、輸出點按照圖示進行設定。
返回驅動界面,界面中暫存器分配設定如下:
# 2. 設計明細
開啟FastWeb設計器,分別加入下插圖之控制元件。或者通過點選[匯入]
按鈕選擇模板檔案來打開模板。
1:TUgSwitchImage 元件,控制元件名稱為 UgSwitchImage03
。
2:TUgPanel 元件,控制元件名稱為 UgPanel02
。
3:TUgSwitchImage 元件,控制元件名稱為 UgSiwtchImage01
。
4:TUgTrackBar 元件,控制元件名稱為 TrackBarIn
。
5:TUgPanel 元件,控制元件名稱為 panelin
。
6:TUgPanel 元件,控制元件名稱為 panellevel
。
7: TUgWaterTank 元件,控制元件名稱為 UgWaterTank01
。
8:TUgPanel 元件,控制元件名稱為 panelout
。
9:TUgPanel 元件,控制元件名稱為 panelflow
。
10: TUgPanel 元件,控制元件名稱為 UgPanel03
。
11:TUgSwitchIamge 元件,控制元件名稱為 UgSwitchImage02
。
12:TUgTrackBar 元件,控制元件名稱為 TrackBarOut
。
同時,界面中設定了8個 TUgModbusTCPClient
,其中的 Host
屬性均設定為 Factory IO
運行的 ModbusTCP Server IP地址。
界面中設定了5個 TUgTimer
,其中的 Interval
設定為 100
。
UgWebRunFrame屬性設定
Height
:設定窗體高度=600
。Width
:設定窗體寬度=800
。
UgSwichImage03屬性設定
雙擊控制元件,打開圖片編輯器,上傳兩個圖片,用於代表開與關的狀態。其中開的圖片在前,關的圖片在後。
UgPanel02屬性設定
Ttite
:設定文章顯示的標題,設定為進水控制
。ShowCaption
:是否在面板區域顯示文字,設定為False
。TitleAlign
:設定標題顯示的文字的對齊方式,設定為taCenter
。
UgSiwtchImage01屬性設定
控制元件位於
UgPanel02
中,雙擊控制元件,打開圖片編輯器,上傳兩個圖片,用於代表開與關的狀態。其中開的圖片在前,關的圖片在後。TrackBarIn屬性設定
Max
:設定取值的最大值,設定為1000
。
panelin屬性設定
Caption
:設定初始顯示的文字,設定為0.00
。Title
:設定標題顯示的文字,設定為進水最大流量(L/s)
。TitleAlign
:設定標題顯示的文字的對齊方式,設定為taCenter
。
panellevel屬性設定
Caption
:設定初始顯示的文字,設定為0.00
。Title
:設定標題顯示的文字,設定為液位高度(m)
。TitleAlign
:設定標題顯示的文字的對齊方式,設定為taCenter
。
UgWaterTank01屬性設定
Options
:設定相關選項,其中修改Height
為 240,修改Width
為100
。
panelout屬性設定
Caption
:設定初始顯示的文字,設定為0.00
。Title
:設定標題顯示的文字,設定為出水最大流量(L/s)
。TitleAlign
:設定標題顯示的文字的對齊方式,設定為taCenter
。
panelflow屬性設定
Caption
:設定初始顯示的文字,設定為0.00
。Title
:設定標題顯示的文字,設定為出水流量(L/s)
。TitleAlign
:設定標題顯示的文字的對齊方式,設定為taCenter
。
UgPanel03屬性設定
Ttite
:設定文章顯示的標題,設定為出水控制
。ShowCaption
:是否在面板區域顯示文字,設定為False
。TitleAlign
:設定標題顯示的文字的對齊方式,設定為taCenter
。
UgSiwtchImage02屬性設定
控制元件位於
UgPanel03
中,雙擊控制元件,打開圖片編輯器,上傳兩個圖片,用於代表開與關的狀態。其中開的圖片在前,關的圖片在後。TrackBarOut屬性設定
Max
:設定取值的最大值,設定為1000
。
# 3. 程式設定
# 3.1. 程式初始設定
設定全域性變數。
var Old_PotentionMeterFill,Old_PotentionMeterDisCharge,Fill,DisCharge,Fill_Pressed,DisCharge_Pressed,Old_Fill,Old_DisCharge;
設定初始運行項:
function UgWebRunFrameOnAfterRunScript(sender)
{
Fill_Pressed = false;
DisCharge_Pressed = false;
Old_Fill = "0";
Old_DisCharge = "1";
}
2
3
4
5
6
7
# 3.2. 事件設定
- UgTimer01-OnTimer事件
檢測開關的狀態暫存器,同步更新。
function UgTimer01OnTimer(sender)
{
var s,List;
List = new TStringList();
if (UgModbusTCPClient01.ReadCoils(1,2,s)){
List.CommaText = s;
if (List.Strings[0] == "1"){
UgSwitchImage01.IsChecked = true;
fill = true;
}
if (List.Strings[0] == "0"){
UgSwitchImage01.IsChecked = false;
fill = false;
}
if (List.Strings[1] == "1"){
UgSwitchImage02.IsChecked = true;
DisCharge = true;
}
if (List.Strings[1] == "0"){
UgSwitchImage02.IsChecked = false;
DisCharge = false;
}
}
List.Free;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- UgTimer02-OnTimer 事件
檢測讀數,並更新界面中顯示的讀數資訊。
//讀數狀態切換
function UgTimer02OnTimer(sender)
{
var i,o,s,t;
if(UgModbusTCPClient02.ReadHoldingRegister(1,i)){
panelin.Caption = FloatToStr(i * 0.01);
}
if(UgModbusTCPClient02.ReadHoldingRegister(2,o)){
panelout.Caption = FloatToStr(o * 0.01);
}
if(UgModbusTCPClient02.ReadHoldingRegister(5,s)){
panellevel.Caption = FloatToStr(s * 0.001 * 3);
UgWaterTank01.Options.Level = s * 0.1;
}
if(UgModbusTCPClient02.ReadHoldingRegister(6,t)){
panelflow.Caption = FloatToStr(t * 0.01);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- ugSwitchImage01-OnSwitch事件
進水開關狀態變化指令傳遞。
//進水開關
function ugSwitchImage01OnSwitch(sender)
{
UgModbusTCPClient03.WriteCoil(1,UgSwitchImage01.IsChecked);
}
2
3
4
5
- ugSwitchImage02-OnSwitch事件
出水開關狀態變化指令傳遞。
//出水開關
function ugSwitchImage02OnSwitch(sender)
{
UgModbusTCPClient03.WriteCoil(2,UgSwitchImage02.IsChecked);
}
2
3
4
5
- TrackBarIn - OnChange事件
進水最大流量調節。
//進水調節
function TrackBarInOnChange(sender)
{
UgModbusTCPClient04.WriteRegister(1,TrackBarIn.Position);
UgModbusTCPClient04.WriteRegister(3,TrackBarIn.Position);
}
2
3
4
5
6
- TrackBarOut-OnChange事件
出水最大流量調節。
//出水調節
function TrackBarOutOnChange(sender)
{
UgModbusTCPClient04.WriteRegister(2,TrackBarIn.Position);
UgModbusTCPClient04.WriteRegister(4,TrackBarIn.Position);
}
2
3
4
5
6
- ugSwitchImage03-OnSwitch事件
監控開關。
//定時器
function ugSwitchImage03OnSwitch(sender)
{
UgTimer01.Enabled = UgSwitchImage03.IsChecked;
UgTimer02.Enabled = UgSwitchImage03.IsChecked;
UgTimer03.Enabled = UgSwitchImage03.IsChecked;
UgTimer04.Enabled = UgSwitchImage03.IsChecked;
UgTimer05.Enabled = UgSwitchImage03.IsChecked;
}
2
3
4
5
6
7
8
9
- UgTimer03-OnTimer 事件
按鈕開關的狀態檢測,如有檢測到按鈕按動的操作,則執行相應的操作。
//檢測按鈕按下,開啟開關
function UgTimer03OnTimer(sender)
{
var s,t,List;
List = new TStringList;
if (UgModbusTCPClient08.ReadInputBits(1,2,s)){
List.CommaText = s;
if (List.Strings[0] == "1"){
Fill_Pressed = True;
}
if (List.Strings[1] == "0"){
DisCharge_Pressed = True;
}
if ((Fill_Pressed) && (Fill == False)){
UgModbusTCPClient05.WriteCoil(1,True);
Fill_Pressed = false;
}
if ((Fill_Pressed) && (Fill == True)){
UgModbusTCPClient05.WriteCoil(1,False);
Fill_Pressed = false;
}
if ((DisCharge_Pressed) && (DisCharge == false)){
UgModbusTCPClient05.WriteCoil(2,True);
DisCharge_Pressed = false;
}
if ((DisCharge_Pressed) && (DisCharge == true)){
UgModbusTCPClient05.WriteCoil(2,False);
DisCharge_Pressed = false;
}
}
List.Free;
}
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
31
32
- UgTimer04-OnTimer事件
場景中的旋鈕轉動檢測事件,同步更新界面的流量控制。
function UgTimer04OnTimer(sender)
{
var s,List;
List = new TStringList();
UgModbusTCPClient06.ReadInputRegisters(1,4,s){
List.CommaText = s;
if (Old_PotentionMeterFill != StrToInt(List.Strings[0])){
UgModbusTCPClient06.WriteRegister(1,StrToInt(List.Strings[0]));
Old_PotentionMeterFill = StrToInt(List.Strings[0]);
}
if (Old_PotentionMeterDisCharge != StrToInt(List.Strings[1])){
UgModbusTCPClient06.WriteRegister(2,StrToInt(List.Strings[1]));
Old_PotentionMeterDisCharge = StrToInt(List.Strings[1]);
}
UgModbusTCPClient06.WriteRegister(5,StrToInt(List.Strings[2]));
UgModbusTCPClient06.WriteRegister(6,StrToInt(List.Strings[3]));
}
List.Free;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- UgTimer05-OnTimer事件
控制開關,控制進出水流量的總開關。
function UgTimer05OnTimer(sender)
{
var s,List;
List = new TStringList;
if (UgModbusTCPClient07.ReadHoldingRegisters(1,4,s)){
List.CommaText = s;
if (Fill){
UgModbusTCPClient07.WriteRegister(3,StrToInt(List.Strings[0]));
}
Else{
UgModbusTCPClient07.WriteRegister(3,0);
}
if (DisCharge){
UgModbusTCPClient07.WriteRegister(4,StrToInt(List.Strings[1]));
}
Else{
UgModbusTCPClient07.WriteRegister(4,0);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 4. 運行結果
使用滑鼠點選工具欄儲存到資料庫,然後點選運行(Run),測試運行結果。監控按鈕按下後,可在Factory IO 中的場景執行操作。