Presentation is loading. Please wait.

Presentation is loading. Please wait.

第17單元 智慧型控制網路 規劃與管理專題.

Similar presentations


Presentation on theme: "第17單元 智慧型控制網路 規劃與管理專題."— Presentation transcript:

1 第17單元 智慧型控制網路 規劃與管理專題

2 課程大綱 17-1 DIO模組應用 17-2 整合模組應用範例

3 前 言 在本單元中,將就DIO模組與整合模組的應用範例加以詳細說明介紹,以培養學生具備智慧型控制網路規劃與管理的專業素養與應用技能,利用智慧型控制網路元件之建構與整合,實際進行實作設計,以達成理論與技術結合的目標。

4 17-1 DIO模組應用 風扇控制系統 硬體應用 功能 提示 感測器部分規劃(控制面板) 致動器部分規劃 程式碼 習題

5 硬體應用 感測器部分: 溫度感測器,自返開關 致動器部分: 風扇、七節顯示器

6 功能 直接控制風扇,OFF、LOW、MED、HIGH。 亂數決定風速,像是市面上的電風扇之”自然風”功能。 類似冷氣的,恆溫空調系統。

7 提示 利用延伸模組上的開關(Switch)當做控制面板。 要找出 Random 函數運用在”自然風”功能上。
由溫度感測器感測到的溫度須經 8bits ADC轉換成數位資料,再由程式轉換為溫度數值顯示在7節顯示器上。 需要讓使用者透過控制面板設定溫度,並且能夠切換顯示室溫及設定溫度。

8 感測器部分規劃(控制面板) 裝置名稱 輸出腳位 功能設定概述 Q1 X0~X7 溫度感測器 SW0 X8 蜂鳴器開關 SW1 X9
恆溫開關(風扇將隨設定溫度調整速度) SW2 X10 自然風開關 SW3~SW6 X11~X14 直接控制風速開關(OFF、LOW、MED、HIGH) SW7 X15 切換室溫/設定溫度 SW8,SW9 X16,X17 調整設定溫度升降

9 致動器部分規劃 裝置名稱 輸出腳位 功能設定概述 S3 Y1,Y2 風扇 U10 Y8~Y11 顯示室溫/設定溫度(十位數) U11
顯示室溫/設定溫度(個位數)

10 程式碼 1/34 #include <SNVT_LEV.H> #include <SNVT_OC.H>
程式碼 1/34 #include <SNVT_LEV.H> #include <SNVT_OC.H> #include <DIO-EXT-Display.H> //#pragma enable_io_pullups //<DIO-EXT-Display.H> //#pragma num_alias_table_entries 15 //<DIO-EXT-Display.H> //#pragma enable_sd_nv_names //<DIO-EXT-Display.H> network input SNVT_state nviCH1 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_out bit0 ~ bit7 //network input SNVT_state nviCH2 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_out bit8 ~ bit15 //<DIO-EXT-Display.H> network input unsigned nviStateTestCH1 ; network input unsigned nviStateTestCH2 ; network input unsigned nviStateTestCH3 ; //network input SNVT_temp_p nvitempSet ; //<DIO-EXT-Display.H> network input SNVT_temp_p nvitempoffset ; network input SNVT_switch nviFanAuto ; network input SNVT_switch nviFanNatural ; network input SNVT_switch nviFanTempSet ; network input SNVT_temp_p nvitemperature ;

11 程式碼 2/34 network output SNVT_state nvoCH1 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_in bit0 ~ bit7 network output SNVT_state nvoCH2 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_in bit8 ~ bit15 network output SNVT_state nvoCH3 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_in bit16 ~ bit23 network output SNVT_temp_p nvotempSet ; network output SNVT_temp_p nvotempture ; network output unsigned nvoStateTestCH1 ; network output unsigned nvoStateTestCH2 ; network output unsigned nvoStateTestCH3 ;

12 程式碼 3/34 /* //<DIO-EXT-Display.H> #define LEN3 3 #define LEN2 2
程式碼 3/34 /* //<DIO-EXT-Display.H> #define LEN #define LEN far int IO_in_reg[LEN3]; far int IO_in_tmp[LEN3]; unsigned long IO_out_reg[LEN2]; unsigned IO_out_tmp[LEN2]; */ unsigned tempreg1; unsigned tempreg2; unsigned Random ; mtimer repeating Rd_io_state = 100 ; // DI scan time 100 ms stimer repeating FanNSet = 8 ; // random time 8 sec //stimer TempSet ; //<DIO-EXT-Display.H> //IO_0 muxbus io_local_bus; //<DIO-EXT-Display.H> SNVT_temp_p TemptureT;

