PROGRAMOWANIE WĘZŁÓW LONWORKS NEURON C Język programowania Neuron C Profile i bloki funkcjonalne Narzędzia programowania i diagnostyki ABIS-cz-4-wykł
JĘZYK NEURON C PODSTAWY Neuron C Programmer s Guide 2.0 PDF Neuron C Reference Guide 2.0 PDF I/O Model Reference 2.0 PDF Neuron C bazuje na strukturach ANSI C Główne różnice: Nowy model komunikacji bloki funkcjonalne, zmienne sieciowe i ustawienia konfiguracyjne Modele obsługi wej/wyj programowalne I/O układu Neuron Chip Obsługa zdarzeń klauzula WHEN brak pętli main () Blok funkcjonalny Zbiór zmiennych sieciowych i ustawień konfiguracyjnych, używanych wspólnie do realizacji zadania/funkcjonalności Profil funkcjonalny Zawiera opis elementów istotnych dla danej funkcjonalności Obowiązkowe i opcjonalne zmienne sieciowe i konfiguracyjne Pokazać przykładowy profil funkcjonalny plik PDF profile 01,02,03 SNVT, UNVT Standardowe Typy Zmiennych Sieciowych oraz Użytkownika SCPT, UCPT Standardowe Typy Ustawień Konfiguracyjnych oraz Użytkownika I/O Neuron Chip 11 programowalnych wejść/wyjść 39 modeli wej/wyj ABIS-cz-4-wykł 2
JĘZYK NEURON C PROGRAM Ogólna struktura programu w języku Neuron C // Deklaracje #define ON TRUE #define OFF FALSE #define DAY 0x1 #define NIGHT 0x0 #define LIGHT_TIMEOUT 600 #define HEAT_TIMEOUT 1200 //SNVT OUTPUTS ------------------------------------------------------------- network output SNVT_switch nvoroomstate = 0,DAY; network output SNVT_state nvoiostate; network input SNVT_switch nvimode = 0,DAY; //IO Blocks ------------------------------------------------------------------------ IO_3 output bit bvolighton; IO_10 input bit bvilightswitch; //zmienne -------------------------------------------------------------------------- short LightAllowed; //obecność zezwolenie światła short LightSwitch; //zadanie światła stimer TimLightTOut; //timer swiatla // Światło ----------------------------------------------------------------------------------------- // when (io_changes (bvilightswitch) to ON) //wyłącznik światła ON LightSwitch = ON; //zadanie światła if (nvimode.state==day) //jeżeli tryb dzienny LightAllowed = TRUE; TimLightOut = LIGHT_TIMEOUT; when (io_changes (bvilightswitch) to OFF) //wyłacznik światła OFF LightSwitch = OFF; //zadanie światła io_out (bvolighton, OFF); //wyłącz światło nvoiostate.bit9 = OFF; //stan światła przepisz do sieci when (LightSwitch) //zadanie śwaitła if (nvimode.state==night) //jeżeli tryb nocny return; //nie załączaj if (LightAllowed) io_out (bvolighton, ON); nvoiostate.bit9 = ON; else io_out (bvolighton, OFF); nvoiostate.bit9 = OFF; // KONIEC Światło ABIS-cz-4-wykł 3
PODSTAWOWE ELEMENTY Obiekty I/O Obsługa interfejsu sygnałów fizycznych Wykorzystanie przyłączanie czujników, wyłączników, termistorów, liczników itp. UWAGA nie wykorzystane I/O podtrzymanie stanu wysokiego rezystory pull-up; dotyczy pinów IO_4 do IO_7 --- dyrektywa załączająca: #pragma enable_io_pullups; IO_0 do IO_3 wysokoprądowe 20 ma --- pozostałe 4 ma Wszystkie IO od IO_0 do IO_11 poziom napięć TTL Ogólny podział obiektów modeli I/O Bezpośrednie Równoległe Szeregowe Timery/Liczniki ABIS-cz-4-wykł 4
PODSTAWOWE ELEMENTY Obiekty I/O Deklaracja w programie: Obsługa obiektów I/O: IO_0 output bit bvolighton; IO_4 input bit ioswitch; - Funkcje --- (wbudowane) --- io_in () io_out () czyta dane z obiektu IO Składnia: wart. zwracana = io_in (nazwa obj. IO, arg) zapis danej do obiekt IO Składnia: io_out (nazwa obj. IO, wart. danej, arg) Przykłady: IO_0 input bit d0; boolean value;... void f(void) value = io_in(d0); // ------------------------ boolean value; IO_0 output bit d0; void f(void) io_out(d0, value); Przykłady: CurrentTemp = io_in (avicurrtemp); Wcześniej musi być: IO_6 input pulsecount avicurrtemp; //--wej. 6 impulsowe, bieżąca temp. // ------------------------ io_out (bvolighton, OFF); Wcześniej: #define ON TRUE #define OFF FALSE IO_3 input bit bvolighton; ABIS-cz-4-wykł 5
PODSTAWOWE ELEMENTY Obiekty I/O Dopuszczalne modele I/O w deklaracjach wejść/wyjść: IO_0 output bit bvolighton; Direct: Input Model Types Output Model Types bit bit byte byte leveldetect nibble nibble touch touch Timer/Counter: dualslope edgedivide edgelog frequency infrared infrared_pattern ontime oneshot period pulsecount pulsecount pulsewidth quadrature stretchedtriac totalcount triac triggeredcount Serial Output: bitshift bitshift magcard serial magcard_bitstream magtrack1 serial wiegand i2c neurowire sci spi ABIS-cz-4-wykł 6
PODSTAWOWE ELEMENTY Obiekty I/O Obsługa obiektów I/O: - Zdarzenia --- (predefiniowane) --- io_changes () --- zwraca wart. TRUE gdy czytana wart. obiektu IO zmieni stan; możliwe trzy przypadki: jakakolwiek zmiana - zmiana o jakąś wartość (by) - zmiana do określonej wartości (to) Składnia: io_changes (nazwa obj. IO) by to Przykłady: IO_0 input bit push_button; when (io_changes(push_button) to 0)... // ------------------------ IO_7 input pulsecount total_ticks; when (io_changes(total_ticks) by 100)... io_update_occurs () --- zwraca wart. TRUE gdy czytana wart. obiektu IO ma nową, uaktualnioną wartość. Wartość ta może być taka sama jak przed aktualizacją!!! To zdarzenie tylko do kilku rodzajów obiektów IO np. timery, liczniki itp. Składnia: io_update_occurs (nazwa obj. IO) Przykłady: #include <io_types.h> ontime_t therm_value; // 'ontime_t' defined in io_types.h IO_7 input ontime io_thermistor; when (io_update_occurs(io_thermistor)) therm_value = (ontime_t)input_value; ABIS-cz-4-wykł 7
PODSTAWOWE ELEMENTY Zmienne sieciowe SNVT Deklaracja w programie: network input SNVT_temp nvitemp; network output SNVT_switch nvoswitchoff; Ogólna składnia: network input output [modyfikaor] [klasa] typ [informacja połączenia] nazwa[=wart. początk.] Obsługa zmiennych sieciowych: - Zdarzenia --- (predefiniowane) --- nv_update_occurs najczęstsze, TYLKO dla zmiennych sieciowych wejściowych TRUE gdy nowa wartość zmiennej (nie koniecznie inna co do wartości!!!) nv_update_fails TRUE gdy nie ma aktualizacji zmiennej procedury korekcji nv_update_suceeds TRUE gdy zmienna została wysłana lub odebrana od urządz. zapisujących nv_update_completes TRUE po aktualizacji zmiennej TYLKO dla zmiennych wyjściowych ABIS-cz-4-wykł 8
PODSTAWOWE ELEMENTY Zmienne sieciowe SNVT wybrane typy zmiennych Zmienna SNVT_switch: Struktura: [value] [state] Wartość analogowa Stan Zmienna SNVT_state: Struktura: [bit0],[bit1],,[bit15] Przykład użycia patrz: Plik aplikacja-neuronc-fragment-1 - PDF Każdy bit: 0 1 on off inactive active disabled enabled low high false true normal alarm ABIS-cz-4-wykł 9
PODSTAWOWE ELEMENTY Timery ukł. Neuron Chip programowe i sprzętowe 2 obiekty timerów obiekty programowe milisekundowe (1 do 64000 ms) sekundowe (1 do 65 535 sek.) W jednej aplikacji do 15 timerów Deklaracja timerów programowych: mtimer [repeating] nazwa timera [wartość] Typ timera Opcja timera z powtarzaniem Wartość do odliczenia, wczytywana do timera po załączeniu zasilania lub resecie. Jeżeli nie podano wartości wpisanie 0. Dodatkowo w ukł. NeuronChip dwa timery sprzętowe (niezależne) Wykorzystywane do wprowadzania opóźnień w aplikacji. Funkcje: delay( ) msec_delay( ) scaled_delay( ) Przykład: when (io_changes(io_switch)) delay(400); // wait 10msec for debounce ABIS-cz-4-wykł 10
PODSTAWOWE ELEMENTY Timery ukł. Neuron Chip programowe przykłady Przykład 1: stimer led_timer = 5; when (zdarzenie) led_timer = 10; Przykład 2: stimer repeating led_timer; Zdarzenie do timerów (do kaluzuli WHEN): timer_expires (nazwa timera) Przykład: stimer led_timer; when (timer_expires(led_timer)) io_out(io_led, OFF); // Turn off the LED when (zdarzenie) time_remain=led_timer; ABIS-cz-4-wykł 11
PODSTAWOWE ELEMENTY Klauzula WHEN ( ) Klauzula WHEN ( ) --- obsługa zdarzeń w programie aplikacji węzła LON. Jeżeli wyrażenie/zdarzenie zawarte w klauzuli osiąga stan TRUE realizowane są zadania zdefiniowane w ramach klauzuli: when (timer_expires(led timer)) // zdarzenie-warunek io_out(io_led, OFF); // zadanie - Turn off the LED Klauzula WHEN ( ) nie może być zagnieżdżana. Przykład: when (io_changes(io_switch)) when (x == 3) //!! Nie wolno!!... Składnia równoważna i poprawna: Przykład: when (io_changes(io_switch)) if (x == 3)... ABIS-cz-4-wykł 12
PODSTAWOWE ELEMENTY Klauzula WHEN ( ) Klauzula WHEN ( ) --- obsługa zdarzeń z trzech kategorii: Predefiniowane Reset ( ) Zdarzenie reset jest w stanie true TRUE tylko po resecie układu Neuron Chip. UWAGA: Reset przy każdym komisjonowaniu urządzenia. Użytkownika --- sprawdzanie stanu zmiennych w aplikacji Przykład: when ((MoveSensor == TRUE) && (!LightAllowed)) io_out (bvo_light, OFF); UWAGA!!! --- ważna kolejność sprawdzania zmiennych Przykład: when ((timer_expires (t)) && (flag == TRUE)) --- kolejność OK. when ((flag == TRUE) && (timer_expires (t))) --- kolejność nie OK. bo jeżeli flaga nie będzie TRUE, nigdy nie sprawdzi się stan licznika/timera ABIS-cz-4-wykł 13
PODSTAWOWE ELEMENTY Klauzula WHEN ( ) Scheduling Klauzula WHEN ( ) --- obsługa zdarzeń w porządku chronologicznym when (nv_update_occurs) // Event A // task to execute when (nv_update_fails) // Event B // task to execute when (io_changes) // Event C // task to execute when (timer_expires) // Event D // task to execute ABIS-cz-4-wykł 14
PODSTAWOWE ELEMENTY Zmienne wbudowane schowek Zmienne wbudowane: input_value [signed long] --- zawiera wartość pobraną z wejścia po funkcji io_in( ) --- może być ona użyta ze zdarzeniami io_changes i io_update_occurs signed long switch_state; when (io_changes(switch_in)) switch_state = input_value; input_is_new --- dla timerów i liczników --- przyjmuje stan TRUE gdy wartość licznika/timera zostaje zaktualizowana ABIS-cz-4-wykł 15
PODSTAWOWE ELEMENTY Zmienne wbudowane schowek Przykłady wykorzystania: 1) IO_8 output bit SwitchLED; IO_5 input pulsecount io_lev; when (io_update_occurs(io_lev)) if (input_value >2) io_out(switchled,on); else io_out(switchled,off); 2) IO_8 output bit SwitchLED; IO_5 input pulsecount io_lev; stimer tdelay; when (timer_expires(tdelay)) if (io_in(io_lev)>2) && (input_is_new)) io_out(switchled,on); else io_out(switchled,off); (to samo zadanie inna konstrukcja) ABIS-cz-4-wykł 16
PRZYKŁADY - 1 Proste programy fragmenty programów Zapisz program z wszystkimi deklaracjami, dyrektywami, zmiennymi itd. --- Zapal diodę na wyj IO_1 (bitowe), na początku wyłączoną, po sygnale z wyłacznika IO_7 --- 1) #define ON TRUE; #define OFF FALSE; IO_1 output bit LED=OFF; IO_7 input bit SWITCH; when (io_changes(switch) to ON) io_out(led,on); when (io_changes(switch) to OFF) io_out(led,off); 2) when (io_changes(switch)) if(input_value==on) io_out(led,on); else io_out(led,off); 3) when (io_changes(switch)) io_out(led,(input_value==on)? ON : OFF); ABIS-cz-4-wykł 17
PRZYKŁADY - 1 Proste programy fragmenty programów Zapisz program z wszystkimi deklaracjami, dyrektywami, zmiennymi itd. --- Jeżeli nastąpi zmiana na wej 6 (pulsecount) impulsowym temperatura bieżąca, to przepisz jej wartość do zmiennej sieciowej z temperaturą i jeżeli temp. bieżąca mniejsza od ustalonej maksymalnej to włącz grzanie (sygnał na wyj 0 przekaźnik zaworu grzejnika), jeżeli większa od maks. to sygnał OFF na styk grzejnika 1) #define ON TRUE #define OFF FALSE #define Max_Temp 25 //lub jako zmienna konfigur. IO_0 output bit Heater; IO_6 input pulsecount Temp_current; network output SNVT_temp nvo_temp_current; when (io_update_occurs(temp_current)) nvo_temp_current=temp_current; if(nvo_temp_current<max_temp io_out(heater,on); else if (nvo_temp_current>max_temp) io_out(heater,off); ABIS-cz-4-wykł 18
PRZYKŁADY - 1 Proste programy fragmenty programów ---DODATKOWO 1 wykorzystać zmienną SNVT_state do przesłania informacji o stanie zał/wył. grzejnika (np. na bicie nr 7) DODATKOWO-1) #define ON TRUE #define OFF FALSE #define Max_Temp 25 //lub jako zmienna konfigur. IO_0 output bit Heater; IO_6 input pulsecount Temp_current; network output SNVT_temp nvo_temp_current; network output SNVT_state nvo_statemon; when (io_update_occurs(temp_current)) nvo_temp_current=temp_current; if(nvo_temp_current<max_temp io_out(heater,on); nvo_statemon.bit7=on; when (io_changes(switch) to OFF) io_out(led,off); nvo_statemon.bit7=on; ABIS-cz-4-wykł 19
PRZYKŁADY - 1 Proste programy fragmenty programów ---DODATKOWO 2 Dopisać procedurę: jeżeli zmieni się zmienna sieciowa dotycząca temperatury, to ustawić bit 1 zmiennej stanu na ON i uruchomić timer sekundowy (reg_temp) z czasem początkowym 60 sek. Jeżeli timer skończy odliczać to wyłączyć bit 1 zmiennej stanu na OFF. DODATKOWO-2) #define ON TRUE #define OFF FALSE #define Max_Temp 25 //lub jako zmienna konfigur. IO_0 output bit Heater; IO_6 input pulsecount Temp_current; network output SNVT_temp nvo_temp_current; network output SNVT_state nvo_statemon; stimer reg_temp; Scheduling!!! when (io_update_occurs(temp_current)) nvo_temp_current=temp_current; nvo_statemon.bit1=on; reg_temp=60; if(nvo_temp_current<max_temp io_out(heater,on); nvo_statemon.bit7=on; when (io_changes(switch) to OFF) io_out(led,off); nvo_statemon.bit7=off; when (timer_expires(reg_temp)) nvo_statemon.bit1=off; ABIS-cz-4-wykł 20
PRZYKŁADY - 1 Przykłady z Neuron C Programmmer s Guide Pokazać przykłady aplikacji i rozwiązań --- str 31 (w pdf - 43) --- przykładowe aplikacje --- termostat --- ściemniacz lamp --->>> DALEJ KONIEC WYKŁADU NR 1 - programowanie Neuron C ABIS-cz-4-wykł 21
POCZĄTEK WYKŁADU NR 2 NEURON C PRZYKŁADY-ZADANIA Krótkie przypomnienie Zapisz ze wszystkimi niezbędnymi wcześniej deklaracjami, definicjami itp. procedurę aplikacji realizującą zadanie: Jeżeli na wej 4 nastąpi zmiana/uaktualnienie (IO pulsecount) to pobierz wartości bitowe z wejść 6 i 7 do zdefiniowanych zmiennych programowych oraz ustaw bit na wyjściu 8 do stanu TRUE. ABIS-cz-4-wykł 22
PRZYKŁADY-ZADANIA Krótkie przypomnienie Zapisz ze wszystkimi niezbędnymi wcześniej deklaracjami, definicjami itp. procedurę aplikacji realizującą zadanie: (timer milisekundowy z początkową wartością 100) Jeżeli timer skończy liczyć, ustaw wyjście 1 na stan ON i wystartuj ten sam timer z nową wartością 200. (timer sekundowy z wartością początkową 60) Jeżeli nastąpi zmiana wejścia bitowego nr 5 o 2, zaczytaj wartość timera do zmiennej (np. long), wystaw na wyjściu 7 sygnał OFF i uruchom timer sekundowy z wartością 50. ABIS-cz-4-wykł 23
PRZYKŁADY-2 Jeszcze jeden przykład ze zmienną SNVT Sterowanie trybami dziennym i nocnym (z obecnością lub bez) #define ON TRUE #define OFF FALSE #define DAY 0x1 #define NIGHT 0x0 network output SNVT_switch nvoroomstate=0,day; network output SNVT_state nvoiostate; network input SNVT_switch nvimode=0,day when(nv_update_occurs(nvimode)) //gdy zadanie zmiany trybu if(nvimode.state==night) //jeżeli tryb nocny to: nvoroomstate.state=0; else if(nvoiostate.bit0==on) //jeżeli tryb dzień i obecność nvoroomstate.state=2; else nvoroomstate.state=1; //jeżeli tryb dzień bez obecności ABIS-cz-4-wykł 24
ELEMENTY JĘZYKA NEURON C Bloki funkcjonalne deklaracja i użycie w programie Blok funkcjonalny przypomnienie definicji Profil funkcjonalny Profile funkcjonalne zdefiniowane w plikach źródłowych (functional profile templates) str WWW LonMark Definicja bloku w programie Neuron C: fblock ABIS-cz-4-wykł 25
ELEMENTY JĘZYKA NEURON C Bloki funkcjonalne deklaracja i użycie w programie W deklaracji profilu funkcjonalnego znajduje się informacja o: - nazwie wykorzystanego szablonu profilu funkcjonalnego (np. SFPTclosedLoopActuator), - użytych zmiennych sieciowych, oraz ich przypisanie do odpowiednich miejsc w szablonie (nazwy ze szablonu-profilu), - nazwie profilu funkcjonalnego. 3 1 2 fblock FPT-identifier fblock-body identifier [array-bounds] [ext-name] [fb-property-list] ; ------------------------------------------------ network output SNVT_amp nvoampere; fblock SFPTopenLoopSensor nvoampere implements nvovalue; fbamperemeter; 3 Jeżeli w bloku ma być przypisana zmienna, która nie jest obowiązkowa ani opcjonalna można zamiast słowa kluczowego implements posłużyć się implementation_specific(unique-index). W takim przypadku tworzona jest zmienna o nadanym przez programistę unikalnym numerze (unique-index) 1 2 Inny przykład: fblock SFPTclosedLoopActuator nvilamp implements nvivalu nvolampfb implements nvovaluefb; Lamp[Lamp_FBLOCK_COUNT] ABIS-cz-4-wykł 26
ELEMENTY JĘZYKA NEURON C Bloki funkcjonalne deklaracja i użycie w programie Jeżeli w programie zdefiniowano również zmienne lub stałe konfiguracyjne, mogą być one elementem bloku funkcjonalnego. Ich użycie w deklaracji bloku: SCPTdefOutput cp_family cpdefaultoutput; SCPTbrightness cp_family cpdisplaybrightness; network output SNVT_amp nvoampere; network output polled SNVT_time_stamp nvoinstalldate; fblock SFPTopenLoopSensor nvoampere implements nvovalue; fbamperemeter external_name("amperemeter") fb_properties cpdefaultoutput, // optional CP cpdisplaybrightness // implementation-spec. Pokazać: Definicje standardowych typów bloków funkcjonalnych LonMark Technical Resorces Resources Files (important Internet Explorer ) W tym miejscu można też nadać im wartości domyślne ABIS-cz-4-wykł 27
ELEMENTY JĘZYKA NEURON C Bloki funkcjonalne zadania, własne Narysować blok funkcjonalny wysyłający zmienną sieciową o rezystancji w kohm, po otrzymaniu na wejścia zmiennych z informacją o prądzie A (+/-) oraz napięciu w kv (wraz z deklaracjami tych zmiennych w programie Neuron C w każdym zadaniu) Narysować blok funkcjonalny wysyłający zmienne sieciowe załączenia oświetlenia i napięcia na lampie V, po otrzymaniu na wejściach zmiennych o załączeniu wyłącznika i obecności w pomieszczeniu. Narysować blok funkcjonalny wysyłający zmienną sieciową z informacją o prędkości obrotowej napędu mieszalnika cieczy (dokładność do 0,1 rad/sek), na podstawie odebranych z sieci zmiennych SNVT z informacjami o prądzie (A) silnika oraz o gęstości mieszanej cieczy (dokładność pomiaru gęstości: 0,5 kg/m3). Wykorzystać SNVT Master List: Pliki PDF SNVT Master List SNVT Master List short ABIS-cz-4-wykł 28
ELEMENTY JĘZYKA NEURON C Funkcje deklaracja, elementy Funkcje gdy potrzebne skorzystanie wielokrotne z pewnych fragmentów kodu. Składnia deklaracji funkcji: return-type function-name ( parameter-list ) statements; return expression of type return-type; Return-type Prameter-list - typ zmiennej zwracanej przez funkcję - lista parametrów funkcji ABIS-cz-4-wykł 29
ZESTAWY URUCHOMIENIOWE Mini FX/FT FT 5000 Smart Transceiver: - Neuron 5000 - Transceiver medium FT 64 KB pamięci flash, 64 KB pamięci EEPROM, Wyświetlacz LCD o wymiarach 4x20, Czujnik natężenia światła, Czujnik temperatury, 5-cio kierunkowy joystick, 2 przyciski, 2 diody LED, Interfejs EIA-232 Interfejs USB Narzędzie soft: - Mini FX Application ABIS-cz-4-wykł 30
ZESTAWY URUCHOMIENIOWE Mini FX/FT - Dodatkowe peryferia: Osobna płytka Mini Gizmo I/O: ABIS-cz-4-wykł 31
ZESTAWY URUCHOMIENIOWE Mini FX/PL Neuron Chip 3120 PL Neuron Chip 3120 Smart Transceiver - tylko: Reset, przycisk i dioda Service Pin - Peryferia: Osobna płytka Mini Gizmo I/O: 8 przycisków 8 LED Czujnik temperatury Brzęczyk piezo Narzędzie soft: - Mini FX Application ABIS-cz-4-wykł 32
PRZYKŁADY-3 Kody programu dla węzłów minifx/ft i minifx/pl Analiza struktury Deklaracje Wybrane funkcje Zdarzenia Wykorzystać pliki PDF aplikacje-minifx-source code KONIEC WYKŁADU NR 2 - programowanie Neuron C ABIS-cz-4-wykł 33