Описание Bios 1

advertisement
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
1. Назначение.
Для программиста на С, оперирующего высокоуровневыми понятиями о системе,
который создает концепцию на уровне датчиков и приводов, в принципе не важно, на
основе каких механизмов контроллер взаимодействует с внешней средой. Важно, что бы
входное воздействие, прошедшее необходимую фильтрацию и в удобном для дальнейшей
обработки виде, было доступно для управляющей программы, а для того, что бы вывести
результат работы, достаточно было бы воспользоваться процедурой вывода, учитывающей
все нюансы схемы контроллера. Именно для того, что бы скрыть от программиста
внутреннее устройство контроллера, созданы библиотеки ввода-вывода. Они
обеспечивают:
- простую настройку контроллера
- ввод и вывод информации
- первичную обработку входных сигналов
- высокоуровневый доступ ко всем модулям контроллера
2. Состав.
Библиотеки ввода вывода обеспечивают доступ к следующим модулям контроллера
- АЦП.
- входные разовые команды
- выходные разовые команды
- клавиатура
- модуль ЖКИ
- последовательные интерфейсы RS485
3. Устройство и работа.
При разработке библиотечных функций использовался метод объектноориентированного программирования. Т.о. для работы с контроллером необходимо создать
объекты необходимых классов и при работе пользоваться их методами.
3.1.
Класс ClassBiosSMH.
Объект этого класса закрывает от разработчика нюансы ввода-вывода разовых
команд, сканирования клавиатуры, работы с ЖКИ. При создании объекта производится
начальная инициализация портов ввода-вывода микроконтроллера ATmega128. Описание
класса, его методы и необходимые константы хранятся в файле SMH2010.hpp.
3.1.1. Укрупненное описание алгоритмов работы с объектами класса.
С помощью методов этого класса осуществляется:
вывод выходных разовых команд
Состояние выходных разовых отражает содержимое члена класса DOutputs. Для
обновления состояний выходов необходимо изменить указанную переменную и вызвать
метод AtomWriteORK().
-
Серия SMODE
1
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
ввод с защитой от дребезга входных разовых команд
Методами данного класса осуществляется обновление информации о состоянии
входов, защита от дребезга осуществляется методом мажеритирования. Для этого
необходимо циклически вызывать метод AtomReadIRK(), а для получения текущего
значения надо воспользоваться методом GetDInputs(). Соответственно, длительность
подавляемого дребезга входа зависит от частоты вызова метода AtomReadIRK().
-
сканирование клавиатуры с защитой от дребезга
Работа с клавиатурой выполняется аналогично работе с входными разовыми
командами. Циклически вызывается AtomReadKBD(), для получения результата
сканирования вызывается GetKbd(). Результатом GetKbd() является 4-х байтный
результат сканирования клавиатуры.
-
вывод на ЖКИ
Методами DisplayCtrlWrite() и DisplayDataWrite() соответственно
производится конфигурация контроллера ЖКИ и передача ему информации.
-
3.1.2. Описание членов класса.
Тип переменной
volatile unsigned int
volatile unsigned long
volatile unsigned char
volatile char
volatile char
volatile int
unsigned char
Таблица 1. Члены класса ClassBiosSMH.
Название
Описание
Закрытые члены класса
input_rk[3]
Массив выборок входных разовых
команд
scan_kbd[3]
Массив выборок клавиатуры
test_rk
Выборка выходных разовых команд
через внешний регистр
cntr_irk
Счетчик выборок входных разовых
команд
cntr_kbd
Счетчик выборок клавиатуры
Открытые члены класса
M_lSystemTicks
Клоки системного таймера
DOutputs
Текущее состояние выходных
разовых команд
3.1.3. Описание методов класса.
ClassBiosSMH()
Конструктор класса ClassBiosSMH инициализирует порты ATmega128
Init
void Init(void)
Метод Init() выполняет следующие функции:
- настройка таймеров
- установка выходных разовых команд
- инициализация дисплея
- разрешение всех прерываний
Серия SMODE
2
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
AtomReadORK
inline void AtomReadORK(void)
Метод AtomReadORK() предназначен для ввода состояния выходных разовых команд
через внешний регистр. После вызова метода состояние test_rk соответствует
состоянию затворов выходных силовых MOSFET–транзисторов, т.о. реализуется функция
самоконтроля. Для правильной работы с регистром на время вызова метода запрещаются
все прерывания.
AtomWriteORK
inline void AtomWriteORK(void)
Метод AtomWriteORK() предназначен для выдачи содержимого переменной DOutputs
в качестве выходных разовых команд через внешний регистр. Для правильной работы с
регистром на время вызова метода запрещаются все прерывания.
AtomReadIRK
inline void AtomReadIRK(void)
Обновление состояния входных разовых команд производится по средством метода
AtomReadIRK(). Для этого состояния разрядов внешних регистров заносятся в массив
input_rk, в ячейку определяемую значением cntr_irk. При чем, значимыми из 2-х
байт элемента массива являются всего первые 12 бит (по числу входных разовых команд),
т.е. результат получается сдвинутым вправо. Для правильной работы с внешними
регистрами на время вызова метода запрещаются все прерывания.
AtomReadKBD
inline void AtomReadKBD(void)
Метод AtomReadKBD() используется для сканирования клавиатуры. Результаты
сканирования, представленные в 4-х байтах, в инверсном коде, помещаются с массив
scan_kbd по индексу cntr_kbd. На время работы с внешними регистрами запрещаются
все прерывания.
DisplayCtrlWrite
inline void DisplayCtrlWrite(unsigned char byte)
Метод DisplayCtrlWrite() используется для выдачи содержимого переменной byte
в качестве управляющей команды контроллеру ЖКИ. Для правильной работы с регистром
на время вызова метода запрещаются все прерывания.
DisplayDataWrite
inline void DisplayDataWrite(unsigned char byte)
Метод DisplayDataWrite() используется для выдачи содержимого переменной byte
в качестве управляющей данных контроллеру ЖКИ. Для правильной работы с регистром
на время вызова метода запрещаются все прерывания.
SetTxEnable
inline void SetTxEnable(char number)
Метод SetTxEnable() используется для включения на передачу конвертора в RS485.
Значение переменной number задает номер модуля USART, для которого используется
данный метод.
Серия SMODE
3
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
ResetTxEnable
inline void ResetTxEnable(char number)
Метод ResetTxEnable() используется для запрещения передачи конвертора в RS485.
Значение переменной number задает номер модуля USART, для которого используется
данный метод.
GetKbd
inline unsigned long GetKbd(void)
Метод GetKbd() реализует защиту от дребезга кнопок клавиатуры методом
мажеритирования. Возвращает отфильтрованный результат сканирования клавиатуры.
GetDInputs
inline unsigned int GetDInputs(void)
Метод GetDInputs() реализует защиту от дребезга входов методом мажеритирования.
Возвращает состояние входных разовых команд, прошедшее фильтрацию.
GetDOutputs
inline unsigned char GetDOutputs(void)
Метод GetDOutputs() возвращает состояние выходных разовых команд.
StartSysTimer
inline void StartSysTimer(void)
Метод StartSysTimer() запускает системный таймер.
StopSysTimer
inline void StopSysTimer(void)
Метод StartSysTimer() останавливает системный таймер.
SetRealTime
inline void SetRealTime(char hours,char minutes,
char seconds)
Метод SetRealTime() используется для установки часов реального времени.
GetRealTime
inline void GetRealTime(char *hours,char *minutes,
char *seconds)
Для того, что бы узнать состояние часов реального времени необходимо обратиться к
методу GetRealTime(). При чем в качестве параметров передаются указатели на
переменные, в которые метод запишет соответствующие значения.
ClearRealTime
inline void ClearRealTime(void)
Метод сбрасывает часы реального времени.
IncrRealTime
inline void IncrRealTime(void)
Метод инкрементирует таймер часов реального времени
Серия SMODE
4
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
GetSystemTicks
inline int GetSystemTicks(void)
Метод возвращает значение системных клоков.
EnableXRAM
inline void EnableXRAM(void)
Метод разрешает доступ к внешнему ОЗУ.
DisableXRAM
inline void DisableXRAM(void)
Метод запрещает доступ к внешнему ОЗУ.
ConvertOuts
inline void ConvertOuts(unsigned char *outs)
Метод устанавливает соответствие между выходными разовыми командами, которые
находятся по указателю outs, и реальным расположением выходов на плате контроллера
SMH 2010. Использование данного метода объясняется следующим обстоятельством, для
облегчения своей работы конструктор при разводке платы поменял местами выходы друг с
другом, поэтому, например, нулевой разряд переменной DOutputs не соответствует
первому выходу контроллера SMH. Для того чтобы реализовать это соответствие и
необходим данный метод. Метод непосредственно изменяет переменную DOutputs.
ConvertIns
inline unsigned int ConvertIns(void)
Метод возвращает значение входных разовых команд, в котором учтено реальное
расположение входов на плате контроллера SMH 2010.
3.1.4. Примеры использования.
Объявление
ClassBiosSMH
*Bios,mbios;
Инициализация
Bios
= &mbios;
Bios->Init();
Вызов методов
Bios->AtomWriteORK();
Bios->AtomReadIRK();
Bios->AtomReadKBD();
Инициализация ЖКИ
Bios->DisplayCtrlWrite((unsigned char)0x38);
_delay_mks(40);
Bios->DisplayCtrlWrite((unsigned char)0x0C);
_delay_mks(40);
Bios->DisplayCtrlWrite((unsigned char)0x01);
_delay_mks(1640);
Серия SMODE
5
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
3.2.
Класс ClassADCChanels.
Объект этого класса закрывает от разработчика нюансы работы с модулем АЦП
микроконтроллера ATmega128. При работе с этим модулем используются 6 каналов (с
нулевого по пятый). Методы класса позволяют настроить тип канала, изменить его
коэффициент усиления, установить опорное напряжение. Описание класса, его методы и
необходимые константы хранятся в файле adc.hpp.
3.2.1. Укрупненное описание алгоритмов работы с объектами класса.
С помощью методов этого класса осуществляется настройка модуля АЦП,
фильтрация результата. Класс ClassADCChanels отвечает за информацию, относящуюся
к конкретному каналу АЦП. Причем номер канала говорит о типе канала и о коэффициенте
усиления (см. описание микроконтроллера ATmega128). Так, например, запись
ClassADCChanels
madcChanel(13);
создает объект дифференциального канала с коэффициентом усиления 10, в котором 3
канал АЦП ATmega128 является положительным, а 2 канал АЦП ATmega128
отрицательным входами. Для доступа к результату АЦП используется метод
GetVolue(). Отдельно нужно сказать о члене класса Mux, в нем хранятся основные
настройки канала: тип канала, коэффициент усиления, опорное напряжение, способ
хранения результата (сдвинут влево или вправо).
3.2.2. Описание членов класса.
Тип переменной
volatile
volatile
volatile
volatile
volatile
char
char
bool
char
char
volatile unsigned char
ClassADCChanels
Таблица 2. Члены класса ClassADCChanels.
Название
Описание
Закрытые члены класса
Number
Номер канала
Order
Размер буфера
filter_on
Флаг включения фильтрации
sample_cntr
Текущий номер выборки
*buffer
Указатель на буфер
Открытые члены класса
Mux
Настройки канала
*Next
3.2.3. Описание методов класса.
ClassADCChanels
ClassADCChanels(unsigned char num)
Конструктор класса производит инициализацию канала num.
Init
void Init(void)
Выделяет память под буфер и обнуляет ее.
Серия SMODE
6
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
GetNumber
inline unsigned char GetNumber(void)
Метод возвращает номер канала.
GetMux
inline unsigned char GetMux(void)
Метод возвращает основные настройки канала.
WriteBuffer
inline void WriteBuffer(unsigned int data)
Метод WriteBuffer() записывает значение из data в буфер канала в ячейку с номером
sample_cntr.
FilterOn
inline void FilterOn(void)
Метод FilterOn() разрешает фильтрацию методом плавающего среднего.
FilterOff
inline void FilterOff(void)
Метод FilterOff() запрещает фильтрацию методом плавающего среднего.
SetReference
void SetReference(unsigned char ref)
Метод SetReference() используется для задания опорного напряжения. Если параметр
ref равен величине, обозначаемой как REFADC_AVCC, то в качестве опорного напряжения
будет использоваться напряжение аналогового питания, равного 5В, если же задать
REFADC_256V будет выбран внутренний источник опорного напряжения, который дает
напряжение 2.56В.
GetVolue
unsigned int GetVolue(void)
Метод GetVolue() возвращает результат АЦП, причем если фильтрация была разрешена,
то результат будет отфильтрован методом плавающего среднего.
3.2.4. Примеры использования.
Объявление
ClassADCChanels madcChanel0(0),madcChanel1(1),madcChanel2(2);
Вызов метода
unsigned int value = madcChanel0.GetVolue();
3.3.
Класс ClassADC.
Объект класса ClassADC занимается опросом созданных каналов. Для того, что бы
поставить канал на опрос используется метод AddChanel(). Описание класса, его
методы и необходимые константы хранятся в файле adc.hpp.
Серия SMODE
7
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
3.3.1. Описание членов класса.
Тип переменной
volatile unsigned char
Таблица 3. Члены класса ClassADC.
Название
Описание
Закрытые члены класса
nextmux
содержимое ADMUX, которое
надо установить в текущем
прерывании
Открытые члены класса
*CurrADCChanel
Указатель на текущий
опрашиваемый канал
*LastADCChanel
Указатель на предыдущий
канал
ClassADCChanels
ClassADCChanels
3.3.2. Описание методов класса.
Init
void Init(void)
Модуль Init инициализирует модуль АЦП ATmega128 и подключенные к нему каналы –
объекты класса ClassADCChanels.
AddChanel
void AddChanel(ClassADCChanels *point)
Метод AddChanel ставит на опрос канал, объект которого находится по адресу указанному
в point.
GetChanelData
inline void GetChanelData(void)
Метод GetChanelData обновляет содержимое буфера текущего канала. Рекомендуется
использовать в прерывании по окончании аналого-цифрового преобразования.
3.3.3. Пример использования.
Объявление
ClassADC
Adc = &madc;
madc,*Adc;
Инициализация
Adc->AddChanel(&madcChanel0);
Adc->Init();
Вызов метода
#pragma vector=ADC_vect
__interrupt void HandleADC(void) {
Adc->GetChanelData();
}
Серия SMODE
8
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
3.4. Класс ClassComs.
Объект данного класса отвечает за инициализацию модуля USART
микроконтроллера ATmega128, передачу и прием последовательности байт по средством
этого модуля. Описание класса, его методы и необходимые константы хранятся в файле
smhcom.hpp.
3.4.1. Укрупненное описание алгоритмов работы с объектами класса.
Для того, что бы отправить посылку необходимо сформировать ее, а затем вызвать
метод GetMessage() в качестве параметра указатель на сформированную посылку, тем
самым, начав передачу. По окончании передачи выставляется флаг Transmitted, и
автоматически начинается прием. После окончания приема ответной посылки или по
истечении тайм-аута выставляется флаги Recived и найденных ошибок. Как прием, так и
передача реализована по принципу автомата состояний, т.е. в ответ на какое то событие
состояние автомата меняется: начинается ожидание ответа или окончание приема.
ВНИМАНИЕ. Работа объекта класса ведется согласно спецификации на Modicon
Modbus Protocol. По данной спецификации длительность паузы между двумя посылками
должна быть не менее времени, достаточного для передачи 8-и байт на заданной скорости.
Для гарантированного удовлетворения данного требования передача посылки ведется
следующим образом: сначала отсылаются 4 нулевых байта (передача ведется при
запрещенной передачи конвертору RS485, т.е. в сеть эти байты не попадают), затем
разрешается передача конвертору и инициируется передача информационных байт, после
завершения передачи снова передаются 4 нулевых байта (конвертору передача запрещена).
Методами данного класса можно осуществить настройку данного параметра, выраженного
в количествах байт.
Спецификация на ModBus так же определяет максимальное время паузы между
двумя байтами в посылки, она равна времени, достаточного для передачи 1.5 байта на
заданной скорости. Методами данного класса можно осуществить настройку данного
параметра, выраженного в количествах половин байта.
ВНИМАНИЕ. Если работа ведется с модулем USART0, т.е. полу дуплексом,
существует возможность во время передачи собственной посылки принимать ее обратно,
контролируя тем самым состояние линии передачи. Эта возможность заложена аппаратно,
в данной версии библиотеки она не используется.
3.4.2. Описание членов класса.
Тип переменной
volatile bool
volatile unsigned
char
Таблица 3. Члены класса ClassComs.
Название
Описание
Закрытые члены класса
Number
Номер модуля USART
*UBRRL,*UBRRH,*UDR,
Указатели на
*UCSRA,*UCSRB,*UCSRC
конфигурационные регистры
модуля USART
baudrate
Скорость обмена
volatile
unsigned
volatile
char
bool
Busy
volatile
char
trm_state
Серия SMODE
Флаг блокировки. Для
разрешения коллизий при
доступе к USART различных
программных модулей
Состояние передачи
9
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
volatile
volatile
int
int
trm_cntr
trm_msgsize
volatile
int
trm_maxsize
volatile
bool
selftransmitt
volatile
volatile
volatile
char
int
int
rec_state
rec_cntr,
rec_msgsize
volatile
int
rec_maxsize
volatile
unsigned
volatile
unsigned
volatile
unsigned
*trm_buffer
char
*rec_buffer
char
m_oldclck
int
ClassBiosSMH
volatile
volatile
volatile
unsigned
volatile
unsigned
volatile
unsigned
volatile
unsigned
volatile
unsigned
volatile
unsigned
Счетчик переданных байт
Размер передаваемой
последовательности
Максимальный размер
передаваемой
последовательности
Флаг “Возможность приема
собственной посылки”
Состояние приема
Счетчик принятых байт
Размер принятой
последовательности
Максимальный размер
принятой последовательности
Указатель на передаваемый
буфер
Указатель на приемный буфер
bool
bool
int
int
Используется при расчете
тайм-аута
Открытые члены класса
*Bios
Указатель на объект класса
ClassBiosSMH, используется
для разрешения и запрета
передачи конвертору
Transmitted
Флаг “Передача завершена”
Recived
Флаг “Прием завершен”
RecByteTimeOut
Минимальная пауза между
битами. Задается в половинах
байта.
FrameTimeOut
Минимальная пауза между
кадрами. Задается в кол-вах
байт.
ErecByteTimeOut
Ошибка тайм-аута
int
ERecByteFrame,
Ошибка фрейма
ErecParity
Ошибка проверки четности
ErecByteOverRun
Ошибка при приеме байта
int
int
int
3.4.3 Описание методов класса.
3.4.3.1.
Описание защищенных методов класса.
start_transmitt
inline void start_transmitt(void)
Метод start_transmitt инициирует начало передачи.
Серия SMODE
10
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
stop_transmitt
inline void stop_transmitt(void)
Метод stop_transmitt завершает передачу и инициирует прием.
3.4.3.2.
Описание открытых методов класса.
ClassComs(int comnumber)
Конструктор в зависимости от значения параметра comnumber устанавливает указатели
*UBRRL,*UBRRH,*UDR,*UCSRA,*UCSRB,*UCSRC на соответствующие
конфигурационные регистры соответствующего USART модуля.
~ClassComs(void)
Деструктор класса.
Sleep
inline void Sleep(void)
Метод Sleep() запрещает прерывания на прием и передачу
WakeUp
inline void WakeUp(void)
Метод WakeUp() разрешает прерывания на прием и передачу
Lock
inline __monitor bool Lock(void)
Метод Lock() устанавливает блокировку для запрета одновременного доступа к USART
различных программных модулей
UnLock
inline __monitor void UnLock(void)
Метод UnLock() убирает блокировку
IsLock
inline bool IsLock(void)
Метод IsLock() возвращает значение флага блокировки
GetNumber
inline int GetNumber(void)
Метод GetNumber() возвращает номер того модуля USART, на который настроен объект
данного класса
PointToRecBuffer
inline unsigned char *PointToRecBuffer(void)
Метод PointToRecBuffer() возвращает указатель на rec_buffer.
PointToTrmBuffer
inline unsigned char *PointToTrmBuffer(void)
Метод PointToTrmBuffer() возвращает указатель на trm_buffer.
Серия SMODE
11
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
GetSizeRecMessage
inline int GetSizeRecMessage(void)
Метод GetSizeRecMessage() возвращает длину принято посылки
GetRecState
inline char GetRecState(void)
Метод GetRecState() возвращает состояние приема
FlushReciver
inline void FlushReciver(void)
Метод FlushReciver() сбрасывает флаг “Прием закончен”
FlushTransmitter
inline void FlushTransmitter(void)
Метод FlushTransmitter() запрещает передачу и устанавливает флаг “Передача
завершена”.
SetRecBuffer
bool SetRecBuffer(int newsize)
Метод SetRecBuffer выделяет память размером newsize под rec_buffer. И
возвращает true, если выделение прошло успешно.
SetTrmBuffer
bool SetTrmBuffer(int newsize)
Метод SetTrmBuffer() выделяет память размером newsize под trm_buffer. И
возвращает true, если выделение прошло успешно.
Init
void Init(unsigned char baud)
Метод Init() инициализирует USART модуль на заданную скорость, очищает буферы и
разрешает прерывания
SetBaudRate
void SetBaudRate(unsigned char baud)
Метод SetBaudRate() устанавливает заданную скорость обмена.
Таблица 4. Скорости обмена.
Скорость обмена, бит/сек
Значение baud
BAUD_230400
230400
BAUD_115200
115200
BAUD_76800
76800
BAUD_57600
57600
SetByteTimeOut
void SetByteTimeOut(unsigned char numb)
Метод SetByteTimeOut() устанавливает заданный тайм-аут на прием байта. Величина
numb должна быть выражена в длительностях половины байта
Серия SMODE
12
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
SetFrameTimeOut
void SetFrameTimeOut(unsigned char numb)
Метод SetFrameTimeOut() устанавливает заданный тайм-аут на прием байта. Величина
numb должна быть выражена в длительностях одного байта
SetParity
void SetParity(unsigned char prty)
Метод SetParity() устанавливает режим проверки на четность: PRTY_NONE – нет
проверки; PRTY_ODD – проверка на нечетность; PRTY_EVEN – проверка на четность.
SetStopBits
void SetStopBits(unsigned char sb)
Метод SetStopBits() зависимости от sb настраивает модуль USART на передачу байта
с одним стоп-битом (RSSTOP_1BIT) или с двумя стоп-битами(RSSTOP_2BIT).
SetBits
void SetBits(unsigned char numb)
Метод SetBits() в зависимости от numb настраивает модуль USART на восьми битный
режим (numb равен 0) или девяти битный режим (numb равен 1).
WriteNextByte
inline void WriteNextByte(void)
Метод WriteNextByte передает следующий байт из буфера trm_buffer, так же
отслеживает окончание посылки по значению trm_cntr. Рекомендуется использовать в
прерывании по окончанию передачи байта.
TestFrame
inline void TestFrame(void)
Метод TestFrame проверяет состояние объекта данного класса, определяет наличие
ошибок, реализует автомат состояний объекта.
ReadNextByte
inline void ReadNextByte(void)
Метод ReadNextByte ставит на передачу следующий байт из буфера rec_buffer, а
так же отслеживает окончание посылки по тайм-ауту. Рекомендуется использовать в
прерывании по окончанию приема байта.
SetMessage
bool SetMessage(int len,unsigned char *point)
Метод SetMessage() копирует буфер, находящийся по указателю point длинной len в
буфер trm_buffer и инициирует передачу.
GetMessage
int GetMessage(unsigned char *buff)
Метод GetMessage() копирует приемный буфер rec_buffer по указателю buff и
сбрасывает флаг “Прием закончен”.
Серия SMODE
13
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
ClrErrors
inline void ClrErrors(void)
Метод ClrErrors очищает ошибки.
isErrors
inline bool isErrors(void)
Метод isErrors возвращает tue если с момента последней очистки ошибок появилась
хотя бы одна ошибка любого типа.
3.4.4. Пример использования.
Объявление
ClassComs
mCom0,mCom1,*Com[2];
Инициализация
Com[0]->Init(BAUD_115200);
Com[0]->ClrErrors();
Работа в прерываниях
#pragma vector=USART0_RX_vect
__interrupt void HandleReadCom0(void) {
Com[0]->ReadNextByte();
}
#pragma vector=USART0_TX_vect
__interrupt void HandleWriteCom0(void) {
Com[0]->WriteNextByte();
}
3.5. Класс ClassProtocols
Объект класса ClassProtocols реализует передачу кадра по средством объекта
класса ClassComs согласно спецификации на Modicon Modbus Protocol. Описание класса,
его методы и необходимые константы хранятся в файле smhproto.hpp и tablcrc16.cpp.
3.5.1. Укрупненное описание алгоритмов работы с объектами класса.
Методы данного класса позволяют работать по спецификации на Modicon Modbus
Protocol как в режиме слейва, так и в режиме мастера. Если объект настроен как слейв, то
необходимо циклически вызывать метод GetQuery(), реализуя тем самым ожидание
принятого запроса. Если метод GetQuery() вернул true, это означает, что прием кадра
завершен, можно начинать разбор кадра и формирование кадра ответа и инициирование
передачи методом Response() или ResponseOK(). Если же объект настроен как
мастер, то для реализации опроса надо воспользоваться методами SendQuery() и
GetResponse(). Метод GetResponse() возвращает true, если прием ответа
завершен, но перед началом разбора кадра его необходимо проверить на наличие ошибок
методом isResponseError().
Серия SMODE
14
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
3.5.2. Описание членов класса.
Тип переменной
volatile
volatile
volatile
bool
bool
bool
volatile
volatile
unsigned
bool
char
volatile
unsigned
char
volatile
unsigned
char
volatile
unsigned
int
volatile
unsigned
int
volatile
unsigned
volatile
int
volatile
int
ClassComs
volatile
unsigned
volatile
unsigned
volatile
unsigned
volatile
unsigned
volatile
unsigned
volatile
unsigned
Серия SMODE
Таблица 3. Члены класса ClassComs.
Название
Описание
Закрытые члены класса
listenOnly
Флаг ‘Запрещение ответа’
respError
Флаг “Ошибочная команда ”
lock
Флаг блокировки. Используется
для разрешения коллизий при
доступе к объекту класса
ClassComs различных
программных модулей
master
Флаг “Мастер”
address
Содержимое поля Slave
Address. Смотри описание
кадра ModBus.
command
Содержимое поля Function.
Смотри описание кадра
ModBus
bytecounter
Содержимое поля Byte Count.
Смотри описание кадра
ModBus
startaddress
Содержимое поля Starting
Address. Смотри описание
кадра ModBus
numberof
Содержимое поля No of
Registers. Смотри описание
кадра ModBus
m_size
Размер посылки
int
responseTimeOut
tickResponseTimeOut
Значение тайм-аута, задается в
мили секундах
Счетчик тайм-аута
Открытые члены класса
*comport
RecQuerys
Счетчик принятых запросов
long
NoResponse
Счетчик не принятых ответов
TransmittedPacket
Счетчик переданных кадров
ErrorsCRC
Ошибка контрольной суммы
ErrorsIFunc
Флаг выставляется если
принятая команда не допустима
Флаг выставляется если размер
принимаемой посылки больше
допустимого
long
long
int
int
ErrorsSize
int
15
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
3.5.3 Описание методов класса.
3.5.3.1.
Описание защищенных методов класса.
modbusCRC16
unsigned int modbusCRC16(unsigned char *buff,int size)
Метод modbusCRC16() возвращает контрольную сумму, рассчитанную по элементам
массива buff, длина массива содержится в size. Константы, необходимые для расчета
контрольной суммы, хранятся в программной флеш памяти и описаны в файле
tablcrc16.cpp.
isQueryReady
bool isQueryReady(void)
isQueryReady() возвращает true если принят запрос и доступ к объекту разрешен.
transmitt
void transmitt(unsigned char *mess,int len)
Метод transmitt() рассчитывает контрольную сумму и инициирует передачу кадра из
массива mess длиной len.
isResponsePresent
unsigned char isResponsePresent(void)
Метод isResponsePresent() возвращает код соответствующий состоянию приема.
Коды возврата функции
0x00 - пакет принят нормально
0x01 - передача не закончена таймаут закончен (ошибочная ситуация)
0x02 - прием не закончен таймаут закончен
(ошибочная ситуация)
0x03 - передача не закончена таймаут то же
0x04 - прием не закончен таймаут то же
3.5.3.2.
Описание открытых методов класса.
Init
void Init(ClassComs *_comport)
Метод Init() инициализирует объект класса: осуществляет привязку к объекту класса
ClassComs, по умолчанию настраивается как слейв, устанавливает тайм-аут и скорость
обмена 115200 бит/сек.
Lock
inline __monitor bool Lock(void)
Метод Lock() устанавливает блокировку для запрета одновременного доступа к объекту
класса ClassComs различных программных модулей.
UnLock
inline __monitor bool UnLock(void)
Метод Lock() снимает блокировку на запрет доступа к объекту класса ClassComs.
Серия SMODE
16
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
IsLock
inline __monitor bool IsLock(void)
Возвращает true если блокировка стоит, false если блокировка снята.
SetMaster
inline __monitor void SetMaster(void)
SetMaster() настраивает свой объект как мастер.
SetSlave
inline __monitor void SetSlave(void)
SetSlave() настраивает свой объект как слейв.
SetReciveBuffer
inline bool
SetReciveBuffer(int size)
SetReciveBuffer() задает размер приемного буфера. В параметре size необходимо
указать требуемое количество информационных байт, байты заголовка и контрольной
суммы метод добавит сам.
SetResponseTimeOut
inline void
SetResponseTimeOut(unsigned int val)
SetResponseTimeOut() используется для задания величины тайм-аута.
SetBaudRate
inline void
SetBaudRate(unsigned char
SetBaudRate() используется для задания скорости обмена.
Значение baud
BAUD_230400
BAUD_115200
BAUD_76800
BAUD_57600
baud)
Таблица 6. Скорости обмена.
Скорость обмена, бит/сек
230400
115200
76800
57600
SetAddress
inline void
SetAddress(unsigned char _address)
Если объект класса настроен как слейв, то метод SetAddress() устанавливает
собственный адрес, если же объект работает как мастер, данный метод устанавливает адрес
слейва, который можно будет впоследствии опросить.
SetCommand
inline void
SetCommand(unsigned char _command)
SetCommand() используется для доступа к закрытому члену класса command.
GetCommand
inline unsigned char GetCommand(void)
GetCommand() используется для доступа к закрытому члену класса command.
Серия SMODE
17
13
Программируемый контроллер SMH 2010
Бласт
Технологический ОDМ- партнер
Описание библиотек ввода-вывода
SetStartAddress
inline void
SetStartAddress()
startaddress.
SetStartAddress(unsigned int address)
используется для доступа к закрытому члену класса
GetStartAddress
inline unsigned int
GetStartAddress(void)
GetStartAddress()
используется для доступа к закрытому
startaddress.
члену
класса
SetNumberOf
inline void
SetNumberOf(unsigned int _numberof)
SetNumberOf() используется для достепа к закрытому члену класса numberof.
GetNumberOf
inline unsigned int
GetNumberOf(void)
GetNumberOf() используется для достепа к закрытому члену класса numberof.
SetByteCounter
inline void
SetByteCounter(unsigned char _bytecounter)
SetByteCounter() используется для достепа к закрытому члену класса bytecounter.
GetByteCounter
inline unsigned char GetByteCounter(void)
GetByteCounter() используется для достепа к закрытому члену класса bytecounter.
testCheckSumm
bool testCheckSumm(unsigned char *buff)
Метод testCheckSumm() сравнивает принятую контрольную сумму с расчетной для
посылки, находящейся в buff. Возвращает true, если принятая и расчетная контрольные
суммы совпали.
setCheckSumm
void setCheckSumm(unsigned char *buff,unsigned int position)
Метод setCheckSumm() рассчитывает контрольную сумму для элементов массива buff,
длиной position и помещает ее в этот же массив на позицию указанную в position.
TimeOuts
void TimeOuts(void)
Декрементирует таймаут ответа.
SendQuery - 1
inline void SendQuery(void)
Метод SendQuery() кадр в котором не информационных байт. Используется для
передачи запроса от мастера к слейву.
Серия SMODE
18
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
SendQuery - 2
void SendQuery(unsigned char *buffer)
Метод SendQuery() составляет и инициирует передачу кадра, в котором в качестве
информационных байт используется содержимое массива buffer. Перед использованием
данного метода необходимо записать в член класса bytecounter количество байт,
приготовленный к отправке. Используется для передачи запроса от мастера к слейву.
GetQuery
bool GetQuery(unsigned char **mess)
Метод GetQuery() возвращает true, если была принята команда, требующая от
пользователя ответа, false возвращается в остальных случаях, таких как: не правильный
прием, прием не закончен и установлен флаг listenOnly. В качестве параметра
необходимо давать указатель на массив, в который метод скопирует информационные
байты принятой посылки. Используется слейвом при получении запроса от мастера.
isResponseError
inline bool isResponseError(void)
Возвращает код ошибки при приеме ответа. Используется мастером.
GetResponse
bool GetResponse(unsigned char **mess)
Метод GetResponse() возвращает true, если можно посылать следующий запрос. В
качестве параметра mess надо задавать указатель на массив, в который данный метод
скопирует информационные байты принятого ответа. Метод вернет false если ответ еще
не принят. Используется мастером
ResponseError
void ResponseError(void)
Данный метод вызывается, если выполнить приинятую команду не возможно.
ResponseError() генерирует ответ, в котором указано что SLAVE определил
ошибочный пакет. Используется слейвом.
ResponseOK
void ResponseOK(void)
Генерирует акноледж. Используется слейвом.
Response
void Response(unsigned char *message,unsigned char size)
Метод Response() составляет и инициирует передачу кадра, в котором в качестве
информационных байт используется содержимое массива message. Количество байт,
приготовленный к отправке, задается в size. Используется для передачи ответа слейва на
запрос от мастера.
DeleteQuery
void DeleteQuery(unsigned char *mess)
Освобождает память, выделенную под mess.
Серия SMODE
19
13
Бласт
Технологический ОDМ- партнер
Программируемый контроллер SMH 2010
Описание библиотек ввода-вывода
DeleteResponse
void DeleteResponse(unsigned char
Освобождает память, выделенную под mess.
*mess)
3.5.4. Пример использования.
Объявление
ClassProtocols *pProtocol[2];
Инициализация в качестве слейва
pProtocol[i] = new ClassProtocols();
pProtocol[i]->Init(Com[0]);
pProtocol[i]->SetAddress(3);
Инициализация в качестве мастера
pProtocol[0] = new ClassProtocols();
pProtocol[0]->Init(Com[0]);
pProtocol[0]->SetMaster();
pProtocol[0]->SetAddress(3);
pProtocol[0]->SetStartAddress(0x0000);
pProtocol[0]->SetNumberOf(0x0001);
pProtocol[0]->SetCommand(Read_Coil_Status);
pProtocol[0]->SendQuery();
Серия SMODE
20
Download