13 程式碼 4/34 when (reset) { io_out(io_local_bus, 8 , 0xFF);
程式碼 4/34 when (reset) { io_out(io_local_bus, 8 , 0xFF); io_out(io_local_bus, 9 , 0xFF); io_out(io_local_bus,255,0); IO_in_reg[0] = 0xFF ; IO_in_reg[1] = 0xFF ; IO_in_reg[2] = 0x00 ; nvotempSet = 2500 ; }

14 程式碼 5/34 when (timer_expires(Rd_io_state)) {
程式碼 5/34 when (timer_expires(Rd_io_state)) { IO_in_tmp[0]= io_in(io_local_bus,0); // nvoStateTest = IO_in_tmp[0]; IO_in_tmp[1]= io_in(io_local_bus,1); IO_in_tmp[2]= io_in(io_local_bus,2); //######### CH1 IO input identify ########### if (IO_in_tmp[0]!= IO_in_reg[0]) // temperature degree show on 7-seg

15 程式碼 6/34 tempreg2 = IO_in_reg[0] & 0x01 ; if (tempreg1 != tempreg2) {
程式碼 6/34 tempreg1 = IO_in_tmp[0] & 0x01 ; //bit0 tempreg2 = IO_in_reg[0] & 0x01 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH1.bit0 = 0 ; else nvoCH1.bit0 = 1 ; } tempreg1 = IO_in_tmp[0] & 0x02 ; //bit1 tempreg2 = IO_in_reg[0] & 0x02 ; nvoCH1.bit1 = 0 ; nvoCH1.bit1 = 1 ;

16 程式碼 7/34 tempreg1 = IO_in_tmp[0] & 0x04 ; //bit2
程式碼 7/34 tempreg1 = IO_in_tmp[0] & 0x04 ; //bit2 tempreg2 = IO_in_reg[0] & 0x04 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH1.bit2 = 0 ; else nvoCH1.bit2 = 1 ; } tempreg1 = IO_in_tmp[0] & 0x08 ; //bit3 tempreg2 = IO_in_reg[0] & 0x08 ; nvoCH1.bit3 = 0 ; nvoCH1.bit3 = 1 ;

17 程式碼 8/34 tempreg1 = IO_in_tmp[0] & 0x10 ; //bit4
程式碼 8/34 tempreg1 = IO_in_tmp[0] & 0x10 ; //bit4 tempreg2 = IO_in_reg[0] & 0x10 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH1.bit4 = 0 ; else nvoCH1.bit4 = 1 ; } tempreg1 = IO_in_tmp[0] & 0x20 ; //bit5 tempreg2 = IO_in_reg[0] & 0x20 ; nvoCH1.bit5 = 0 ; nvoCH1.bit5 = 1 ;

18 程式碼 9/34 tempreg1 = IO_in_tmp[0] & 0x40 ; //bit6
程式碼 9/34 tempreg1 = IO_in_tmp[0] & 0x40 ; //bit6 tempreg2 = IO_in_reg[0] & 0x40 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH2.bit0 = 0 ; else nvoCH2.bit0 = 1 ; } tempreg1 = IO_in_tmp[0] & 0x80 ; //bit7 tempreg2 = IO_in_reg[0] & 0x80 ; nvoCH1.bit7 = 0 ; nvoCH1.bit7 = 1 ; }

19 程式碼 10/34 IO_in_reg[0] = IO_in_tmp[0] ;
程式碼 10/34 IO_in_reg[0] = IO_in_tmp[0] ; nvoStateTestCH1 = IO_in_reg[0]; TemptureT = (((255-nvoStateTestCH1)/5)*100); // transfer digital temperature value to temperature degree nvotempture=(TemptureT+nvitempoffset); // setting temperature offset if(nviFanTempSet.state ==0) { Dsp0=(nvotempture/1000); // display temperature degree Dsp1=((nvotempture%1000)/100); }

20 程式碼 11/34 //####### CH2 IO input identify #########
程式碼 11/34 //####### CH2 IO input identify ######### if (IO_in_tmp[1]!= IO_in_reg[1]) { tempreg1 = IO_in_tmp[1] & 0x01 ; // bit0 Buzzer sound tempreg2 = IO_in_reg[1] & 0x01 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH2.bit0 = 0 ; nviCH1.bit15 = 0 ; } else { nvoCH2.bit0 = 1 ; nviCH1.bit15 = 1 ;

21 程式碼 12/34 tempreg1 = IO_in_tmp[1] & 0x02 ; //bit1 automatic Temperature control tempreg2 = IO_in_reg[1] & 0x02 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH2.bit1 = 0 ; if(nvotempture > nvotempSet+400) { nviCH1.bit14 = 0 ; nviCH1.bit13 = 0 ; } else if(nvotempture > nvotempSet+200) { nviCH1.bit14 = 1 ; else if(nvotempture > nvotempSet) nviCH1.bit13 = 1 ; } else } { nvoCH2.bit1 = 1 ; }

22 程式碼 13/34 tempreg1 = IO_in_tmp[1] & 0x04 ; //bit2 Random function
程式碼 13/34 tempreg1 = IO_in_tmp[1] & 0x04 ; //bit2 Random function tempreg2 = IO_in_reg[1] & 0x04 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH2.bit2 = 0 ; } else nvoCH2.bit2 = 1 ; tempreg1 = IO_in_tmp[1] & 0x08 ; //bit3 Fan speed = High tempreg2 = IO_in_reg[1] & 0x08 ; nvoCH2.bit3 = 0 ; nviCH1.bit14 = 0 ; nviCH1.bit13 = 0 ;

23 程式碼 14/34 tempreg1 = IO_in_tmp[1] & 0x10 ; //bit4 Fan speed = Med
程式碼 14/34 tempreg1 = IO_in_tmp[1] & 0x10 ; //bit4 Fan speed = Med tempreg2 = IO_in_reg[1] & 0x10 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH2.bit4 = 0 ; nviCH1.bit14 = 1 ; nviCH1.bit13 = 0 ; } tempreg1 = IO_in_tmp[1] & 0x20 ; //bit5 Fan speed = Low tempreg2 = IO_in_reg[1] & 0x20 ; nvoCH2.bit5 = 0 ; nviCH1.bit14 = 0 ; nviCH1.bit13 = 1 ;

24 程式碼 15/34 tempreg1 = IO_in_tmp[1] & 0x40 ; //bit6 Fan = OFF
程式碼 15/34 tempreg1 = IO_in_tmp[1] & 0x40 ; //bit6 Fan = OFF tempreg2 = IO_in_reg[1] & 0x40 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH2.bit6 = 0 ; nviCH1.bit14 = 1 ; nviCH1.bit13 = 1 ; } tempreg1 = IO_in_tmp[1] & 0x80 ; // bit7 Monitor expectancy temperature tempreg2 = IO_in_reg[1] & 0x80 ;

25 程式碼 16/34 if (tempreg1 != tempreg2) { if ( tempreg1 == 0 )
程式碼 16/34 if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH2.bit7 = 0 ; nviFanTempSet.state =1 ; Dsp0=(nvitempSet/1000); // display expectancy temperature Dsp1=((nvitempSet%1000)/100); } else nvoCH2.bit7 = 1 ; nviFanTempSet.state =0 ; Dsp0=(nvotempture/1000); // display expectancy temperature Dsp1=((nvotempture%1000)/100);

26 程式碼 17/34 IO_out_reg[0] =*((unsigned long*)&nviCH1);
程式碼 17/34 IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); IO_in_reg[1] = IO_in_tmp[1] ; nvoStateTestCH2 = IO_in_tmp[1]; }

27 程式碼 18/34 //####### CH3 IO input identify #########
程式碼 18/34 //####### CH3 IO input identify ######### if (IO_in_tmp[2]!= IO_in_reg[2]) { tempreg1 = IO_in_tmp[2] & 0x01 ; //bit0 expectancy temperature +1 tempreg2 = IO_in_reg[2] & 0x01 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH3.bit0 = 0 ; nvotempSet = nvotempSet +100 ; } else { nvoCH3.bit0 = 1 ; } tempreg1 = IO_in_tmp[2] & 0x02 ; //bit1 expectancy temperature -1 tempreg2 = IO_in_reg[2] & 0x02 ; { nvoCH3.bit1 = 0 ; nvotempSet = nvotempSet -100 ; { nvoCH3.bit1 = 1 ; }

28 程式碼 19/34 IO_out_reg[1] =*((unsigned long*)&nviCH2);
程式碼 19/34 IO_out_reg[1] =*((unsigned long*)&nviCH2); IO_out_tmp[1] = low_byte(IO_out_reg[1]); io_out(io_local_bus, 9 , IO_out_tmp[1]); IO_in_reg[2] = IO_in_tmp[2] ; //nvoStateTestCH3 = IO_in_tmp[2]; }

29 程式碼 20/34 when (nv_update_occurs(nvitempoffset)) // Temperature offset
程式碼 20/34 when (nv_update_occurs(nvitempoffset)) // Temperature offset { TemptureT = (((255-nvoStateTestCH1)/5)*100); nvotempture=(TemptureT+nvitempoffset); if(nviFanTempSet.state ==0) Dsp0=(nvotempture/1000); Dsp1=((nvotempture%1000)/100); }

30 程式碼 21/34 when (nv_update_occurs(nvitempSet)) // when expectancy temperature change { if(nviFanTempSet.state ==1) { Dsp0=(nvitempSet/1000); Dsp1=((nvitempSet%1000)/100); } if(nvoCH2.bit1 == 0) { if(nvotempture > nvotempSet+400) { nviCH1.bit14 = 0 ; nviCH1.bit13 = 0 ; } else if(nvotempture > nvotempSet+200) { nviCH1.bit14 = 1 ; else if(nvotempture > nvotempSet) nviCH1.bit13 = 1 ; } else nviCH1.bit13 = 1 ; } } IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); // nvoStateTestCH = IO_out_tmp[0]; io_out(io_local_bus, 8 , IO_out_tmp[0]); }

31 程式碼 22/34 when (nv_update_occurs(nvitemperature)) // when temperature change { if(nvoCH2.bit1 == 0) { if(nvotempture > nvotempSet+400) { nviCH1.bit14 = 0 ; nviCH1.bit13 = 0 ; } else if(nvotempture > nvotempSet+200) { nviCH1.bit14 = 1 ; else if(nvotempture > nvotempSet) nviCH1.bit13 = 1 ; } else }

32 程式碼 23/34 IO_out_reg[0] =*((unsigned long*)&nviCH1);
程式碼 23/34 IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); // nvoStateTestCH = IO_out_tmp[0]; io_out(io_local_bus, 8 , IO_out_tmp[0]); } when (nv_update_occurs (nviCH1)) { when (nv_update_occurs (nviCH2)) IO_out_reg[1] =*((unsigned long*)&nviCH2); IO_out_tmp[1] = low_byte(IO_out_reg[1]); // nvoStateTestCH = IO_out_tmp[1]; io_out(io_local_bus, 9 , IO_out_tmp[1]);

33 程式碼 24/34 when (timer_expires(FanNSet)&&nvoCH2.bit2 == 0) //Random function , please refer to "Neuron C reference guide" page 3-83 { Random = random() ; if(255 >= Random && Random > 191 ) { nviCH1.bit14 = 0 ; nviCH1.bit13 = 0 ; } else if(191 >= Random && Random > 127 ) { nviCH1.bit14 = 1 ; else if(127 >= Random && Random > 63 ) nviCH1.bit13 = 1 ; } else nviCH1.bit13 = 1 ; } IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); // nvoStateTestCH = IO_out_tmp[0]; io_out(io_local_bus, 8 , IO_out_tmp[0]);

34 程式碼 25/34 <DIO-EXT-Display.H> #include <stdlib.H>
程式碼 25/34 <DIO-EXT-Display.H> #include <stdlib.H> #pragma enable_io_pullups #pragma num_alias_table_entries 15 #pragma enable_sd_nv_names network input SNVT_state nviCH2 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_out bit8 ~ bit15 //network input unsigned nviStateTestCH1 ; network input SNVT_temp_p nvitempSet ; #define LEN #define LEN far int IO_in_reg[LEN3]; far int IO_in_tmp[LEN3]; unsigned long IO_out_reg[LEN2]; unsigned IO_out_tmp[LEN2]; IO_0 muxbus io_local_bus; int Dsp0 ; int Dsp1 ; mtimer repeating Display = 100 ;

35 程式碼 26/34 when (timer_expires(Display)) // 7-seg display table 0~15
程式碼 26/34 when (timer_expires(Display)) // 7-seg display table 0~15 { if(Dsp0 == 0) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ; nviCH2.bit13 = 0 ; nviCH2.bit12 = 0 ; } if(Dsp1 == 0) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 0 ; nviCH2.bit9 = 0 ; nviCH2.bit8 = 0 ;} if(Dsp0 == 1) { nviCH2.bit15 = 1 ; if(Dsp1 == 1) { nviCH2.bit11 = 1 ; nviCH2.bit8 = 0 ; }

36 程式碼 27/34 if(Dsp0 == 2) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ;
程式碼 27/34 if(Dsp0 == 2) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ; nviCH2.bit13 = 0 ; nviCH2.bit12 = 0 ;} if(Dsp1 == 2) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 1 ; nviCH2.bit9 = 0 ; nviCH2.bit8 = 0 ;} if(Dsp0 == 3) { nviCH2.bit15 = 1 ; if(Dsp1 == 3) { nviCH2.bit11 = 1 ;

37 程式碼 28/34 if(Dsp0 == 4) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ;
程式碼 28/34 if(Dsp0 == 4) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ; nviCH2.bit13 = 1 ; nviCH2.bit12 = 0 ;} if(Dsp1 == 4) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 0 ; nviCH2.bit9 = 1 ; nviCH2.bit8 = 0 ;} if(Dsp0 == 5) { viCH2.bit15 = 1 ; if(Dsp1 == 5) { nviCH2.bit11 = 1 ;

38 程式碼 29/34 if(Dsp0 == 6) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ;
程式碼 29/34 if(Dsp0 == 6) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ; nviCH2.bit13 = 1 ; nviCH2.bit12 = 0 ;} if(Dsp1 == 6) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 1 ; nviCH2.bit9 = 1 ; nviCH2.bit8 = 0 ;} if(Dsp0 == 7) { nviCH2.bit15 = 1 ; if(Dsp1 == 7) { nviCH2.bit11 = 1 ;

39 程式碼 30/34 if(Dsp0 == 8) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ;
程式碼 30/34 if(Dsp0 == 8) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ; nviCH2.bit13 = 0 ; nviCH2.bit12 = 1 ; } if(Dsp1 == 8) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 0 ; nviCH2.bit9 = 0 ; nviCH2.bit8 = 1 ; } if(Dsp0 == 9) { nviCH2.bit15 = 1 ; if(Dsp1 == 9) { nviCH2.bit11 = 1 ;

40 程式碼 31/34 if(Dsp0 == 10) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ;
程式碼 31/34 if(Dsp0 == 10) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ; nviCH2.bit13 = 0 ; nviCH2.bit12 = 1 ; } if(Dsp1 == 10) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 1 ; nviCH2.bit9 = 0 ; nviCH2.bit8 = 1 ; } if(Dsp0 == 11) { nviCH2.bit15 = 1 ; if(Dsp1 == 11) { nviCH2.bit11 = 1 ;

41 程式碼 32/34 if(Dsp0 == 12) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ;
程式碼 32/34 if(Dsp0 == 12) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 0 ; nviCH2.bit13 = 1 ; nviCH2.bit12 = 1 ; } if(Dsp1 == 12) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 0 ; nviCH2.bit9 = 1 ; nviCH2.bit8 = 1 ; } if(Dsp0 == 13) { nviCH2.bit15 = 1 ; if(Dsp1 == 13) { nviCH2.bit11 = 1 ; nviCH2.bit8 = 1 ;}

42 程式碼 33/34 if(Dsp0 == 14) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ;
程式碼 33/34 if(Dsp0 == 14) { nviCH2.bit15 = 0 ; nviCH2.bit14 = 1 ; nviCH2.bit13 = 1 ; nviCH2.bit12 = 1 ; } if(Dsp1 == 14) { nviCH2.bit11 = 0 ; nviCH2.bit10 = 1 ; nviCH2.bit9 = 1 ; nviCH2.bit8 = 1 ; } if(Dsp0 == 15) { nviCH2.bit15 = 1 ; if(Dsp1 == 15) { nviCH2.bit11 = 1 ;

43 程式碼 34/34 IO_out_reg[1] =*((unsigned long*)&nviCH2);
程式碼 34/34 IO_out_reg[1] =*((unsigned long*)&nviCH2); IO_out_tmp[1] = low_byte(IO_out_reg[1]); io_out(io_local_bus, 9 , IO_out_tmp[1]);

44 習題 將自然風功能中的每8秒自動切換的 ”8秒”也用Random,設定在10 秒到60秒之間。
當溫度介於臨界值時,風扇會不停切換(LOW、MED、LOW、MED),請在切換溫度之後加入一個延遲效果,約5~10秒。 當溫度高於40度時,請觸發蜂鳴器鳴叫,並在網路變數上送出警告。

45 保全系統 硬體應用 功能 提示 感測器部分規劃 致動器部分規劃 程式碼 習題 專題練習

46 硬體應用 感測器部分: 磁簧開關、自返開關。 致動器部分: 蜂鳴器、直流馬達、螺線管、繼電器開關、七節顯示器。

47 功能 警報功能,當有人站在門口時啟動倒數裝置,20秒內不能輸入正確密碼,啟動警報器警告。 密碼輸入功能,修改密碼功能。 人員離開,系統復原。

48 提示 利用自返開關當作密碼輸入器,4個bits當作密碼,1個bit 當傳送。 倒數計時功能。 密碼判定將是很重要的一部分,如何做判斷。

49 感測器部分規劃 裝置名稱 輸出腳位 功能設定概述 S1 X8 磁簧開關 SW1,SW2 X9,X10 馬達正反轉 SW8~SW11
4bits 鍵盤 SW12 X20 傳送SW8~SW11資料 SW13 X21 重置

50 致動器部分規劃 裝置名稱 輸出腳位 功能設定概述 B1 Y0 20秒內不能輸入正確密碼,啟動蜂鳴器 S4 Y3,Y4 馬達正反轉 S2 Y5
螺線管 K6 Y6 模擬當人靠近時的燈 K7 Y7 進入密碼設定模式的警示燈 U10 Y8~Y11 顯示倒數計時秒數 U11 Y12~Y15 顯示輸入之密碼數值

51 程式碼 1/23 #include <SNVT_LEV.H> #include <SNVT_OC.H>
#include <DIO-EXT-Display.h> //#pragma enable_io_pullups //#pragma num_alias_table_entries 15 //#pragma enable_sd_nv_names network input SNVT_occupancy nviMags ; // input bit0 Mags network input SNVT_occupancy nviOccupy ; network input SNVT_lev_disc nviGuard ; network input SNVT_occupancy nviDoorOccup ; network input unsigned nviStateTestCH1 ; network input unsigned nviStateTestCH2 ; network input unsigned nviStateTestCH3 ; network input unsigned nviPass1 ; network input unsigned nviPass2 ; network input unsigned nviPass3 ; network input unsigned nviPass4 ;

52 程式碼 2/23 network output SNVT_occupancy nvoMags ; // output bit0 Mags
network output SNVT_occupancy nvoOccupy ; network output SNVT_lev_disc nvoGuard ; network output SNVT_lev_disc nvoFireL ; network output SNVT_switch nvoDoorLight ; network output SNVT_state nvoCH1 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_in bit0 ~ bit7 network output SNVT_state nvoCH2 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_in bit8 ~ bit15 network output SNVT_state nvoCH3 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_in bit16 ~ bit23 network input SNVT_state nviCH1 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_out bit0 ~ bit7 //network input SNVT_state nviCH2 ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};// io_out bit8 ~ bit15

53 程式碼 3/23 network output unsigned nvoStateTestCH1 ;
//#define LEN //#define LEN //far int IO_in_reg[LEN3]; //far int IO_in_tmp[LEN3]; //unsigned long IO_out_reg[LEN2]; //unsigned IO_out_tmp[LEN2]; unsigned tempreg1; unsigned tempreg2; mtimer repeating Rd_io_state = 100 ; mtimer Passtimer ; stimer repeating Temp = 1 ; // 0 : Active : Inactive //IO_0 muxbus io_local_bus; int i ; int x ; int p1 ;int p2 ;int p3 ;int p4 ;

54 程式碼 4/23 when (reset) { io_out(io_local_bus, 8 , 0xFF);
IO_in_reg[0] = 0xFF ; IO_in_reg[1] = 0xFF ; IO_in_reg[2] = 0xFF ; i=0 ; nviMags = OC_UNOCCUPIED; nviOccupy = OC_UNOCCUPIED ; nvoMags = OC_UNOCCUPIED; nvoOccupy = OC_UNOCCUPIED ; } when (timer_expires(Rd_io_state)) nvoStateTestCH2=x ; IO_in_tmp[1]= io_in(io_local_bus,1); IO_in_tmp[2]= io_in(io_local_bus,2);

55 程式碼 5/23 //####### CH2 IO input identify #########
if (IO_in_tmp[1]!= IO_in_reg[1]) { tempreg1 = IO_in_tmp[1] & 0x01 ; //bit0 mags tempreg2 = IO_in_reg[1] & 0x01 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { if(nviCH1.bit10 !=0) { nvoCH2.bit0 = 0 ; nvoMags =OC_OCCUPIED ; } else { nvoCH2.bit0 = 1 ; nvoMags =OC_UNOCCUPIED ; i=0; Passtimer =0 ; Dsp0=0 ; } } { nvoCH2.bit0 = 1 ; Dsp0=0 ; } }

56 程式碼 6/23 tempreg1 = IO_in_tmp[1] & 0x02 ; //bit1
tempreg2 = IO_in_reg[1] & 0x02 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH2.bit1 = 0 ; nviCH1.bit12 = 0 ; IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); } else nvoCH2.bit1 = 1 ; nviCH1.bit12 = 1 ;

57 程式碼 7/23 tempreg1 = IO_in_tmp[1] & 0x04 ; //bit2
tempreg2 = IO_in_reg[1] & 0x04 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH2.bit2 = 0 ; nviCH1.bit11 = 0 ; IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); } else { nvoCH2.bit2 = 1 ; nviCH1.bit11 = 1 ; io_out(io_local_bus, 8 , IO_out_tmp[0]); } } IO_in_reg[1] = IO_in_tmp[1] ; nvoStateTestCH2 = IO_in_tmp[1] ; }

