Project

General

Profile

Feature #1227

NI HS-GPIB-USB review

Added by tin over 7 years ago. Updated over 7 years ago.

Status:
Closed
Priority:
High
Assignee:
Category:
Article
Start date:
07/24/2015
Due date:
08/16/2015
% Done:

100%

Estimated time:

Description

Существует огромное множество измерительных приборов и механизмов для решения как лабораторных так и производственных задач.Часто процесс измерения похож на рутину - тысячи измерений, сотни условий, десятки режимов. Доверять такие задачи человеку нельзя - результат будет непредсказуем, необходима автомотизация процесса измерения.Для управления процессом измерения и удаленного получения данных с прибора используют интерфейсы связи.Фактически стандатным интерфейсом систем измерения в промышленности является IEEE-488 GPIB.
"Описание интерфейса GPIB" https://ru.wikipedia.org/wiki/IEEE-488#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5

Сегодня интерфейс GPIB медленно заменяется более современными USB, Ethernet. Однако, для управления имеющимися в распоряжении приборами по-прежнему требуется наличие GPIB-контроллера для выполнения задач контроля и управления.

В большенстве случаев, для связи сприбором используется обычный ПК в настольном либо промышленном исполнении, под управлением Windows или Linux систем, и совсем редко MAC OS. Большинство производителей поддерживают интерфейс GPIB с помощью отдельных утилит и библиотек для своих программных продуктов.

Использование GPIB совместно с стандартным адаптером GPIB-USB не вызывает проблем или затруднений в Windows-среде, в Linux все часто заканчивается многими часами проб и ошибок, если ваш дистрибутив не поддерживается официально, либо нет опыта в использовании библиотек GPIВ. Попробуем разобраться в работе GPIB под Linux на примере популярного микрокомпьютера Raspberry Pi.

Адаптер интерфейса National Instruments GPIB-USB-HS h2.
Рассмотрим подробнее аппаратную часть адаптера интерфейса, который будем использвать. Существует множество версий USB-GPIB адаптеров от National Instruments. Будем использвать GPIB-USB-HS, хотя есть более новая версия адаптера GPIB-USB-HS+, с ценой около ~600 USD.

Документация кратко описвает спецификацию и основные этапы подключения адаптера datasheet.
h3. Особенности адаптера:

  • специализированный ASIC обеспечивает максимальную производительность интерфейса IEEE 488.2
  • высокоскоростной GPIB контроллер
  • подключение к приборам без специального кабеля
  • скорость передачи данных до 1.8 MB/s (IEEE 488.1) и до 7.9 MB/s (HS488)
  • наличие лицензии для NI-488.2

Основной микроконтроллер для связи с USB - Cypress CY7C68013A EZ-USB® FX2LP™ USB Microcontroller High-Speed USB Peripheral Controller построен на ядре 8051.

GPIB часть интерфейса построена на специализировннном ASIC от National Instruments - TNT5004-AB, контроллер может использовать как интерфейсы общего назначения, так и PCI. Увы, документацию можно получить только под NDA, однако доступна документация для аналогичного контроллера TNT5002-AB, которая прольет свет на внутреннее устройство контроллера.
В схеме адаптера также присутствует памятьдля хранения данных Cypress CY7C1399BN 256-Kbit (32K x 8) SRAM. Частота системного генератора 40 МГц.


h2. Структурная схема интерфейсного контроллера.

В схеме адаптера присутствуют микросхемы Texas Instruments TLC7733I и Maxim MAX804CSA супервизоры питания, а также несколько микросхем логики. Монтаж элеметнов печатной платы выполнен с одной стороны, вторая сторона - пуста.

Для сравнения привведем фото предыдущей версии адаптера GPIB-USB-B, которая использует Cypress FX и National Instruments TNT4882C-BT GPIB контроллеры. Документация на контроллер TNT4882*C* так же предоставляется под NDA, но доступна версия TNT4882 без буквы "С" datasheet here

Фото GPIB-USB-HS. Пластиковая крышка с металлизированным покрытием для защиты от ЭМИ.

Достаточно железа, давайте погрузимся в мир Linux.

Проверяем Наличие ПО для Linux - заявлена поддержка RedHat, Scientific Linux and SUSE. В наших планах использование GPIB совместно с Raspberry Pi под управлением Debian.
h2. Raspberry Pi setup

