13 Бласт Технологический оdм- партнер Программируемый контроллер smh 2010 Описание библиотек ввода-вывода Назначение



Скачать 273.32 Kb.
Дата07.11.2016
Размер273.32 Kb.

13



Бласт


Технологический ОDМ- партнер

Программируемый контроллер SMH 2010

Описание библиотек ввода-вывода

  1. Назначение.

Для программиста на С, оперирующего высокоуровневыми понятиями о системе, который создает концепцию на уровне датчиков и приводов, в принципе не важно, на основе каких механизмов контроллер взаимодействует с внешней средой. Важно, что бы входное воздействие, прошедшее необходимую фильтрацию и в удобном для дальнейшей обработки виде, было доступно для управляющей программы, а для того, что бы вывести результат работы, достаточно было бы воспользоваться процедурой вывода, учитывающей все нюансы схемы контроллера. Именно для того, что бы скрыть от программиста внутреннее устройство контроллера, созданы библиотеки ввода-вывода. Они обеспечивают:



    • простую настройку контроллера

    • ввод и вывод информации

    • первичную обработку входных сигналов

    • высокоуровневый доступ ко всем модулям контроллера



  1. Состав.

Библиотеки ввода вывода обеспечивают доступ к следующим модулям контроллера



    • АЦП.

    • входные разовые команды

    • выходные разовые команды

    • клавиатура

    • модуль ЖКИ

    • последовательные интерфейсы RS485




  1. Устройство и работа.

При разработке библиотечных функций использовался метод объектно-ориентированного программирования. Т.о. для работы с контроллером необходимо создать объекты необходимых классов и при работе пользоваться их методами.




    1. Класс ClassBiosSMH.

Объект этого класса закрывает от разработчика нюансы ввода-вывода разовых команд, сканирования клавиатуры, работы с ЖКИ. При создании объекта производится начальная инициализация портов ввода-вывода микроконтроллера ATmega128. Описание класса, его методы и необходимые константы хранятся в файле SMH2010.hpp.




      1. Укрупненное описание алгоритмов работы с объектами класса.

С помощью методов этого класса осуществляется:



  • вывод выходных разовых команд

Состояние выходных разовых отражает содержимое члена класса DOutputs. Для обновления состояний выходов необходимо изменить указанную переменную и вызвать метод AtomWriteORK().



  • ввод с защитой от дребезга входных разовых команд

Методами данного класса осуществляется обновление информации о состоянии входов, защита от дребезга осуществляется методом мажеритирования. Для этого необходимо циклически вызывать метод AtomReadIRK(), а для получения текущего значения надо воспользоваться методом GetDInputs(). Соответственно, длительность подавляемого дребезга входа зависит от частоты вызова метода AtomReadIRK().


  • сканирование клавиатуры с защитой от дребезга

Работа с клавиатурой выполняется аналогично работе с входными разовыми командами. Циклически вызывается AtomReadKBD(), для получения результата сканирования вызывается GetKbd(). Результатом GetKbd() является 4-х байтный результат сканирования клавиатуры.


  • вывод на ЖКИ

Методами DisplayCtrlWrite() и DisplayDataWrite() соответственно производится конфигурация контроллера ЖКИ и передача ему информации.
3.1.2. Описание членов класса.

Таблица 1. Члены класса ClassBiosSMH.

Тип переменной

Название

Описание

Закрытые члены класса

volatile unsigned int

input_rk[3]

Массив выборок входных разовых команд

volatile unsigned long

scan_kbd[3]

Массив выборок клавиатуры

volatile unsigned char

test_rk

Выборка выходных разовых команд через внешний регистр

volatile char

cntr_irk

Счетчик выборок входных разовых команд

volatile char

cntr_kbd

Счетчик выборок клавиатуры

Открытые члены класса

volatile int

M_lSystemTicks

Клоки системного таймера

unsigned char

DOutputs

Текущее состояние выходных разовых команд



      1. Описание методов класса.


ClassBiosSMH()

Конструктор класса ClassBiosSMH инициализирует порты ATmega128


Init

void Init(void)

Метод Init() выполняет следующие функции:


  • настройка таймеров

  • установка выходных разовых команд

  • инициализация дисплея

  • разрешение всех прерываний


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, для которого используется данный метод.
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)

Метод инкрементирует таймер часов реального времени

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);





    1. Класс ClassADCChanels.

Объект этого класса закрывает от разработчика нюансы работы с модулем АЦП микроконтроллера ATmega128. При работе с этим модулем используются 6 каналов (с нулевого по пятый). Методы класса позволяют настроить тип канала, изменить его коэффициент усиления, установить опорное напряжение. Описание класса, его методы и необходимые константы хранятся в файле adc.hpp.


3.2.1. Укрупненное описание алгоритмов работы с объектами класса.
С помощью методов этого класса осуществляется настройка модуля АЦП, фильтрация результата. Класс ClassADCChanels отвечает за информацию, относящуюся к конкретному каналу АЦП. Причем номер канала говорит о типе канала и о коэффициенте усиления (см. описание микроконтроллера ATmega128). Так, например, запись