58 程式碼 8/23 //####### CH3 IO input identify #########
if (IO_in_tmp[2]!= IO_in_reg[2]) { tempreg1 = IO_in_tmp[2] & 0x01 ; //bit0 tempreg2 = IO_in_reg[2] & 0x01 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH3.bit0 = 1 ; } else { nvoCH3.bit0 = 0 ; } } tempreg1 = IO_in_tmp[2] & 0x02 ; //bit1 tempreg2 = IO_in_reg[2] & 0x02 ; { if ( tempreg1 == 0 ) { nvoCH3.bit1 = 1 ; } { nvoCH3.bit1 = 0 ; }

59 程式碼 9/23 tempreg1 = IO_in_tmp[2] & 0x04 ; //bit2
tempreg2 = IO_in_reg[2] & 0x04 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH3.bit2 = 1 ; } else { nvoCH3.bit2 = 0 ; } } tempreg1 = IO_in_tmp[2] & 0x08 ; //bit3 tempreg2 = IO_in_reg[2] & 0x08 ; { nvoCH3.bit3 = 1 ; } { nvoCH3.bit3 = 0 ;

60 程式碼 10/23 tempreg1 = IO_in_tmp[2] & 0x10 ; //bit4
tempreg2 = IO_in_reg[2] & 0x10 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) { nvoCH3.bit4 = 1 ; x=x+1 ; } else { nvoCH3.bit4 = 0 ; } } tempreg1 = IO_in_tmp[2] & 0x20 ; //bit5 tempreg2 = IO_in_reg[2] & 0x20 ; { nvoCH3.bit5 = 1 ; x=0 ; nviCH1.bit10 = 1 ; IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); } { nvoCH3.bit5 = 0 ; } }