Вся, предоставленная ниже информация проверялась на платформе Raspberry Pi 1 model B revision 2,
использовалось подключение к интерфейсу USB. Версия операционной системы платы RASPBIAN Debian Wheezy, с дополнительными настройками интерфейса I2C описанными в Настройка I2C. если вы хотите установить систему "с чистого листа" на пустую SD карту, рекомендуем воспользоваться описанием: описание установки ОС.

Приводим пошаговую инструкцию по подключению GPIB-USB-HS к Raspberry Pi.
В качестве руководства к действию мы импользовали тему форума "Forum thread on EEVBlog.com" пользователя bingo600. Этот материал оказал большую помошь и позволил сократить время на установку. bingo600 использовал подключение к приборам Beiming S82357 и Agilent 82357B, но основной ход установку аналогичен нашему.

#1 Пред началом установки настоятельно рекомендуется обновить все пакеты. все команды выполняются с правами администратора, иначе необходимо использовать sudo.

pre. apt-get update

#2 Установим образ ядра Linux. Поскольку linux-gpib версии модулей отличаются для разных версий ядра, в нашем случае - версии должны совпаадть. в нашем случае используется версия 3.18.0.

pre. apt-get install linux-image-rpi-rpfv

В каталоге /boot присутствуют два файла initrd.img-3.18.0-trunk-rpi и vmlinuz-3.18.0-trunk-rpi

#3 Для загрузки ядра, отличного от "Foundation kernel" в конец файла boot/config.txt добавим запись:

pre. ****** SNIP ****************
  1. Set params for "raspbian debian-style kernel" boot
    kernel=vmlinuz-3.18.0-trunk-rpi
    initramfs initrd.img-3.18.0-trunk-rpi followkernel

#4 Дважды проверьте имена файлов и их наличие, иначе Raspberry Pi не загрузится. если допущена ошибка - это легко исправить. Достаньке SD карту из слота, поместите ее в ваш РС и измените файл config.txt, он доступен с файловой системы FAT в любой операционной среде, в отличие от остальных linux разделов Raspberry SD карты.

#5 После загрузки проверим версию ядра системы и установим необходимые пакеты:

pre. pi@tin ~ $ uname -a
Linux tin.pi 3.18.0-trunk-rpi #1 PREEMPT Debian 3.18.5-1~exp1+rpi16 (2015-03-28) armv6l GNU/Linux
pi@tin ~ $ sudo apt-get install linux-headers-rpi-rpfv

#6 поскольку мы будем компилировать некоторое ПО позже установим все необходимые для этого библиотеки, что бы убедится что зависимости выполнены правильно.

pre. apt-get install build-essential texinfo texi2html libcwidget-dev tcl8.4-dev tk8.4-dev libncurses5-dev libx11-dev binutils-dev bison flex libusb-1.0-0 libusb-dev libmpfr-dev libexpat1-dev tofrodos subversion autoconf automake libtool

#7. Перейдем непосредственно к инсталяции linux-gpib. Входим в home директорию и запускаем:

pre. root@tin:/home/# mkdir linux-gpib
root@tin:/home/# cd linux-gpib
root@tin:/home/linux-gpib# svn checkout svn://svn.code.sf.net/p/linux-gpib/code/trunk linux-gpib-code
A linux-gpib-code/linux-gpib
A linux-gpib-code/linux-gpib/test
A linux-gpib-code/linux-gpib/test/runtest
...
...
root@tin:/home/linux-gpib# cd linux-gpib-code/linux-gpib/

#8 На этом этапе мы имеем последнюю версию linux-gpib из SVN и мы готовы настроить и установить ее.

pre. root@tin:/home/linux-gpib# cd linux-gpib-code/linux-gpib/
root@tin:/home/linux-gpib/linux-gpib-code/linux-gpib# ./bootstrap
libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
configure.ac:102: installing `./compile'
configure.ac:39: installing `./config.guess'
configure.ac:39: installing `./config.sub'
configure.ac:20: installing `./install-sh'
configure.ac:20: installing `./missing'
examples/Makefile.am: installing `./depcomp'
...
...

#9 linux-gpib использует заголовочные файля ядра, поэтому версия библиотеки и ядра должны совпадать. ДЛя того чтобы убедится, что установка прола успешно выполним:

