Помогите синхронизировать VISA

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
Alcamo
interested
interested
Сообщения: 2
Зарегистрирован: 05 ноя 2017, 19:58
Репутация: 0
Версия LabVIEW: 2015
Контактная информация:

Помогите синхронизировать VISA

Сообщение Alcamo »

Здравствуйте.
У меня есть ардуино Мега . Я к нему подключил энкодер и пытаюсь получить с него сигнал в Labview для построения системы управления. В ардуино я залил код для энкодера:

Код: Выделить всё

/* Rotary encoder with attachInterrupt

Counts pulses from an incremental encoder and put the result in variable counter.
Taking also into account the direction and counts down when the rotor rotates in
the other direction.

This code is used attachInterrupt 0 and 1 which are pins 2 and 3 moust Arduino.
For more information about attachInterrupt see:
http://arduino.cc/en/Reference/AttachInterrupt
 
created 2014
by Ben-Tommy Eriksen

https://github.com/BenTommyE/BenRotaryEncoder
 
*/

// Encoder connect to digitalpin 2 and 3 on the Arduino.

int counter = 0;  //This variable will increase or decrease depending on the rotation of encoder

void setup() {
  Serial.begin (9600);
 
  pinMode(2, INPUT);           // set pin to input
  pinMode(3, INPUT);           // set pin to input
 
  digitalWrite(2, HIGH);       // turn on pullup resistors
  digitalWrite(3, HIGH);       // turn on pullup resistors
 
 
  //Setting up interrupt
  //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
  attachInterrupt(0, ai0, RISING);
 
  //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
  attachInterrupt(1, ai1, RISING);
}

void loop() {
  // Send the value of counter
  Serial.println (counter);

}

void ai0() {
  // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
  // Check pin 3 to determine the direction
  if(digitalRead(3)==LOW) {
    counter++;
  }else{
    counter--;
  }
}

void ai1() {
  // ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
  // Check with pin 2 to determine the direction
  if(digitalRead(2)==LOW) {
    counter--;
  }else{
    counter++;
  }
}


Далее при помощи VISA я получаю сигнал в Labview.

Но мне необходимо задавать также программные траектории (например синусоиду), строить регулятор и прочее. Я пытаюсь сделать это в одном loop. Но при попытке сгенерить синусоиду в реальном времени и зачитать VISA ничего не получается. У меня это получается только в раздельных Loop. В одном же Loop я вижу свою синусоиду, но сигнал с энкодера замирает и через какие-то промежутки времени выдает разные значения с большими задержками.

Вопрос: Как мне подружить это дело? синхронизировать эти 2 сигнала, чтобы к ним можно было применять всякую разную математику в дальнейшем.
Прилагаю VI.
Вложения
encoder2.vi
(58.62 КБ) 116 скачиваний

Alcamo
interested
interested
Сообщения: 2
Зарегистрирован: 05 ноя 2017, 19:58
Репутация: 0
Версия LabVIEW: 2015
Контактная информация:

Re: Помогите синхронизировать VISA

Сообщение Alcamo »

Когда я нажимаю 'Simulate acquision timing' в блоке симуляции синуса, то синус показывается в реальном времени, а данные с VISA вообще не идут. Но если я переключу в блоке на Run as fast as possible, то данные с VISA идут нормально, а синус очень быстро пролетает. Что мне с этим делать?

bartex
user
user
Сообщения: 73
Зарегистрирован: 14 апр 2014, 21:09
Репутация: 0
Версия LabVIEW: 2015
Откуда: Санкт-Петербург

Re: Помогите синхронизировать VISA

Сообщение bartex »

Alcamo
Что мне с этим делать?


Попробуйте поменять настройки в блоке симуляции синуса.
Во всяком случае, у меня заработало, правда я вместо энкодера
на 2 и 3 ногу Ардуино вешал кнопки :think:
Вложения
Энкодер2.PNG
encoder2-1.vi
(38.86 КБ) 94 скачивания

Alex Dem
assistant
assistant
Сообщения: 109
Зарегистрирован: 06 май 2015, 22:24
Репутация: 0
Версия LabVIEW: 2014, 2018
Контактная информация:

