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

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

2017/3/12 儿童常见病防治 XX XX XX 公司名称 第一季度工作报告 潍坊市妇幼保健院.
跳楼价 亏本大甩卖 清仓处理 买一送一 5折酬宾. 跳楼价 亏本大甩卖 清仓处理 买一送一 5折酬宾.
职业教育课程改革创新教材 财经法规与会计职业道德.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
Online Practice- Oxford Learn system
Android RISC Team Wendy Wang July,2017
加速度計 指導老師 : 洪正瑞 製作人 : 蔡昌佑.
Lab 6 SP601 Design Platform Introduction
Chapter 5 迴圈.
Arduino課程 DHT11溫濕感測 中部自造者基地-雲科大.
IEEE Supframe 演講者:李嘉凱 指導教授:柯開維.
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
第7單元 實習2  DIO-EXT-All.
100學年度第2學期 邏輯設計實習TA訓練 機 台 介 紹.
智慧電子應用設計導論(1/3) Sensor-III
沈阳辽通自动控制装备厂 电牵引采煤机变频器培训课程.
MPLAB IDE 8 建立專案.
SWITCH&7-SEG元件控制 嵌入式作業系統實作 11/17.
(田徑運動 Athletics) Random Slide Show Menu
开关电源常规测试项目 目录 1、功率因素和效率测试 2、平均效率测试 3、输入电流测试 4、浪涌电流测试 5、电压调整率测试
Kinco 智能伺服编程软件基础
Arduino.
第四章 控制系統.
無線射頻識別系統(RFID) 基本原理及發展與應用
常见问题解答 II. App上重置并清空数据库之后,手机app找不到圣诞灯怎么办? I. 打开APP,发现并连接不了圣诞灯怎么办?
安裝JDK 安裝Eclipse Eclipse 中文化
組員:羅敏嘉 S (組長) 劉為云 S 鄭佳姍 S 黃瑩禎 S 指導老師:林得裕 教授
語法:Variables & Functions 實作:Digital out (Button+LED) 簡報:廖崇義
Labview內部Linx功能簡介(Analog/Digital/PWM)
第5單元 實習1 ilon10 setup.
JTAG INTERFACE SRAM TESTER WITH C-LCM
INTELLIGENCE PLUS VOIC QUICK REFERENCE 留言信箱系統使用指南
Ch9 Communicating with Hardware
指導教授 張寶棣 助教 黃智穎 第十七組 B 物理三 李明哲 B 大氣三 吳宛真
網路安全技術 OSI七層 學生:A 郭瀝婷 指導教授:梁明章.
第一單元 建立java 程式.
類比轉數位 IC研究 組員:施怡儒 S 柯曄新 S 張久藝 S
    使用Arduino量測直流(DC)電壓    林品成 月.
實驗十二: 紅綠燈控制電路設計 規格: Due: Jan. 3, 2008 Tvrl = Thgl + Thgf + Thyl
4-15 WDT HT66F50.
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
Working Model 2D 朝陽科技大學 工業設計系 邱相文.
語法:結構 實作:Analog in (VR、光敏+七段顯示電壓) 簡報:廖崇義
第一次Labview就上手 參考書籍: LabVIEW for Everyone (Jeffrey Travis/Jim Kring)
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
亚博科技 Arduino视频教程 第12讲 8乘8点阵.
基本IO.
第13單元 實習8 Focus-Router-Lamp
物聯網期末報告 組員: 邱景柏 方嘉慶 陳約翰 洪銘陽
Flash 8:開口中 從Y:\ 複製『開口中.fla』到 D:\ 更改名稱為:s3x99 (你的班號) 雙按開啟檔案 2019年5月7日
4.19 Fsys _ SLOW MODE HT66F70A.
第8單元 實習3 DO-Buzzer.
4-16 SLEEP0 HT66F70A.
取得與安裝TIDE 從TIBBO網站取得TIDE
第1單元 課程源起及特色.
使用VHDL設計-8x3編碼電路 通訊一甲 B 楊穎穆.
遙控車程式流程圖規劃 學號:B 姓名:楊 穎 穆 老師:田 慶 誠.
班級:博碩子一甲 授課老師:鐘國家 助教:陳國政
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
LED Pili LED 中州技術學院 電子系 副教授 余文俊.
一、 OP-Amp 放大器原理 反相放大電路 圖一.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Application of NeuroScience
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
E3X-DA-11N光纖處理器簡易調整方法 一.各部位名稱與功能: 動作出力指示燈 感度調整設定與機能變更設定按扭 入光量檢出表示
Department of Computer Information Science, NCTU
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

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

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

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

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

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

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

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

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

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

