Помогите разобраться с CIN

ActiveX, .NET, DLL
Volley
beginner
beginner
Сообщения: 11
Зарегистрирован: 22 дек 2008, 17:17
Версия LabVIEW: 8.5
Контактная информация:

Помогите разобраться с CIN

Сообщение Volley »

в примерах по испольхованию CIN (Code Interface Node) нужно загружать код в формате .lsb, а имеется стандартный файл Си, помогите разобраться.
Заранее спасибо
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: помогите разобраться с CIN

Сообщение Eugen Graf »

Не парься с CINом, сделай DLL.
Volley
beginner
beginner
Сообщения: 11
Зарегистрирован: 22 дек 2008, 17:17
Версия LabVIEW: 8.5
Контактная информация:

Re: помогите разобраться с CIN

Сообщение Volley »

тогда, пожалуста, пример по созданию DLL в LabVIEW?
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: помогите разобраться с CIN

Сообщение mzu2006 »

присоединяюсь. Если версия :labview: не меньше чем 8.2, то смысла делать CIN мало. И даже в случае предыдущих версий, если не используешь навороты вроде CINLoad, CINAbort, CINUnload и своего CIN Dataspace, то всё равно лучше делать dll.

А если всё-таки надо использовать, то здесь лежит wizard, автоматически делающий CIN-проекты из сенерированных :labview: сишников. Wizard написан для Visual Studio 2003/05.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: помогите разобраться с CIN

Сообщение mzu2006 »

Volley, dll в LabVIEW или dll для последующего использования в LabVIEW, пожалуйста конкретизируй
Volley
beginner
beginner
Сообщения: 11
Зарегистрирован: 22 дек 2008, 17:17
Версия LabVIEW: 8.5
Контактная информация:

Re: помогите разобраться с CIN

Сообщение Volley »

Извиняюсь за неккоректный вопрос, имелось ввиду не использование готовых DLL, а создание новых из LabVIEW
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4412
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 11 раз
Поблагодарили: 3 раза
Контактная информация:

Re: помогите разобраться с CIN

Сообщение Pavel Krivozubov »

Volley писал(а):тогда, пожалуста, пример по созданию DLL в LabVIEW?
если все же это создание ДЛЛ в других средах, то вот эта тема тебе поможет. я там выкладывал рук-во, как чего делать.
/viewtopic.php?f=52&t=784&hilit=%D0%B1%D0%BB%D0%B0%D0%B3%D0%BE%D0%B4%D0%B0%D1%80%D1%87%D0%B8%D0%BA

ну и для соответствия типов данных С++ и LabVIEW смотри пример Call Dll
Volley
beginner
beginner
Сообщения: 11
Зарегистрирован: 22 дек 2008, 17:17
Версия LabVIEW: 8.5
Контактная информация:

Re: помогите разобраться с CIN

Сообщение Volley »

И еще хотельсь бы все -таки ответ на мой первй вопрос, это у меня одного такие проблемы или действительно в стандартных эксемплах представлен код Си а программа требует файл в формате .lsd
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: помогите разобраться с CIN

Сообщение mzu2006 »

Indey, Volley, похоже, вообще не про то.
Volley писал(а):имелось ввиду не использование готовых DLL, а создание новых из LabVIEW
Давай конкретизируем.
1. CIN node а также call library node предназначены для включения кода, написанного на текстовом языке (C, например) в :labview:. Т.е. есть сишный код, хотим вызвать его из :labview:
2. Application Builder предназначен для создания DLL (и приложений) из уже готового кода написанного на :labview: для включения в другие проекты. Т.е. есть :labview: код, хотим вызвать его из С.

Ты имел в виду второе, так?

.lsb (не .lsd :haha: ) это то во что преобразуется dll, созданная специальным образом, чтобы быть загруженной в CIN node. Т.е. это про первый случай.

Ещё раз мой вопрос: тебя интересует первое или второе?
Avant_Guard
beginner
beginner
Сообщения: 11
Зарегистрирован: 12 фев 2013, 09:46
Версия LabVIEW: 9.0
Контактная информация:

Re: Помогите разобраться с CIN

Сообщение Avant_Guard »

Хотел бы поднять тему с аналогичной проблемой:
Как, все-таки создавать файл *.lsb для CIN (Code Interface node)? В стандартной справке LabView совершенно непонятно как это делается:
http://zone.ni.com/reference/en-XX/help ... in_source/
Может кто-то объяснить более подробно?
А ноги вот откуда растут, чтобы не вдаваться в подробности почему надо делать именно CIN а НЕ DLL, связанная тема на этом форуме:
http://www.labviewportal.org/viewtopic. ... 000#p32719
Если уже есть налаженное решение с CIN, то я бы не стал переписывать его через DLL без особых на то причин

Как раз там есть несколько примеров с CIN, Все они успешно у меня работают.
Сам я взял допилил один из существующих кодов *.c (которые потом преобразуются в *.lsb) для своих задач, благо не пришлось много переделывать.

