Главная » Статьи » 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 По этой ссылке можно скачать архив действующей схемы и необходимые для ее работы ASM и HEX файлы. Рис. 4. Контроллер ошибок WATSON-M установленный в пульте управления технологической линией по производству кабельной продукции. Связатся с автором статьи Вы можете по адресу terrarus@mail.ru | ||
Просмотров: 10450 | | |
Всего комментариев: 0 | |