DCON-запросы представляют собой ANSI-строки с терминатором \r(символ возврата каретки - 0x0D), посылаемые модулям ввода-вывода, которые, в свою очередь возвращают ответ...
DCON-запросы представляют собой ANSI-строки с терминатором \r(символ возврата каретки - 0x0D), посылаемые модулям ввода-вывода, которые, в свою очередь возвращают ответ в виде ANSI-строки. Пример запроса на модуль ICP DAS i-7052 выглядит следующим образом:
@04\r ,где 04 - адрес модуля - число от 0x00 до 0xFF. Корректный ответ выглядит так:
>00FF, где 00FF - состояние входов, а символ ">" в большинстве запросов( не во всех!) обозначает то, что запрос был верным, и пришел корректный ответ.
В предыдущей статье речь шла о классе строки под Turbo C++ 1.01, этот класс возьмем в качестве базового. Класс будет создавать нужные запросы на аналоговые и цифровые модули ввода, а также на цифровые модули вывода. Плюс тому, нужна обработка ответов. Все другие запросы дописываются без особых затруднений. Итак, будем реализовывать следующие запросы:
@AA - запрос на модуль дискретного ввода для получения состояния всех входов.
$AAM - запрос на получение имени модуля( для всех модулей).
#AAAcDD / #AABcDD - запрос на изменение состояния одного выхода модуля дискретного вывода.
#AAN - запрос на получение состояния одного входа модуля аналогового ввода.
Полный список запросов с описанием можно посмотреть в документации к модулям на сайте icpdas.ru
Получим следующий интерфейс:
class CDconString: public CString
{
public:
// Конструктор по умолчанию
CDconString():CString();
// Конструктор с инициализацией строкой
CDconString(const char* str):CString(str);
// Конструктор копирования
CDconString(const CString& s):CString(s);
// Конструктор копирования
CDconString(const CDconString& s):CString((CString)s);
~CDconString();
/*
* Создает DCON-запрос для модулей дискретного
* ввода-вывода на получение состояния модуля.
* В качестве параметра передается адрес модуля.
*/
void CreateDINQuery(unsigned int nAddr);
/*
* Создает DCON-запрос на получение имени модуля.
* В качестве параметра передается адрес модуля.
*/
void CreateGetNameQuery(unsigned int nAddr);
/*
* Создает DCON-запрос для модулей дискретного
* вывода на изменение состояния одного канала.
* Параметры:
* nAddr: адрес модуля
* channel: номер канала (0-15)
* on: состояние вкл/выкл (TRUE/FALSE)
*/
void CreateDOUTQueryOneChannel(unsigned int nAddr, unsigned int channel, BOOL on);
/*
* Создает DCON-запрос для модулей аналогового
* ввода на получение значения одного канала.
* Параметры:
* nAddr: адрес модуля
* channel: номер канала.
*/
void CreateAINQueryOneChannel(unsigned int nAddr, unsigned int channel);
//Обрабатывает ответ от модуля дискретного ввода
BOOL ProcessDINResponse(unsigned int& val) const;
//Обрабатывает ответ от модуля аналогового ввода
BOOL ProcessAINResponse(float& val) const;
//Обрабатывает ответ от модуля дискретного вывода
BOOL ProcessDOUTResponse() const;
};
Пример использования:
//---Создание запроса---//
const int port=2; // COM-порт для отправки запроса
CDconString ds;
ds.CreateDOUTQueryOneChannel(25,12,TRUE); // #19B401\r
// Отправка данных в порт. Из библиотеки 7188xa
ToComBufn(port, ds.GetString(), ds.GetLenght());
//---Обработка ответа---//
ds=">00EA"; // Получили такой ответ
unsigned int ui=0; // сюда запишется результат
if(!ds.ProcessDINResponse(ui)) // Обрабатываем
{
// Неверный ответ
} else
{
// Все ок.
// ui == 234 (0xEA)
}