И теперь вопрос такой: Как из него сделать *.lsb, чтобы потом вызвать из LabView через CIN?
Надеюсь на скорый ответ, буду мониторить тему.
Avant_Guard
beginner
beginner
Сообщения: 11
Зарегистрирован: 12 фев 2013, 09:46
Версия LabVIEW: 9.0
Контактная информация:

Re: Помогите разобраться с CIN

Сообщение Avant_Guard »

Я смотрю тема просматривается, но как сделать пока никто не знает.
Вот что еще мне удалось откопать: http://zone.ni.com/devzone/cda/epd/p/id/2690
Generating a Makefile for CINs with LabVIEW
This vi prompts the user for the Code Interface Node (CIN) and then automatically generates the makefile. The makefile is created and saved in the same directory as the CIN. This program will automatically create a makefile for an existing CIN. The C code file must have a *.c or *.cpp extension. The vi does not check to make sure you have selected a valid CIN. This VI will not create makefiles that can be used to generate LV external subroutines. This example will work in LabVIEW 5.0.x and above and generates makefiles for use with MS Visual C++ 5.0 and up.
Товарищи, помогите открыть (там версия 5.0), что там внутри? К сожалению файл сюда не могу прикрепить. Может удастся переделать в более новых версиях LV?
Avant_Guard
beginner
beginner
Сообщения: 11
Зарегистрирован: 12 фев 2013, 09:46
Версия LabVIEW: 9.0
Контактная информация:

Re: Помогите разобраться с CIN

Сообщение Avant_Guard »

А ну вот собственно, чтобы туда не лазить далеко. (Нашел как это делается тут)
Вложения
cin_mak.vi
(86.35 КБ) 188 скачиваний
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Помогите разобраться с CIN

Сообщение mzu2006 »

lsb получается из dll путем её обработки специальной программой.

В своё время я написал wizard, устанавливающийся под VS.2003, который создавал новый тип проектов: CIN. Скачать можно здесь: http://code.google.com/p/cinwizardvs2003labview/ Там же моя статья в LTR с инструкцией по инсталляции и применению.

Вот тоже полезная ссылка: http://www.ni.com/white-paper/3435/en
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3710
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2021
Благодарил (а): 4 раза
Поблагодарили: 52 раза
Контактная информация:

Re: Помогите разобраться с CIN

Сообщение dadreamer »

Avant_Guard

Можно также компилировать CIN в Microsoft Visual Studio 2005 и выше. Для этого нужно настроить проект таким образом:

Project -> Properties:

вкладка Configuration Properties -> General:
изменить значение параметра "Use Of MFC" с "Use MFC in a Shared DLL" на "Use Standard Windows Libraries"

вкладка Configuration Properties -> C/C++ -> General:
1) изменить значение параметра "Additional Include Directories" с [пусто] на "$(CINTOOLS_DIR)"
2) изменить значение параметра "Detect 64bit Portability Issues" с "Yes (/Wp64)" на "No"

вкладка Configuration Properties -> C/C++ -> Code Generation:
1) изменить значение параметра "Runtime Library" с "Multi-threaded Debug DLL (/MDd)" на "Multi-threaded DLL (/MD)"
2) изменить значение параметра "Struct Member Alignment" с "Default" на "1 Byte (/Zp1)"
3) изменить значение параметра "Buffer Security Check" с "Yes" на "No"

вкладка Configuration Properties -> C/C++ -> Precompiled Headers:
1) изменить значение параметра "Create/Use Precompiled Header" с "Use Precompiled Header (/Yu)" на "Not Using Precompiled Headers"
2) изменить значение параметра "Create/Use PCH Through File" с "StdAfx.h" на [пусто]
3) изменить значение параметра "Precompiled Header File" с "$(IntDir)\$(TargetName).pch" на [пусто]

вкладка Configuration Properties -> C/C++ -> Advanced:
1) изменить значение параметра "Compile As" с "Compile as C++ Code (/TP)" на "Default"

вкладка Configuration Properties -> Linker -> General:
1) изменить значение параметра "Suppress Startup Banner" с "Yes (/NOLOGO)" на "No"
2) изменить значение параметра "Additional Library Directories" с [пусто] на "$(CINTOOLS_DIR)"

вкладка Configuration Properties -> Linker -> Input:
1) изменить значение параметра "Additional Dependencies" с [пусто] на "cin.obj labview.lib lvsb.lib"
2) изменить значение параметра "Ignore Specific Library" с [пусто] на "MSVCRTD"
3) изменить значение параметра "Module Definition File" с ".\SampleCIN.def" на "$(CINTOOLS_DIR)\lvsbmain.def"

