Лекция: Теоретические основы программирования стенда 2
Программирование стенда 2 основано на литературе [1…6] и имеет в основе базовый язык релейно–контактных символов систем управления на основе контроллеров Микродат. Программно–логическая модель стенда 2 представлена на рис.2, стенд представляет собой имитатор управления температурой нагрева нагревателя и имеет следующий состав:
– на месте М00 установлен модуль связи ИРПС КМ5700, который через адаптер (RS232/RS485) связан c ПИД – регулятором температуры ТРМ –101КР, для регистрации с помощью термопары и передачи в контроллер температуры нагрева нагревателя (лампы накаливания). Модуль не маскируется.
– на месте М01установлен 16–ти разрядный модуль вывода–ввода дискретных каналов постоянного напряжения 24 В, в котором младшие 16 разрядов являются выводом постоянного тока 24 В (адреса 000.00 – 000.16), а старшие 16 разрядов являются вводом постоянного тока 24 В (адреса 100.00–100.16). Данный модуль имеет наименование КМ 5800 и маскируется на первом месте контроллера (с процессором КМ 5330) символом y/x , в среде САПР SAP 32 FK. Назначение выходов и входов модуля на месте М01 следующее:
var HL_ON 001.00 //ШИМ УПРАВЛЕНИЕ НАГРУЗКОЙ
var TRM_OFF 001.01 // РАЗРЕШЕНИЕ ШИМ УПРАВЛЕНИЯ
Модуль МО1 по каналам HL_ON и TRM_OFF связан с преобразователем мощности (DC/AC), который нагружен на нагревательный элемент (лампу HL1). Управление строиться на постоянной установке сигнала TRM_OFF и периодическом включении и отключении сигнала HL_ON, который включает и отключает нагрузку (лампу HL1) посредством преобразователя (DC/AC). Схема стенда 2 показана на рис.2. Базовая программа работы стенда 2 (название STEND2.fk) представлена ниже:
Алгоритм программы:
— в соответствии с протоколом связи с регулятором ТРМ101 в ячейке Т (037) формируется в десятых долях градуса температура лампы HL1, на основании замеров термопары ТП1 (50,0 градусов = 500), при задании в ячейке UST (040) уставки (50,0 градусов = 500) программа устанавливает в активное состояние команду TRM_OFF и управляет включением и отключением нагрузки (лампы HL1), посредством включения и отключения команды HL_ON, в зависимости от сравнения измеренной температуры Т(037) с заданной уставкой UST (040).
М00-ИРПС АДАПТЕР НА RS232/RS485 РЕГУЛЯТОР ТРМ
М01-Y/X ПРЕОБР. DC/AC ТП1
HL_ON
HL1
TRM_OFF
Рис. 2. Стенд 2 управления температурой нагревателя
//БАЗОВАЯ ПРОГРАММА СТЕНДА 2 (ФАЙЛ STEND2.fk)
#define maska 0 2 2
#define maska 1 0 0
#define maska 2 0 0
#define maska 3 0 0
#define Address 10033
#define Interrupt 0
#define Block 0
#define Scan 377
#define Period 0
var HL_ON 001.00
var TRM_OFF 001.01
//******************ПЕРЕМЕННЫЕ********************
var ZERO 020
var ZER_ 020.00
var BYTE 021
var BYTE_00 021.00
var CRC 022
var CRC_00 022.00
var MUS 023
var MUS_06 023.06
var MUS_07 023.07
var CH 025
var CH_16 025.16
var STATUS 026 // Копия регистра состояния
var RECEIVER 026.00 // Буфер приемника не пуст
var TRANSM 026.01 // Буфер передатчика не пуст
var TEST 026.02 // Самотестирование закончено
var NOTPARITI 026.05 // Ошибка контроля четности
var OVER 026.06 // Переполнение приемника
var ERRCODE 026.07 // Ошибка формата последовательного кода
var TIM_RECEIV 027 //
var TIK_RECEIV 027.16
var CH1 030
var SIZE 031
var CH2 032
var EXP 033
var MANT 034
var MANT1 035
var MANT2 036
var T 037
var UST 040
var TIM_CHIM 041
var TIK_CHIM 041.16
var DATA0 200 //
var DATA1 201 //
var DATA2 202 //
var DATA3 203 //
var DATA4 204 //
var DATA5 205 //
var DATA6 206 //
var DATA7 207 //
var DATA8 210 //
var DATA9 211 //
var DATA10 212 //
var DATA11 213 //
var DATA12 214 //
var DATA13 215 //
var DATA14 216 //
var DATA15 217 //
//******************КОНСТАНТЫ********************
// слово конфигурации порта: 9600,8,1,n
var CONFIG 300
const 1000000001001110b
// адрес узла в сети (8 бит): 0
var BYTE1 301
const 00h
// расширение адреса узла в сети (3 бит): 000b
// признак удаленного запроса (1 бит): 1b
// размер информационного поля данных (4 бит): 0000b
var BYTE2 302
const 00010010b
// старший байт идентификатора параметра (8 бит): 03h
var BYTE3 303
const 0B8h
// младший байт идентификатора параметра (8 бит): 8Ah
var BYTE4 304
const 0DFh
// константа = 1
var C1 305
const 1
// константа = 0Fh
var C0Fh 306
const 0Fh
// константа = 47h
var C47h 307
const 47h
// константа = 10
var C10 310
const 10d
// константа = 127
var C127 311
const 127d
// константа = 128
var C128 312
const 128d
[НСТ]00
[НБЛ]000
[СБС]ZERO
[СБС]001
[СБС]CH, [ПФФ]CH[УНС]20[ПРС]20[ПРС]CONFIG[ПРК]11d[ПРК]11d
[СБС]CH2
[ЧТР]000 [ЗПС]STATUS
TEST=[ОСТ]1, [ПБЛ]001
[НБЛ]001
// Конфигурируем модуль последовательного ввода/вывода
[ЧТС]CONFIG, [ЗПР]000
// Вычислим контрольную сумму посылки
[СБС]CRC
[ЧТС]BYTE1, [ВПП]000
[ЧТС]BYTE2, [ВПП]000
[ЧТС]BYTE3, [ВПП]000
[ЧТС]BYTE4, [ВПП]000
[ЧТС]ZERO, [ВПП]000
[ЧТС]ZERO, [ВПП]000
// Формируем посылку
[СБС]CH
[КБМ]23h, [ЗПС]MUS, [ВПП]003
[ЧТС]BYTE1, [ВПП]002
[ЧТС]BYTE2, [ВПП]002
[ЧТС]BYTE3, [ВПП]002
[ЧТС]BYTE4, [ВПП]002
[ЧТС]ZERO, [ВПП]002
[ЧТС]ZERO, [ВПП]002
[ЧБС]CRC, [ВПП]002
[ЧБМ]CRC, [ВПП]002
[КБМ]0Dh, [ЗПС]MUS, [ВПП]003
// Передаем сформированную посылку
[СБС]CH
[ПФМ]CH[ПРС]400[ПРС]0004[ПРК]18d[ПРК]18d
[СБС]CH, [СБС]TIM_RECEIV
[ПБЛ]002
[НБЛ]002
// Читаем регистр состояния модуля последовательного ввода/вывода
[ЧТР]000, [ЗПС]STATUS
// Если нет данных в течение 0.3 сек, перейти на блок обработки принятой посылки
[ТВД]TIM_RECEIV[ПРК]2
TIK_RECEIV = [ЧТС]CH,[ЗПС]SIZE
[СБС]CH,[ СБС]CH1, [ПБЛ]003
// Модуль не прошел тест
^TEST = [ПБЛ]002
// Если есть ошибки
NOTPARITI+OVER+ERRCODE = [ПБЛ]001
// Если буфер приема не пуст, вычитывать данные из буфера
RECEIVER = [ЧТР]004, [ЗПС]MUS, [СБС]TIM_RECEIV
[ЗСФ]CH[ПРС]500[ПРС]MUS[ПРК]100d
[НБЛ]003
[ЧСФ]CH[ПРС]500[ПРС]MUS[ПРК]30d
CH_16 = [ПБЛ]001
[РВН]MUS[ПРК]23h = [ПБЛ]003
[РВН]MUS[ПРК]0Dh = [ПБЛ]004
^ZER_= [ЧТС]MUS, [ВАС]C47h, [ЗПС]BYTE
[СЦС]BYTE, [СЦС]BYTE, [СЦС]BYTE, [СЦС]BYTE
[ЧСФ]CH[ПРС]500[ПРС]MUS[ПРК]30d
[ЧТС]MUS, [ВАС]C47h, [ПСС]BYTE, [ПСС]ZERO, [ЗПС]BYTE
[ЗСФ]CH1[ПРС]DATA0[ПРС]BYTE[ПРК]30d
// — - — - — - — - — - — - — - — - — - — - --
[НБЛ]004
[ЧТС]DATA4, [ЗПС]EXP, [СЦС]EXP.[R]EXP.10
DATA5.07 = [ ]EXP.00
^ZER_=[ЧТС]EXP, [ВАС]C127, [ЗПС]EXP
[ЧТС]DATA5, [ЗПС]MANT1, [R]MANT1.07
[ЧТС]DATA6, [ЗПС]MANT2
[СБС]MANT, [S]MANT.00
[ПБЛ]005
// — - — - — - — - — - — - — - — - — - — - — -
[НБЛ]005
[РВН]EXP[ПРК]0 = [ЧТС]MANT1, [УМН]C10[ПРС]MUS,
[ДЕЛ]C128[ПРС]MUS,
[ЗПС]MANT1, ЧТС]MANT, [УМН]C10[ПРС]MUS, [САС]MANT1, [ЗПС]T
[ПБЛ]001
^ZER_= [СЦС]MANT
MANT1.06= [ ]MANT.00
^ZER_= [СЦС]MANT1, [R]MANT1.07
MANT2.07 = [ ]MANT1.00
^ZER_= [СЦС]MANT2
[ЧТС]EXP, [ВАС]C1, [ЗПС]EXP
// Подпрограмма вычисления контрольной суммы приборов ОВЕН ТРМ138, ТРМ101, СИ8...
// Вызов: 1. Сброс CRC
// 2. записываем в аккумулятор очередной байт посылаемого кадра
// 3. вызываем подпрограмму
// 4. переход к п.2 пока не закончатся байты кадра
// 5. текущая контрольная сумма в слове CRC
// Вычисление производится следующим образом:
// 1. исключающее ИЛИ (Старший байт CRC и очередной байт посылки)
// 2. сдвиг CRC не циклический к старшим разрядам
// 3. если бит 7 = 1 полученного результата в п.1, то CRC = исключающее ИЛИ (CRC и 8F57h)
// 4. сдвиг текущего байта кадра не циклический к старшим разрядам
// 5. перейти к п.1 если количество сдвигов байта меньше 8, иначе завершить обработку текущего байта кадра.
[НПП]000
// Принимаем очередной байт
[ЗПС]BYTE
// Выполняем подсчет hash свертки
[ВПП]001, [ВПП]001, [ВПП]001, [ВПП]001, [ВПП]001, [ВПП]001, [ВПП]001,
[ВПП]001
[НПП]001
// получаем старший байт CRC, кладем в MUS
[ЧТС]CRC,[КБМ]0, [ЗПС]MUS, [ПББ]MUS
// MUS = исключающее ИЛИ (MUS и BYTE)
[ЧТС]MUS, [ПСС]BYTE, [ПСС]ZERO ,[ЗПС]MUS
// сдвиг CRC не циклический к старшим разрядам
[СЦС]CRC, [R]CRC_00
// если бит 7 = 1 CRCH, то CRC = исключающее ИЛИ (CRC и 8F57h)
MUS_07 = [КБС]8Fh, [КБМ]57h, [ПСС]CRC, [ПСС]ZERO, [ЗПС]CRC
// сдвиг текущего байта кадра не циклический к старшим разрядам
^ZER_= [СЦС]BYTE, [R]BYTE_00
// Подпрограмма формирования посылки из кадра для приборов ОВЕН ТРМ138, ТРМ101, СИ8...
[НПП]002
// Принимаем очередной байт
[ЗПС]BYTE
// Выделяем старшую тетраду и преобразовываем в ASCII
[ЗПС]MUS, [СЦМ]MUS, [СЦМ]MUS, [СЦМ]MUS, [СЦМ]MUS, [ЧТС]MUS,
[ПУС]C0Fh,
[САС]C47h, [ЗПС]MUS
// Записать байт посылки в файл
[ВПП]003
// Выделяем младшую тетраду и преобразовываем в ASCII
[ЧТС]BYTE, [ПУС]C0Fh, [САС]C47h, [ЗПС]MUS
// Записать байт посылки в файл
[ВПП]003
[НПП]003
// Запись байта посылки в файл
[ЗСФ]CH[ПРС]400[ПРС]MUS[ПРК]30d
// — - — - — - — - — - — - — - — - — - — - — -
[НСТ]01
[НБЛ]10
[S]TRM_OFF
[МНШ]T[ПРС]UST=[ ]HL_ON
[НОП]
[НОП]
[НОП]
[НОП]
[НОП]
[НОП]
[НОП]
[НОП]
[КОН]00