Llistat Font de Programa LOGO. Maqueta Funicular (SADEX)
; FUNICUL.LOG
; ===========
; Control d'un Funicular
; Autor : Feliu MUNIENTE  (IES Icària. Barcelona)
; Data  : Febrer ' 2000
; Font  : Courier-13
;
;----------------------------------------------------
  proc funicular :temps_espera :so_limit :lux_limit
;----------------------------------------------------
; Procediment Principal
; =====================
; Paràmetres
; ----------
; temps_espera : Temps (seg) espera per a iniciar
; (5")           el moviment, durant el qual la
;                cèl.lula fotoèlectrica (luxòmetre)
;                no ha de detectar pas de persones
; so_limit     : Pel demunt d'aquest valor es 
; (60 dB)        considera que s'ha donat una ordre
;                d'inici de moviment
; lux_limit    : Pe sota del qual es considera
; (700 Lx)       que hi ha una persona entrant al
;                funicular (es reiniciarà el 
;                temporitzador de seguretat de
;                temps d'espera abans d'iniciar
;                el proper moviment
;
; (xx) Valors aconsellats
;----------------------------------------------------

; Inicialitzacions i Definició de Variables
; -----------------------------------------
posa.a "m_lux   "A
posa.a "m_so    "B
posa.a "m_temp  "C
posa.a "m_rele  "D
posa.a "m_ed    "E
posa.a "m_sd    "F
posa.a "m_mot   "G

posa.a "e_ae    "1   ; Aturada Emergència
posa.a "e_an    "2   ; Aturada Normal
posa.a "e_fce   "3   ; Final de Cursa Esquerra
posa.a "e_fcd   "4   ; Final de Cursa Dreta
posa.a "e_ie    "5   ; Inici Baixa Esquerra
posa.a "e_id    "6   ; Inici Baixa Dreta
posa.a "e_auto  "7   ; Funcionament Automàtic (1)
                     ;              Manual    (0)

posa.a "s_le    "1   ; Led Esquerra
posa.a "s_lw    "2   ; Led Espera (Wait)
posa.a "s_lr    "3   ; Led Error
posa.a "s_ld    "4   ; Led Dreta
posa.a "s_bru   "5   ; Brunzidor
posa.a "s_int   "8   ; Intermitent

posa.a "r_cel   "1   ; Relè Cèl·lula Fotoelèctrica

p ; Reset Sortides

posa.a "temps_inicial     temps 
posa.a "etapa             "0   ; Etapa de GRAFCET
posa.a "error_a_confirmar "0

si (:temps_espera<5) [posa.a "temps_espera "5] 

; Valors Límits (so : Palmada Inici)  (lux : detector persones)
; ------------- (temp : tèrmic motor)

;posa.a "so_limit          "80
;posa.a "lux_limit         "200
posa.a "temp_limit        ((termòmetre.llegit :m_temp) +2)

; Control d'Etapes
; ----------------
mentre [no :etapa = 5] [grafcet]

; Final
; -----
p
escriu [---FI---]

fi

;----------------------------------------------------
  proc grafcet
;----------------------------------------------------
; Procediment de Control d'Etapes del GRAFCET
;----------------------------------------------------

si (:etapa = "0)  [etapa_0]
si (:etapa = "1)  [etapa_1]
si (:etapa = "2)  [etapa_2]
si (:etapa = "3)  [etapa_3]
si (:etapa = "4)  [etapa_4]

fi

;----------------------------------------------------
  proc etapa_0
;----------------------------------------------------
; Etapa 0 : Inicial, Espera Arranc
;----------------------------------------------------
mentre [:etapa = 0] [etapa_0_accions]

desactiva.sortida :m_sd :s_lr     ; Led Error
desactiva.sortida :m_sd :s_bru    ; Brunzidor

fi

;----------------------------------------------------
  proc etapa_0_accions
;----------------------------------------------------
 
escriu.seguit [E_0 (Inicial)]

; Verifica Alarmes
; ----------------
actualitza_intermitent
control_alarmes
si (vt(:error = 0)(no :error_a_confirmar = 0)) [(escriu.seguit [ - Falta Confirmar Error -])(posa.a "led_error :intermitent)][posa.a "led_error "1]

; Accions de l'etapa
; ------------------
si (:led_error = 1) [(activa.sortida :m_sd :s_lr)(activa.sortida :m_sd :s_bru)][(desactiva.sortida :m_sd :s_lr)(desactiva.sortida :m_sd :s_bru)]

; Confirmació d'alarmes
; ----------------------
si (vt (:error = 0) (sonòmetre.llegit :m_so > :so_limit)) [posa.a "error_a_confirmar "0]
 

; Condicions de sortida d'etapa
; -----------------------------
si (vt (:error_a_confirmar = 0) (estat.entrada? :m_ed :e_ie) (estat.entrada? :m_ed :e_fcd) (estat.entrada? :m_ed :e_fce)) [posa.a "etapa "1]

si (vt (:error_a_confirmar = 0) (estat.entrada? :m_ed :e_id) (estat.entrada? :m_ed :e_fcd) (estat.entrada? :m_ed :e_fce)) [posa.a "etapa "3]

si (vt (:error_a_confirmar = 0) (estat.entrada? :m_ed :e_fce) (no estat.entrada? :m_ed :e_fcd)) [posa.a "etapa "4]

si (vt (:error_a_confirmar = 0) (estat.entrada? :m_ed :e_fcd) (no estat.entrada? :m_ed :e_fce)) [posa.a "etapa "2]

si (vt (estat.entrada? :m_ed :e_fcd)(estat.entrada? :m_ed :e_fce)(no estat.entrada? :m_ed :e_ie)(no estat.entrada? :m_ed :e_id)) [escriu.seguit [-Falta Sentit Inici-]]

escriu []

fi

;----------------------------------------------------
  proc etapa_1
;----------------------------------------------------
; Etapa 1 : Baixa Vagó Esquerra
;----------------------------------------------------
mentre [:etapa = 1] [etapa_1_accions]

atura.motor :m_mot 1              ; Vagó a baix
desactiva.sortida :m_sd :s_le     ; Led Esquerra

fi

;----------------------------------------------------
  proc etapa_1_accions
;----------------------------------------------------

escriu.seguit [E_1 (Baixa Esquerra)]

; Accions de l'etapa
; ------------------
activa.sortida :m_sd :s_le    ; Led Esquerra
esquerra.motor :m_mot 1       ; Vaixa Vagó Esquerra

; Verifica condicions de sortida d'etapa
; --------------------------------------
si (no estat.entrada? :m_ed :e_fce)  [posa.a "etapa "2]

control_alarmes
escriu []

fi

;----------------------------------------------------
  proc etapa_3
;----------------------------------------------------
; Etapa 3 : Baixa Vagó Dreta
;----------------------------------------------------
mentre [:etapa = 3] [etapa_3_accions]

atura.motor :m_mot 1              ; Vagó a baix
desactiva.sortida :m_sd :s_ld     ; Led Dreta

fi

;----------------------------------------------------
  proc etapa_3_accions
;----------------------------------------------------
escriu.seguit [E_3 (Baixa Dreta)]

; Accions de l'etapa
; ------------------
activa.sortida :m_sd :s_ld    ; Led Dreta
dreta.motor :m_mot 1          ; Vaixa Vagó Dreta

; Verifica condicions de sortida d'etapa
; --------------------------------------
si (no estat.entrada? :m_ed :e_fcd)  [posa.a "etapa "4]

control_alarmes
escriu []

fi

;----------------------------------------------------
  proc etapa_2
;----------------------------------------------------
; Etapa 2 : Espera a començar baixada dreta
;----------------------------------------------------

posa.a "inici_espera temps
etapa_2_4 "3

fi

;----------------------------------------------------
  proc etapa_4
;----------------------------------------------------
; Etapa 4 : Espera a començar baixada dreta
;----------------------------------------------------

posa.a "inici_espera temps
etapa_2_4 "1

fi

;----------------------------------------------------
  proc etapa_2_4 :etapa_següent
;----------------------------------------------------
; Etapes 2 i 4 : Aturat, esperant Inici de Moviment
;----------------------------------------------------
activa.sortida :m_rele :r_cel    ; Bombeta Cèl.

mentre [(va (:etapa = 2) (:etapa = 4))] [etapa_2_4_accions :etapa_següent]

activa.sortida :m_sd      :s_bru    ; Brunzidor
desactiva.sortida :m_sd   :s_lw     ; Led Espera
desactiva.sortida :m_rele :r_cel    ; Bombeta Cèl.
desactiva.sortida :m_sd   :s_bru    ; Brunzidor

fi

;----------------------------------------------------
  proc etapa_2_4_accions :etapa_següent
;----------------------------------------------------

escriu.seguit [E_2_4 (Esperant Inici Moviment)]
(escriu.seguit [ (] ((temps - :inici_espera)/100) [/] (:temps_espera) [) ])

; Accions de l'etapa
; ------------------
actualitza_intermitent
si ((temps - :inici_espera)/100 > :temps_espera) [posa.a "led_espera :intermitent][posa.a "led_espera "1]
si (:led_espera=1) [(activa.sortida :m_sd :s_lw)(desactiva.sortida :m_sd :s_bru)][(desactiva.sortida :m_sd :s_lw)(activa.sortida :m_sd :s_bru)]

si (luxòmetre.llegit :m_lux < :lux_limit) [posa.a "inici_espera temps]

; Verifica condicions de sortida d'etapa
; --------------------------------------
si (vt(estat.entrada? :m_ed :e_auto) ((temps - :inici_espera)/100 > :temps_espera))  [posa.a "etapa :etapa_següent]

si (vt(no estat.entrada? :m_ed :e_auto) (sonòmetre.llegit :m_so > :so_limit) ((temps - :inici_espera)/100 > :temps_espera))  [posa.a "etapa :etapa_següent]

si (estat.entrada? :m_ed :e_an)  [posa.a "etapa "5]

control_alarmes
escriu []

fi

;----------------------------------------------------
  proc control_alarmes
;----------------------------------------------------
; Control d'Alarmes de funcionament
;         Posa Etapa = 0
;         Posa Error = Nº d'error
;----------------------------------------------------

posa.a "error "0

; Emergència
; ----------
si (no estat.entrada? :m_ed :e_ae) [(posa.a "error "1)(escriu.seguit [-Emergència-])]

; Ambivalència
; ------------
si (vt (no estat.entrada? :m_ed :e_fce) (no estat.entrada? :m_ed :e_fcd)) [(posa.a "error :error+2)(escriu.seguit [-Ambivalència FdC-])] 

; Tèrmic de Motor
; ---------------
si (termòmetre.llegit :m_temp > :temp_limit) [(posa.a "error :error+4) (escriu.seguit [-Tèrmic-])]

; Tractament final d'errors
; -------------------------
(escriu.seguit [ (] ((temps-:temps_inicial)/100) [)])

si (no :error=0)[(posa.a "etapa "0) (posa.a "error_a_confirmar :error)]
 

fi

;----------------------------------------------------
  proc actualitza_intermitent
;----------------------------------------------------
; Posa la variable :intermitent a
;    0 Si les Centèssimes del temps < 50
;    1 Si les Centèssimes del temps > 50
;----------------------------------------------------

posa.a "ara   temps
posa.a "centessimes (:ara - ((part.entera (:ara/100))*100)
si (:centessimes > 50) [posa.a "intermitent "1] [posa.a "intermitent "0]

;(escriu :ara :centessimes :intermitent)

;sortida :m_sd :s_int :intermitent (NO FUNCIONA!!!)

;si (:intermitent=1) [activa.sortida :m_sd :s_int][desactiva.sortida :m_sd :s_int]

fi

;----------------------------------------------------
  proc Prova_so
;----------------------------------------------------
; Proves de nivell de so
;----------------------------------------------------

posa.a "m_so      "b
posa.a "so_maxim  "0
posa.a "so_actual "0 
posa.a "tecla     "

mentre [vt (no :tecla = "A) (no :tecla = "a)]  [prova_so_accions]

escriu []
escriu [--FI--]

fi

;----------------------------------------------------
proc prova_so_accions
;----------------------------------------------------

posa.a "so_actual sonòmetre.llegit :m_so
si (:so_actual > :so_maxim) [posa.a "so_maxim :so_actual]

escriu.seguit [(A)Atura (R)Reset / Act__Màx : ]
escriu.seguit  sonòmetre.llegit :m_so
escriu.seguit [__]
escriu        :so_maxim

si (tecleig)  [posa.a "tecla caràcter.llegit] [posa.a "tecla "]

si (va (:tecla = "R) (:tecla = "r)) [posa.a "so_maxim "0]

fi

   Tornar a la pantalla de Software