61 程式碼 11/23 tempreg1 = IO_in_tmp[2] & 0x40 ; //bit6
tempreg2 = IO_in_reg[2] & 0x40 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH3.bit6 = 1 ; } else nvoCH3.bit6 = 0 ;

62 程式碼 12/23 tempreg1 = IO_in_tmp[2] & 0x80 ; //bit7
tempreg2 = IO_in_reg[2] & 0x80 ; if (tempreg1 != tempreg2) { if ( tempreg1 == 0 ) nvoCH3.bit7 = 1 ; } else nvoCH3.bit7 = 0 ; IO_out_reg[1] =*((unsigned long*)&nviCH2); IO_out_tmp[1] = low_byte(IO_out_reg[1]); io_out(io_local_bus, 9 , IO_out_tmp[1]); IO_in_reg[2] = IO_in_tmp[2] ; nvoStateTestCH3 = IO_in_tmp[2];

63 程式碼 13/23 when (timer_expires(Passtimer)) // 20 sec count down
{ if(i==0) {Dsp0=0 ; Passtimer = 10 ; i=1 ; } else if(i==1) { Dsp0=9 ; Passtimer = 1000 ; i=2 ; } else if(i==2) { Dsp0=8 ; i=3 ; } else if(i==3) { Dsp0=7 ; i=4 ;

64 程式碼 14/23 else if(i==4) { Dsp0=6 ; Passtimer = 1000 ; i=5 ; }

65 程式碼 15/23 i=9 ; } else if(i==9) { Dsp0=1 ; Passtimer = 1000 ; i=10 ; }

66 程式碼 16/23 } else if(i==13) { Dsp0=7 ; Passtimer = 1000 ; i=14 ;

67 程式碼 17/23 else if(i==17) { Dsp0=3 ; Passtimer = 1000 ; i=18 ; }

68 程式碼 18/23 { Dsp0=0 ; Passtimer = 1000 ; nvoGuard = ST_ON ; i=21 ; }
else if(i==21) nvoGuard = ST_OFF ; i=0 ;

69 程式碼 19/23 when (nv_update_occurs) { if(nviMags ==OC_OCCUPIED )
{ nviCH1.bit9 = 0 ; Passtimer = ; if(i==21) { nviCH1.bit15 = 0 ; } else { nviCH1.bit15 = 1 ; } IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); } if(nviMags ==OC_UNOCCUPIED ) { nviCH1.bit9 = 1 ;

70 程式碼 20/23 when (nv_update_occurs(nviStateTestCH3))
{ Dsp1= (239 - nviStateTestCH3) ; if(nvoCH3.bit4==1) // when you press "send" switch, X will increae 1 { // if your password mismatch ,X will become to 0 if(x==1) { p1= nviPass1 ; if(nviStateTestCH3!=p1) x=0 ; } if(x==2) { p2= nviPass2 ; if(nviStateTestCH3!=p2) if(x==3) { p3= nviPass3 ; if(nviStateTestCH3!=p3)

71 程式碼 21/23 if(x==4) // password correct { p4= 239 - nviPass4 ;
if(nviStateTestCH3!=p4) { x=0 ; } else { i=0 ; Passtimer =0 ; Dsp0=0 ; nviCH1.bit10 = 0 ; IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); } if(x==5) { p4= ; { x=0 ;

72 程式碼 22/23 if(x==6) //turn to password setting mode { p4= 239 - 15 ;
if(nviStateTestCH3!=p4) x=0 ; } else nviCH1.bit8 = 0 ; IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]); if(x==7) // 1st digit password setting nviPass1 = nviStateTestCH3;

73 程式碼 23/23 if(x==8) // 2nd digit password setting {
nviPass2 = nviStateTestCH3; } if(x==9) // 3rd digit password setting nviPass3 = nviStateTestCH3; if(x==10) // 4th digit password setting nviPass4 = nviStateTestCH3; x=0 ; nviCH1.bit8 = 1 ; IO_out_reg[0] =*((unsigned long*)&nviCH1); IO_out_tmp[0] = low_byte(IO_out_reg[0]); io_out(io_local_bus, 8 , IO_out_tmp[0]);

