Главная » Статьи » Proton PICBasic

Контроллер ошибок на PIC16F877A
Анатолий Медведев, terrarus@mail.ru. 
Контроллер ошибок на PIC16F887A

На заводе по производству проводов и кабельной продукции https://ros-elektro.ru/catalog/kabel_provod/shvvp/, где я сейчас работаю, актуальны вопросы по контролю за работой систем автоматики и оборудования технологических линий. 
Например, при скручивании многожильного провода, состоящего из одного стального центрального проводника и 36 проводов, намотанных на центральном проводнике в три слоя по схеме 1+6+12+18, в процессе намотки может оборваться один из проводников, или сразу несколько. Может прекратиться подача воздуха или масла в гидравлическую систему станка, произойти срабатывание датчика при возникновении поломки одной из частей технологической линии. В этих случаях требуется оперативно зарегистрировать такую ситуацию и остановить станок, чтобы избежать производства бракованной продукции или возникновения серьезных последствий от аварийной ситуации. 
В этой статье описывается прибор NIECHAUS-M, получивший название от технологической линии скручивающей многожильные провода, выполняет функции контроллера ошибок, которые возникают при срабатывании контактных датчиков в тот момент, когда наблюдается поломка или сбой в работе оборудования.

Контроллер ошибок NIECHAUS-M разработан на основе PIC-микроконтроллера 16F887A. В статье приводится его принципиальная схема (рис. 1) и управляющая программа (рис. 2), написанная на языке BASIC в среде программирования PROTON+IDE.
Cхема контроллера была смоделирована и отлажена в интеллектуальной среде схемотехнического моделирования PROTEUS 7.4 SP3. Его действующая модель niehaus-m.DSN приведена на рисунке 3.

Контроллер последовательно опрашивает состояние 19 контактных датчиков и выводит на 4-строчный жидкокристаллический дисплей информацию об их состоянии. Включает или отключает систему экстренной остановки технологической линии, регистрирует и сохраняет в памяти время и даты включения и отключения технологической линии, время её общей наработки и время простоя.

Все датчики гальванически развязаны при помощи оптоэлектронных пар для исключения наведения повышенных электрических потенциалов на входах микроконтроллера, которые могут возникать в условиях промышленного предприятия при эксплуатации мощных частотных преобразователей и электродвигателей.

Конструктивно такие контроллеры выполняются в щитовых встраиваемых корпусах с габаритными размерами 136 х 66 х 100 мм. Фотография подобного контроллера WATSON-M установленного в пульте управления другой крутильной машины приведена на рисунке 4.

 

Рис. 1. Схема электрическая принципиальная контроллера ошибок NIECHAUS-M.

Листинг управляющей программы niechaus_m.bas

