$regfile = "xm128a1def.dat"
$crystal = 32000000
$hwstack = 64
$swstack = 40
$framesize = 64
'include the following lib and code, the routines will be replaced since they are a workaround
$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014
$lib "i2c_twi.lbx" '
'-------------------------------------------------------------------------------
'Enable the external oscillator 8MHz and PLL 32MHz
'-------------------------------------------------------------------------------
'For 8MHz crystal
Config Osc = Disabled , Extosc = Enabled , Range = 2mhz_9mhz , Startup = Xtal_1kclk , 32khzosc = Enabled
' Set PLL OSC conditions:
Osc_pllctrl = &B1100_0100 ' reference external oscillator, set the PLL' multiplication factor to 4 (bits 0 - 4)
Set Osc_ctrl.4 ' Enable PLL Oscillator
Bitwait Osc_status.4 , Set ' wait until the pll clock reference source is stable
Clk_ctrl = &B0000_0100 ' switch system clock to pll
Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1
'Config Osc = Disabled , Extosc = Enabled , Range = 2mhz_9mhz , Startup = Xtal_256clk
'Config Sysclock = External , Prescalea = 1 , Prescalebc = 1_1 'EXTERNAL 32MHz
'osc_xoscctrl = &B01001011 'задаем диапазон внешнего генератора 2...9МГц и время запуска равное 16000
'Set Osc_ctrl.3 'разрешаем работу внешнего генератора
'Osc_pllctrl = &B11000100 'задаем внешний генератор как источник синхронизации для блока PLL и умножаем на 4
'Do
'Loop Until Osc_status.3 = 1 'ожидаем готовность внешнего генератора
'Set Osc_ctrl.4 'разрешаем работу блока PLL
'Do
'Loop Until Osc_status.4 = 1 'ожидаем готовность PLL
'Cpu_ccp = &B11011000 'разрешение на изменение защитных регистров
'Clk_ctrl = &B00000100 'задаем системную синхронизацию от PLL
'Cpu_ccp = &B11011000 'разрешение на изменение защитных регистров
'Clk_psctrl = &B00000000 'записываем в регистр предделителя системной частоты 0
'Clk_lock = &B00000000 'нет запрета на изменение 2-х предыдущих регистров
'Reset Osc_ctrl.0 'отключаем внутренний источник на 2МГц, тем самым запускаем системную синхронизацию от PLL
'-------------------------------------------------------------------------------
'Config Interrupts
Config Priority = Static , Vector = Application , Lo = Enabled , Hi = Enabled , Med = Enabled
'-------------------------------------------------------------------------------
'Config ADCA ADCB
'-------------------------------------------------------------------------------
Config Adca = Single , Convmode = Signed , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = Diff , Mux0 = &B00000001
Config Adcb = Single , Convmode = Signed , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = Diff , Mux0 = &B00000001
'-------------------------------------------------------------------------------
'Config DACB
'-------------------------------------------------------------------------------
'Config Dacb = Enabled , Io0 = Enabled , Io1 = Enabled , Channel = Dual , Reference = AREFA , Interval = 64 , Refresh = 64
'Dacb0 = 4095
'DACB1 = 2047
'Start Dacb
'Stop Dacb
'-------COM порты
'---Основной RS-232 DB9(1)
Config Com5 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM5:" For Binary As #1
'Управление соединением CSD
Reset Portd.6
Config Pind.6 = Output
'---прерывание входящего звонка RI/PIND.5
'On Portd_int0 Prer_zvonok
Enable Portd_int0 , Lo
Config Portd.5 = Input
Portd_int0mask = &B00100000
Config Xpin = Porte.5 , Outpull = Pullup , Sense = Falling
'---Дополнительный RS-232(2)
Config Com3 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM3:" For Binary As #2
'---Основной RS-485/1(3)
Config Com2 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #3
'управление прием/передача RS-485/1
Reset Portd.7
Config Pind.7 = Output
'---Дополнительный RS-485/2(4)
Config Com7 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM7:" For Binary As #4
'управление прием/передача RS-485/2
Reset Portf.1
Config Pinf.1 = Output
'---USB
Config Com8 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM8:" For Binary As #5
'---I2C
Open "twid" For Binary As #6
I2cinit #6 'set i2c pins to right state , open collector , pull up activated
Config Twid = 100000 'Set TWI Baud Rate and Enable TWI Master
'configure the date format
'time$ = "23:58:00" ' для наблюдения смены дня
'Date$ = "08-10-03" ' 08 октябрь 2003
Config Clock = User
Config Date = Dmy , Separator = - ' ANSI-Format
Config Watchdog = 8000
Stop Watchdog
'---первый микролан
Config 1wire = Portk.1
'---EEPROM
Config Eeprom = Mapped
'Реле
Config Porth = Output
'Реле модема
Reset Portk.0
Config Pink.0 = Output
'светодиод ТМ
Set Portk.2
Config Pink.2 = Output
'контроль наличия питающего напряжения
Reset Portk.5
Config Pink.5 = Input
'Управление соединением CSD
Reset Portd.6
Config Pind.6 = Output
'контактные входы
Config Portj = Input
'Зуммер
Reset Portc.2
Config Pinc.2 = Output
'информационный светодиод1
Reset Portk.4
Config Pink.4 = Output
'информационный светодиод2
Reset Portc.0
Config Pinc.0 = Output
'информационный светодиод3
Reset Portc.1
Config Pinc.1 = Output
'------ЛСД
Config Lcdpin = Pin , Db4 = Porte.4 , Db5 = Porte.5 , Db6 = Porte.6 , Db7 = Porte.7 , E = Porte.0 , Rs = Porte.1
'############################ЗАМЕНА ПЕРЕМЕННЫХ##################################
'-светодиод 1 modem
Diod_1 Alias Portk.4
'-светодиод 2 net
Diod_2 Alias Portc.0
'-светодиод 1 err
Diod_3 Alias Portc.1
'-Зуммер
Zummer Alias Portc.2
'-управление прием/передача RS-485/1
Re_de_rs485_1 Alias Portd.7
'-управление прием/передача RS-485/2
Re_de_rs485_2 Alias Portf.1
'-Светодиод ТМ
Diod_tm Alias Portk.2
'-Реле модема
Rele_modema Alias Portk.0
'-реле
Rele Alias Porth
'-входы
Vhodi Alias Pinj
'############################КОНСТАНТЫ##########################################
Const Razmeepr = 4799
Const Adca_koef = 1.009191552 ' коэффициенты для 2-й платы (которая у меня)
Const Adcb_koef = 1.009212989
'address of ds1307
Const Ds1307w = &HD0 'Addresses of Ds1307 clock
Const Ds1307r = &HD1
Const Slave_w = &B1010_0000 'slave write address EEPROM
Const Slave_r = &B1010_0001 'slave read address EEPROM
'############################ПЕРЕМЕННЫЕ EEPROMA#################################
'---настройки дополнительного RS-232
Dim Baud_rate_rs232_eram As Eram Byte
Dim Data_bits_rs232_eram As Eram Byte
Dim Parity_rs232_eram As Eram Byte
Dim Stop_bits_rs232_eram As Eram Byte
'---настройки RS-485(1)
Dim Baud_rate_rs485_1_eram As Eram Byte
Dim Data_bits_rs485_1_eram As Eram Byte
Dim Parity_rs485_1_eram As Eram Byte
Dim Stop_bits_rs485_1_eram As Eram Byte
'---настройки дополнительного RS-485(2)
Dim Baud_rate_rs485_2_eram As Eram Byte
Dim Data_bits_rs485_2_eram As Eram Byte
Dim Parity_rs485_2_eram As Eram Byte
Dim Stop_bits_rs485_2_eram As Eram Byte
'---ключи Touch Memory at 27 обязательно
Dim Epr_toch_mem(64) As Eram Byte At 27
'---мастер ключ
Dim Epr_master_kl(8) As Eram Byte
'--режим охраны
Dim Epr_ohrana As Eram Byte
'--маски входов на охране
Dim Epr_maska_vhod As Eram Byte
Dim Epr_maska_vhod_adc As Eram Byte
'--состояние питания перед выключением
Dim Epr_pred_pitanie As Eram Byte
'--кол-во попыток отправки СМС
Dim Epr_nepr_sms As Eram Byte
'--АЦП
Dim Min_adc_eram(10) As Eram Byte
Dim Diap_dat_eram(10) As Eram Integer
Dim Koef_adc_eram(10) As Eram Single
Dim Diap_adc_eram(10) As Eram Byte
Dim Vrem_zad_adc(8) As Eram Word
Dim Vrem_zad_adc_posle(8) As Eram Word
'--контактные
Dim Vrem_nakopl(8) As Eram Word
Dim Vrem_zad(8) As Eram Word
Dim Vrem_zad_posle(8) As Eram Word
Dim Crc_eram As Eram Word
'--mLan
Dim Str_min_por_eram(8) As Eram String * 4
Dim Str_max_por_eram(8) As Eram String * 4
'--пароль
Dim Epr_parol As Eram String * 8
'--номер ДЦ
Dim Disp_epr As Eram String * 16
'--номер СМС Центра
Dim Epr_smsc As Eram String * 16
'Dim Min_dat_eram(8) As Eram Integer
'###############################################################################
'-----Переменные соединения по каналу GPRS
Dim User As String * 16
Dim Password As String * 16
Dim Apn As String * 32
Dim Ip_adr1 As String * 15
Dim Ip_adr2 As String * 15
Dim Ip_port1 As String * 5
Dim Ip_port2 As String * 5
Dim Min_signal As Integer
Dim Ping_ip_adr1 As String * 15
Dim Ping_ip_adr2 As String * 15
Dim Timeout As Byte
Dim Session_gprs As Word
Dim Konf_gprs As Byte
'-----Переменные соединения по каналу CSD
Dim Tempbyte1_r As Byte
Dim Tempbyte_r As Byte
Dim Razr_csd As Byte
Dim I_r As Word
Dim Buf_in_r(254) As Byte
Dim Buf_in_485_r(254) As Byte
Dim Otkr_kanal_r As Bit
Dim Kol_err_r As Byte
Dim Err_r As Byte
Dim Temp_r As Byte
Dim Get_dln_r As Byte
Dim Get_byte_r As Byte
Dim Get_byte_r1 As Byte
Dim Crc_r As Byte
Dim Id_paketa_r As Byte
Dim Id_ystr_r As Byte
Dim Golova_r As Byte
Dim Xvost_r As Byte
Dim Dlina_r As Byte
Dim I_w_r As Word
Dim Get_w_r As Long
Dim Msg_r As String * 16
Dim Otvet_r As String * 50
'-------переменные для буфера событий
Dim Golova As Byte 'голова буфера
Dim Hvost As Byte 'хвост буфера
Dim Kol_sob As Byte 'кол-во событий
Dim Bufer_str(50) As String * 16 'знач-е времени
Dim Bufer_sost(50) As Byte 'знач-е входов
'--------------часы
Dim Hi As Byte , Lo As Byte
Dim Dat As String * 9
Dim Chas As String * 9
'------------переменные функции управления реле
Dim Izm_i As Byte
Dim Izm_j As Byte
Dim Izm_j1 As Byte
Dim Izm_byte As Byte
Dim Izm_value As Byte
Dim Izm_epr_adr As Word
Dim Izm_str2 As String * 2
'------------------некоторые локальные переменные
Dim Loc_epradres As Word
Dim Loc_i As Word
Dim Loc_i1 As Word
Dim Loc_byte As Byte
Dim Get_w As Long
Dim Get_byte As Byte
Dim Get_dln As Word
'---переменные создания архивов состояния
Dim Flag_arhiv As Bit
Dim Arhiv(90) As Byte
Dim Kol_arhiv As Byte
Dim Golova_arhiv As Byte
Dim Period_stat As Word
Dim Ch_period_stat As Word
'------------ПЕРЕМЕННЫЕ ОСНОВНОГО ЦИКЛА
Dim Temp_single As Single
Dim Temp_integer As Integer
Dim J As Word
Dim J2 As Word
Dim I As Word
Dim I1 As Word
Dim I2 As Word
Dim Epradres As Word
Dim Adr_telef As Word
Dim Adr_sms As Word
Dim Tempstr1 As String * 1
Dim Str2 As String * 2
Dim Twi_start As Byte
Dim Min_adc(10) As Byte
Dim Diap_adc(10) As Byte
Dim Min_dat(10) As Integer
Dim Diap_dat(10) As Integer
Dim Koef_adc(10) As Single
Dim Ed_izm_dat(10) As String * 10
Dim Zn_adc_single(10) As Single
Dim Zn_adc_long(10) As Single
Dim Adc_str(10) As String * 5
Dim Zn_dat_adc_single(10) As Single
Dim Zn_dat_adc_string(10) As String * 10
Dim Max_por_dat(8) As Single
Dim Min_por_dat(8) As Single
Dim Mlan_str(8) As String * 10
Dim Vrem_stat As String * 4 'ответ телефона или ПС
Dim Id_obekta As String * 10
Dim Csq As String * 11
Dim Csq_dbm As Integer
Dim Parol As String * 7
Dim Smsc As String * 16
Dim Sost_vihod As String * 8
Dim Sost_datch As String * 8
Dim Sost_adc As String * 8
Dim Otvet As String * 40
Dim Ohrana As Byte
Dim Perezagr As Byte
Dim Izmen_mlan(8) As Byte
Dim Izmen_adc(8) As Byte
Dim My_err As Byte
Dim Kol_nepr_sms As Byte
Dim Fl_otsil_stat As Byte
Dim Maska_vhod As Byte
Dim Maska_vhod_adc As Byte
Dim Kol_stat As Byte
Dim Kol_ciklov As Byte
Dim Est_ohrana As Byte
Dim Kontr_tel As Byte
Dim Tempbyte As Byte
Dim Tempbyte1 As Byte
Dim Kol_kluchei As Byte
Dim Dlina_parola As Byte
Dim Tek_vhod As Byte 'текущее значение входов
Dim Pred_vhod As Byte 'предыдущее значение входов
Dim Tip_datch As Byte
Dim Id_toch_mem(8) As Byte
Dim Vrem_rele(8)as Word
Dim Sost_vhod As Byte
Dim Flag_reset As Bit
Dim Flag_lcd As Bit
Dim Konfig_kluch As Bit
Dim Pervii_raz As Bit 'флаг первого цикла измерений
Dim Bez_modema As Bit
Dim Pred_pitanie As Bit
Dim Pitanie As Bit
'---------для датчиков mLAn
Dim Id_datch(8) As Byte
Dim Toch_mem(8) As Byte
Dim Obr_datch As Byte 'текущий номер датчика MLan
Dim Pred_sost_datch As String * 1
Dim Str_max_por As String * 4
Dim Str_min_por As String * 4
Dim Zn_datch_str As String * 10
Dim Zn_datch1_str As String * 6
Dim Zn_datch As Single
Dim Zn_datch_arr(32) As Byte
Dim Singl_temper As Single 'полученное значение датчика MLan
Dim Min_porog As Single
Dim Max_porog As Single
Dim Vdd As Word , Vad As Word , Vcc As Word , Temp As Single
Dim Kol_imp As Long
'----------переменные для прерывания таймера3
Dim Kol_prer_tim3 As Byte
Dim Zn_dat_mlan(8) As String * 16
Dim Msg_tim3 As String * 16
'----------переменные для прерывания таймера 1
Dim Tim_epradres As Word
Dim Flag(8) As Byte
Dim Flag_adc(8) As Byte
Dim Tek(8) As Byte
Dim Tek_adc(8) As String * 1
Dim Tek_vrem_nakopl(8) As Word
Dim Tek_vrem_zad(8) As Word
Dim Tek_vrem_zad_adc(8) As Word
Dim Tek_vrem_zad_posle(8) As Word
Dim Tek_vrem_zad_adc_posle(8) As Word
Dim Prisl_tm As Byte
Dim Vrem_zad_tm As Word
Dim Flag_tm As Byte
Dim Tek_vrem_tm As Byte
Dim Tim_i As Byte
Dim Tim_i1 As Byte
Dim Tim_j As Byte
Dim Tim_j1 As Byte
Dim Tim_byte As Byte
Dim Tim_toch_mem(8) As Byte
Dim Tim_id_datch(8) As Byte
'@@@@@@@@@@@@@@@@@@@@@переменные работы с СМС@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Dim S1 As String * 2 , S0 As String * 2 , S4 As String * 4
Dim Pdu_type As String * 2
Dim Pdu_err As Byte , Tmp1 As Byte , Tmp2 As Byte , Dsc As Byte
Dim F As Bit
Dim Bytes7(9) As Byte
Dim Char As Word , X As Word , Y As Word , E_i As Word
Dim Loc_dln_pdu As Word
'--------для SMS
Dim Buf As String * 322 , Msg As String * 140
Dim Sender As String * 16
Dim Sender1 As String * 16
'---русификация ЛСД
Dim Rus As String * 1 , Cntr As Byte , I_lcd As Byte
'-----------------СЛУЖЕБНЫЕ
Dim Vrem_otw As Long
Dim Vrem_pered As Long
Dim Vrem_otv_tel As Integer
Dim Sms_komand As String * 15
'------------замена стандартных часов
Dim T_sec As Byte
Dim T_min As Byte
Dim T_hour As Byte
Dim T_weekday As Byte
Dim T_day As Byte
Dim T_month As Byte
Dim T_year As Byte
'###############################################################################
Declare Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adres As Word , Value As Byte)
Declare Sub Getline_usb(s As String)
Declare Sub Getline_rs232(s As String)
Declare Sub R_lcd(msg As String)
Declare Sub Getdatetime()
Declare Sub Setdate()
Declare Sub Settime()
Declare Sub Temper()
Declare Sub Vlaga()
Declare Sub Schit()
'###############################################################################
'---начальные установки
Rele = 0
Cls
Cursor Off
Msg = "СОЮЗТЕХНОПРОЕКТ"
Call R_lcd(msg)
Locate 2 , 1
Msg = "RECON-SX v.19.1"
Call R_lcd(msg)
Set Zummer
Wait 1
Reset Zummer
Set Diod_1
Wait 1
Reset Diod_1
Set Diod_2
Wait 1
Reset Diod_2
Set Diod_3
Wait 1
Reset Diod_3
'---Установка параметров дополнительного порта RS-232(2)
Arhiv(1) = Baud_rate_rs232_eram
Arhiv(2) = Data_bits_rs232_eram
Arhiv(3) = Parity_rs232_eram
Arhiv(4) = Stop_bits_rs232_eram
J = Crc16uni(arhiv(1) , 4 , &HFFFF , &H8005 , 1 , 1)
J2 = Crc_eram
If J <> J2 Then
Baud_rate_rs232_eram = 3
Data_bits_rs232_eram = 3
Parity_rs232_eram = 0
Stop_bits_rs232_eram = 0
Else
Tempbyte = Baud_rate_rs232_eram
Select Case Tempbyte
Case 0 : Config Com3 = 1200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 1 : Config Com3 = 2400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 2 : Config Com3 = 4800 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 3 : Config Com3 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 4 : Config Com3 = 14400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 5 : Config Com3 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 6 : Config Com3 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 7 : Config Com3 = 56000 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 8 : Config Com3 = 57600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Case 9 : Config Com3 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
End Select
'---количество бит данных
Tempbyte = Data_bits_rs232_eram
Select Case Tempbyte
Case 0 : Reset Usartd0_ctrlc.0
Reset Usartd0_ctrlc.1
Case 1 : Set Usartd0_ctrlc.0
Reset Usartd0_ctrlc.1
Case 2 : Reset Usartd0_ctrlc.0
Set Usartd0_ctrlc.1
Case 3 : Set Usartd0_ctrlc.0
Set Usartd0_ctrlc.1
End Select
'---бит паритета
Tempbyte = Parity_rs232_eram
Select Case Tempbyte
'none
Case 0 : Reset Usartd0_ctrlc.4
Reset Usartd0_ctrlc.5
'odd
Case 1 : Set Usartd0_ctrlc.4
Set Usartd0_ctrlc.5
'even
Case 2 : Reset Usartd0_ctrlc.4
Set Usartd0_ctrlc.5
End Select
'---кол-во стоп битов
Tempbyte = Stop_bits_rs232_eram
Select Case Tempbyte
Case 0 : Reset Usartd0_ctrlc.3
Case 1 : Set Usartd0_ctrlc.3
End Select
End If
Call Getdatetime()
Poisk:
'-----получение времени
Call Getdatetime()
'---------
'###############################################################################
Cls
Cursor On
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " ..Поиск ПК.."
Call R_lcd(msg)
Wait 1
'*******************************************************************************
J = 0
Do
Print #5 , "ATI"
Vrem_otw = 300000 'определяет время опроса
Vrem_otv_tel = 25
Otvet = ""
Call Getline_usb(otvet)
If Otvet = "PC" Then 'проверяем ответил ПК или телефон
Waitms 500
Vrem_otv_tel = 7
Print #5 , "Ver.30.05.13*019.1"
'----принимаем ответ
Call Getline_usb(otvet)
If Otvet = "PC_OK" Then
Exit Do
End If
End If
'---будем искать телефон если не нашли ПК
If J > 10 Then
Cls
Cursor Off
Msg = "Подключения к ПК"
Call R_lcd(msg)
Locate 2 , 1
Msg = " не обнаружено"
Call R_lcd(msg)
Goto Poisk_tel
End If
I = J Mod 2
If I = 0 Then
Shiftcursor Right
Else
Shiftcursor Left
End If
Incr J
Loop
'###########################КОНФИГУРАЦИЯ КОНТРОЛЛЕРА############################
'--- LCD
Cls
Cursor Off
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "Конфигурирование"
Call R_lcd(msg)
'---
Pc:
Vrem_otw = 2000000
Vrem_otv_tel = 15
Otvet = ""
'ждем команду
Call Getline_usb(otvet)
If Otvet = "" Then
Goto Pc
End If
'------------запрос ID датчиков из контроллера----------------------------------
If Otvet = "ID" Then
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Запрос ID mLan"
Call R_lcd(msg)
Id_toch_mem(1) = 1wsearchfirst()
If Err = 0 Then
For I1 = 1 To 8
Str2 = Hex(id_toch_mem(i1))
Print #5 , Str2;
If I1 = 8 Then
Print #5 ,
End If
Next I1
'---если совмещенный датчик температуры и влажности
If Id_toch_mem(1) = &H26 Then
Id_toch_mem(1) = &H27
For I1 = 1 To 8
Str2 = Hex(id_toch_mem(i1))
Print #5 , Str2;
If I1 = 8 Then
Print #5 ,
End If
Next I1
End If
'---если счетчик импульсов
If Id_toch_mem(1) = &H1D Then
Id_toch_mem(1) = &H1E
For I1 = 1 To 8
Str2 = Hex(id_toch_mem(i1))
Print #5 , Str2;
If I1 = 8 Then
Print #5 ,
End If
Next I1
End If
Else
For I1 = 1 To 16
Print #5 , "0";
Next I1
Print #5 ,
End If
For I = 1 To 7
Id_toch_mem(1) = 1wsearchnext()
If Err = 0 Then
For I1 = 1 To 8
Str2 = Hex(id_toch_mem(i1))
Print #5 , Str2;
If I1 = 8 Then
Print #5 ,
End If
Next I1
'---если совмещенный датчик температуры и влажности
If Id_toch_mem(1) = &H26 Then
Id_toch_mem(1) = &H27
For I2 = 1 To 8
Str2 = Hex(id_toch_mem(i2))
Print #5 , Str2;
If I1 = 8 Then
Print #5 ,
End If
Next I2
End If
'---если совмещенный датчик температуры и влажности
If Id_toch_mem(1) = &H1D Then
Id_toch_mem(1) = &H1E
For I2 = 1 To 8
Str2 = Hex(id_toch_mem(i2))
Print #5 , Str2;
If I1 = 8 Then
Print #5 ,
End If
Next I2
End If
Else
For I1 = 1 To 16
Print #5 , "0";
Next I1
Print #5 ,
End If
Next I
Goto Pc
End If
'------------запрос TM----------------------------------
'---запрс Т.М.
If Otvet = "TM" Then
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Запрос ID Т.М."
Call R_lcd(msg)
'чтение ID
Toggle Diod_tm 'СВЕТОДИОД ДЛЯ touchmemory
Tim_id_datch(1) = 1wsearchfirst(pink , 3)
If Err <> 1 And Tim_id_datch(1) = 1 Then
Msg = ""
For Tim_i = 1 To 8
Msg = Msg + Hex(tim_id_datch(tim_i))
Next Tim_i
Print #5 , Msg
Else
Print #5 , "N/A"
End If
Wait 2
Toggle Diod_tm 'СВЕТОДИОД ДЛЯ touchmemory
Goto Pc
End If
'------------запрос значения датчиков, входов, выходов
If Otvet = "STATUS" Then
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "Запрос состояния"
Call R_lcd(msg)
'---опрос входов
Tek_vhod = Not Vhodi
Print #5 , Bin(tek_vhod)
'ОБРАБОТКА АЦП
'-----------------цифрим 30 раз
For I = 1 To 10
Zn_adc_single(i) = 0
Zn_adc_long(i) = 0
Next I
'---цифрим все каналы по 30 раз
For I2 = 1 To 30
'-------ADCA-------
'ADC_1(pina.2)
Temp_integer = Getadc(adca , 0 , &B00010001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(1) = Zn_adc_long(1) + Temp_integer
Waitus 300
'ADC_2(pina.3)
Temp_integer = Getadc(adca , 0 , &B00011001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(2) = Zn_adc_long(2) + Temp_integer
Waitus 300
'ADC_3(pina.4)
Temp_integer = Getadc(adca , 0 , &B00100001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(3) = Zn_adc_long(3) + Temp_integer
Waitus 300
'ADC_4(pina.5)
Temp_integer = Getadc(adca , 0 , &B00101001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(4) = Zn_adc_long(4) + Temp_integer
Waitus 300
'ADC_5(pina.6)
Temp_integer = Getadc(adca , 0 , &B00110001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(5) = Zn_adc_long(5) + Temp_integer
Waitus 300
'ADC_6(pina.7)
Temp_integer = Getadc(adca , 0 , &B00111001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(6) = Zn_adc_long(6) + Temp_integer
Waitus 300
'-------ADCB-------
'ADC_7(pinb.0)
Temp_integer = Getadc(adcb , 0 , &B00000001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(7) = Zn_adc_long(7) + Temp_integer
Waitus 300
'ADC_8(pinb.4)
Temp_integer = Getadc(adcb , 0 , &B00100001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(8) = Zn_adc_long(8) + Temp_integer
Waitus 300
'ADC_9(pinb.5)
Temp_integer = Getadc(adcb , 0 , &B00101001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(9) = Zn_adc_long(9) + Temp_integer
Waitus 300
'ADC_10(pinb.6)
Temp_integer = Getadc(adcb , 0 , &B00110001)
' Print #1 , "Temp_integer=" ; Temp_integer
Zn_adc_long(10) = Zn_adc_long(10) + Temp_integer
Waitus 300
Waitms 30
Next I2
'---перерасчет в мА/В
For I = 1 To 10
'---приведение к мА/В
If Zn_adc_long(i) < 0 Then Zn_adc_long(i) = 0
Zn_adc_single(i) = Zn_adc_long(i) / 30
'канал а
If I < 7 Then
Zn_datch = Zn_adc_single(i) * Adca_koef
End If
'канал в
If I > 6 Then
Zn_datch = Zn_adc_single(i) * Adcb_koef
End If
Vdd = Round(zn_datch)
Zn_datch = Vdd / 100
Zn_adc_single(i) = Zn_datch
Adc_str(i) = Fusing(zn_adc_single(i) , "#.##")
Print #5 , Adc_str(i)
Next I
'---ОПРОС MLAN
For Obr_datch = 0 To 7
Epradres = Obr_datch * 16
Epradres = Epradres + 3498 'вычисление адреса ID датчика
For I = 1 To 8 'считывание ID обрабатываемого датчика
Call Read_eeprom(epradres , Tempbyte)
Str2 = Chr(tempbyte)
Incr Epradres
If Tempbyte = 0 Then
Print #5 , "N/A"
Goto Kon_opros
End If
If Tempbyte > 90 Or Tempbyte < 47 Then
Print #5 , "N/A"
Goto Kon_opros
End If
Call Read_eeprom(epradres , Tempbyte)
Str2 = Str2 + Chr(tempbyte)
Incr Epradres
If Tempbyte > 90 Or Tempbyte < 47 Then
Print #5 , "N/A"
Goto Kon_opros
End If
If Str2 = "" Then
Id_datch(i) = 0
Else
Id_datch(i) = Hexval(str2)
End If
Next I
Select Case Id_datch(1) 'проверка принадлежности датчика к используемым
Case &H10 : Tip_datch = 0 'температура
Case &H28 : Tip_datch = 0 'температура
Case &H26 : Tip_datch = 11 'температура
Case &H27 : Tip_datch = 12 'влага
Id_datch(1) = &H26
Case &H1D : Tip_datch = 21 'первый канал
Case &H1E : Tip_datch = 22 'второй канал
Id_datch(1) = &H1D
Case Else : Print #5 , "N/A"
Goto Kon_opros
End Select
If Id_datch(8) <> Crc8(id_datch(1) , 7) Then 'проверка контрольной суммы
Print #5 , "N/A"
Goto Kon_opros
End If
'---если датчик необнаружен
1wreset
1wverify Id_datch(1) 'проверка наличия датчика и его ID
If Err = 1 Then
Waitms 200
1wreset
1wverify Id_datch(1)
If Err = 1 Then
Print #5 , "N/A"
Goto Kon_opros
End If
End If
'----------------------ЕСЛИ ЕСТЬ ДАТЧИК
Select Case Id_datch(1)
Case &H10 : Call Temper()
'---если получили неправильный результат
If Zn_datch = 255 Then
Waitms 100
Call Temper()
End If
'---если получили неправильный результат
If Zn_datch = 255 Then
Waitms 100
Call Temper()
End If
Case &H28 : Call Temper()
'---если получили неправильный результат
If Zn_datch = 255 Then
Waitms 100
Call Temper()
End If
'---если получили неправильный результат
If Zn_datch = 255 Then
Waitms 100
Call Temper()
End If
Case &H26 : Call Vlaga()
Case &H1D : Call Schit()
End Select
If Zn_datch = 255 Then
If Id_datch(1) <> &H1D Then
Print #5 , "N/A"
Goto Kon_opros
End If
End If
Print #5 , Zn_datch_str
Kon_opros:
Next Obr_datch
'Системное время контроллера
Call Getdatetime()
Print #5 , Dat
Print #5 , Chas
Goto Pc
End If
'-----------------------------установка времени---------------------------------
If Otvet = "TIME" Then
Cls
Msg = " Установка"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Даты и времени"
Call R_lcd(msg)
Print #5 , "TIME_OK"
Vrem_otw = 1400000
Vrem_otv_tel = 9
'время
Call Getline_usb(chas)
If Len(chas) <> 8 Then
Print #5 , "ERR"
Goto Pc
End If
Vrem_otv_tel = 9
'дата
Call Getline_usb(dat)
If Len(dat) <> 8 Then
Print #5 , "ERR"
Goto Pc
End If
'---время
Str2 = Mid(chas , 7 , 2)
T_sec = Val(str2)
Str2 = Mid(chas , 4 , 2)
T_min = Val(str2)
Str2 = Mid(chas , 1 , 2)
T_hour = Val(str2)
Str2 = Mid(chas , 7 , 2)
T_sec = Val(str2)
'----дата
Str2 = Mid(dat , 1 , 2)
T_day = Val(str2)
Str2 = Mid(dat , 4 , 2)
T_month = Val(str2)
Str2 = Mid(dat , 7 , 2)
T_year = Val(str2)
Call Setdate()
Waitms 20
Call Settime()
Waitms 20
Call Getdatetime()
Print #5 , "DATE" ; Dat ; "*" ; Chas
Wait 2
Cls
Msg = " Дата " + Dat
Call R_lcd(msg)
Locate 2 , 1
Msg = " Время " + Chas
Call R_lcd(msg)
Goto Pc
End If
'------------чтение конфигурации из контроллера---------------------------------
If Otvet = "LOAD" Then
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Чтение EEPROM"
Call R_lcd(msg)
Vrem_otw = 600000
Print #5 , "LOAD"
Waitms 20
For I = 0 To Razmeepr
Call Read_eeprom(i , Tempbyte)
Printbin #5 , Tempbyte;
Next I
Waitms 20
Print #5 , "LOAD_OK"
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Выполнено "
Call R_lcd(msg)
Goto Pc
End If
'------------запись конфигурации в контроллер-----------------------------------
If Otvet = "SAVE" Then
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "Запись в EEPROM"
Call R_lcd(msg)
Print #5 , "SAVE"
Tempbyte1 = 0
Vrem_otw = 1400000
For I = 0 To Razmeepr
Get_w = 0
Get_dln = 1
Do
Incr Get_w
If Get_w > Vrem_otw Then
Goto Kon_save
End If
Get_byte = Ischarwaiting(#5)
If Get_byte <> 0 Then
Get_byte = Inkey(#5)
Tempbyte = Get_byte
Print #5 , "o";
Call Write_eeprom(i , Tempbyte)
Exit Do
End If
Loop
If I <> Razmeepr Then
Tempbyte1 = Tempbyte1 + Tempbyte
End If
Next I
If Tempbyte1 = Tempbyte Then
Print #5 , "SAVE_OK"
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Выполнено "
Call R_lcd(msg)
Else
Kon_save:
Print #5 , "ERR2"
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Ошибка записи "
Call R_lcd(msg)
End If
Goto Pc
End If
'------------управление реле
If Otvet = "RELE" Then
Otvet = ""
Vrem_otv_tel = 9
Vrem_otw = 2000000
Call Getline_usb(otvet)
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "Управление реле"
Call R_lcd(msg)
If Len(otvet) = 9 Then
For I = 0 To 7
I1 = I + 1
If Mid(otvet , I1 , 1) = "0" Then
Tempbyte.i = 0
End If
If Mid(otvet , I1 , 1) = "1" Then
Tempbyte.i = 1
End If
Next I
Rele = Tempbyte
'реле питания модема
If Mid(otvet , 9 , 1) = "1" Then
Set Rele_modema
Else
Reset Rele_modema
End If
End If
Goto Pc
End If
'------------Чтение параметров порта RS-485-----------------------------
If Otvet = "READ RS-485" Then
Cls
Msg = "Чтение настроек"
Call R_lcd(msg)
Locate 2 , 1
Msg = " порта RS-232"
Call R_lcd(msg)
Tempbyte = Baud_rate_rs232_eram
Str_max_por = Str(tempbyte)
Tempbyte = Data_bits_rs232_eram
Str_max_por = Str_max_por + Str(tempbyte)
Tempbyte = Parity_rs232_eram
Str_max_por = Str_max_por + Str(tempbyte)
Tempbyte = Stop_bits_rs232_eram
Str_max_por = Str_max_por + Str(tempbyte)
Print #5 , Str_max_por
Goto Pc
End If
'------------Установка параметров порта RS-485-----------------------------
If Otvet = "SETUP RS-485" Then
Vrem_otw = 400000
Vrem_otv_tel = 4
Call Getline_usb(otvet)
' otvet = "3000" 'для проверки кода, не забыть убрать в рабочей программе
Cls
Msg = " Настройка "
Call R_lcd(msg)
Locate 2 , 1
Msg = " порта RS-232"
Call R_lcd(msg)
'---проверка наличия всех данных
I2 = Len(otvet)
If I2 < 4 Then
Print #5 , "ERROR"
Wait 2
Cls
Msg = " Ошибка "
Call R_lcd(msg)
Locate 2 , 1
Msg = "установки данных"
Call R_lcd(msg)
Wait 2
Goto Pc
End If
'---символы - скорость обмена, бит данных, проверка, стоп бит
'---скорость обмена
Tempstr1 = Mid(otvet , 1 , 1)
Select Case Tempstr1
Case "0" : Config Com2 = 1200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 0
Case "1" : Config Com2 = 2400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 1
Case "2" : Config Com2 = 4800 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 2
Case "3" : Config Com2 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 3
Case "4" : Config Com2 = 14400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 4
Case "5" : Config Com2 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 5
Case "6" : Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 6
Case "7" : Config Com2 = 56000 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 7
Case "8" : Config Com2 = 57600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 8
Case "9" : Config Com2 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Baud_rate_rs232_eram = 9
End Select
'---количество бит данных
Tempstr1 = Mid(otvet , 2 , 1)
Select Case Tempstr1
Case "0" : Data_bits_rs232_eram = 0
Reset Usartc1_ctrlc.0
Reset Usartc1_ctrlc.1
Case "1" : Data_bits_rs232_eram = 1
Set Usartc1_ctrlc.0
Reset Usartc1_ctrlc.1
Case "2" : Data_bits_rs232_eram = 2
Reset Usartc1_ctrlc.0
Set Usartc1_ctrlc.1
Case "3" : Data_bits_rs232_eram = 3
Set Usartc1_ctrlc.0
Set Usartc1_ctrlc.1
End Select
'---бит паритета
Tempstr1 = Mid(otvet , 3 , 1)
Select Case Tempstr1
Case "0" : Parity_rs232_eram = 0 'none
Reset Usartc1_ctrlc.4
Reset Usartc1_ctrlc.5
Case "1" : Parity_rs232_eram = 1 'odd
Set Usartc1_ctrlc.4
Set Usartc1_ctrlc.5
Case "2" : Data_bits_rs232_eram = 2 'even
Reset Usartc1_ctrlc.4
Set Usartc1_ctrlc.5
End Select
'---кол-во стоп битов
Tempstr1 = Mid(otvet , 4 , 1)
Select Case Tempstr1
Case "0" : Stop_bits_rs232_eram = 0
Reset Usartc1_ctrlc.3
Case "1" : Stop_bits_rs232_eram = 1
Set Usartc1_ctrlc.3
End Select
Arhiv(1) = Baud_rate_rs232_eram
Arhiv(2) = Data_bits_rs232_eram
Arhiv(3) = Parity_rs232_eram
Arhiv(4) = Stop_bits_rs232_eram
J = Crc16uni(arhiv(1) , 4 , &HFFFF , &H8005 , 1 , 1)
Crc_eram = J
Print #5 , "OK"
Goto Pc
End If
'------------Вывод данных в RS-485-----------------------------
If Otvet = "SEND RS-485" Then
'----принимаем данные для посылки в RS-232
Vrem_otw = 400000
Vrem_otv_tel = 60
Call Getline_usb(otvet)
Cls
Msg = "Обмен по RS-232 "
Call R_lcd(msg)
I2 = Len(otvet)
Tempstr1 = Mid(otvet , I2 , 1)
Decr I2
Otvet = Mid(otvet , 1 , I2)
I2 = I2 / 2
'---подготовка массива к передаче
For I = 1 To I2
Tempbyte = I * 2
Tempbyte = Tempbyte - 1
Str2 = Mid(otvet , Tempbyte , 2)
Arhiv(i) = Hexval(str2)
Next I
'---если нужно добавить CRC16
If Tempstr1 = "1" Then
J = Crc16uni(arhiv(1) , I2 , &HFFFF , &H8005 , 1 , 1)
Incr I2
Arhiv(i2) = Low(j)
Otvet = Otvet + Hex(arhiv(i2))
Incr I2
Arhiv(i2) = High(j)
Otvet = Otvet + Hex(arhiv(i2))
End If
'---передаем обратно строку из байтов в HEX через пробел
Buf = ""
For I = 1 To I2
Str2 = Hex(arhiv(i))
Buf = Buf + Str2
Buf = Buf + " "
Next I
Print #5 , Buf
'---передача в RS-232
For I = 1 To I2
Tempbyte = Arhiv(i)
Printbin #2 , Tempbyte;
Next I
'---прием из канала RS-232
Get_w_r = 0
Get_dln_r = 0
Do
Incr Get_w_r
If Get_w_r > 600000 Then
Exit Do
End If
If Usartd0_status.7 = 1 Then
Get_byte_r = Usartd0_data
Incr Get_dln_r
Buf_in_485_r(get_dln_r) = Get_byte_r
If Get_dln_r > 253 Then
Exit Do
End If
End If
Loop
'---преобразование в HEX строку
Buf = ""
Locate 2 , 1
Msg = "отпр." + Str(i2)
Msg = Msg + " прин."
Msg = Msg + Str(get_dln_r)
Call R_lcd(msg)
'---если ничего не пришло
If Get_dln_r = 0 Then
Buf = "N/A"
Print #5 , Buf
Goto No_485
End If
For I = 1 To Get_dln_r
Buf = Buf + Hex(buf_in_485_r(i))
Buf = Buf + " "
Next I
Print #5 , Buf
No_485:
Goto Pc
End If
'------------Конец обмена----------------------------------
If Otvet = "BYE" Then
Goto Poisk
End If
'------------Ошибка обмена----------------------------------
Print "ERR"
Goto Pc
'##########################Поиск телефона#############################
Poisk_tel:
Reset Bez_modema
Print #1 , "AT+IPR=9600 "
Otvet = ""
Golova = 0
Kol_sob = 0
Pred_vhod = 0
Tek_vhod = 0
Pred_pitanie = 0
Obr_datch = 0
Pervii_raz = 1
Sost_datch = "НННННННН"
Sost_adc = "НННННННН"
Sost_vihod = "РРРРРРРР"
Dlina_parola = 0
Wait 1
Print #1 , "ATE0"
Wait 2
Cls
Cursor Off
Msg = " RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Поиск модема"
Call R_lcd(msg)
Wait 2
J = 0
Nachprog: 'начало программы
Print #1 , "ATI"
Vrem_otw = 100000 'определяет время опроса
Tempbyte = 0
Do
Vrem_otv_tel = 40
Otvet = ""
Call Getline_rs232(otvet)
'---нашелся модем
If Mid(otvet , 1 , 2) = "OK" Then
Kontr_tel = 1
Otvet = ""
Reset Bez_modema
Cls
Cursor Off
Msg = " Обнаружен "
Call R_lcd(msg)
Locate 2 , 1
Msg = " Модем "
Call R_lcd(msg)
Wait 1
Goto Telefon
End If
Incr Tempbyte
If Tempbyte > 7 Then
Incr J
'-включаем автономный режим
If J > 3 Then
Incr J2
If J2 > 2 Then
Kontr_tel = 0
Set Bez_modema
Cls
Cursor Off
Msg = " Модем "
Call R_lcd(msg)
Locate 2 , 1
Msg = " Не обнаружен "
Call R_lcd(msg)
Wait 2
Cls
Cursor Off
Msg = " Автономный "
Call R_lcd(msg)
Locate 2 , 1
Msg = " Режим "
Call R_lcd(msg)
Wait 2
Goto Telefon
End If
J = 0
'---перезагружаем модем вдруг он завис
Cls
Cursor Off
Msg = " Перезагрузка "
Call R_lcd(msg)
Locate 2 , 1
Msg = " Модема "
Call R_lcd(msg)
Set Rele_modema 'выключаем реле питания модема
Wait 2
Reset Rele_modema 'включаем реле питания модема
Wait 10
Goto Poisk_tel
End If
Goto Nachprog
End If
Loop
'##########################РЕЖИМ РАБОТЫ С МОДЕМОМ###############################
Telefon:
Cls
Cursor Off
Msg = " Проверка "
Call R_lcd(msg)
Locate 2 , 1
Msg = "Алгоритма работы"
Call R_lcd(msg)
'---проверка епром
Tempbyte1 = 0
For I = 0 To Razmeepr
Call Read_eeprom(i , Tempbyte)
If I <> Razmeepr Then
Tempbyte1 = Tempbyte1 + Tempbyte
End If
Next I
Vrem_otw = 300000
If Tempbyte1 <> Tempbyte Then
Tempbyte1 = 0
For I = 0 To Razmeepr
Call Read_eeprom(i , Tempbyte)
If I <> Razmeepr Then
Tempbyte1 = Tempbyte1 + Tempbyte
End If
Next I
Obr_datch = 0
If Tempbyte1 <> Tempbyte Then
Do
Cls
Set Zummer
Set Diod_3
Waitms 100
Reset Diod_3
Waitms 100
Set Diod_3
Waitms 100
Reset Diod_3
Waitms 100
Set Diod_3
Waitms 100
Reset Diod_3
Waitms 100
Reset Zummer
Msg = " Алгоритм работы"
Call R_lcd(msg)
Locate 2 , 1
Msg = " Отсутствует "
Call R_lcd(msg)
Wait 4
Cls
Waitms 200
Msg = " Задайте "
Call R_lcd(msg)
Locate 2 , 1
Msg = " Алгоритм работы"
Call R_lcd(msg)
Wait 1
'---перезагрузка
Incr Obr_datch
If Obr_datch > 20 Then
Obr_datch = 0
Start Watchdog
Enable Interrupts 'все прерывания
End If
Loop
End If
End If
Cls
Waitms 200
Msg = " Алгоритм работы"
Call R_lcd(msg)
Locate 2 , 1
Msg = " ОК"
Call R_lcd(msg)
Reset Diod_tm
'--------------------------Считывание настроек алгоритма
'----сколько раз отсылать смс
Call Read_eeprom(3660 , Kol_nepr_sms)
If Kol_nepr_sms = 0 Then
Epr_nepr_sms = 5
Else
Epr_nepr_sms = Kol_nepr_sms
End If
'---первый телефон - диспетчерский центр
For I = 1 To 9
Sender = ""
Adr_telef = 3833
For I2 = 0 To 15
Call Read_eeprom(adr_telef , Tempbyte)
If Tempbyte = 0 Then 'если нет телефона
Exit For
End If
Sender = Sender + Chr(tempbyte)
Incr Adr_telef
Next I2
Next
If Len(sender) = 0 Then
Disp_epr = ""
Else
Disp_epr = Sender
End If
'---мастер ключ
Tim_epradres = 3642
For Tim_i = 1 To 8 'считывание ID мастер ключа
Str2 = ""
For Tim_i1 = 1 To 2
Call Read_eeprom(tim_epradres , Tim_byte)
Str2 = Str2 + Chr(tim_byte)
Incr Tim_epradres
Next Tim_i1
Tempbyte = Hexval(str2)
Epr_master_kl(tim_i) = Tempbyte
Next Tim_i
'---сколько статусов отправлять
Call Read_eeprom(3663 , Kol_stat)
'---начальные значения датчиков и ацп
For Obr_datch = 1 To 8
Mlan_str(obr_datch) = "0"
Zn_dat_mlan(i) = "0"
Adc_str(obr_datch) = "0.0"
Zn_dat_adc_string(obr_datch) = "0.0"
Next Obr_datch
'---пороги для датчиков микролана
For Obr_datch = 0 To 7
Tempbyte1 = Obr_datch + 1
Str_min_por_eram(tempbyte1) = ""
Str_max_por_eram(tempbyte1) = ""
Str_max_por = ""
Str_min_por = ""
Epradres = Obr_datch * 8
Epradres = Epradres + 3332
For I = 0 To 3 'считывание максимального порога
Call Read_eeprom(epradres , Tempbyte)
Str_max_por = Str_max_por + Chr(tempbyte)
Incr Epradres
Next I
For I = 0 To 3 'считывание минимального порога
Call Read_eeprom(epradres , Tempbyte)
Str_min_por = Str_min_por + Chr(tempbyte)
Incr Epradres
Next I
Tempbyte1 = Obr_datch + 1
Str_max_por_eram(tempbyte1) = Str_max_por
Str_min_por_eram(tempbyte1) = Str_min_por
Next Obr_datch
'---для АЦП
For Obr_datch = 0 To 7
Tempbyte1 = Obr_datch + 1
Epradres = Obr_datch * 8
Epradres = Epradres + 3396
'считывание максимального порога
For I = 0 To 3
Call Read_eeprom(epradres , Tempbyte)
For Tim_i = 0 To 7
Tim_i1 = I * 8
Tim_i1 = Tim_i1 + Tim_i
Max_por_dat(tempbyte1).tim_i1 = Tempbyte.tim_i
Next Tim_i
Incr Epradres
Next I
'считывание минимального порога
For I = 0 To 3
Call Read_eeprom(epradres , Tempbyte)
For Tim_i = 0 To 7
Tim_i1 = I * 8
Tim_i1 = Tim_i1 + Tim_i
Min_por_dat(tempbyte1).tim_i1 = Tempbyte.tim_i
Next Tim_i
Incr Epradres
Next I
Next Obr_datch
For I = 1 To 8
Flag(i) = 0
Next I
'----настройки АЦП
J2 = 3866
For I = 1 To 10
'диапазон сигнала и его мин. значение
Call Read_eeprom(j2 , Min_adc(i))
Incr J2
Call Read_eeprom(j2 , Tempbyte)
Incr J2
Diap_adc(i) = Tempbyte - Min_adc(i)
'диапазон датчика и его мин. значение
Call Read_eeprom(j2 , Tempbyte)
Incr J2
Call Read_eeprom(j2 , Tempbyte1)
Incr J2
Min_dat(i) = Makeint(tempbyte1 , Tempbyte)
Call Read_eeprom(j2 , Tempbyte)
Incr J2
Call Read_eeprom(j2 , Tempbyte1)
Vrem_otv_tel = Makeint(tempbyte1 , Tempbyte)
Diap_dat(i) = Vrem_otv_tel - Min_dat(i)
'коэффициент (чему равен 1мА/В)
Koef_adc(i) = Diap_dat(i) / Diap_adc(i)
'---сохраняем во внутренний епром
Min_adc_eram(i) = Min_adc(i)
Diap_adc_eram(i) = Diap_adc(i)
Diap_dat_eram(i) = Diap_dat(i)
Koef_adc_eram(i) = Koef_adc(i)
J2 = J2 + 11
Next I
'----Еденицы измерения датчика АЦП
J2 = 3871
For I = 1 To 10
Ed_izm_dat(i) = ""
For J = 1 To 10
Incr J2
Call Read_eeprom(j2 , Tempbyte)
If Tempbyte > 0 Then
Ed_izm_dat(i) = Ed_izm_dat(i) + Chr(tempbyte)
End If
Next J
J2 = J2 + 6
Next I
'----время накопления сигнала для сработки контактного входа
For I = 1 To 8
Tim_epradres = I + 4025
Call Read_eeprom(tim_epradres , Tempbyte )
J = Tempbyte * 2
Vrem_nakopl(i) = J
Tek_vrem_nakopl(i) = 0
Next I
'----задержки реакции на контактных входах
For I = 1 To 8
Tim_epradres = I + 3663
Call Read_eeprom(tim_epradres , Tempbyte )
J = Tempbyte * 2
Vrem_zad(i) = J
Next I
'----задержки после реакции на контактных входах
For I = 1 To 8
Tim_epradres = I + 3680
Call Read_eeprom(tim_epradres , Tempbyte)
J = Tempbyte * 2
Vrem_zad_posle(i) = J
Next I
'----задержки реакции на аналоговых входах
For I = 1 To 8
Tim_epradres = I + 3671
Call Read_eeprom(tim_epradres , Tempbyte)
J = Tempbyte * 2
Vrem_zad_adc(i) = J
Next I
'----задержки после реакции на аналоговых входах
For I = 1 To 8
Tim_epradres = I + 3688
Call Read_eeprom(tim_epradres , Tempbyte)
J = Tempbyte * 2
Vrem_zad_adc_posle(i) = J
Next I
'--считываем время задержки на постановку на охрану
Call Read_eeprom(3680 , Tempbyte)
Vrem_zad_tm = Tempbyte * 2
'---ID объекта
Id_obekta = ""
For Epradres = 3697 To 3704
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte <> 0 Then
Id_obekta = Id_obekta + Chr(tempbyte)
Else
Exit For
End If
Next Epradres
'--------------------------------
'считывание пароля доступа к контроллеру
Parol = ""
Epradres = 3490
For I = 0 To 7
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
Parol = Parol + Chr(tempbyte)
Incr Dlina_parola
Incr Epradres
Next I
Epr_parol = Parol
'--------------------------------
'записываем смс центр
Smsc = ""
For I = 0 To 15
Epradres = 3849 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
Smsc = Smsc + Chr(tempbyte)
Next I
Epr_smsc = Smsc
'--------------------------------
'охрана
Call Read_eeprom(3661 , Est_ohrana)
'--------------------------------
'---маска снятия с охраны контактных входов
Call Read_eeprom(3658 , Maska_vhod)
Epr_maska_vhod = Maska_vhod
'--------------------------------
'---маска снятия с охраны аналоговых входов
Call Read_eeprom(3659 , Maska_vhod_adc)
Epr_maska_vhod_adc = Maska_vhod_adc
'--------------------------------
'---разрешение соединения по каналу CSD
Call Read_eeprom(3865 , Razr_csd)
'--------------------------------
'---период создания архивов и (ДА/НЕТ)
Call Read_eeprom(3641 , Tempbyte)
If Tempbyte > 0 Then
Period_stat = Tempbyte * 120
'---учитываем задержку на пол секунды
Period_stat = Period_stat - 1
End If
'--------------------------------
'---голова архива и количество имеющихся в памяти архивов
Call Read_eeprom(9997 , Arhiv(1))
Call Read_eeprom(9998 , Arhiv(2))
Call Read_eeprom(9999 , Arhiv(3))
Call Read_eeprom(10000 , Arhiv(4))
J = Crc16uni(arhiv(1) , 2 , &HFFFF , &H8005 , 1 , 1)
J2 = Makeint(arhiv(4) , Arhiv(3))
If J <> J2 Then
Golova_arhiv = 1
Kol_arhiv = 0
Else
Golova_arhiv = Arhiv(1)
Kol_arhiv = Arhiv(2)
End If
If Golova_arhiv > 60 Or Golova_arhiv = 0 Then
Golova_arhiv = 1
Kol_arhiv = 0
End If
If Kol_arhiv > 60 Then
Golova_arhiv = 1
Kol_arhiv = 0
End If
'##############################настройки GPRS
'------------------------------
'пользователь
User = ""
For I = 0 To 15
Epradres = 4300 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
User = User + Chr(tempbyte)
Next I
'------------------------------
'пароль
Password = ""
For I = 0 To 15
Epradres = 4316 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
Password = Password + Chr(tempbyte)
Next I
'------------------------------
'точка доступа
Apn = ""
For I = 0 To 31
Epradres = 4332 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
Apn = Apn + Chr(tempbyte)
Next I
'------------------------------
'Ip адрес 1
Ip_adr1 = ""
For I = 0 To 14
Epradres = 4414 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
If Tempbyte <> 32 Then
Ip_adr1 = Ip_adr1 + Chr(tempbyte)
End If
Next I
'------------------------------
'Ip адрес 2
Ip_adr2 = ""
For I = 0 To 14
Epradres = 4429 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
If Tempbyte <> 32 Then
Ip_adr2 = Ip_adr2 + Chr(tempbyte)
End If
Next I
'------------------------------
'Порт1
Ip_port1 = ""
For I = 0 To 4
Epradres = 4494 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
Ip_port1 = Ip_port1 + Chr(tempbyte)
Next I
'------------------------------
'Порт2
Ip_port2 = ""
For I = 0 To 4
Epradres = 4499 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
Ip_port2 = Ip_port2 + Chr(tempbyte)
Next I
'------------------------------
'минимальный уровень сигнала
Call Read_eeprom(4556 , Tempbyte)
Call Read_eeprom(4557 , Tempbyte1)
Min_signal = Makeint(tempbyte1 , Tempbyte)
'------------------------------
'Ping_ip адрес 1
Ping_ip_adr1 = ""
For I = 0 To 14
Epradres = 4558 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
If Tempbyte <> 32 Then
Ping_ip_adr1 = Ping_ip_adr1 + Chr(tempbyte)
End If
Next I
'------------------------------
'Ping_ip адрес 2
Ping_ip_adr2 = ""
For I = 0 To 14
Epradres = 4573 + I
Call Read_eeprom(epradres , Tempbyte)
If Tempbyte = 0 Then
Exit For
End If
If Tempbyte <> 32 Then
Ping_ip_adr2 = Ping_ip_adr2 + Chr(tempbyte)
End If
Next I
'------------------------------
'Таймаут
Call Read_eeprom(4588 , Timeout)
'------------------------------
'Длительность GPRS сессии
Call Read_eeprom(4589 , Tempbyte)
Call Read_eeprom(4590 , Tempbyte1)
Session_gprs = Makeint(tempbyte1 , Tempbyte)
'------------------------------
'Конфигурация алгоритма GPRS
Call Read_eeprom(4591 , Konf_gprs)
'--------------------------------
Cls
Msg = " RECON-SX"
Call R_lcd(msg)
Wait 1
Locate 2 , 1
Msg = " Штатный режим "
Call R_lcd(msg)
'--------------------------------
Kol_prer_tim3 = 1
Kol_nepr_sms = 0
Print "AT&D2"
Wait 1
Print "AT+CLIP=0"
Wait 1
Print "ATE0"
Wait 1
Print "AT+CPMS=" ; Chr(34) ; "ME" ; Chr(34)
Wait 1
End
'#################ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ НА t ДАТЧИКАХ MLan######################
Sub Temper()
nop
End Sub
'#################ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ НА ДАТЧИКАХ ВЛАГИ#######################
Sub Vlaga()
nop
End Sub
'#################ДАТЧИКИ ИМПУЛЬСОВ#############################################
Sub Schit()
nop
End Sub
'##########################ПРОЦЕДУРА ЗАПИСИ ЕЕПРОМА#############################
'writing a byte to EEPROM 24c256
Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)
Hi = High(adres)
Lo = Low(adres)
I2cstart #6 'start condition
I2cwbyte Slave_w , #6 'slave address
I2cwbyte Hi , #6 'high address of EEPROM
I2cwbyte Lo , #6 'low address of EEPROM
I2cwbyte Value , #6 'value to write
I2cstop #6 'stop condition
Waitms 5 'wait for 10 milliseconds
End Sub
'##########################ПРОЦЕДУРА ЧТЕНИЯ ЕЕПРОМА#############################
'reading a byte from EEPROM 24c256
Sub Read_eeprom(byval Adres As Word , Value As Byte)
Hi = High(adres)
Lo = Low(adres)
I2cstart #6 'generate start
I2cwbyte Slave_w , #6 'slave address
I2cwbyte Hi , #6 'high address of EEPROM
I2cwbyte Lo , #6 'low address of EEPROM
I2cstop #6 ' Generate start code
I2cstart #6 , #6 'repeated start
I2cwbyte Slave_r , #6 'slave address (read)
I2crbyte Value , Nack , #6 'read byte
I2cstop #6 'generate stop
End Sub
'#####################################ввод строки в порт RS-232#################
Sub Getline_rs232(s As String)
Get_byte = Inkey(#1)
Get_byte = Inkey(#1)
S = ""
Get_w = 0
Get_dln = 1
Do
Incr Get_w
If Get_w > Vrem_otw Then
Exit Do
End If
Get_byte = Ischarwaiting(#1)
If Get_byte <> 0 Then
Get_byte = Inkey(#1)
Select Case Get_byte
Case 13 : '<0D>
Case 10 : Exit Do '<0A>
Case Else:
Incr Get_dln
S = S + Chr(get_byte) ' build string
If Get_dln > Vrem_otv_tel Then
Exit Do
End If
End Select
End If
Loop
End Sub
'#####################################ввод строки в USB порт####################
Sub Getline_usb(s As String)
Get_byte = Inkey(#5)
Get_byte = Inkey(#5)
S = ""
Get_w = 0
Get_dln = 1
Do
Incr Get_w
If Get_w > Vrem_otw Then
Exit Do
End If
Get_byte = Ischarwaiting(#5)
If Get_byte <> 0 Then
Get_byte = Inkey(#5)
Select Case Get_byte
Case 13 : '<0D>
Case 10 : Exit Do '<0A>
Case Else:
Incr Get_dln
S = S + Chr(get_byte) ' build string
If Get_dln > Vrem_otv_tel Then
Exit Do
End If
End Select
End If
Loop
End Sub
'##############################замена стандартных часов№########################
Sub Getdatetime()
I2cstart #6 ' Generate start code
I2cwbyte Ds1307w , #6 ' send address
I2cwbyte 0 , #6 ' start address in 1307
I2cstop #6 ' Generate start code
I2cstart #6 ' Generate start code
I2cwbyte Ds1307r , #6 ' send address
I2crbyte T_sec , Ack , #6
I2crbyte T_min , Ack , #6 ' MINUTES
I2crbyte T_hour , Ack , #6 ' Hours
I2crbyte T_weekday , Ack , #6 ' Day of Week
I2crbyte T_day , Ack , #6 ' Day of Month
I2crbyte T_month , Ack , #6 ' Month of Year
I2crbyte T_year , Nack , #6
I2cstop #6
T_sec = Makedec(t_sec) : T_min = Makedec(t_min) : T_hour = Makedec(t_hour)
T_day = Makedec(t_day) : T_month = Makedec(t_month) : T_year = Makedec(t_year)
'---дата
Dat = ""
If T_day < 10 Then
Dat = "0"
End If
Dat = Dat + Str(t_day)
Dat = Dat + "-"
If T_month < 10 Then
Dat = Dat + "0"
End If
Dat = Dat + Str(t_month)
Dat = Dat + "-"
If T_year < 10 Then
Dat = Dat + "0"
End If
Dat = Dat + Str(t_year)
'---время
Chas = ""
If T_hour < 10 Then
Chas = "0"
End If
Chas = Chas + Str(t_hour)
Chas = Chas + ":"
If T_min < 10 Then
Chas = Chas + "0"
End If
Chas = Chas + Str(t_min)
Chas = Chas + ":"
If T_sec < 10 Then
Chas = Chas + "0"
End If
Chas = Chas + Str(t_sec)
End Sub
Sub Setdate()
T_day = Makebcd(t_day) : T_month = Makebcd(t_month) : T_year = Makebcd(t_year)
I2cstart #6 ' Generate start code
I2cwbyte Ds1307w , #6 ' send address
I2cwbyte 4 , #6 ' starting address in 1307
I2cwbyte T_day , #6 ' Send Data to SECONDS
I2cwbyte T_month , #6 ' MINUTES
I2cwbyte T_year , #6 ' Hours
I2cwbyte &H10 , #6 ' Байт конфигурации
I2cstop #6
End Sub
Sub Settime()
T_sec = Makebcd(t_sec) : T_min = Makebcd(t_min) : T_hour = Makebcd(t_hour)
I2cstart #6 ' Generate start code
I2cwbyte Ds1307w , #6 ' send address
I2cwbyte 0 , #6 ' starting address in 1307
I2cwbyte T_sec , #6 ' Send Data to SECONDS
I2cwbyte T_min , #6 ' MINUTES
I2cwbyte T_hour , #6 ' Hours
I2cstop #6
End Sub
'========= Русский текст на LCD ==============================================
Sub R_lcd(msg As String)
For Cntr = 1 To Len(msg)
Rus = Mid(msg , Cntr , 1)
I_lcd = Asc(rus)
If I_lcd > 191 Then
I_lcd = I_lcd - 192
I_lcd = Lookup(i_lcd , Tbl_lcd)
Rus = Chr(i_lcd)
End If
Lcd Rus
Next Cntr
End Sub
'*******************************************************************************
Koef:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 255
Koef2:
Data 255 , 128 , 64 , 32 , 16 , 8 , 4 , 2 , 1
Tbl_lcd:
Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4
Data &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB
Data &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7
Data &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0
Data &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7