ClassADCChanels madcChanel(13);

создает объект дифференциального канала с коэффициентом усиления 10, в котором 3 канал АЦП ATmega128 является положительным, а 2 канал АЦП ATmega128 отрицательным входами. Для доступа к результату АЦП используется метод GetVolue(). Отдельно нужно сказать о члене класса Mux, в нем хранятся основные настройки канала: тип канала, коэффициент усиления, опорное напряжение, способ хранения результата (сдвинут влево или вправо).
3.2.2. Описание членов класса.
Таблица 2. Члены класса ClassADCChanels.

Тип переменной

Название

Описание

Закрытые члены класса

volatile char

Number

Номер канала

volatile char

Order

Размер буфера

volatile bool

filter_on

Флаг включения фильтрации

volatile char

sample_cntr

Текущий номер выборки

volatile char

*buffer

Указатель на буфер

Открытые члены класса

volatile unsigned char

Mux

Настройки канала

ClassADCChanels

*Next














3.2.3. Описание методов класса.

ClassADCChanels


ClassADCChanels(unsigned char num)

Конструктор класса производит инициализацию канала num.


Init

void Init(void)

Выделяет память под буфер и обнуляет ее.

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() возвращает результат АЦП, причем если фильтрация была разрешена, то результат будет отфильтрован методом плавающего среднего.




      1. Примеры использования.



Объявление


ClassADCChanels madcChanel0(0),madcChanel1(1),madcChanel2(2);
Вызов метода

unsigned int value = madcChanel0.GetVolue();





    1. Класс ClassADC.

Объект класса ClassADC занимается опросом созданных каналов. Для того, что бы поставить канал на опрос используется метод AddChanel(). Описание класса, его методы и необходимые константы хранятся в файле adc.hpp.




      1. Описание членов класса.

Таблица 3. Члены класса ClassADC.

Тип переменной

Название

Описание

Закрытые члены класса

volatile unsigned char

nextmux

содержимое ADMUX, которое надо установить в текущем прерывании


Открытые члены класса

ClassADCChanels

*CurrADCChanel

Указатель на текущий опрашиваемый канал

ClassADCChanels

*LastADCChanel

Указатель на предыдущий канал


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 madc,*Adc;

Adc = &madc;



Инициализация


Adc->AddChanel(&madcChanel0);

Adc->Init();



Вызов метода


#pragma vector=ADC_vect

__interrupt void HandleADC(void) {

Adc->GetChanelData();

}


    1. Класс ClassComs.

Объект данного класса отвечает за инициализацию модуля USART микроконтроллера ATmega128, передачу и прием последовательности байт по средством этого модуля. Описание класса, его методы и необходимые константы хранятся в файле smhcom.hpp.


3.4.1. Укрупненное описание алгоритмов работы с объектами класса.

Для того, что бы отправить посылку необходимо сформировать ее, а затем вызвать метод GetMessage() в качестве параметра указатель на сформированную посылку, тем самым, начав передачу. По окончании передачи выставляется флаг Transmitted, и автоматически начинается прием. После окончания приема ответной посылки или по истечении тайм-аута выставляется флаги Recived и найденных ошибок. Как прием, так и передача реализована по принципу автомата состояний, т.е. в ответ на какое то событие состояние автомата меняется: начинается ожидание ответа или окончание приема.

ВНИМАНИЕ. Работа объекта класса ведется согласно спецификации на Modicon Modbus Protocol. По данной спецификации длительность паузы между двумя посылками должна быть не менее времени, достаточного для передачи 8-и байт на заданной скорости. Для гарантированного удовлетворения данного требования передача посылки ведется следующим образом: сначала отсылаются 4 нулевых байта (передача ведется при запрещенной передачи конвертору RS485, т.е. в сеть эти байты не попадают), затем разрешается передача конвертору и инициируется передача информационных байт, после завершения передачи снова передаются 4 нулевых байта (конвертору передача запрещена). Методами данного класса можно осуществить настройку данного параметра, выраженного в количествах байт.

Спецификация на ModBus так же определяет максимальное время паузы между двумя байтами в посылки, она равна времени, достаточного для передачи 1.5 байта на заданной скорости. Методами данного класса можно осуществить настройку данного параметра, выраженного в количествах половин байта.

ВНИМАНИЕ. Если работа ведется с модулем USART0, т.е. полу дуплексом, существует возможность во время передачи собственной посылки принимать ее обратно, контролируя тем самым состояние линии передачи. Эта возможность заложена аппаратно, в данной версии библиотеки она не используется.


      1. Описание членов класса.


Таблица 3. Члены класса ClassComs.

Тип переменной

Название

Описание

Закрытые члены класса

volatile bool

Number

Номер модуля USART

volatile unsigned char

*UBRRL,*UBRRH,*UDR,