程式碼 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 ;

程式碼 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 ;

程式碼 3/34 /* //<DIO-EXT-Display.H> #define LEN3 3 #define LEN2 2 程式碼 3/34 /* //<DIO-EXT-Display.H> #define LEN3 3 #define LEN2 2 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;

程式碼 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 ; }

程式碼 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

程式碼 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 ;

程式碼 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 ;

程式碼 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 ;

程式碼 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 ; }

程式碼 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); }

程式碼 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 ;

程式碼 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 ; }

程式碼 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 ;

程式碼 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 ;

程式碼 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 ;

程式碼 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);

程式碼 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]; }

程式碼 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 ; }

程式碼 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]; }

程式碼 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); }

程式碼 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]); }

程式碼 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 }

程式碼 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]);

程式碼 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]);

程式碼 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 LEN3 3 #define LEN2 2 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 ;

程式碼 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 ; }

程式碼 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 ;

程式碼 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 ;

程式碼 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 ;

程式碼 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 ;

程式碼 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 ;

程式碼 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 ;}

程式碼 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 ;

程式碼 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]);

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

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

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

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

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

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

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

程式碼 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 ;

程式碼 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

程式碼 3/23 network output unsigned nvoStateTestCH1 ; //#define LEN3 3 //#define LEN2 2 //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 1 : Inactive //IO_0 muxbus io_local_bus; int i ; int x ; int p1 ;int p2 ;int p3 ;int p4 ;

程式碼 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);

程式碼 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 ; } }

程式碼 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 ;

程式碼 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] ; }

程式碼 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 ; }

程式碼 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 ;

程式碼 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 ; } }

程式碼 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 ;

程式碼 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];

程式碼 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 ;

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

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

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

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

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

程式碼 19/23 when (nv_update_occurs) { if(nviMags ==OC_OCCUPIED ) { nviCH1.bit9 = 0 ; Passtimer = 1000 ; 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 ;

程式碼 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= 239 - nviPass1 ; if(nviStateTestCH3!=p1) x=0 ; } if(x==2) { p2= 239 - nviPass2 ; if(nviStateTestCH3!=p2) if(x==3) { p3= 239 - nviPass3 ; if(nviStateTestCH3!=p3)

程式碼 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= 239 - 15 ; { x=0 ;

程式碼 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 = 239 - nviStateTestCH3;

程式碼 23/23 if(x==8) // 2nd digit password setting { nviPass2 = 239 - nviStateTestCH3; } if(x==9) // 3rd digit password setting nviPass3 = 239 - nviStateTestCH3; if(x==10) // 4th digit password setting nviPass4 = 239 - 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]);

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

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

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

本應用系統的架構圖

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

Development Device Target Device

鍵入Device Name及 勾選Commission

Start NodeBuilder

NodeBuilder Project

Project name

Finish

Device template name

點選Non-standard

Hardware Template

執行Nodebuilder Development Tool

編輯DIO-Access.nc 程式

門禁控制程式流程

程式碼 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

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

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

編輯完成之後,執行Build

DIO-Access

Channel

ASCII

Service Pin

Load Application Image

Online -Finish

按DIO模組上的Service Pin

建立Functional Block

連接Functional Block

系統架構

Monitor I/O

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