pre. root@tin:/home/gpib/linux-gpib-3.2.21# apt-get install linux-headers-3.18.0
Reading package lists... Done
Building dependency tree
Reading state information... Done
...
...
The following NEW packages will be installed:
linux-headers-3.18.0-trunk-all linux-headers-3.18.0-trunk-all-armhf
linux-headers-3.18.0-trunk-rpi2
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 857 kB of archives.
After this operation, 6,807 kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
...
...
Fetched 857 kB in 2s (365 kB/s)
Selecting previously unselected package linux-headers-3.18.0-trunk-rpi2.
(Reading database ... 97166 files and directories currently installed.)
Unpacking linux-headers-3.18.0-trunk-rpi2 (from .../linux-headers-3.18.0-trunk-rpi2_3.18.5-1~exp1+rpi16_armhf.deb) ...
Selecting previously unselected package linux-headers-3.18.0-trunk-all-armhf.
Unpacking linux-headers-3.18.0-trunk-all-armhf (from .../linux-headers-3.18.0-trunk-all-armhf_3.18.5-1~exp1+rpi16_armhf.deb) ...
Selecting previously unselected package linux-headers-3.18.0-trunk-all.
Unpacking linux-headers-3.18.0-trunk-all (from .../linux-headers-3.18.0-trunk-all_3.18.5-1~exp1+rpi16_armhf.deb) ...
Setting up linux-headers-3.18.0-trunk-rpi2 (3.18.5-1~exp1+rpi16) ...
Setting up linux-headers-3.18.0-trunk-all-armhf (3.18.5-1~exp1+rpi16) ...
Setting up linux-headers-3.18.0-trunk-all (3.18.5-1~exp1+rpi16) ...

#10 Запускаем ./configure в linux-gpib директории системного окружения.

pre. root@tin:/home/linux-gpib/linux-gpib-code/linux-gpib# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking build system type... armv6l-unknown-linux-gnueabihf
checking host system type... armv6l-unknown-linux-gnueabihf
checking Linux kernel directory... ok
checking Linux kernel compile flags... Makefile:10: *** mixed implicit and normal rules: deprecated syntax ok
checking for gcc... gcc

#11 Компилируем и устанавливаем linux-gpib

pre..
root@tin:/home/gpib/linux-gpib-3.2.21# make
make all-recursive
make1: Entering directory '/home/gpib/linux-gpib-3.2.21'
Making all in include
make2: Entering directory '/home/gpib/linux-gpib-3.2.21/include'
make all-am
make3: Entering directory '/home/gpib/linux-gpib-3.2.21/include'
make3: Nothing to be done for 'all-am'.
...
...
root@tin:/home/gpib/linux-gpib-3.2.21# make install

Настроки для linux-gpib и интерфейса

После того, как все вышеописанные действия выполнены без ошибок, подключаем адаптер GPIB-USB-HS к Raspberry Pi и попробуем с ним "пообщатся".

Убедитесь, что Raspberry Pi запитана от источника как минимум +5 VDC 1 А, а подключение выполнено хорошим кабелем. Поскольку NI GPIB-USB-HS требует мощного питания - подключение дешевым кабелем USB к порту PC может вызваь нестабильность в работе, например светодиоды LAN непрерывно моргают, ничего не работает, а падение напряжения на кабеле - слишком большое.

Проверить соединене с адаптером просто, достаточно запустить lsusb, что бы увидеть какие устройства подключены к USB:

pre..
root@tin:/etc# lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 3923:709b National Instruments Corp. GPIB-USB-HS

в отличие от старого адаптера GPIB-USB-B, который требовал загрузку firmware Cypress FX , GPIB-USB-HS не требует каких либо загрузок и прошивок, а готов к работе сразу после включения "Из коробки"
Запускаем модуль ядра с modprobe:

pre..
root@tin:/home/gpib/linux-gpib-3.2.21# modprobe ni_usb_gpib
root@tin:/home/gpib/linux-gpib-3.2.21#

на данном этапе не должно быть ошибок, это можно проверить с помощью lsmod следующим образом:

pre..
root@tin:/home/gpib/linux-gpib-3.2.21# lsmod
Module Size Used by
i2c_dev 6970 0
i2c_bcm2708 5306 0
ni_usb_gpib 26063 0
gpib_common 31031 1 ni_usb_gpib