74 習題 重新設計一種密碼判斷模式,並將密碼增加至6位數。
請設計密碼由下一個裝置判斷,也就是說送出當使用者輸入密碼之 後,從網路變數上送出數值,並由下一級判斷密碼正確與否,回送開關門資料。(送出之密碼需為暗碼(加一個演算法),回送之開關門資料也必須是暗碼而非on或是off)。 系統設定的初始密碼為”0000”,請想辦法避免,有心人士將電源重置後,入侵家中。

75 專題練習 需要三台DIO模組,第一:大門(門禁系統),第二:客廳(自動溫控及調光系統),第三:浴室(濕度及排風系統),這三個系統當中有個別的自主系統,同時在互操控的部份分別有關聯的網路變數(包含火警警報、入侵警報、…等等)。

76 17-2 整合模組應用範例 硬體需求: (1) i-Lon 10 Ethernet Adapter
(2) CI Power Supply Module (3) CI Penta Sens Module (4) CI Tri-Sound Module (5) CI Decode Module (6) CI DIO Module

77 本應用系統的架構圖

78 將PentaSens、Alarm、Decode 建置於網路中

79 Development Device Target Device

80 鍵入Device Name及 勾選Commission

81 Start NodeBuilder

82 NodeBuilder Project

83 Project name

