Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Программирование WinCon i7188

 Ответить Ответить
Автор
Сообщение
Arm Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 23 Январь 2010
Online Status: Offline
Публикации: 27
Свойства публикации Свойства публикации   Ответить, цитируя автора - Arm Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Программирование WinCon i7188
    Опубликовано: 16 Август 2010 07:53

Добрый день может кто может подсказать где можно найти описание функций используемых в WinCon? В стандартном manual приведены только несколько примеров и то не понятно как работающих!!! Или ответить на вопросы:

1. Для отправки двоичного числа 0000100000001000 на порт мне достаточно написать следующие строки:

char data[4]="0808";

InstallCom(port,57600L/*(Кстати почему L)*/,8,0,1);

Set485DirToTransmit(4);

for(i=0;i<4;i++)

ToCom(port,data);

WaitTransmitOver(4);

Set485DirToReceive(4);

RestoreCom(4);

2. Чтобы получить данные достаточно написать:


InstallCom(port,57600L,8,0,1);

if(IsCom4())

{

data=ReadCom4();

}

RestoreCom4();

И что будет записанно в переменной data на сколько я понял все 8 принятых на Com порт байт???

В таком случае какой тип должен быть у переменной data??? И как потом обрабатывать полученные данные???

Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Август 2010 12:45

1. Описание функций см. на фирменном диске в файле \Napdos\MiniOS7\Document\MiniOS7_API_Functions_ver?.?.pdf

2. Описанный алгоритм, по идее, должен отправить не двоичное число, а последовательность символов '0', '8', '0', '8'. Но у вас он отправит неизвестно что из-за ошибки в вызове ToCom. Должно бытьтак:

ToCom(port,*data++);

3. Ваш вариант приема примет только 1 байт, при его наличии в буфере приема... и не сможет его никуда записать. Нормальный компилятор не должен пропустить такое:

char data[4];

/*...*/

data = /*любое выражение */

Опять-таки, нужно разыменовывать указатель.

То есть для приема вам нужно время от времени проверять наличие данных в порту (IsCom4()), при их наличии складывать байты в массив (например, так: *data++ = ReadCom4(); ), и параллельно отслеживать признак окончания приема. По достижению этого признака, обработать накопленные данные в массиве data. Тип у массива data должен быть char или unsigned char, размер должен быть достаточен для приема самой длинной из возможных посылок. Как обрабатывать - зависит от того, какие данные вы принимаете.

Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Август 2010 12:48
Ах, да, L означает, что число представляет собой long int
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Август 2010 05:18

Confused вот что бывает, когда пишешь что-то второпях

Для того, чтобы писать/читать что-то из массива с помощью указателя, надо создать отдельную переменную-указатель:

char data[4];

char* pc = data;

//Передача очередного байта в СОМ-порт

ToCom(port,*pc++);

/* ..... */

//Прием очердного байта

*pc++ = ReadCom4();

Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
Arm Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 23 Январь 2010
Online Status: Offline
Публикации: 27
Свойства публикации Свойства публикации   Ответить, цитируя автора - Arm Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Август 2010 05:30

На сколько я понял данные в приведенном тобой примере записываються обратно в массив data или я не прав???

В примере такого небыло. Я уже давно понял что там многое не так написано!!!                

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

Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Август 2010 07:17

Да, тот кусок кода, что я привел будет работать с одним и тем же массивом. Пример из последнего поста (как и твои предыдущие примеры) можно рассматривать только как примеры синтаксиса вызова функций. Для полноценной процедуры обмена нужно сделать много чего еще...

А теперь конкретно - как отправить двоичное число:

unsigned short int byData = 0x0808;

char* pc = (char*) &byData;

//дальше берем твой исходный код с минимальными изменениями:

InstallCom(port,57600L,8,0,1);

Set485DirToTransmit(4);

for(i=0;i<4;i++)

ToCom(port,*pc++);

WaitTransmitOver(4);

Set485DirToReceive(4);

RestoreCom(4);

Вроде должно работать Cool Надо только помнить, что место функциям типа InstallCom() там, где идет инициализация программы (т.е. вызывать Install... /Restore... надо только один раз в ходе работы программы, или если в процессе работы надо изменить параметры порта  - скорость, биты данных и т.д.)

Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
casey Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 19 Июль 2005
Категория: Ukraine
Online Status: Offline
Публикации: 39
Свойства публикации Свойства публикации   Ответить, цитируя автора - casey Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Август 2010 09:16

Небольшая поправка. По идее т.к. sizoef(short int)==2, то должно быть

for(i=0;i<2;i++)

ToCom(port,*pc++);
Наверх
MuadDib Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Июль 2006
Online Status: Offline
Публикации: 304
Свойства публикации Свойства публикации   Ответить, цитируя автора - MuadDib Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Август 2010 09:32
Первоначально опубликовано casey

Небольшая поправка. По идее т.к. sizoef(short int)==2, то должно быть

for(i=0;i<2;i++)

ToCom(port,*pc++);

Действительно, я пропустил этот момент. 0x0808 умещается в 2 байта

Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Август 2010 21:51

Тут вроде не видно очень важных функций для приема данных, без которых нормальной работы не будет, а сплошная морока.

Перед чтением данных нужно проверить что накопилось в буфере приема (после  InstallCom  драйвер работает автоматически).  Есть две функции:  IsCom(port)  и  DataSizeInCom(port).  Какую из них применять, надо прикинуть по месту.  Если цикл опроса быстрый и данные приходят неспеша - то удобна  IsCom()  которая проверяет один байт.  Наоборот, когда цикл медленный и ожидается напор байтов - нужна  DataSizeInCom() ,  она проверяет сразу блок. После проверки дату надо сразу читать, а то насыпет еще.

Кроме того надо организовать буфер с динамическими указателями записи и чтения.  Обычно это кольцевой буфер размером 256, 512, 1024 и т.д. байт.  При чтении данные кладуться в буфер и указатель записи передвигается на число байт.  Указатель чтения смотрит на сколько он отстал, и догоняет указатель записи.  Главно чтобы общая средняя скорость заполнения буфера не превышала скорость извлечения данных, т-е указатель чтения всегда должен догонять запись. Ну а если и переполнится, не беда - буфер то кольцевой.

С форматом данных разберитесь сами, это мелочь.

С уважением,SAN

Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz