вы число 200 вставили на вход "количество байт". Таким образом функция "VISA Read" не выйдет, пока не придут все 200 байт либо по таймауту. При таймауте на выходе Error Out будет ошибка. Включите трассировку и увидите. если вы точнео знаете, сколько байт должно вернуться, то вместо 200 напишите. И как минимум 1 символ нужно послать. Дальше - что у вас посылает контроллер - данные в виде байт (BIN) или символьную строку. Если в виде байт, то это 2 байта (прикладываю ВИшку). И в цикл нужно вставить Wait until next ms (Метроном) и число 100 на вход. (Это задержка повтора цикла)
Спасибо, буду разбираться.
К примеру у меня есть готовый проект (по работе), который включает как раз такую связку (40*DS18B20 - ATmega16 - RS485 - LabView (графики, расчёты средних значений, запись в БД, експорт в Ексель)). Но всё это выкладывать... Во-первых накладно, а во вторых - это коммерческий проект.
Гм. Круто. Надеюсь, мой некоммерческий проект выльется во что-то похожее.
orinoko писал(а):вы число 200 вставили на вход "количество байт". Таким образом функция "VISA Read" не выйдет, пока не придут все 200 байт либо по таймауту. При таймауте на выходе Error Out будет ошибка. Включите трассировку и увидите. если вы точнео знаете, сколько байт должно вернуться, то вместо 200 напишите. И как минимум 1 символ нужно послать. Дальше - что у вас посылает контроллер - данные в виде байт (BIN) или символьную строку. Если в виде байт, то это 2 байта (прикладываю ВИшку). И в цикл нужно вставить Wait until next ms (Метроном) и число 100 на вход. (Это задержка повтора цикла)
К примеру у меня есть готовый проект (по работе), который включает как раз такую связку (40*DS18B20 - ATmega16 - RS485 - LabView (графики, расчёты средних значений, запись в БД, експорт в Ексель)). Но всё это выкладывать... Во-первых накладно, а во вторых - это коммерческий проект.
orinoko писал(а):Хотелось бы попросить Администратора, чтобы он разрешил добавлять файлы типа *.vi А то упаковка - это лишнее телодвижение. А это файл неисполняемый. Исходник, так сказать.
не надо упаковывать- достаточно заменить расширение на допустимое, и в заголовке сообщения указать - на какое расширение заменить при просмотре.
Для начала я бы посоветовал всё таки внимательно почитать уроки по LV. Начать изучение LV я бы посоветовал с "LabVIEW Basic I Course". Он на русском. Можно найти. И также есть цикл уроков журнала Пикад. Можно скачать с сайта Пикада. Я, конечно, понимаю, что руский человек инструкцию читает только в двух случаях - когда нечего читать и когда всё сломалось. . Программирование на LV отличается от текстовых языков. Нельзя применять их методы к LV.
А теперь к вашему терминалу. Во-первых, всегда (как правило) используйте провод ошибки. Таким образом всегда можно узнать где и что случилось и сама программа будет меньше глючить. Потому что если в предыдущем блоке произошла ошибка, то и последующие об этом будут знать и не выполнять критические части своей программы. А так как у вас - независимо от возникшей ошибки следующие блоки пытаются отработать. Дальше - у вас два отдельных референса на один порт. Так работать не будет. Изучите внимательно сначала примеры. Главное - понять, а не бездумно скопировать.
И ещё. Опишите, что должен делать терминал. Что он должен получить в ответ.
Во вложении вариант терминала для приёма эха. Нужно соединить 2 и 3 ножки СОМ-порта.
Начинаем с датчиков. У меня используется на все датчики 3 вывода порта С, таким образом имеем три группы датчиков. Линии подтянуты к +5В резистором 3,3 кОм. Соединение только по 3-проводному кабелю (общий, +5В, данные). Длина кабеля может достигать 10-15 метров. Идеально подходит UTP, а ещё лучше STP.И экран подключить к общему проводу. Обращение к датчикам происходит по их серийным номерам. Считывать их можно, подключая один на линию, и подавая команду «READ_ROM» (0х33). Полученные 8 байт нужно запомнить и они в такой же последовательности и должны передаваться при запросах. Все серийные номера датчиков и номер канала, к которому он подключен, хранятся в EEPROM.
Так как у нас датчиков много, то обмен с ними не должен мешать остальным функциям МК. Сначала для каждого датчика подаём команду «CONVERT» (0x44). Взводим таймер на 800 мс. По прерыванию этого таймера начинаем читать данные с каждого датчика и запоминаем в памяти. По окончании взводим таймер на время паузы между измерениями (200-500 мс). После чего всё повторяется.
Конечно, если у вас всего один датчик, то и городить этот пароход не имеет смысла.
А теперь попробуем МК сконнектить с LV. Сначала определимся хоть с каким ни каким протоколом обмена. Будем сразу приучаться к методу "запрос-ответ". Упростим задачу. Компьютер должен послать команду - пусть это будет "Т" (английское). В ответ МК должен послать пакет о температурах всех датчиков. Данные одного датчика занимают 4 байта (у меня так) 1-й байт - порядковый номер, 2-й байт - состояние датчика, 3 и 4 байты - температура (как принято от самого датчика). Мы не будем пока заморачиваться с адресацией и обойдёмся без расчёта CRC.
Теперь наша задача в LV:
1. Послать запрос.
2. Принять весь пакет.
3. Раскидать в массив температур
это для начала...
Вот набросал для начала процесс обмена LV с внешним устройством (нашим контроллером). Исходник и картинку диаграммы (кто просто хочет поглядеть).
А теперь я буду ждать высказываний от заинтересованных товарищей. А то что-то все замолчали.
Что касается протокола - то в 90% случаев это сугубо личное представление данных.
Основной задачей протокола является формализация представления информации. Протокол в данном случае выступает правилом кодирования, передачи, приема и декодирования информации.
Условно протоколы можно разделить на бинарные и текстовые.
Сами протоколы состоят из информативной и служебной частей.
Служебная часть отвечает за признаки начала передачи, разделители и окончания. В качестве окончаний часто выступают т.н. контрольные суммы.
Все данные помещаются в информативную часть.
Данные в бинарном протоколе предсталяются более короткими нежели в текстовых.
Для примера. Пусть желаем передать значение в пределах от 0 до 100. В бинарном представлении данные займут 1 байт, точнее 7 бит.
В текстовом представлении потребуется уже 3 байта - по одному на символ.
Ну и напоследок, хочется заметить, что формирование контрольной суммы в текстовых протоколах, желательно представлять текстом, а не бинарными данными (иногда бывает и так).
наверное на этом ликбез по протоколу можно считать завершенным.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Meteor, спасибо помощь в объяснениях! Реализация протокола - сугубо личное. Хочу также отметить, что свой пример я привёл для того, чтобы можно было при расшифровке пакета в LV на что-то опираться, на конкретный пример, а не рассказывать о сферических символах в вакууме
Завтра продолжим формировать данные в LV
мне необходимо получать данные либо в бинарном либо в 16-ричном коде.
Управляющее значение необходимо задавать в десятичном, потом кодировать в 2х8 бит бинарного.
С помощью каких функций это лучше сделать?
foxit писал(а):
Расскажите про программу МК и как все данные упаковывать с помощью протокола.
В МК должен быть выделен буфер для хранения данных о температурах каждого датчика(это 1 и 2 принятые байты от датчика) и его состоянии (всего по 4 байта на датчик). Состояний у датчика может быть два - есть датчик(напр. 0x00) и нет датчика (напр. 0x7F). В процессе опроса датчиков это буфер заполняется значениями. по команде от компьютера весь этот буфер просто отсылается без изменений. Ничего упаковывать не надо. Я бы показал свою реализацию, но во-первых, у меня всё на асме, а во-вторых, протокол у меня более расширенный и с наскока там непонятно совсем. Но идея такая же. Но только я заполняю буфер передачи перед отсылкой, собирая данные последовательно в кучу. И по прерываниям "UDR_Empty" отсылаю весь буфер, по мере отсылки идёт расчёт CRC16, после отсылки всего буфера досылаю 2 байта CRC.
Roman Venom писал(а):мне необходимо получать данные либо в бинарном либо в 16-ричном коде.
Управляющее значение необходимо задавать в десятичном, потом кодировать в 2х8 бит бинарного.
С помощью каких функций это лучше сделать?
То есть вам нужно отослать с компьютера двухбайтное число в виде двух отдельных байтов?
То есть вам нужно отослать с компьютера двухбайтное число в виде двух отдельных байтов?
Ну я рассматриваю 2 варианта. Либо посылка десятичного байта, а потом его кодирование в двухбайтное уже в МК, либо кодирование в лабвью и отправка уже 2х8 байт.