84 Finish

85 Device template name

86 點選Non-standard

87 Hardware Template

88 執行Nodebuilder Development Tool

89 編輯DIO-Access.nc 程式

90 門禁控制程式流程

91 程式碼 1/3 #include <SNVT_LEV.H> #include <SNVT_OC.H>
程式碼 1/3 #include <SNVT_LEV.H> #include <SNVT_OC.H> #pragma num_alias_table_entries 15 // I/O設定,定義網路變數 network input SNVT_occupancy nviOccup ; network input SNVT_lev_disc bind_info(auth) nviGuard ; network output SNVT_lev_disc bind_info(auth) nvoGuard ; network output SNVT_lev_disc nvoFireL ; // I/O 定義 I/O型態 I/O名稱 //(auth)表示此I/O須有”認證”過的Device才能連接 mtimer tmOccup ; //Neuron C中,內建的時間函數mtimer

92 程式碼 2/3 //事件觸發時的動作 when (nv_update_occurs (nviOccup)) {
程式碼 2/3 //事件觸發時的動作 when (nv_update_occurs (nviOccup)) { if (nviOccup==OC_OCCUPIED ) // 如果送入信號為OCCUPIED nvoGuard = ST_ON ; tmOccup = ; // 設定時間參數10 Sec } else // 如果送入信號為UN_OCCUPIED nvoGuard = ST_OFF ;

93 程式碼 3/3 //計時終了 when (timer_expires(tmOccup)) {
程式碼 3/3 //計時終了 when (timer_expires(tmOccup)) { if (nviGuard == ST_ON) //如果 nviGuard 仍是 ST_ON nvoFireL = ST_ON ; // 送信號給警報器,發出警報 }

94 編輯完成之後,執行Build

95 DIO-Access

96 Channel

97 ASCII

98 Service Pin

99 Load Application Image

100 Online -Finish

101 按DIO模組上的Service Pin

102 建立Functional Block

103 連接Functional Block

104 系統架構

105 Monitor I/O

106 結論 程式的撰寫當中,控制網路大多以”事件觸發”為基礎,Sensor偵測到狀態改變,送出信號告知其他Device,先有狀態流程圖,以狀態流程圖為基礎,來建置網路,較為容易。


Download ppt "第17單元 智慧型控制網路 規劃與管理專題."

Similar presentations


Ads by Google