Код
  '* Name : niechaus_M.BAS *
  '* Author : Anatoly Medvedev *
  '* Notice : Copyright © 2009 *
  '* : All Rights Reserved *
  '* Date : 1.06.2009 *
  '* Version : 2.0 *
  '* Notes : Программа контроллера ошибок крутильной машины *
  '* : Niechaus *
  '****************************************************************  
  '--Общие настройки--
  Device = 16F877A
  XTAL = 4
  ;--Опции компилятора--
  Declare SHOW_SYSTEM_VARIABLES = OFF ;В Proteus показать внутренние переменные
  Declare FSR_CONTEXT_SAVE = OFF ;Не заботится о сохранении содержимого регистра FSR
  Declare REMINDERS = OFF ;Выключает напоминания компилятора 
  Declare WARNINGS = OFF ;Выключает предупреждения компилятора
  ;--Настройки АЦП-- 
  Declare ADIN_RES 10 ;Разрядность результата преобразования АЦП
  Declare ADIN_TAD FRC ;Источник тактирования АЦП
  Declare ADIN_STIME 100
 ;--Настройки устройств I2C--
  Declare SDA_PIN PORTC.4
  Declare SCL_PIN PORTC.3
  Declare SLOW_BUS OFF ;Выключить замедление при OSC > 4 Мгц
  Declare BUS_SCL OFF ;Включить режим работы шины SCL без подтягивающего резистора
  ;--Настройки портов--
  Declare PORTB_PULLUPS = OFF ; Включить подтягивающие резисторы на PORTB
  Declare ALL_DIGITAL = off ;Каждый порт выполняет свою функцию по умолчанию 
  '--Определение назначения каналов портов--
   TRISA = %00100000 ' Сделать канал (вывод) AN4 (PORTA.5) входом 
   TRISE = %00000110 ' Сделать канал (вывод) AN5 (PORTE.50 выходом, RE1, RE2 входами
   ADCON1 = %10000010 ' Установить все выводы PORTA в режим АЦП 
   TRISC = %11100100 ' PORTC.5/6/7 вход
   TRISD = %11111111 ' Сделать каналы PORTD входами 
   TRISB = %11111111 ' Сделать каналы PORTВ входами 
 '---Настройки подключения ЖКИ---
  Declare LCD_TYPE ALPHA  
  Declare LCD_DTPIN PORTA.0  
  Declare LCD_ENPIN PORTC.0 
  Declare LCD_RSPIN PORTC.1 
  Declare LCD_INTERFACE 4  
  Declare LCD_COMMANDUS 2000  
  Declare LCD_DATAUS 50  
  Declare LCD_LINES 4  
  '==Настройки для работы с DS1307==
  SCL VAR PORTC.3 ' ножка clock 
  SDA VAR PORTC.4 ' ножкка data
  'Dim Ctrl As Byte
  'Ctrl = %00010000 ' управляюший регистр (на выходе SOUT 1Hz)
  rtc_read CON %11010000 ' Адрес часов для чтения 
  rtc_write con %11010001 ' Адрес часов для записи 
  Dim sec As Byte ' секунды 
  Dim sec1 As Byte ' секунды в десятичном формате
  Dim sec2 As Byte
  Dim mins As Byte ' минуты в формате DS1307 
  Dim mins1 As Byte ' минуты в десятичном формате 
  Dim hr As Byte ' часы в формате DS1307 
  Dim hr1 As Byte ' часы в десятичном формате 
  Dim day As Byte ' день недели 
  Dim date As Byte ' дата в формате DS1307 
  Dim date1 As Byte ' дата в десятичном формате 
  Dim mon As Byte ' месяц в формате DS1307 
  Dim mon1 As Byte ' месяц в десятичном формате 
  Dim yr As Byte ' год в формате DS1307 
  Dim yr1 As Byte 
  Dim d_hi As Byte
  Dim d_lo As Byte
  Dim tmp As Byte 
  Dim tmp1 As Byte  
  '--Объявл переменных--
  Dim Narab As Word
  Dim N As Byte ' перм.для счета секунд наработки
  Dim NN As Word ' перм.счета минут наработки
  Dim NNN As Word ' перм.счета часов наработки
  Dim NNN2 As Word ' перм. для редактирования часов наработки
  Dim D As Byte ' перем.номера сработавшего датчика 
  Dim VAR1 As Word 'Перем для хранения результата АЦП в канале ADIn 5 
  Dim VAR2 As Word 'Перем для хранения результата АЦП в канале ADIn 6
  Dim PROSThr As Byte ' Простой в часах
  Dim PROSTm As Byte ' простой в мин
  Dim Prost As Word
  Dim X As Byte 
  Dim sec_ost As Byte ' пер.секунд остановки
  Dim mins_ost As Byte ' пер.минут остановки
  Dim hr_ost As Byte ' пер.часов остановки
  Dim date_ost As Byte ' пер.даты остановки
  Dim mon_ost As Byte ' пер.месяца остановки
  Dim yr_ost As Byte ' пер.года остановки  
  Dim sec_start As Byte ' пер.секунд старта
  Dim mins_start As Byte ' пер.минут старта
  Dim hr_start As Byte ' пер.часов старта
  Dim date_start As Byte ' пер.даты остарта
  Dim mon_start As Byte ' пер.месяца старта
  Dim yr_start As Byte ' пер.года старта
  Dim address As Byte ' Переменная адреса указ дат и др
  Dim address2 As Byte ' Переменная адреса простоя
  Dim Ukaz_daty As Byte ' пер.записи дат остановок  
  Dim ukaz_dat As Byte ' пер.просмотра дат остановок 
  Dim addr As Byte ' Пер.адреса для просмотра дат остановок  
  '--Инициализация--
   Init: 
   Clear
   'I2COUT SDA, SCL, RTC_write, 7, [Ctrl]  
   NN = ERead 0  
   NNN = ERead 2  
   Ukaz_daty = ERead 4
   address = Ukaz_daty * 10
    PORTE.0 = 0  
   GoSub read_time ' Чтение текущ времени
   sec_start = sec1  
   mins_start = mins1
   hr_start = hr1
   date_start = date1
   mon_start = mon1
   yr_start = yr1
   DelayMS 100
   EWrite (address + 5), [mins_start, hr_start, date_start, mon_start, yr_start] ' запись времен включ станка
   Zastavki: 
   Print At 1, 1,$20
   Print At 2, 3,$4B,$6F,$BD,$BF,$70,$6F,$BB,$BB,$65,$70,$20,$6F,$C1,$B8,$B2,$6F,$BA ' "Контроллер ошибок"
   Print At 3, 6,"NIECHAUS-M"
   Print At 4, 1,$20
   DelayMS 2000
   Cls
   Print At 1 ,6,$50,$61,$B7,$70,$61,$B2,$6F,$BF,$BA,$61 ' "Разработка"
   Print At 2 ,2,$41,$48,$41,$54,$4F,$A7,$A5,$B1,$20,$4D,$45,$E0,$42,$45,$E0,$45,$42,$41 ' "АНАТОЛИЯ МЕДВЕДЕВА"
   Print At 3 ,8,$31,$20,$B8,$C6,$BD,$C7 ' "1 июня"
   Print At 4 ,8,$32,$30,$30,$39,$20,$B4,$2E ' "2009 г."
    DelayMS 2000 
    Cls
  '--Главная программа--
   Main: 
    Let D = 0 
    Let X = 1  
   If PORTB.4 = 0 Then Cls: DelayMS 500: GoTo KNOPKI
   VAR1 = ADIn 4  
   If VAR1 <= 600 Then GoTo Ostanovka 
   VAR2 = ADIn 6  
   If VAR2 <= 800 Then Cls: Prost = ERead 230: GoSub Prostoy 
    Narab = NNN
    Print At 1, 1,$4F,$AC,$A5,$A0,$4F,$4B,$20,$48,$45,$54,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20 '"ОШИБОК HET "
    GoSub DATCHIKI
    GoSub Narabotka 
    GoSub read_time
    If sec1 <> sec2 Then N = N + 1: If N > 59 Then N = 0: NN = NN + 1: If NN > 59 Then NN = 0: NNN = NNN + 1: If NNN > 59999 Then NNN = 0 
    sec2 = sec1 ' запомнить состояние текущей секунды  
    GoSub PRNT3_4
   GoTo Main
    End
  '--Конец Гл. програm--
  '--Нач.прогр. KNOPKI --
  KNOPKI:
    If PORTB.6 = 0 Then DelayMS 500: X = X + 1: If X > 4 Then X = 1
    If PORTB.5 = 0 Then DelayMS 500: X = X - 1: If X = 0 Then X = 4
    If X = 1 Then GoSub Rezim1
    If X = 2 Then GoSub Rezim2
    If X = 3 Then GoSub Rezim3
    If X = 4 Then GoSub Rezim4
    If X = 1 And PORTB.7 = 0 Then Cls: DelayMS 500: GoTo Main
    If X = 2 And PORTB.7 = 0 Then Cls: DelayMS 500: X = 0: ukaz_dat = Ukaz_daty: GoTo Istor_ost
    If X = 3 And PORTB.7 = 0 Then Cls: GoSub read_time: DelayMS 400: X = 0: GoTo UstVREMY
    If X = 4 And PORTB.7 = 0 Then Cls: DelayMS 400: X = 0: NNN2 = NNN: GoTo Redakt_narab 
    GoTo KNOPKI 
   '---------
    Redakt_narab:
    Print At 1, 1, $54,$65,$BA,$79,$E6,$65,$65,$20,$B7,$BD,$61,$C0,$65,$BD,$B8,$65 '"Текущее значение"
    Print At 2, 1, $BD,$61,$70,$61,$B2,$6F,$BF,$BA,$B8,$3A,$20, Dec NNN,$C0,$2E,DEC2 NN,$BC 
    Print At 3, 1, $48,$6F,$B3,$6F,$65,$20,$B7,$BD,$61,$C0,$65,$BD,$B8,$65 '"Новое значение"
    Print At 4, 1, $BD,$61,$70,$61,$B2,$6F,$BF,$BA,$B8,$3A,$20,Dec NNN2,$C0,$2E
    If PORTB.5 = 0 Then DelayMS 150: NNN2 = NNN2 + 1: If NNN2 > 60001 Then NNN2 = 0  
    If PORTB.6 = 0 Then DelayMS 150: NNN2 = NNN2 - 1: If NNN2 > 60001 Then NNN2 = 0 
    If PORTB.7 = 0 Then Cls: DelayMS 500: NN = 0: NNN = NNN2: EWrite 0, [NN, NNN]: GoTo Main
    GoTo Redakt_narab:
   '--Начало подпрогр. Istor_ost --
   Istor_ost:
    Print At 1, 1, $E0,$61,$BF,$61,$20,$43,$54,$41,$50,$54,$20,$3A, DEC2 date_start,"-",DEC2 mon_start,"-",DEC2 yr_start '"Дата СТАРТ :"
    Print At 2, 1, $42,$70,$65,$BC,$C7,$20,$43,$54,$41,$50,$54,$3A, DEC2 hr_start,"-",DEC2 mins_start,"-",DEC2 sec_start '"Время СТАРТ:"
    Print At 3, 1, $E0,$61,$BF,$61,$20,$20,$43,$54,$4F,$A8,$20,$3A, DEC2 date_ost,"-",DEC2 mon_ost,"-",DEC2 yr_ost '"Дата СТОП :"
    Print At 4, 1, $42,$70,$65,$BC,$C7,$20,$43,$54,$4F,$A8,$20,$3A, DEC2 hr_ost,"-",DEC2 mins_ost,"-",DEC2 sec_ost '"Время СТОП :"
    If PORTB.5 = 0 Then DelayMS 250: ukaz_dat = ukaz_dat + 1: GoSub PROVERKA: Cls: Print At 2, 1, "ukaz_dat - ", Dec ukaz_dat: DelayMS 1000: GoTo Istor2_ost:
    If PORTB.6 = 0 Then DelayMS 250: ukaz_dat = ukaz_dat - 1: GoSub PROVERKA: Cls: Print At 2, 1, "ukaz_dat - ", Dec ukaz_dat: DelayMS 1000: GoTo Istor2_ost:
    If PORTB.7 = 0 Then Cls: DelayMS 500: GoTo Main
    DelayMS 300:    
    GoTo Istor_ost
    Istor2_ost:
    addr = ukaz_dat * 10 
    sec_ost = 0
    mins_ost = ERead (addr + 0 + 10) ' Чтение времени остановки станка
    hr_ost = ERead (addr + 1 + 10)
    date_ost = ERead (addr + 2 + 10)
    mon_ost = ERead (addr + 3 + 10)
    yr_ost = ERead (addr + 4 + 10)
   sec_start = 0
   mins_start = ERead addr + 5 ' Чтение времени старта станка
   hr_start = ERead addr + 6
   date_start = ERead addr + 7
   mon_start = ERead addr + 8
   yr_start = ERead addr + 9
    Print At 1, 1, $E0,$61,$BF,$61,$20,$43,$54,$41,$50,$54,$20,$3A, DEC2 date_start,"-",DEC2 mon_start,"-",DEC2 yr_start '"Дата СТАРТ :"
    Print At 2, 1, $42,$70,$65,$BC,$C7,$20,$43,$54,$41,$50,$54,$3A, DEC2 hr_start,"-",DEC2 mins_start,"-",DEC2 sec_start '"Время СТАРТ:"
    'Print At 3, 1, $E0,$61,$BF,$61,$20,$20,$43,$54,$4F,$A8,$20,$3A, DEC2 date_ost,"-",DEC2 mon_ost,"-",DEC2 yr_ost '"Дата СТОП :"
    Print At 3, 1, $42,$70,$65,$BC,$C7,$20,$43,$54,$4F,$A8,$20,$3A, DEC2 hr_ost,"-",DEC2 mins_ost,"-",DEC2 sec_ost '"Время СТОП :"
    Print At 4, 1, $A8,$70,$6F,$63,$BF,$6F,$B9,$3A,$20, Dec Prost
    If PORTB.5 = 0 Then DelayMS 500: ukaz_dat = ukaz_dat + 1: GoSub PROVERKA: Cls: Print At 2, 1, "ukazat_dat - ", Dec ukaz_dat: DelayMS 1000
    If PORTB.6 = 0 Then DelayMS 500: ukaz_dat = ukaz_dat - 1: GoSub PROVERKA: Cls: Print At 2, 1, "ukaz_dat - ", Dec ukaz_dat: DelayMS 1000
    If PORTB.7 = 0 Then Cls: DelayMS 300: GoTo Main
    DelayMS 300:
    GoTo Istor2_ost 
   '-- Подрограмма проверки диапазона переменной установки дат--
    PROVERKA: 
    If ukaz_dat > 21 Then ukaz_dat = 1
    If ukaz_dat < 1 Then ukaz_dat = 21 
    Return
 '--Начало подпрогр. USTANOVKA VREMENI --
  '--Индикация выбора режимов работы--
   Rezim1:
    Print At 1 ,1,$42,$C3,$B2,$6F,$70,$20,$70,$65,$B6,$B8,$BC,$61,$20,$70,$61,$B2,$6F,$BF,$C3,$20 '"Vibor rezima raboty " 
    Print At 2 ,1,$2D,$20,$4B,$4F,$48,$54,$50,$4F,$A7,$62,$20,$4F,$AC,$A5,$A0,$4F,$4B,$20,$2D,$20 '"- KONTROL. OSIBOK - "
    Print At 3 ,1,$A5,$63,$BF,$6F,$70,$B8,$C7,$20,$6F,$63,$BF,$61,$BD,$6F,$B3,$6F,$BA,$20,$20,$20 '"Istor_ost. ostanovok "

    Print At 4 ,1,$A9,$63,$BF,$61,$BD,$6F,$B3,$BA,$61,$20,$B3,$70,$65,$BC,$65,$BD,$B8,$20,$20,$20 '"Ustanovka vremeni "
   Return 
   Rezim2:
    Print At 1 ,1,$42,$C3,$B2,$6F,$70,$20,$70,$65,$B6,$B8,$BC,$61,$20,$70,$61,$B2,$6F,$BF,$C3,$20 '"Vibor rezima raboty "
    Print At 2 ,1,$4B,$6F,$BD,$BF,$70,$6F,$BB,$C4,$20,$6F,$C1,$B8,$B2,$6F,$BA,$20,$20,$20,$20,$20 '"Kontrol. osibok "
    Print At 3 ,1,$2D,$A5,$43,$54,$4F,$50,$A5,$B1,$20,$4F,$43,$54,$41,$48,$4F,$42,$4F,$4B,$2D,$20 '"-Istor_ost. OSTANOVOK-"
    Print At 4 ,1,$A9,$63,$BF,$61,$BD,$6F,$B3,$BA,$61,$20,$B3,$70,$65,$BC,$65,$BD,$B8,$20,$20,$20 '"Ustanovka vremeni "  
   Return 
   Rezim3: 
   Print At 1,1,$42,$C3,$B2,$6F,$70,$20,$70,$65,$B6,$B8,$BC,$61,$20,$70,$61,$B2,$6F,$BF,$C3,$20 '"Vibor rezima raboty "
 Print At 2,1,$4B,$6F,$BD,$BF,$70,$6F,$BB,$C4,$20,$6F,$C1,$B8,$B2,$6F,$BA,$20,$20,$20,$20,$20 '"Kontrol. osibok "
   Print At 3,1,$A5,$63,$BF,$6F,$70,$B8,$C7,$20,$6F,$63,$BF,$61,$BD,$6F,$B3,$6F,$BA,$20,$20,$20 '"Istor_ost. ostanovok "
   Print At 4,1,$2D,$A9,$43,$54,$41,$48,$4F,$42,$4B,$41,$20,$42,$50,$45,$4D,$45,$48,$A5,$2D,$20 '"-USTANOVKA VREMENI-"
   Return 
    Rezim4:  
   Print At 1,1,$42,$C3,$B2,$6F,$70,$20,$70,$65,$B6,$B8,$BC,$61,$20,$70,$61,$B2,$6F,$BF,$C3,$20 '"Vibor rezima raboty
   Print At 2,1,$A5,$63,$BF,$6F,$70,$B8,$C7,$20,$6F,$63,$BF,$61,$BD,$6F,$B3,$6F,$BA,$20,$20,$20 '"Istor_ost. ostanovok "
    Print At 3 ,1,$A9,$63,$BF,$61,$BD,$6F,$B3,$BA,$61,$20,$B3,$70,$65,$BC,$65,$BD,$B8,$20,$20,$20 '"Ustanovka vremeni "
    Print At 4 ,1,$2D,$50,$45,$E0,$41,$4B,$E1,$A5,$B1,$20,$48,$41,$50,$41,$A0,$4F,$54,$4B,$A5,$2D '"-REDAKCIY narabotki-"
   Return
  '--Конец выбора режимов работы--

    UstVREMY:
    DelayMS 300
    BranchL X, [Ust_godov, Ust_mesacev, Ust_dney, Ust_chasov, Ust_minut, Ust_secund]
    If PORTB.7 = 0 Then Cls: DelayMS 300: GoTo Main  
    GoTo UstVREMY
    Ust_godov:
    Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$B4,$6F,$E3,$6F,$B3,$20,$20,$20,$20,$20 '"Редакция годов" 
    If PORTB.5 = 0 Then DelayMS 500: yr1 = yr1 + 1: If yr1 >= 99 Then yr1 = 99
    If PORTB.6 = 0 Then DelayMS 500: yr1 = yr1 - 1: If yr1 <= 0 Then yr1 = 0  
    GoSub PRNT3_4 
    If PORTB.7 = 0 Then Cls: DelayMS 300: X = 1: GoTo UstVREMY
    GoTo Ust_godov
    Ust_mesacev:
    Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$BC,$65,$63,$C7,$E5,$65,$B3,$20,$20,$20 '"Ред месяцев "  
    If PORTB.5 = 0 Then DelayMS 500: mon1 = mon1 + 1: If mon1 >= 12 Then mon1 = 12
    If PORTB.6 = 0 Then DelayMS 500: mon1 = mon1 - 1: If mon1 <= 0 Then mon1 = 0 
    GoSub PRNT3_4  
    If PORTB.7 = 0 Then Cls: DelayMS 300: X = 2: GoTo UstVREMY 
    GoTo Ust_mesacev
    Ust_dney: 
    Print At 1, 1, $$50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$E3,$BD,$65,$B9,$20,$20,$20,$20,$20,$20 '"Ред дней"
    If PORTB.5 = 0 Then DelayMS 500: date1 = date1 + 1: If date1 >= 30 Then date1 = 30
    If PORTB.6 = 0 Then DelayMS 500: date1 = date1 - 1: If date1 <= 0 Then date1 = 0  
    GoSub PRNT3_4 
    If PORTB.7 = 0 Then Cls: DelayMS 300: X = 3: GoTo UstVREMY
    GoTo Ust dney
    Ust_chasov:
    Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$C0,$61,$63,$6F,$B3,$20,$20,$20,$20,$20
    If PORTB.5 = 0 Then DelayMS 500: hr1 = hr1 + 1: If hr1 >= 23 Then hr1 = 23
    If PORTB.6 = 0 Then DelayMS 500: hr1 = hr1 - 1: If hr1 <= 0 Then hr1 = 0 
    GoSub PRNT3_4  
    If PORTB.7 = 0 Then Cls: DelayMS 300: X = 4: GoTo UstVREMY
    GoTo Ust_chasov
    Ust_minut:
    Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$BC,$B8,$BD,$79,$BF,$20,$20,$20,$20,$20 '"Redakciya minut " 
    If PORTB.5 = 0 Then DelayMS 500: mins1 = mins1 + 1: If mins1 >= 59 Then mins1 = 59
    If PORTB.6 = 0 Then DelayMS 500: mins1 = mins1 - 1: If mins1 <= 0 Then mins1 = 0  
    GoSub PRNT3_4 
    If PORTB.7 = 0 Then Cls: DelayMS 300: X = 5: GoTo UstVREMY 
    GoTo Ust_minut  
    Ust_secund:
    Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$63,$65,$BA,$79,$BD,$E3,$20,$20,$20,$20 '"Redakciya secund " 
    If PORTB.5 = 0 Then DelayMS 500: sec1 = sec1 + 1: If sec1 >= 59 Then sec1 = 59
    If PORTB.6 = 0 Then DelayMS 500: sec1 = sec1 - 1: If sec1 <= 0 Then sec1 = 0  
    GoSub PRNT3_4 
    If PORTB.7 = 0 Then Cls: DelayMS 300: X = 0: GoSub write_time: GoTo Main 
    GoTo Ust_secund  
   DATCHIKI:
   Let D = 0  
    If PORTD.0 = 0 Then D = 1
    If PORTD.1 = 0 Then D = 2
    If PORTD.2 = 0 Then D = 3  
    If PORTD.3 = 0 Then D = 4
    If PORTD.4 = 0 Then D = 5
    If PORTD.5 = 0 Then D = 6
    If PORTD.6 = 0 Then D = 7
    If PORTD.7 = 0 Then D = 8
    If PORTB.0 = 0 Then D = 9
    If PORTB.1 = 0 Then D = 10
    If PORTB.2 = 0 Then D = 11
    If PORTB.3 = 0 Then D = 12
    If PORTC.2 = 0 Then D = 13
    If PORTC.5 = 0 Then D = 14
    If PORTC.6 = 0 Then D = 15
    If PORTC.7 = 0 Then D = 16
    If D > 0 Then PORTE.0 = 1: GoTo IndOSIBKI
   Return  
  '--Конец DATCHIKI--
   IndOSIBKI:
    Print At 1, 1,$4F,$AC,$A5,$A0,$4B,$41,$20,$E0,$41,$54,$AB,$A5,$4B,$41,$20,$44, Dec D, " " '"ОШИБКА ДАТЧИКА D"
    If D = 1 Then Print At 2, 1,$48,$65,$BF,$20,$E3,$61,$B3,$BB,$65,$BD,$B8,$C7,$20,$B3,$6F,$B7,$E3,$79,$78,$61 '"Нет давления воздуха" 
    If D = 2 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B3,$20,$31,$2D,$6F,$B9,$20,$63,$65,$BA,$E5,$B8,$B8,$20 '"Obryv v 1-oj sekcii "  
    If D = 3 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B3,$6F,$20,$32,$2D,$6F,$B9,$20,$63,$65,$BA,$E5,$B8,$B8 '"Obryv vo 2-oj sekcii"  
    If D = 4 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B3,$20,$33,$2D,$65,$B9,$20,$63,$65,$BA,$E5,$B8,$B8,$20 '"Obryv v 3-ej sekcii "
    If D = 5 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B3,$20,$34,$2D,$6F,$B9,$20,$63,$65,$BA,$E5,$B8,$B8,$20 '"Obryv v 4-oj sekcii "

    If D = 6 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B3,$20,$35,$2D,$6F,$B9,$20,$63,$65,$BA,$E5,$B8,$B8,$20 '"Obryv v 5-oj sekcii "
    If D = 7 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B3,$20,$36,$2D,$6F,$B9,$20,$63,$65,$BA,$E5,$B8,$B8,$20 '"Obryv v 6-oj sekcii "
    If D = 8 Then Print At 2, 1,$4F,$BF,$BA,$70,$C3,$BF,$20,$B7,$61,$E6,$B8,$BF,$BD,$2E,$20,$BA,$6F,$B6,$79,$78 '"Otkryt zashitn.kovuh"
    If D = 9 Then Print At 2, 1,$50,$61,$E3,$B8,$61,$BB,$2E,$B2,$B8,$65,$BD,$B8,$65,$20,$70,$6F,$BF,$6F,$70,$61 '"Radial.bienie rotora"
    If D = 10 Then Print At 2, 1,$4F,$63,$65,$B3,$6F,$65,$20,$63,$BC,$65,$E6,$65,$BD,$2E,$70,$6F,$BF,$6F,$70,$61 '"Osevoe smesen.rotora"
    If D = 11 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$63,$65,$70,$E3,$65,$C0,$BD,$B8,$BA,$61,$20,$20,$20,$20 '"Obryv cerdehnika " 
    If D = 12 Then Print At 2, 1,$48,$65,$BF,$20,$E3,$61,$B3,$BB,$65,$BD,$B8,$C7,$20,$BC,$61,$63,$BB,$61,$20,$20 '"Net davleniy masla " 
    If D = 13 Then Print At 2, 1,$4F,$B2,$70,$C3,$B3,$20,$B6,$B8,$BB,$C3,$20,$BD,$61,$20,$B3,$C3,$78,$6F,$E3,$65 '"Obryv zily na vihode" 
    If D = 14 Then Print At 2, 1, "14"
    If D = 14 Then Print At 2, 1, "15"
    If D = 14 Then Print At 2, 1, "16"
    GoSub read_time
    GoSub PRNT3_4
    DelayMS 100
    If PORTA.4 = 0 Then Cls: Print At 1, 1, $43,$A0,$50,$4F,$43,$20,$4F,$AC,$A5,$A0,$4F,$4B,$20,$20,$20,$20,$20,$20,$20,$20: DelayMS 500: GoSub DATCHIKI: DelayMS 1000: GoTo IndOSIBKI '"CBPOC OSIBOK "
    If D = 0 Then DelayMS 500: PORTE.0 = 0: GoTo Main
    GoTo IndOSIBKI
  '--Подпрогр. Narabotka--  
    Narabotka:
    Narab = NNN
    Print At 2, 1, $48,$61,$70,$61,$B2,$6F,$BF,$BA,$61,$20, Dec Narab,$C0,$2E,DEC2 NN,$BC '"Наработка XXXXXч.XXм"
    Return 
    '--Подпрогр. Остановка--  
    Ostanovka: 
    GoSub read_time
    sec_ost = 0
    mins_ost = mins1
    hr_ost = hr1
    date_ost = date1
    mon_ost = mon1
    yr_ost = yr1  
    Ukaz_daty = ERead 4
    Ukaz_daty = Ukaz_daty + 1
    If Ukaz_daty > 21 Then Ukaz_daty = 1 
    address = Ukaz_daty * 10
    address2 = 230 + Ukaz_daty
    Cls
    'Ukaz_daty = 0: EWrite 4, [Ukaz_daty]  
    'NN = 0
    'NNN = 0
    EWrite 0, [NN, NNN, Ukaz_daty]
    EWrite address2, [Prost]
    EWrite address, [mins_ost, hr_ost, date_ost, mon_ost, yr_ost]
    'Ewrite (address + 5), [mins_start, hr_start, date_start, mon_start, yr_start]
    Ostan2:
    Print At 1, 1, "OTKLUCHENIE WATSON "
    Print At 2, 1, "Narabotka:", Dec NNN, "hr", Dec NN, "min"
    Print At 3, 1, "TIME STOP: ",DEC2 hr_ost,"-",DEC2 mins_ost,"-",DEC2 sec_ost
    'Print At 4, 1, "DATA STOP: ",Dec date_ost,"-",Dec mon_ost,"-",Dec yr_ost
    Print At 4, 1, "ADC: ", Dec VAR1, " Ukaz_dat:", Dec Ukaz_daty
    DelayMS 500 
    GoTo Ostan2 
    Stop
   End  
   '--Вывод на ЖКИ 3-ей и 4-ой строк с инфой о текущем времени--
   PRNT3_4:
    Print At 3, 1,$E0,$61,$BF,$61,$20,$3A,$20, DEC2 date1,"-",DEC2 mon1,"-",DEC2 yr1
    Print At 4, 1,$42,$70,$65,$BC,$C7,$3A,$20, DEC2 hr1,"-",DEC2 mins1,"-",DEC2 sec1
   Return
   Prostoy:
   'delayms 100
   GoSub read_time
    If sec1 <> sec2 Then N = N + 1: If N > 1 Then N = 0: PROSTm = PROSTm + 1: If PROSTm > 59 Then PROSTm = 0: PROSThr = PROSThr + 1: If PROSThr> 24 Then PROSThr = 0 
    sec2 = sec1 ' запомнить состояние текущей секунды  
   Print At 1, 1, $4F,$43,$54,$41,$48,$4F,$42,$4B,$41, " :", DEC4 Prost '"ОСТАНОВКА"
   Print At 2, 1, $A8,$70,$6F,$63,$BF,$6F,$B9,$3A,$20, DEC2 PROSThr,$C0,$2E, DEC2 PROSTm,$BC 
   GoSub PRNT3_4
   VAR2 = ADIn 6  
   VAR1 = ADIn 4
   If VAR1 <= 600 Then Prost = PROSTm + (PROSThr * 60): GoTo Ostanovka
   If VAR2 <= 800 Then GoTo Prostoy 
   Prost = PROSTm + (PROSThr * 60)
   Return
  '--Чтение времени из DS1307--
  read_time: 
  I2CIN SDA, SCL, RTC_read, 0, [sec,mins,hr,day,date,mon,yr] 
  tmp = sec 
  GoSub fix_bcd_in
  sec1 = tmp 
  tmp = mins 
  GoSub fix_bcd_in 
  mins1 = tmp 
  tmp = hr 
  GoSub fix_bcd_in 
  hr1 = tmp 
  tmp = date 
  GoSub fix_bcd_in 
  date1 = tmp 
  tmp = mon 
  GoSub fix_bcd_in 
  mon1 = tmp 
  tmp = yr 
  GoSub fix_bcd_in 
  yr1 = tmp 
  Return
  '--Запись времени в DS1307---
  write_time:
  tmp = sec1 
  GoSub fix_bcd_out
  sec = tmp 
  tmp = mins1 
  GoSub fix_bcd_out 
  mins = tmp 
  tmp = hr1 
  GoSub fix_bcd_out 
  hr = tmp 
  tmp = date1 
  GoSub fix_bcd_out 
  date = tmp 
  tmp = mon1 
  GoSub fix_bcd_out 
  mon = tmp 
  tmp = yr1 
  GoSub fix_bcd_out 
  yr = tmp 
  sec = 0 
  I2COUT SDA, SCL, RTC_write, 0, [sec,mins,hr,day,date,mon,yr] 
  Return
  fix_bcd_in:
  tmp1 = tmp & 15 
  tmp = tmp >> 4 
  tmp = tmp1 + 10 * tmp 
  Return 
  fix_bcd_out:
  tmp1 = tmp / $A 
  tmp = tmp - (tmp1 * $A) 
  tmp = tmp + (tmp1 << 4) 
  Return
 

Рис. 3. Действующая модель niechaus.DSN контроллера ошибок NIECHAUS-M.

По этой ссылке можно скачать архив действующей схемы и необходимые для ее работы ASM и HEX файлы. 
 
















Рис. 4. Контроллер ошибок WATSON-M установленный в пульте управления
технологической линией по производству кабельной продукции.

Связатся с автором статьи Вы можете по адресу terrarus@mail.ru


Категория: Proton PICBasic | Добавил: terrarus (05.06.2009) E
Просмотров: 10171 | Теги: разработка, прибор, контроллер, PROTON, проект, автоматика | Рейтинг: 5.0/8
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]