Пробуем использовать gpib_config tool для проверки, но получаем неприятную ошибку:

pre..
root@tin:/home/gpib/linux-gpib-3.2.21# gpib_config
failed to configure boardtype: ni_usb_gpib
failed to configure board
main: Invalid argument

Oops... После нескольких попыток, обнаруживаем, что ошибка связана с отличающимися именами текущего драйвера и модуля ядра. Исправляем /etc/gpib.conf :

pre..
board_type = "ni_usb_b">/* type of interface board being used */

Проверяем, теперь все должно работать:

pre..
root@tin:/home/gpib/linux-gpib-3.2.21# gpib_config
root@tin:/home/gpib/linux-gpib-3.2.21#

Ошибок нет! адаптер готов к работе.

Проверяем работу с GPIB интерфесом:

Для проверки подключаем адаптер NI GPIB-USB-HS к Keithley 2002 bench digital multimeter. Прибор настроен на 17-й адрес GPIB.

pre..
root@tin:/# ibtest
Do you wish to open a (d)evice or an interface (b)oard?
(you probably want to open a device): d
enter primary gpib address for device you wish to open [0-30]: 17
trying to open pad = 17 on /dev/gpib0 ...
You can:
w(a)it for an event
...
...
(r)ead string
perform (s)erial poll (device only)
change (t)imeout on io operations
request ser(v)ice (board only)
(w)rite data string
: w
enter a string to send to your device: *IDN?
sending string: *IDN?

gpib status is:
ibsta = 0x2100 < END CMPL >
iberr= 0

ibcnt = 6
You can:
w(a)it for an event
...
...
(r)ead string
perform (s)erial poll (device only)
change (t)imeout on io operations
request ser(v)ice (board only)
(w)rite data string
: r
enter maximum number of bytes to read [1024]: 1024
trying to read 1024 bytes from device...
received string: 'KEITHLEY INSTRUMENTS INC.,MODEL 2002,1167961,A09 /A02'
Number of bytes read: 57
gpib status is:
ibsta = 0x2100 < END CMPL >
iberr= 0

ibcnt = 57

Как видно выше - результат проверки - положительный, интерфейс работает, данные передаются от\к прибору корректно.

Python-приложение для связи GPIB с Raspberry Pi

Вот и пришло время написать простую программу для общения с нашими "инструментами" через GPIB.
в качестве языка программирования выберем Python. ... тут поток сумбурных мыслей пропущен, я подумаю, что здесь написать.

It's time to write some simple program to talk with our instruments over GPIB.
One of easy choices would be using Python, as this high-level language is very easy to write data-logging >programs and format data, without worry much about low-level coding.

Для использования GPIB в Python нужна python-dev библиотека установленная и работающая:

pre..
root@tin:/# apt-get install python-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libssl-dev libssl-doc python2.7-dev
The following NEW packages will be installed:
libssl-dev libssl-doc python-dev python2.7-dev
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,699 kB/31.4 MB of archives.
After this operation, 41.4 MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
....
Setting up python2.7-dev (2.7.3-6+deb7u2) ...
Setting up python-dev (2.7.3-4+deb7u1) ...

Python-dev библиотеке нужен доступ к GPIB адаптеру.
Теперь мы можем установить python egg для подключения Gpib модуля совместно с python system environment:

pre..
root@tin:/home/linux-gpib-code/linux-gpib/language/python# python ./setup.py install
running install
running build
running build_py
creating build
creating build/lib.linux-armv6l-2.7
copying Gpib.py -> build/lib.linux-armv6l-2.7
running build_ext
building 'gpib' extension
creating build/temp.linux-armv6l-2.7
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I../../include -I/usr/include/python2.7 -c gpibinter.c -o build/temp.linux-armv6l-2.7/gpibinter.o
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-armv6l-2.7/gpibinter.o -L../../lib/.libs -lgpib -lpthread -o build/lib.linux-armv6l-2.7/gpib.so
running install_lib
copying build/lib.linux-armv6l-2.7/Gpib.py -> /usr/local/lib/python2.7/dist-packages
copying build/lib.linux-armv6l-2.7/gpib.so -> /usr/local/lib/python2.7/dist-packages
byte-compiling /usr/local/lib/python2.7/dist-packages/Gpib.py to Gpib.pyc
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/gpib-1.0.egg-info