вкладка Configuration Properties -> Custom Build Step -> General:
1) изменить значение параметра "Command Line" с [пусто] на ""$(CINTOOLS_DIR)\lvsbutil" -c "$(TargetName)" -d "$(OutDir)""
2) изменить значение параметра "Outputs" с [пусто] на "$(OutDir)$(TargetName).lsb"

поле Configuration в левом верхнем углу окна SampleCIN Property Pages:
1) изменить значение поля с "Active(Debug)" на "Release"
2) повторить вышеописанные действия

Перед компиляцией следует создать переменную среды CINTOOLS_DIR, содержащую путь к папке с заголовочными файлами LabVIEW, например C:\Program Files (x86)\National Instruments\LabVIEW 2011\cintools__. Для LabVIEW 2011/2012 лучше не использовать уже имеющуюся папку cintools в каталоге LabVIEW, а создать рядом новую, например cintools__, и поместить туда файлы из вложения в этом сообщении. Это необходимо, т.к. начиная с LV 2010 CIN не поддерживается NI (хотя и работает внутри vi) и из директории cintools удалена часть файлов. Кроме того, в палитре виртуальных инструментов нет иконки CIN, но её можно туда добавить с помощью подпалитры adv.mnu из старых версий LV (см. вложение). Почитайте ещё мануалы Using External Code in LabVIEW и LabVIEW Advanced Course, там есть много примеров по работе с CIN.
cin_to_lv.rar
(325.82 КБ) 169 скачиваний
mnu.zip
иконка для палитры
(470 байт) 132 скачивания
Дополню этот мануал ещё одним важным замечанием. На нижеописанные грабли сам наступал несколько раз, т.к. информация со временем забывается, поэтому это стоит запомнить. При компиляции DLL для CIN'а в MS Visual Studio 2005 внутрь библиотеки "зашивается" манифест, содержащий зависимости от стандартных библиотек VC++. Если DLL построена в Release-конфигурации, то манифест будет такого вида:

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

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>
Если же конфигурация была Debug, то манифест будет выглядеть так:

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

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>
Как видим, в этом случае библиотека зависит от отладочных (debug) библиотек Microsoft Visual C Run-Time, которые идут вместе со средой Visual Studio. Если эту DLL перенести на ПК, где нет MS Visual Studio, то она работать не будет! Это означает, что она не захочет грузиться ни в LabVIEW (через узел Call Library Function Node), ни в какой-либо другой среде (через LoadLibrary, например). Соответственно, и узел Code Interface Node окажется не работоспособен, а :labview: выдаст сообщение:
Code Interface Node: LabVIEW subroutine link error
The external subroutine could not be found
Code Interface Node: object code is not loaded
This Code Interface Node has no code to execute. Right-click the node, select Load Code Resource from the shortcut menu, and select the object code file (.lsb)
Решений тут может быть несколько:
1. Поменять конфигурацию билда DLL в MS Visual Studio с Debug на Release и откомпилированную библиотеку (VI с CIN'ом) уже поместить на целевую машину;
2. Установить на целевой компьютер MS Visual Studio или Visual C++ 2005 Express Edition;
3. Создать в MS Visual Studio инсталлер для DLL - способ, конечно, малопригодный для одной маленькой библиотеки;
4. Отредактировать в HEX-редакторе саму библиотеку (точнее, манифест внутри неё) (пробовал и вроде как работает), то есть, нужно заменить строку
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
на строку
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
(Проще всего аккуратно поменять DebugCRT на CRT, а оставшееся место затереть пробелами, чтобы размер файла не изменился.)
5. Перейти на другой компилятор (MinGW, старый VC 7.1 или 2003, новые версии Visual Studio);
6. Переносить на целевой ПК все манифесты и библиотеки, от которых зависит компилируемая DLL.

Подробно эта история с манифестами обсуждалась на форуме NI, здесь, здесь, частично тут, тут и ещё много где, гугл в помощь.
Последний раз редактировалось dadreamer 15 апр 2015, 20:03, всего редактировалось 2 раза.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Помогите разобраться с CIN

Сообщение mzu2006 »

Полное и подробное описание. Рекомендую! CIN Wizard делает почти всё вышеперечисленное + немного форматирует C код.

Теперь по сути:
0. Не рассказано с какого проекта начать. Win32->DLL->Additional Settings->Empty project
1 Нужно осветить вопрос как туда включить код, сгенерированный LabVIEW по CIN->RMB->Generate C Code

+ Есть несколько лишних вещей:
1. Configuration Properties -> General: лишнее при правильном выборе проекта (как указано выше)
2. Buffer Security Check, Detect 64 bit portability, Supress Startup Banner - по желанию
3. Precompiled Headers не мешает сборке CIN, даже помогает, если Вы привыкли пользоваться MSVC.
dadreamer писал(а):в палитре виртуальных инструментов нет иконки CIN
Она есть в путях поиска даже в 2012. CTRL-SPACE -> Code interface Node. Её не обязательно переносить из предыдущих версий.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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