*UCSRA,*UCSRB,*UCSRC



Указатели на конфигурационные регистры модуля USART

volatile unsigned char

baudrate

Скорость обмена

volatile bool

Busy

Флаг блокировки. Для разрешения коллизий при доступе к USART различных программных модулей

volatile char

trm_state

Состояние передачи

volatile int

trm_cntr

Счетчик переданных байт

volatile int

trm_msgsize

Размер передаваемой последовательности

volatile int

trm_maxsize

Максимальный размер передаваемой последовательности

volatile bool

selftransmitt

Флаг “Возможность приема собственной посылки”

volatile char

rec_state

Состояние приема

volatile int

rec_cntr,

Счетчик принятых байт

volatile int

rec_msgsize

Размер принятой последовательности

volatile int

rec_maxsize

Максимальный размер принятой последовательности

volatile unsigned char

*trm_buffer

Указатель на передаваемый буфер

volatile unsigned char

*rec_buffer

Указатель на приемный буфер

volatile unsigned int

m_oldclck

Используется при расчете

тайм-аута



Открытые члены класса

ClassBiosSMH

*Bios

Указатель на объект класса ClassBiosSMH, используется для разрешения и запрета передачи конвертору

volatile bool

Transmitted

Флаг “Передача завершена”

volatile bool

Recived

Флаг “Прием завершен”

volatile unsigned int

RecByteTimeOut

Минимальная пауза между битами. Задается в половинах байта.

volatile unsigned int

FrameTimeOut

Минимальная пауза между кадрами. Задается в кол-вах байт.

volatile unsigned int

ErecByteTimeOut

Ошибка тайм-аута

volatile unsigned int

ERecByteFrame,

Ошибка фрейма

volatile unsigned int

ErecParity

Ошибка проверки четности

volatile unsigned int

ErecByteOverRun

Ошибка при приеме байта


3.4.3 Описание методов класса.

3.4.3.1. Описание защищенных методов класса.
start_transmitt

inline void start_transmitt(void)

Метод start_transmitt инициирует начало передачи.
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.
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 должна быть выражена в длительностях половины байта
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 и сбрасывает флаг “Прием закончен”.

ClrErrors

inline void ClrErrors(void)

Метод ClrErrors очищает ошибки.
isErrors

inline bool isErrors(void)

Метод isErrors возвращает tue если с момента последней очистки ошибок появилась хотя бы одна ошибка любого типа.


      1. Пример использования.


Объявление

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();

}



    1. Класс 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().





      1. Описание членов класса.

Таблица 3. Члены класса ClassComs.

Тип переменной

Название

Описание

Закрытые члены класса

volatile bool

listenOnly

Флаг ‘Запрещение ответа’

volatile bool

respError

Флаг “Ошибочная команда ”

volatile bool

lock

Флаг блокировки. Используется для разрешения коллизий при доступе к объекту класса ClassComs различных программных модулей

volatile bool

master

Флаг “Мастер”

volatile unsigned char

address

Содержимое поля Slave Address. Смотри описание кадра ModBus.

volatile unsigned char

command

Содержимое поля Function. Смотри описание кадра ModBus

volatile unsigned char

bytecounter

Содержимое поля Byte Count. Смотри описание кадра ModBus

volatile unsigned int

startaddress

Содержимое поля Starting Address. Смотри описание кадра ModBus

volatile unsigned int

numberof

Содержимое поля No of Registers. Смотри описание кадра ModBus

volatile unsigned int

m_size

Размер посылки

volatile int

responseTimeOut

Значение тайм-аута, задается в мили секундах

volatile int

tickResponseTimeOut

Счетчик тайм-аута

Открытые члены класса

ClassComs

*comport




volatile unsigned long

RecQuerys

Счетчик принятых запросов

volatile unsigned long

NoResponse

Счетчик не принятых ответов

volatile unsigned long

TransmittedPacket

Счетчик переданных кадров

volatile unsigned int

ErrorsCRC

Ошибка контрольной суммы

volatile unsigned int

ErrorsIFunc

Флаг выставляется если принятая команда не допустима

volatile unsigned int

ErrorsSize

Флаг выставляется если размер принимаемой посылки больше допустимого



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.



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 baud)

SetBaudRate() используется для задания скорости обмена.


Таблица 6. Скорости обмена.

Значение baud

Скорость обмена, бит/сек

BAUD_230400

230400

BAUD_115200

115200

BAUD_76800

76800

BAUD_57600

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.



SetStartAddress

inline void SetStartAddress(unsigned int address)

SetStartAddress() используется для доступа к закрытому члену класса startaddress.


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() кадр в котором не информационных байт. Используется для передачи запроса от мастера к слейву.


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.




DeleteResponse

void DeleteResponse(unsigned char *mess)

Освобождает память, выделенную под mess.




      1. Пример использования.



Объявление

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


База данных защищена авторским правом ©bezogr.ru 2016
обратиться к администрации

    Главная страница