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