Re: Помогите синхронизировать VISA

Сообщение Alex Dem »

Alcamo, попробуйте организовать чтение из порта, как в примере.
Вложения
Безымянный.png
Безымянный.png (9.35 КБ) 4754 просмотра

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1922
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Помогите синхронизировать VISA

Сообщение Borjomy_1 »

Сколько раз повторять... Не используют "Bytes at Port" при работе с терминальным символом! Забудьте вы эту функцию!

Blackman

Activity
leader
leader
Сообщения: 931
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Помогите синхронизировать VISA

Сообщение Blackman »

Borjomy_1 писал(а):Сколько раз повторять... Не используют "Bytes at Port" при работе с терминальным символом! Забудьте вы эту функцию!

Пусть в порт принято 8 байт SOS\nHELP :help:
1. Проверяем BytesAtPort=8
2. Функция чтения 8-ми байтов возвращает 4 байта SOS\n
3. Проверяем BytesAtPort=4
4. Функция чтения 4-х байт возвращает 4 байта HELP
5. Проверяем BytesAtPort=0
6. Функция чтения 0 байт возвращает 0 байтов - пустая строка и т.д.
И где здесь "криминал"? :wink:

Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Репутация: 0
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Помогите синхронизировать VISA

Сообщение Vitekkz88 »

"Всё зависит от задачи и требований!" - универсальное заклинание на случай важных переговоров :crazy:
Вложения
Cat.png
Cat.png (17.54 КБ) 4711 просмотров
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3508
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: Помогите синхронизировать VISA

Сообщение dadreamer »

Я в новых проектах перестал использовать Bytes At Port. Но иногда возникают другие "грабли" - если таймаут операций чтения-записи делать меньше 300 мс, начинают теряться символы в пакетах. Хотя на 9600 должно всё стабильно доходить. Такое даже с дублирующей сессией. А с Bytes At Port такого почему-то не происходит.

Кстати, ТС решил уже свою проблему - перешёл на LIFA. В личке написал.

bartex
user
user
Сообщения: 73
Зарегистрирован: 14 апр 2014, 21:09
Репутация: 0
Версия LabVIEW: 2015
Откуда: Санкт-Петербург

Re: Помогите синхронизировать VISA

Сообщение bartex »

Сейчас ради любопытства сравнил частоты обмена данными (LoopRate) для LINX и VISA при работе с Ардуино UNO (с генератором синусоиды внутри цикла - чтобы из темы не выпасть)

LINX при опросе 2 каналов - примерно 165 Гц
VISA при совместной работе со скетчем из начала темы - примерно 320 Гц
Эх, было бы у LINX хотя бы 1000 Гц, цены бы ей не было :)
Вложения
LoopRate.PNG

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1922
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Помогите синхронизировать VISA

Сообщение Borjomy_1 »

В драйвере порта установите размер фифо буфера на прием равный 1, а не 16, как по умолчанию. Это уменьшает задержки обмена.

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1922
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Помогите синхронизировать VISA

Сообщение Borjomy_1 »

Blackman писал(а):
Borjomy_1 писал(а):Сколько раз повторять... Не используют "Bytes at Port" при работе с терминальным символом! Забудьте вы эту функцию!

Пусть в порт принято 8 байт SOS\nHELP :help:
1. Проверяем BytesAtPort=8
2. Функция чтения 8-ми байтов возвращает 4 байта SOS\n
3. Проверяем BytesAtPort=4
4. Функция чтения 4-х байт возвращает 4 байта HELP
5. Проверяем BytesAtPort=0
6. Функция чтения 0 байт возвращает 0 байтов - пустая строка и т.д.
И где здесь "криминал"? :wink:

Криминал в том, что нет никакой гарантии, что в момент опроса bytes at Port придет вся посылка.
Не надо путать теплое с мягким. Если протокол с терминальным символом, то никакого bytes at Port. Если протокол допускает и без терминального, то программисту надо отрывать руки. Хрень на придумывают, а потом героически борятся.

Ответить

Вернуться в «Коммуникация с приборами»