Простой тест поможет проверить доступ к прибору, Для настроек используем GPIB адрес 17.Тест отправляет"IDN?" и запрашивает чтение 100 байт:

pre..
root@tin:/home/linux-gpib/linux-gpib-code/linux-gpib/language/python# python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

import Gpib
inst = Gpib.Gpib(0,17) # Device address 17
inst.write("*IDN?")
inst.read(100) # read 100 bytes

'KEITHLEY INSTRUMENTS INC.,MODEL 2002,1167961,A09 /A02 \n'

Надеемся, эта статья поможет использовать маленькую, но мощную плату Raspberry Pi совместно с промышленным стандартным интерфейсом GPIB. Размер и возможности микрокомпьютера, позволяют интегрировать его совместно с имеющимися GPIB инструментами в производство. Такой подход позволяет добавлять новые вычислительные мощности и интерфейсы (LAN, WEB...), осуществлять удаленное наблюдение и управление, отпадает необходимость в больших громоздких ПК.

pre..
  1. xDevs.com Python test GPIB app
  2. http://xdevs.com/guide/ni_gpib_rpi/
    import sys
    import Gpib
    inst = Gpib.Gpib(0,17) # Instrument GPIB Address = 17
    inst.write(":DISP:WIND:TEXT:DATA 'Raspberry Pi GPIB;)'")
    inst.write(":DISP:WIND2:TEXT:DATA 'xdevs.com/guide/ni_gpib_rpi'")
    inst.write(":DISP:WIND:TEXT:STAT ON")
    inst.write(":DISP:WIND2:TEXT:STAT ON")

Если у вас есть какие-либо замечания и предложения - всегда готовы выслушать их в коментариях.


Files

Clipboard-3.png (69.1 KB) Clipboard-3.png tin, 08/16/2015 10:10 AM
#1

Updated by tin over 7 years ago

  • Description updated (diff)
#2

Updated by tin over 7 years ago

  • Status changed from New to In Progress
#3

Updated by tin over 7 years ago

  • Description updated (diff)
  • Due date set to 08/16/2015
  • Assignee changed from tin to Izerg
  • Priority changed from Normal to High
  • % Done changed from 0 to 70

Зерги вызвались перевести на завтра

#4

Updated by tin over 7 years ago

  • Description updated (diff)
#5

Updated by tin over 7 years ago

#6

Updated by Izerg over 7 years ago

  • Description updated (diff)
#7

Updated by Izerg over 7 years ago

  • Description updated (diff)
#8

Updated by Izerg over 7 years ago

  • Description updated (diff)
#9

Updated by Izerg over 7 years ago

  • Description updated (diff)
#10

Updated by Izerg over 7 years ago

  • Description updated (diff)
#11

Updated by Izerg over 7 years ago

Итоги подведем:
- съедено 6 часов времени (4 - чистого).
- выпито 2 чайника чая
- сгрызено 3 куска сыра...
- выслушано 6 часов музыки
- подтянут турник
- за время написания перевода ни одна распбери не была сожжена или безвозвратно покалечена!
- за время написания перевода ни одна кетля не была починена!
- за время написания перевода ... был написан перевод (внезапно!)
Данный перевод был написан как он есть. Автор перевода не несет ответственности за потеряное форматирование, невнятные абзацы и прочие неправильные шрифты.
Автор переода оставляет за собой право доказать правильность и обоснованность применения тех или иных логических, лексических, и прочих графоманских конструкций, как и право ничего никому не доказывать :)
Аминь!
на сем иссуй считаю завершенным, дальнейшие действия - суть следующих иссуев:
- вычитка и правка.
- оформление статьи на хабр ?

#12

Updated by Izerg over 7 years ago

  • Status changed from In Progress to Resolved
  • Assignee changed from Izerg to tin
  • % Done changed from 70 to 100

с порядком абзацев и картинок - я не уверен, нужно детально смотреть.

#13

Updated by tin over 7 years ago

Принято и опубликовано

#14

Updated by tin over 7 years ago

Еще попереводить хочешь? :)

#15

Updated by tin over 7 years ago

  • Status changed from Resolved to Closed

Also available in: Atom PDF