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