Программное обеспечение для предварительных испытаний манипулятора грунтозаборного комплекса космического аппарата "Фобос-грунт"
Методика проведения испытаний на воздействие транспортировочных, ударных нагрузок и виброускорений. Разработка программного обеспечения комплексного стенда отработки и испытаний манипулятора грунтозаборного комплекса. Блок-схемы алгоритмов управления.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 24.03.2013 |
Размер файла | 3,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
В целом выявление возможных поражающих, опасных и вредных факторов в помещении с техническими средствами и вне его производится при инспектировании предприятий, анализе установленной отчетности по производственному травматизму и заболеваемости работников, а также с помощью современных расчетно-аналитических методов оценки опасностей.
Таким образом, условия труда операторов ЭВМ, несмотря на отсутствие явных вредностей, нуждаются в оптимизации. При проектировании систем искусственного освещения, кондиционирования воздуха мы попытаемся оптимизировать условия труда оператора ПК.
Методами и средствами обеспечения БЖД работников в помещении с техническими средствами кроме перечисленных ранее методов, являются:
- рациональная организация рабочего места
- эстетизация интерьера
- улучшение санитарно-гигиенических факторов условий труда
- рационализация режима труда и отдыха
При организации рабочих мест в помещениях с ПК необходимо учитывать инженерно-психологические характеристики и антропометрические данные человека как при выборе рабочей позы и определении рабочих зон, так и при размещении органов управления и индикаторов.
Размещение органов управления и средств отображения информации на рабочем месте существенно влияет на эффективность действий оператора, особенно на скорость и точность выполнения критических операций. Так рекомендуется располагать органы управления в зоне досягаемости моторного поля с учетом частоты использования и важности этих органов. Их группируют так, чтобы действия человека осуществлялись слева направо и сверху вниз, а также обеспечивалась равномерность нагрузки обеих его рук и ног. Аварийные органы управления должны иметь специальные средства опознавания и предотвращения их непроизвольного и самопроизвольного включения (выключения).
Рабочие места операторов ЭВМ следует размещать в специально выделенных помещениях, отвечающих гигиеническим требованиям в отношении площади (согласно СНиП минимальная площадь рабочего места с ПЭВМ составляет 6 м2), условий естественного освещения и систем кондиционирования воздуха. В качестве таких помещений наиболее подходят помещения с северной, северо-восточной или северо-западной ориентацией световых проемов.
Интерьер или внутреннее пространство помещения создается архитектурными формами и отделкой, цветовым решением и системой освещения. Предметное окружение персонала помещения должно сочетаться гармонически и способствовать снижению нервно-психической перегрузки. Цветовую окраску помещений с вычислительными средствами целесообразно выбирать в соответствии с цветом технических устройств, а также учитывать эмоционально-физиологическое воздействие цвета, света и их функционально-эстетическую роль в организации пространства. Так же при выборе цветовой окраски необходимо учитывать требование равномерного распределения яркостей в поле зрения оператора. Более светлая окраска помещения способствует повышению степени освещенности.
Для окраски потолков рекомендуются оптимальные слабонасыщенные цвета с высокой отражательной способностью: белый, слоновой кости, салатовый, светло-бежевый, светло-голубой. Для окраски стен рекомендуют гамму светло-серых, серо-голубых, светло-зеленых, зеленовато-голубых, серо-зеленых, светло-желтых цветов и белого цвета. В отделке помещений должен доминировать один цвет.
Помещения северной стороны рекомендуют окрашивать в цвета теплого оттенка (бежевые, оранжевые, желтые, желто-зеленые), а солнечные помещения окрашивать в цвета холодного оттенка (синие, голубые, зелено-голубые, серо-голубые и белые). При монотонной работе помещение и окружающие предметы следует окрашивать в яркие, бодрящие, но не режущие глаз цвета. При выполнении работ, связанных с нервно-эмоциональным напряжением, должны преобладать спокойные тона холодного, голубовато-зеленоватого оттенка.
Для снижения утомления, сохранения здоровья и повышения работоспособности человека необходимы перерывы в работе по 5…10 мин. через каждый час работы или по 15…20 мин. через каждые два часа работы.
На рабочих местах операторов должны обеспечиваться оптимальные параметры микроклимата, уровень освещенности не менее 400 лк и уровень шума не более 50 дБА, что должно обеспечиваться правильно спроектированной системой искусственного освещения и звукоизолирующими корпусами оборудования.
6.7 Электробезопасность офиса на 2 ПЭВМ
6.7.1 Защитное зануление
Расчет зануления имеет целью определить условия, при которых оно надежно выполняет возложенные на него задачи быстро отключает поврежденную установку от сети и в то же время обеспечивает безопасность прикосновения человека к зануленному корпусу в аварийный период. В соответствии с этим зануление рассчитывают на отключающую способность. При этом в соответствии с ПУЭ должны выполняться следующие требования.
К системе TN относятся трехфазные четырехпроводных (три фазных проводника и проводник, совмещающий функции нулевого рабочего и нулевого защитного проводников и однофазные двухпроводные (фазный и нулевой рабочий проводники) сетей существующих зданий старой постройки.
В системе TN время автоматического отключения питания не должно превышать значений: для номинального фазового напряжения 220В - 0,4; 380В - 0,2; более 380 - 0,1с. Значения времени отключения питания считаются достаточными для обеспечения электробезопасности, в том числе и в групповых цепях, питающих передвижные и переносные электроприемники и ручной электроинструмент класса I.
В цепях, питающих распределительные, групповые, этажные и другие щиты и щитки, время отключения не должно превышать 5 с. Допускаются значения времени отключения не более 5 с в цепях, питающих только стационарные электроприемники от распределительных щитков или щитов при выполнении одного из следующих условий:
1) полное сопротивление защитного проводника между главной заземляющей шиной и распределительным щитом или щитком не превышает значения, Ом
где ZП - полное сопротивление цепи «фаза - нуль», Ом;
U - номинальное фазное напряжение сети, В;
50 - падение напряжения на участке защитного проводника между главной заземляющей шиной и распределительным щитом или щитком, В.
2) к шине PE распределительного щита или щитка присоединена дополнительная система уравнивания потенциалов, охватывающая те же сторонние проводящие части, что и основная система уравнивания потенциалов.
Расчет зануления на отключающую способность заключается в определении параметров нулевого защитного проводника (длина, сечение, материал) и максимальной токовой защиты, при которых ток однофазного короткого замыкания, возникающий при замыкании фазного провода на зануленный корпус, вызвал бы срабатывание максимальной токовой защиты за указанное время.
К расчету зануления на отключающую способность.
Значение тока короткого замыкания (КЗ) Iк зависит от фазного напряжения сети U и сопротивлений цепи, в том числе от полных сопротивлений трансформатора zт, фазного проводника zL1, нулевого защитного проводника zPE, внешнего индуктивного сопротивления петли (контура) фазный проводник -- нулевой защитный проводник (петли фаза-нуль) xП, а также от активных сопротивлений заземлений нейтрали обмоток источника тока (трансформатора) r0 и повторного заземления нулевого защитного проводника rП.
Поскольку r0 и rП, как правило, велики по сравнению с другими сопротивлениями цепи, можно не принимать во внимание параллельную ветвь, образованную ими. Тогда выражение для тока короткого замыкания Iк в комплексной форме будет иметь вид:
где U фазное напряжение сети, В; zт -- комплекс полного сопротивления обмоток трехфазного источника тока (трансформатора), Ом; zL1 -- комплекс полного сопротивления фазного провода. Ом; zPE -- комплекс полного сопротивления нулевого защитного проводника, Ом.
При расчете зануления допустимо применять приближенную формулу для вычисления действительного значения (модуля) тока короткого замыкания Iк, в которой модули сопротивлений трансформатора и петли фаза нуль zт и zП складываются арифметически:
Некоторая неточность (около 5%) этой формулы ужесточает требования безопасности и поэтому считается допустимой.
Полное сопротивление петли фаза - нуль в действительной форме (модуль) равно:
Расчет зануления на отключающую способность является поверочным расчетом правильности выбора проводимости нулевого защитного проводника, а точнее, достаточности проводимости петли фаза - нуль.
Значение zт зависит от мощности трансформатора, напряжения и схемы соединения его обмоток, а также от конструктивного исполнения трансформатора.
Значения RL1 и RPE для проводников из цветных металлов (медь, алюминий) определяют по известным данным сечению s, мм2, длине l, м, и материалу проводников. При этом искомое сопротивление:
где -- удельное сопротивление проводника, равное для меди 0,018, а для алюминия 0,028 Оммм2/м, коэффициент 1,2 учитывает увеличение сопротивления при нагреве кабеля в результате длительного протекания тока.
Сечение жилы фазного провода либо известно, либо выбирается исходя из значения рабочего тока (т.е. тока протекающего по проводнику при нормальном режиме работы) . Сечение нулевого защитного проводника должно быть не менее чем указанные в таблице 8.
Таблица 8 - Наименьшие сечения защитных проводников
Сечение фазных проводников, мм2 |
Наименьшее сечение защитных проводников, мм2 |
|
S 16 |
S |
|
16 < S 35 |
16 |
|
S > 35 |
S/2 |
Если нулевой защитный проводник стальной, то его активное сопротивление RPE определяется с помощью таблиц, в которых приведены значения сопротивлений 1 км (r, Ом/км) различных стальных проводников при разной плотности тока частотой 50 Гц.
Для этого необходимо задаться профилем и сечением проводника, а также знать его длину и ожидаемое значение тока КЗ Iк, который будет проходить по этому проводнику в аварийный период. Сечением проводника задаются из расчета, чтобы плотность тока КЗ в нем была в пределах примерно 0,5 - 2,0 А/мм2.
Значения внутренних индуктивных сопротивлений (вызванных самоиндукцией) xL1 и xPE медных и алюминиевых проводников сравнительно малы (около 0,0156 Ом/км), обычно ими можно пренебречь. Внутреннее индуктивное сопротивление жил (фазной или нулевой) можно определить по формуле (1.6)
где l - длина проводника, м.
Для стальных проводников внутренние индуктивные сопротивления оказываются достаточно большими, и их определяют с помощью таблиц. При этом также необходимо знать профиль и сечение проводника, его длину и ожидаемое значение тока Iк.
Значение внешнего индуктивного сопротивления (вызванного взаимоиндукцией между фазным и нулевым проводом) xП может быть определено по известной из теоретических основ электротехники формуле для индуктивного сопротивления двухпроводной линии с проводами круглого сечения одинакового диаметра d, м:
где - угловая скорость, рад/с, L - индуктивность линии, Гн; - относительная магнитная проницаемость среды; - магнитная постоянная, Гн/м; l - длина линии, м; D -- расстояние между проводами линии, м.
Диаметр жилы проводника фазного или нулевого :
где S - сечение жилы.
Расстояние между фазной и нулевой жилами:
D=(dL1 + dPE)/2 + 3,4
Где D - расстояние между фазной и нулевой жилами, мм;
3,4 - удвоенная толщина изоляции, мм.
Внешнее индуктивное сопротивление можно определить по формуле (1.10).
Где dL1 и dPE - диаметр жил фазной и нулевой, соответственно, по формуле (1.8) мм2; D - расстояние между фазной и нулевой жилами, мм.
При малых значениях D, соизмеримых с диаметром проводов d, т. е. когда фазный и нулевой проводники расположены в непосредственной близости один от другого, сопротивление незначительно (не более 0,1 Ом на км).
Суммарное индуктивное сопротивление фазной и нулевой жил:
Оценка эффективности системы автоматического отключения питания (защитного зануления) в сети типа TN
Для того, что бы оценить эффективность системы зануления нужно сравнить время отключения поврежденного электропотребителя с наибольшим допустимым временем защитного автоматического отключения питания, для чего необходимо сравнить ток короткого замыкания (измеренный или рассчитанный) с характеристиками аппарата максимальной токовой защиты (МТЗ), защищающего участок сети на котором произошло замыкание фазного провода на зануленный корпус электропотребителя.
Обычно в роли аппаратов МТЗ выступают плавкие вставки или автоматические выключатели. Аппарат МТЗ реагирует на сверхток (ток короткого замыкания) и, в зависимости от значения сверх тока и от своих характеристик, отключает защищаемую линию за некий промежуток времени. Таким образом, для определения времени отключения необходимо знать значение тока короткого замыкания в исследуемой цепи и характеристики аппарата МТЗ, установленного в ней.
Характеристики аппаратов МТЗ
Аппараты МТЗ имеют достаточно большое количество различных характеристик, однако, при оценке эффективности системы зануления наибольшее значение имеют номинальный ток аппарата и время-токовая (ампер-секундная) характеристика.
Номинальный ток аппарата - максимальный ток, который протекая через аппарат неограниченно долго, не вызовет его срабатывания.
Как уже отмечалось, наибольшее распространение получили такие аппараты МТЗ, как плавкие вставки и автоматические выключатели. В промышленности для защиты линий непосредственно питающих потребителя в подавляющем большинстве случаев используются автоматические выключатели.
Автоматические выключатели могут быть выполнены с тепловым (ТР) или с электромагнитным расцепителем (ЭМР), а так же с комбинированным расцепителем. Особенность теплового расцепителя в том, что время срабатывания зависит от протекающего тока (чем больше ток, тем меньше время срабатывания), электромагнитный расцепитель срабатывает при достижении тока срабатывания практически моментально (менее 0,2-0,1 с). Автоматический выключатель с комбинированным расцепителем при токах превышающих номинальный, но менее тока срабатывания ЭМР работает, как автоматический выключатель с тепловым расцепителем, а при превышении тока срабатывания ЭМР, как автоматический выключатель с ЭМР.
Для простоты и удобства проектирования и эксплуатации электрических сетей разработаны и приняты стандартные характеристики отключения автоматов защиты. Таким образом, атоматические выключатели известных производителей (ABB, Siemens, Merlin Gerin и т.п.), но с одинаковыми номинальными токами и характеристиками практически идентичны, сточки зрения отключающей способности. Существует так же общий ряд значений номинального тока : 5; 6; 8; 10; 13; 16; 20; 25; 32; 40 А.
Характеристики отключения автоматов защиты обозначают большими латинскими буквами, например: «В» или «С». Сведения по некоторым характеристикам приведены в таблице 9.
Таблица 9 - Некоторые характеристики автоматических выключателей
Характеристика |
Область применения |
Минимальный ток срабатывания теплового расцепителя |
Минимальный ток срабатывания электромагнитного расцепителя |
|
B |
активная нагрузка |
от 1,13Iн до 1,45Iн |
от 3Iн до 5Iн |
|
С |
активная нагрузка |
от 1,13Iн до 1,45Iн |
от 5Iн до 10Iн |
|
D |
Активно-индуктивная нагрузка, эл. двигатели |
от 1,13Iн до 1,45Iн |
от 10Iн до 20Iн |
|
K |
Активно-индуктивная нагрузка, эл. двигатели, трансформаторы |
от 1,05Iн до 1,2Iн |
от 8Iн до 14Iн |
|
Z |
электроника |
от 1,05Iн до 1,2Iн |
от 2Iн до 3Iн |
Примечание: 1. Iн - номинальный ток автоматического выключателя;
2. Автоматические выключатели с характеристикой D выпускаются как с комбинированным, так и только с тепловым расцепителем, остальные автоматические выключатели выпускаются только с комбинированным расцепителем.
Разброс значений токов срабатывания объясняется, во-первых, невозможностью создания абсолютно идентичных аппаратов, во-вторых, тем, что срабатывание может происходить как из «холодного» состояния, т.е. сразу после включения аппарата, так и из «горячего», т.е. перед срабатыванием чувствительный элемент теплового расцепителя автоматического выключателя был нагрет протекающим по нему рабочим током.
При оценке эффективности защитного зануления мы должны рассматривать наихудший вариант, поэтому для случая срабатывания теплового расцепителя необходимо пользоваться верхней кривой характеристики. Если же ток короткого замыкания находится в интервале минимальных токов срабатывания ЭМР, то необходимо рассчитывать время отключения по характеристике теплового расцепителя, т.к. ЭМР может не сработать. Гарантированное срабатывание ЭМР автоматического выключателя происходит только в случае превышения током короткого замыкания большего из минимальных токов срабатывания ЭМР. Для примера рассмотрим реакцию автоматического выключателя типа «С» с номинальным током 25А на токи различной величины, протекающие через него (см. таблицу 10).
Таблица 10 - Реакция автоматического выключателя типа «С» с номинальным током 25А на токи различной величины
Значение |
Кратность |
Реакция расцепителя |
Время |
Примечание |
||
тока, А |
Тока |
ТР |
ЭМР |
отключения |
||
20 |
0,8 |
не сработает |
не сработает |
отключения не произойдет |
нормальный режим работы |
|
27 |
1,08 |
не сработает |
не сработает |
отключения не произойдет |
допустимая перегрузка |
|
75 |
3 |
сработает |
не сработает |
От 4,5 до 14 с |
для расчета берем время 14 с |
|
200 |
8 |
сработает |
срабатывание возможно |
по ТР: 1,5 с по ЭМР: 0,01 с |
для расчета берем время 1,5 с |
|
275 |
11 |
- |
сработает |
0,01 с |
для расчета берем время 0,01с |
Расчет защитного зануления
Исходные данные:
Мощность потребителя P = 1,1 кВт
Количество потребителей n=2
Длина питающего кабеля от распределительного щита до потребителя (кабель Б) L=10 м (все кабели проложены в одном коробе)
Длина питающего кабеля от трансформатора до распределительного щита (кабель А) Lтр=220 м (кабель проложен открыто в воздухе)
Материал провода - медь (=0,018 Ом*мм2/м)
Трансформатор S=100 кВА
Коэффициент использования КИ=0,5
Категория автоматического выключателя - D
1. Определяем ток нагрузки
1.1. Рабочий ток одного потребителя
Iн = P/ Uф =1100/220= 5 А
где P- мощность, Вт
Uф- фазное напряжение 220 В
Iн - рабочий ток одного потребителя
1.2. Рабочий ток группы потребителей (ток, протекающий по кабелю от трансформатора к распределительному щиту)
I=Iн*n*КИ=5 *2*0,5=5 А
где n - количество потребителей;
I - рабочий ток группы потребителей
2. Определяем сечение провода.
В соответствии с требованиями ПУЭ на допустимый длительный ток для трехжильных проводов и кабелей, проложенных в воздухе определяем сечение фазных жил кабеля А:
Сечение кабеля А: SА=25 мм2
В соответствии с требованиями ПУЭ на допустимый длительный ток для трехжильных проводов и кабелей, проложенных в коробе определяем сечение фазных жил кабеля Б (провода могут быть проложены многослойно и пучками):
Сечение фазной жилы кабеля Б: SБ=4 мм2
Сечение нулевых защитных (PE) проводников для кабеля А будет равно 16 мм2, а для кабеля Б будет равен сечению фазных жил (см. табл. 1.2)
3. Определяем номинальные токи автоматических выключателей
Выбираем из существующего ряда номиналов: 5; 6; 8; 10; 13; 16; 20; 25; 32; 40 (А)
Номинальный ток автоматического выключателя : 20 А
4. Расчет активного и индуктивного сопротивления проводников.
4.1. Расчет диаметра жил
По формуле 1.8 получим:
Для кабеля А: dА L= 5,6 мм, dА PE=4,5 мм
Для кабеля Б : dБ L=dБ PE=2,3 мм
4.2. Расчет расстояния между жилами
По формуле 1.9 получим:
Для кабеля А: DА= 8,5 мм
Для кабеля Б: DБ= 5,7 мм
4.3. Расчет активного сопротивления жилы
По формуле 1.5 для медного кабеля с учетом увеличения сопротивления при нагреве, получим:
Для кабеля А : rА L= 0,19 Ом, rА PE=0,3 Ом
Для кабеля Б : rБ L=rБ PE=0,27 Ом
4.4. Расчет индуктивного сопротивления жилы
По формуле 1.6 рассчитаем внутреннее индуктивное сопротивление кабеля, по формуле 1.10 - внутреннее индуктивное сопротивление кабеля, а суммарное индуктивное сопротивление по формуле 1.11:
Для кабеля А: XА=0,021 Ом
Для кабеля Б: XБ=0,007 Ом
4.5. Расчет полного сопротивления петли «фаза-нуль»
По формуле 1.4 получим:
zП=1,03 Ом.
5. Расчет тока короткого замыкания
По формуле 1.3 получим (zт - сопротивление обмоток трансформатора (определяется по мощности трансформатора и схеме соединения обмоток в данном случае zт=0,226 Ом)):
Iк=199 А.
6. Определение времени отключения
Находим кратность тока короткого замыкания к номинальному току автоматического выключателя: Iк/Iном=13,2.
Время срабатывания автоматического выключателя типа «D» при такой кратности тока короткого замыкания к номинальному составит от 0,01 до 0,8 с. Время отключения, обеспечивающее безопасность человека, составляет 0,4 с. Можно сделать вывод о эффективности, в данном случае, системы защитного зануления.
7. Расчет ожидаемого напряжения прикосновения
Ожидаемое напряжение прикосновения - это напряжение между одновременно доступными прикосновению проводящими частями, когда человек их не касается. В случае зануленного корпуса в сети типа TN и отсутствия повторного заземления НЗП ожидаемое напряжение прикосновения будет равно напряжению на зануленном корпусе, относительно земли. Это напряжение можно рассчитать по формуле 2.3
где Iк - ток КЗ, проходящий по петле фаза-нуль, А;
zPE - полное сопротивление участка нулевого защитного проводника, обтекаемого током Iк, Ом .
7.1 Расчет полного сопротивления участка нулевого защитного проводника, обтекаемого током Iк
=0,57 Ом.
7.2 Расчет ожидаемого напряжения прикосновения
=113,5 В
Время, в течение которого человек может находиться под воздействием такого напряжения, составляет менее 0,2 с. Отключение же поврежденной электроустановки произойдет за время от 0,01 до 0,8 с (см. пункт 6).
Вывод: безопасность человека в рассматриваемой сети обеспечена не полностью.
8. Расчет значения сопротивления повторного заземления нулевого защитного проводника
Для Uпр.доп.= 50 В и r0=4 Ом получим rп 37,8 Ом
Одной из возможных мер, позволяющих обеспечить безопасность человека, является повторное заземление нулевого защитного проводника.
Выводы по главе
После проведенных расчетов было выявлено, что необходимо двойное заземление сопротивления нулевого защитного проводника, значение которого равно 37,8 Ом, что удовлетворяет заданным нормам.
Заключение
Целью дипломной работы являлась разработка программного обеспечения комплексного стенда отработки и испытаний манипулятора грунтозаборного комплекса, в рамках которой было необходимо разработать алгоритмы:
- подпрограмма инициализации;
- подпрограмма перемещения манипулятора;
- подпрограмма забора грунта;
- подпрограмма выгрузки грунта;
- подпрограмма перемещения лепестков и толкателя грунтозаборного устройства.
В дипломной работе были проанализированы комплексный стенд а так же сам манипулятор, по итогам анализа были определены: область решаемой задачи, требования к программному обеспечению управляющей ПЭВМ.
Данное программное обеспечение целесообразно использовать для отладки и испытаний бортового комплекса управления. Проведенные испытания (с использованием ПО) удовлетворяют всем основным требованиям, которые позволяют сделать заключение о работоспособности манипулятора.
Тестирование ПО, проведенное в соответствии с методикой испытаний показало, что программа является работоспособной и отвечает предъявляемым ней требованиям.
В рамках экономической части дипломной работы были рассчитаны затраты на разработку, оценена экономическая эффективность и оценен уровень научно-технической прогрессивности. Срок окупаемости 1,01 года, что указывает на целесообразность применения данной разработки и экономическую оправданность. В рамках части охраны труда были проанализированы возможности возникновения опасных воздействий на человека и рассчитана электробезопасность центра.
Список литературы
1. Delphi от «а» до «я».
2. Долин П.А. Основы техники безопасности в электроустановках. М.: Энергоатомиздат, 1984 г.
3. Правила технической эксплуатации электроустановок потребителей, М.: Омега-Л, 2004 г.
Приложение А
Текст программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Grids, Math,
Definitions, // обмен с контроллерами приводов манипулятора
LCARD_32, Lusbapi, TeeProcs, TeEngine, Chart, Series, // обмен с платой L-140
Elements,
Commands;
const
//******************************************
//* Константы дл управления приводами манипулятора
//******************************************
s_dev_n : string ='EPOS';
s_pr_n : string ='MAXON_RS232';
s_in_n : string ='RS232';
s_p_n1 : string ='COM3';
s_p_n2 : string ='COM4';
Motors_number=5;
//******************************************
//* Константы для обмена с платой АЦП
//******************************************
//Константы для определения режима работы каналов АЦП
ADC_MODE_DIFF = 0;
ADC_MODE_COMM = 1;
//Максимальный код АЦП
MAX_VALUE_ADC = 8000;
// частота ввода данных
AdcRate : double = 1.0;
KadrRate : double = 1.0;
// кол-во отсчетов в запросе (кратное 32) для ф. ReadData
DataStep : DWORD = 64*1024;
// столько блоков по DataStep отсчётов нужно собрать в файл
NBlockToRead : WORD = 4*20;
// кол-во активных каналов
CHANNELS_QUANTITY = 16;
//Используемые каналы
USED_CHANNELS = 5;
//Настроки диапазонов по каналам
ADC_RANGE_CHANNELS : array [0..(USED_CHANNELS-1)] of byte =
( ADC_INPUT_RANGE_10000mV_E140,
ADC_INPUT_RANGE_10000mV_E140,
ADC_INPUT_RANGE_10000mV_E140,
ADC_INPUT_RANGE_10000mV_E140 );
adc_filter_que_len = 10;
Coeff = 0.02;
POSITIONNING_MOTORS = 1;
POSITIONNING_ADC = 2;
VELOCITY_KEEPING = 3;
type
TShortrArray = array [0..5] of array of SHORT;
TForm1 = class(TForm)
GroupBox22: TGroupBox;
Btn_connect: TButton;
Btn_disconnect: TButton;
Memo1: TMemo;
Button1: TButton;
Button3: TButton;
btn_adcconn: TButton;
timer_adc: TTimer;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
GroupBox7: TGroupBox;
GroupBox18: TGroupBox;
E_s_dev_1: TEdit;
E_s_pr_1: TEdit;
E_s_in_1: TEdit;
E_s_p_1: TEdit;
CB_conn_1: TCheckBox;
GroupBox19: TGroupBox;
E_s_dev_2: TEdit;
E_s_pr_2: TEdit;
E_s_in_2: TEdit;
E_s_p_2: TEdit;
CB_conn_2: TCheckBox;
GroupBox20: TGroupBox;
E_s_dev_3: TEdit;
E_s_pr_3: TEdit;
E_s_in_3: TEdit;
E_s_p_3: TEdit;
CB_conn_3: TCheckBox;
GroupBox21: TGroupBox;
E_s_dev_4: TEdit;
E_s_pr_4: TEdit;
E_s_in_4: TEdit;
E_s_p_4: TEdit;
CB_conn_4: TCheckBox;
GroupBox23: TGroupBox;
GroupBox24: TGroupBox;
TB_m1_velocity: TTrackBar;
B_m1_stop: TButton;
B_m1_reset_counter: TButton;
GroupBox25: TGroupBox;
TB_m2_velocity: TTrackBar;
B_m2_stop: TButton;
B_m2_reset_counter: TButton;
GroupBox26: TGroupBox;
TB_m3_velocity: TTrackBar;
B_m3_stop: TButton;
B_m3_reset_counter: TButton;
GroupBox3: TGroupBox;
GroupBox2: TGroupBox;
SG1: TStringGrid;
btn_adcstart: TButton;
Btn_set_zero_motor_ang: TButton;
GroupBox4: TGroupBox;
GroupBox5: TGroupBox;
GroupBox8: TGroupBox;
GroupBox6: TGroupBox;
Edit_m1_targ_angle: TEdit;
Edit_m2_targ_angle: TEdit;
Edit_m4_targ_angle: TEdit;
Button_set_working_mode: TButton;
Btn_set_target_angles: TButton;
CB_ADC_use_1: TCheckBox;
CB_ADC_use_2: TCheckBox;
CB_ADC_use_3: TCheckBox;
CB_ADC_use_4: TCheckBox;
UpDn_chan_id_1: TUpDown;
Edit_chan_id_1: TEdit;
Edit_chan_id_2: TEdit;
Edit_chan_id_3: TEdit;
Edit_chan_id_4: TEdit;
UpDn_chan_id_2: TUpDown;
UpDn_chan_id_3: TUpDown;
UpDn_chan_id_4: TUpDown;
Timer1: TTimer;
TabSheet3: TTabSheet;
Chart1: TChart;
Chart2: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
GroupBox1: TGroupBox;
Edit_m1_targ_speed: TEdit;
GroupBox9: TGroupBox;
Edit_m2_targ_speed: TEdit;
GroupBox10: TGroupBox;
Edit_m4_targ_speed: TEdit;
Btn_set_targ_speeds: TButton;
Chart3: TChart;
Chart4: TChart;
Series3: TLineSeries;
Series4: TLineSeries;
RG_working_mode: TRadioGroup;
TabSheet4: TTabSheet;
GroupBox12: TGroupBox;
OD_prg_file: TOpenDialog;
TabSheet5: TTabSheet;
GroupBox16: TGroupBox;
SGC: TMemo;
LB1: TListBox;
GroupBox13: TGroupBox;
Btn_prg_del: TButton;
Btn_prg_edit: TButton;
Btn_prg_ins: TButton;
Btn_prg_add: TButton;
GroupBox14: TGroupBox;
Btn_prg_load: TButton;
Btn_prg_save: TButton;
Btn_prg_start: TButton;
Btn_prg_clear: TButton;
Btn_prg_stop: TButton;
SD_prg_file: TSaveDialog;
Timer_prg: TTimer;
Button4: TButton;
GroupBox11: TGroupBox;
TB_m4_velocity: TTrackBar;
B_m4_stop: TButton;
B_m4_reset_counter: TButton;
GroupBox15: TGroupBox;
Edit_m3_targ_angle: TEdit;
GroupBox17: TGroupBox;
TB_m5_velocity: TTrackBar;
B_m5_stop: TButton;
B_m5_reset_counter: TButton;
GroupBox27: TGroupBox;
Edit_m5_targ_angle: TEdit;
GroupBox28: TGroupBox;
E_s_dev_5: TEdit;
E_s_pr_5: TEdit;
E_s_in_5: TEdit;
E_s_p_5: TEdit;
CB_conn_5: TCheckBox;
CB_ADC_use_5: TCheckBox;
Edit_chan_id_5: TEdit;
UpDown1: TUpDown;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Btn_connectClick(Sender: TObject);
procedure Btn_disconnectClick(Sender: TObject);
procedure TB_m1_velocityChange(Sender: TObject);
procedure TB_m2_velocityChange(Sender: TObject);
procedure TB_m3_velocityChange(Sender: TObject);
procedure TB_m4_velocityChange(Sender: TObject);
procedure TB_m5_velocityChange(Sender: TObject);
procedure B_m1_stopClick(Sender: TObject);
procedure B_m2_stopClick(Sender: TObject);
procedure B_m3_stopClick(Sender: TObject);
procedure B_m4_stopClick(Sender: TObject);
procedure B_m5_stopClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure B_m1_reset_counterClick(Sender: TObject);
procedure B_m2_reset_counterClick(Sender: TObject);
procedure B_m3_reset_counterClick(Sender: TObject);
procedure B_m4_reset_counterClick(Sender: TObject);
procedure B_m5_reset_counterClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure btn_adcconnClick(Sender: TObject);
procedure timer_adcTimer(Sender: TObject);
procedure btn_adcstartClick(Sender: TObject);
procedure Btn_set_zero_motor_angClick(Sender: TObject);
procedure Button_set_working_modeClick(Sender: TObject);
procedure Btn_set_target_anglesClick(Sender: TObject);
procedure UpDn_chan_id_1Click(Sender: TObject; Button: TUDBtnType);
procedure UpDn_chan_id_2Click(Sender: TObject; Button: TUDBtnType);
procedure UpDn_chan_id_3Click(Sender: TObject; Button: TUDBtnType);
procedure UpDn_chan_id_4Click(Sender: TObject; Button: TUDBtnType);
procedure Timer1Timer(Sender: TObject);
procedure Btn_prg_loadClick(Sender: TObject);
procedure Btn_prg_saveClick(Sender: TObject);
procedure Btn_prg_clearClick(Sender: TObject);
procedure Btn_prg_startClick(Sender: TObject);
procedure Btn_prg_stopClick(Sender: TObject);
procedure Btn_prg_addClick(Sender: TObject);
procedure Btn_prg_insClick(Sender: TObject);
procedure Btn_prg_editClick(Sender: TObject);
procedure Btn_prg_delClick(Sender: TObject);
procedure Timer_prgTimer(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
m_oInitialisation: boolean;
m_oImmediately:boolean;
Function GetCodeDescription(asst:string):string;
function UpdateStatus: boolean;
function Detect_motors_position() : boolean;
function Detect_inertial_position() : boolean;
function Set_motors_move() : boolean;
end;
TProgram_item = class
cmd_type : word;
cmd_act : string;
cmd_params : string;
cmd_str : string;
cmd_t_count : integer;
private
public
function check_finalized() : boolean;
function lunch_cmd() : boolean;
end;
var
// идентификатор потока ввода
hReadThread : THANDLE;
ReadTid : DWORD;
// Идентификатор файла данных
FileHandle: Integer;
// интерфейс модуля E14-140
pModule : ILE140;
//
Chans_que : array[1..USED_CHANNELS] of word;
Chans_arr : array[1..USED_CHANNELS, 1..adc_filter_que_len] of real;
Chans_mid : array[1..USED_CHANNELS] of real;
Chans_zero : array[1..USED_CHANNELS] of real;
// версия библиотеки Rtusbapi.dll
DllVersion : DWORD;
// идентификатор устройства
ModuleHandle : THandle;
// название модуля
ModuleName: String;
// скорость работы шины USB
UsbSpeed : BYTE;
// структура с полной информацией о модуле
ModuleDescription : MODULE_DESCRIPTION_E140;
// структура параметров работы АЦП
ap : ADC_PARS_E140;
//
IO_R_L :IO_REQUEST_LUSBAPI;
// экранный счетчик-индикатор
Counter, OldCounter : WORD;
// указатель на буфер для данных
Buffer : TShortrArray;
//
Kadr1 : pshort;
Kadr : Array[1..32] of short;
// номер ошибки при выполнения потока сбора данных
ReadThreadErrorNumber : WORD;
// флажок завершения потоков ввода данных
IsReadThreadComplete : boolean;
// Дескриптор стандартного устройства ввода компьютера - клавиатура
InputConsoleHandle : THandle;
// Дескриптор стандартного устройства вывода компьютера - дисплей
OutputConsoleHandle : THandle;
// Для хранения максимальных размеров окна
MaxX, MaxY : DWORD;
// *** вспомогательные переменные ***
ticks, i : WORD;
// вспомогательная строчка
Str_1 : string;
//
Form1: TForm1;
Motors : array[1..motors_number] of TMotor;
Positionning_active : boolean = False;
Positionning_move : integer = 0;
Prg : array[1..200] of TProgram_item;
p_i :TProgram_item;
Cur_command : word;
Total_commands : word;
implementation
{$R *.dfm}
procedure Setup_connect_params;
begin
with Form1 do
begin
Motors[1]:=TMotor.create;
Motors[1].set_connection_parameters(E_s_dev_1.text, E_s_pr_1.text, E_s_in_1.text, E_s_p_1.text);
Motors[1].m_enabled:=CB_conn_1.Checked;
Motors[1].ADC_enabled:=CB_ADC_use_1.Checked;
Motors[1].set_ADC_chan_id(UpDn_chan_id_1.position);
Motors[2]:=TMotor.create;
Motors[2].set_connection_parameters(E_s_dev_2.text, E_s_pr_2.text, E_s_in_2.text, E_s_p_2.text);
Motors[2].m_enabled:=CB_conn_2.Checked;
Motors[2].ADC_enabled:=CB_ADC_use_2.Checked;
Motors[2].set_ADC_chan_id(UpDn_chan_id_2.position);
Motors[3]:=TMotor.create;
Motors[3].set_connection_parameters(E_s_dev_3.text, E_s_pr_3.text, E_s_in_3.text, E_s_p_3.text);
Motors[3].m_enabled:=CB_conn_3.Checked;
Motors[3].ADC_enabled:=CB_ADC_use_3.Checked;
Motors[3].set_ADC_chan_id(UpDn_chan_id_3.position);
Motors[4]:=TMotor.create;
Motors[4].set_connection_parameters(E_s_dev_4.text, E_s_pr_4.text, E_s_in_4.text, E_s_p_4.text);
Motors[4].m_enabled:=CB_conn_4.Checked;
Motors[4].ADC_enabled:=CB_ADC_use_4.Checked;
Motors[4].set_ADC_chan_id(UpDn_chan_id_4.position);
Motors[5]:=TMotor.create;
Motors[5].set_connection_parameters(E_s_dev_5.text, E_s_pr_5.text, E_s_in_5.text, E_s_p_5.text);
Motors[5].m_enabled:=CB_conn_5.Checked;
Motors[5].ADC_enabled:=CB_ADC_use_5.Checked;
Motors[5].set_ADC_chan_id(UpDn_chan_id_5.position);
end;
end;
Procedure Setup_output_table;
begin
Form1.SG1.Cells[0,1]:='Мотор 1';
Form1.SG1.Cells[0,2]:='Мотор 2';
Form1.SG1.Cells[0,3]:='Мотор 3';
Form1.SG1.Cells[0,4]:='Мотор 4';
Form1.SG1.Cells[0,5]:='Мотор 5';
Form1.SG1.Cells[1,0]:='Зад. скорость';
Form1.SG1.Cells[2,0]:='Факт. скорость';
Form1.SG1.Cells[3,0]:='Факт. ток';
Form1.SG1.Cells[4,0]:='Зад. угол, град.';
Form1.SG1.Cells[5,0]:='Факт. угол, град.';
Form1.SG1.Cells[6,0]:='Факт. АЦП угол, град.)';
Form1.SG1.Cells[7,0]:='АЦП напряж., В';
end;
Procedure Setup_adc_variables;
var
i : word;
begin
for i:=1 to USED_CHANNELS do
chans_que[i]:=0;
chans_zero[1]:=2.3;
chans_zero[2]:=2.3;
chans_zero[3]:=2.3;
chans_zero[4]:=2.3;
chans_zero[5]:=2.3;
end;
Procedure Connect_to_motors;
var
i : integer;
begin
For i:=1 to Motors_number do
if Motors[i].m_enabled then
if Motors[i].connect
then Form1.Memo1.Lines.Add('Motor '+IntToStr(i)+' connected.')
else Form1.Memo1.Lines.Add('Error connecting to motor '+IntToStr(i)+' Err. code: '+IntToStr(Motors[i].m_dErrorCode));
end;
Procedure Disconnect_from_motors;
var
i : integer;
begin
For i:=1 to Motors_number do
if Motors[i].m_enabled then
begin
Motors[i].disable_connection;
Form1.Memo1.Lines.Add('Motor '+IntToStr(i)+' disconnected.');
end;
end;
function return_mode(radio_value:integer):integer;
begin
case radio_value of
0: return_mode:=-6;
1: return_mode:=-5;
2: return_mode:=-3;
3: return_mode:=-2;
4: return_mode:=-1;
5: return_mode:=1;
6: return_mode:=3;
7: return_mode:=6;
else return_mode:=0;
end
end;
Function TForm1.GetCodeDescription(asst:string):string;
var
i : word;
begin
For i:=0 to Form1.SGC.Lines.Count-1 do
If ExistStrInStr(Form1.SGC.Lines.Strings[i],asst)
then
begin
Result:=Form1.SGC.Lines.Strings[i];
exit;
end
else
Result:='';
end;
function TForm1.Detect_motors_position() : boolean;
var
i : integer;
r : real;
s_real_angle : string;
s_targ_angle : string;
begin
For i:=1 to Motors_number do
begin
//Calculate the real motors angles
r:=Motors[i].get_real_angle;
Str(r:4:2,s_real_angle);
//Calculate the real motors angles
r:=Motors[i].get_real_angle;
Str(r:4:2,s_real_angle);
r:=Motors[i].get_requested_angle;
Str(r:4:2,s_targ_angle);
//Output the all angular motors values to the screen
SG1.cells[1,i]:=IntToStr(Motors[i].get_req_velocity);
SG1.cells[2,i]:=IntToStr(Motors[i].get_real_velocity);
SG1.cells[3,i]:=IntToStr(Motors[i].get_real_current);
SG1.cells[4,i]:=s_targ_angle;
SG1.cells[5,i]:=s_real_angle;
end;
Result:=True;
end;
function TForm1.Detect_inertial_position() : boolean;
var
i : integer;
r : real;
s_real_angle : string;
begin
For i:=1 to Motors_number do
with Motors[i] do
if ADC_enabled then
begin
Set_ADC_angle(chans_mid[Get_ADC_chan_id()]*100);
r:=Motors[i].Get_ADC_angle;
Str(r:4:2,s_real_angle);
SG1.cells[6,i]:=s_real_angle;
r:=chans_mid[i];
Str(r:4:2,s_real_angle);
SG1.cells[7,i]:=s_real_angle;
end;
Result:=True;
end;
function TForm1.Set_motors_move() : boolean;
var
i : integer;
r : real;
s_real_angle : string;
begin
Case Positionning_move of
POSITIONNING_MOTORS : begin
For i:=1 to Motors_number do
with Motors[i] do
set_velocity(calc_motors_speed);
end;
POSITIONNING_ADC : begin
For i:=1 to Motors_number do
with Motors[i] do
set_velocity(calc_ADC_speed);
end;
VELOCITY_KEEPING : begin
For i:=1 to Motors_number do
with Motors[i] do
set_velocity(calc_velocity_speed);
end;
end;// of case
Result:=True;
end;
function TForm1.UpdateStatus: boolean;
var
i : integer;
r : real;
s_real_angle : string;
s_targ_angle : string;
s1, s2 : string;
begin
UpdateStatus:=true;
Detect_motors_position();
Detect_inertial_position();
//Calculate and move the motors to target position
Set_motors_move();
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Err_code : longword;
begin
if ( not VCS_CloseAllDevices(Err_code)) then ShowMessage('Error closing devices!');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Setup_connect_params;
Setup_output_table;
Setup_adc_variables;
end;
procedure TForm1.Btn_connectClick(Sender: TObject);
begin
//Set the connection parameters
Setup_connect_params;
//Connect to motors controllers
Connect_to_motors;
//Connect to ADC
btn_adcconn.Click;
//Reset motor zero position
Btn_set_zero_motor_ang.Click;
//Lunch the main timer
Timer1.Enabled := True;
end;
procedure TForm1.Btn_disconnectClick(Sender: TObject);
begin
Disconnect_from_motors;
Timer1.Enabled := False;
end;
procedure TForm1.TB_m1_velocityChange(Sender: TObject);
var
new_velocity: longint;
begin
new_velocity:=TB_m1_velocity.position*Velocity_rate;
Motors[1].set_velocity(new_velocity);
end;
procedure TForm1.TB_m2_velocityChange(Sender: TObject);
var
new_velocity: longint;
begin
new_velocity:=TB_m2_velocity.position*Velocity_rate;
Motors[2].set_velocity(new_velocity);
end;
procedure TForm1.TB_m3_velocityChange(Sender: TObject);
var
new_velocity: longint;
begin
new_velocity:=TB_m3_velocity.position*Velocity_rate;
Motors[3].set_velocity(new_velocity);
end;
procedure TForm1.TB_m4_velocityChange(Sender: TObject);
var
new_velocity: longint;
begin
new_velocity:=TB_m4_velocity.position*Velocity_rate;
Motors[4].set_velocity(new_velocity);
end;
procedure TForm1.TB_m5_velocityChange(Sender: TObject);
var
new_velocity: longint;
begin
new_velocity:=TB_m5_velocity.position*Velocity_rate;
Motors[5].set_velocity(new_velocity);
end;
procedure TForm1.B_m1_stopClick(Sender: TObject);
begin
Motors[1].set_velocity(0);
TB_m1_velocity.Position :=0;
end;
procedure TForm1.B_m2_stopClick(Sender: TObject);
begin
Motors[2].set_velocity(0);
TB_m2_velocity.Position :=0;
end;
procedure TForm1.B_m3_stopClick(Sender: TObject);
begin
Motors[3].set_velocity(0);
TB_m3_velocity.Position :=0;
end;
procedure TForm1.B_m4_stopClick(Sender: TObject);
begin
Motors[4].set_velocity(0);
TB_m4_velocity.Position :=0;
end;
procedure TForm1.B_m5_stopClick(Sender: TObject);
begin
Motors[5].set_velocity(0);
TB_m5_velocity.Position :=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
For i:=1 to Motors_number do
if Motors[i].m_enabled then
if Motors[i].set_uMode(Velocity_mode)
then Form1.Memo1.Lines.Add('Motor '+IntToStr(i)+' mode is'+IntToStr(Velocity_mode))
else Form1.Memo1.Lines.Add('Error changing motor mode');
end;
procedure TForm1.B_m1_reset_counterClick(Sender: TObject);
begin
Motors[1].set_pulse_position(0);
end;
procedure TForm1.B_m2_reset_counterClick(Sender: TObject);
begin
Motors[2].set_pulse_position(0);
end;
procedure TForm1.B_m3_reset_counterClick(Sender: TObject);
begin
Motors[3].set_pulse_position(0);
end;
procedure TForm1.B_m4_reset_counterClick(Sender: TObject);
begin
Motors[4].set_pulse_position(0);
end;
procedure TForm1.B_m5_reset_counterClick(Sender: TObject);
begin
Motors[5].set_pulse_position(0);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i : integer;
begin
For i:=1 to Motors_number do
if Motors[i].m_enabled then
if Motors[i].set_uMode(Position_mode)
then Form1.Memo1.Lines.Add('Motor '+IntToStr(i)+' mode is'+IntToStr(Motors[i].get_uMode))
else Form1.Memo1.Lines.Add('Error changing motor mode');end;
procedure TForm1.btn_adcconnClick(Sender: TObject);
var
r1:real;
s1:string;
i : integer;
begin
// проверим версию используемой DLL библиотеки
DllVersion := GetDllVersion;
if DllVersion <> CURRENT_VERSION_LUSBAPI then
begin
ShowMessage('Неверная версия DLL библиотеки Lusbapi.dll! ' + #10#13 +
' Текущая: ' + IntToStr(DllVersion shr 16) + '.' + IntToStr(DllVersion and $FFFF) + '.' +
' Требуется: ' + IntToStr(CURRENT_VERSION_LUSBAPI shr 16) + '.' + IntToStr(CURRENT_VERSION_LUSBAPI and $FFFF) + '.');
exit;
end
else Memo1.Lines.Add(' DLL Version --> OK');
// попробуем получить указатель на интерфейс для модуля E14-140
pModule := CreateLInstance(pCHAR('e140'));
if pModule = nil
then ShowMessage('Недоступен интерфейс модуля E14-140!')
else Memo1.Lines.Add(' Module Interface --> OK');
// попробуем обнаружить модуль E14-140 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
for i := 0 to (MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI-1)
do
if pModule.OpenLDevice(i) then break;
// что-нибудь обнаружили?
if i > MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI then ShowMessage('Не удалось обнаружить модуль E14-140 в первых 127 виртуальных слотах!')
else Memo1.Lines.Add(' OpenLDevice('+IntToStr(i)+') --> OK');
// получим идентификатор устройства
ModuleHandle := pModule.GetModuleHandle();
// прочитаем название модуля в текущем виртуальном слоте
ModuleName := '0123456';
if not pModule.GetModuleName(pCHAR(ModuleName)) then ShowMessage('Не могу прочитать название модуля!')
else Memo1.Lines.Add(' GetModuleName() --> OK');
// проверим, что это модуль E14-140
if Boolean(AnsiCompareStr(ModuleName, 'E140')) then ShowMessage('Обнаруженный модуль не является E14-140!')
else Memo1.Lines.Add(' The module is ''E14-140''');
// попробуем получить скорость работы шины USB
if not pModule.GetUsbSpeed(@UsbSpeed) then ShowMessage(' Не могу определить скорость работы шины USB')
else Memo1.Lines.Add(' GetUsbSpeed() --> OK\n');
// теперь отобразим скорость работы шины USB
if UsbSpeed = USB11_LUSBAPI then Str_1 := 'Full-Speed Mode (12 Mbit/s)' else Str_1 := 'High-Speed Mode (480 Mbit/s)';
Memo1.Lines.Add(' USB is in '+str_1);
// теперь получим номер версии загруженного драйвера DSP
if not pModule.GET_MODULE_DESCRIPTION(@ModuleDescription) then ShowMessage('Не могу получить информацию о модуле!')
else Memo1.Lines.Add(' GET_MODULE_DESCRIPTION() --> OK');
// получим текущие параметры работы ввода данных
if not pModule.GET_ADC_PARS(@ap) then ShowMessage('Не могу получить текущие параметры ввода данных!')
else Memo1.Lines.Add(' GET_ADC_PARS --> OK');
//Меняем параметры
ap.ChannelsQuantity :=16;
ap.AdcRate :=AdcRate;
ap.KadrRate:=KadrRate;
ap.InterKadrDelay:=100;
ap.InputMode:=NO_SYNC_E140;
ap.ChannelsQuantity:=USED_CHANNELS;
//Настраиваем логичские параметы
for i:=0 to (USED_CHANNELS-1) do
begin
ap.ControlTable[i]:=i + ADC_MODE_COMM*32 + ADC_RANGE_CHANNELS[i]*64;
Memo1.Lines.Add('Log channel'+IntToStr(i)+'='+IntToStr(ap.ControlTable[i]));
end;
//Задаем скорректированные параметры работы АЦП
pModule.SET_ADC_PARS(@ap);
// отобразим параметры работы модуля по вводу данных на экране монитора
Memo1.Lines.Add(' Module E14-140 (S/N '+StrPas(@ModuleDescription.Module.SerialNumber)+') is ready ... ');
Memo1.Lines.Add(' Module Info:');
Memo1.Lines.Add(' Module Revision is '+StrPas(@ModuleDescription.Module.Revision));
Memo1.Lines.Add(' MCU Driver Version is '+StrPas(@ModuleDescription.Mcu.Version.Version)+StrPas(@ModuleDescription.Mcu.Version.Date));
Memo1.Lines.Add(' ADC parameters:');
Memo1.Lines.Add(' ChannelsQuantity = '+IntToStr(ap.ChannelsQuantity));
r1:=ap.AdcRate;Str(r1:6:2,s1);
Memo1.Lines.Add(' AdcRate = '+s1+' kHz');
r1:=ap.InterKadrDelay;Str(r1:6:2,s1);
Memo1.Lines.Add(' InterKadrDelay = '+s1+' ms');
r1:=ap.KadrRate;Str(r1:6:2,s1);
Memo1.Lines.Add(' KadrRate = '+s1+' kHz');
//Выполняем функцю остановки для сброса АЦП(рекомендация производителя)
pmodule.STOP_ADC;
// if pmodule.START_ADC then Memo1.Lines.Add('ADC started') else Memo1.Lines.Add('******* Error starting ADC! *******');
end;
function calc_adc_angles : boolean;
begin
//Мотор 1
Motors[1].set_adc_angle(chans_mid[1]);
//Мотор 2
Motors[2].set_adc_angle(chans_mid[2]);
//Мотор 3
Motors[3].set_adc_angle(chans_mid[3]);
//Мотор 4
Motors[4].set_adc_angle(chans_mid[4]);
//Мотор 5
Motors[5].set_adc_angle(chans_mid[5]);
end;
function get_voltages : boolean;
var
r1, r2 : short;
voltage : real;
i, q, cch : word;
s1, s2 : string;
Buff : Array[0..CHANNELS_QUANTITY*2] of short;
begin
for q:=0 to CHANNELS_QUANTITY*2 do Buff[q]:=0;
s1:='';
if pmodule.ADC_KADR(@Buff) then
begin
for cch:=1 to USED_CHANNELS do
begin
Voltage:=ADC_INPUT_RANGES_E140[ADC_RANGE_CHANNELS[cch-1]]/MAX_VALUE_ADC*Buff[cch-1];
Voltage:=Voltage-chans_zero[cch];
//Для первого включения - заполняем весь массив текущим значением
if chans_que[cch]=0
then
for i:=1 to adc_filter_que_len do chans_arr[cch,i]:=Voltage
else
chans_arr[cch,chans_que[cch]]:=Voltage;
//Увеличиваем указатель записи следующего элемента
Inc(chans_que[cch]);
if chans_que[cch]>adc_filter_que_len
then
chans_que[cch]:=1;
//Расчитываем среднее значение и удаляем нулевой сигнал
chans_mid[cch]:=0;
for i:=1 to adc_filter_que_len do chans_mid[cch]:=chans_mid[cch]+chans_arr[cch,i];
chans_mid[cch]:=(chans_mid[cch]/adc_filter_que_len); //-chans_zero[cch];
{
if cch=1 then Form1.series1.Add(chans_mid[cch],'',ClRed);
if cch=2 then Form1.series2.Add(chans_mid[cch],'',ClRed);
if cch=3 then Form1.series3.Add(chans_mid[cch],'',ClRed);
if cch=4 then Form1.series4.Add(chans_mid[cch],'',ClRed);
}
if cch=1 then Form1.series1.Add(Voltage,'',ClRed);
if cch=2 then Form1.series2.Add(Voltage,'',ClRed);
if cch=3 then Form1.series3.Add(Voltage,'',ClRed);
if cch=4 then Form1.series4.Add(Voltage,'',ClRed);
end;
Result:=True;
end
else
Result:=false;
end;
procedure TForm1.timer_adcTimer(Sender: TObject);
begin
if not Get_voltages then Memo1.Lines.Add('Error ADC reading!');
if(UpdateStatus()=false) then
Application.MessageBox('Communication Error', 'Error', mb_OK);
Inc(ticks);
end;
procedure TForm1.btn_adcstartClick(Sender: TObject);
begin
if Timer_adc.Enabled then Timer_adc.Enabled :=False else begin Timer_adc.Enabled :=True;ticks:=0; end;
end;
procedure TForm1.Btn_set_zero_motor_angClick(Sender: TObject);
var
i : integer;
begin
For i:=1 to Motors_number do
Motors[i].set_zero_pulse;
end;
procedure TForm1.Button_set_working_modeClick(Sender: TObject);
begin
Positionning_move:=RG_working_mode.ItemIndex;
Case Positionning_move of
1 : begin
Positionning_active := true;
end;
2 : begin
Positionning_active := true;
end;
3 : begin
Positionning_active := true;
end;
0 : begin
Positionning_active := false;
end;
end;
end;
procedure TForm1.Btn_set_target_anglesClick(Sender: TObject);
var
r1, r2, r3, r4, r5 : real;
Code1, Code2, Code3, Code4, Code5 : integer;
begin
Val(Edit_m1_targ_angle.Text, r1, Code1);
Val(Edit_m2_targ_angle.Text, r2, Code2);
Val(Edit_m4_targ_angle.Text, r3, Code3);
Val(Edit_m2_targ_angle.Text, r4, Code4);
Val(Edit_m4_targ_angle.Text, r5, Code5);
if ((Code1<>0) OR (Code2<>0) OR (Code3<>0) OR (Code4<>0) OR (Code5<>0)) then
begin
ShowMessage('Error int target angles!');
end
else
begin
if Code1=0 then Motors[1].set_requested_angle(r1);
if Code2=0 then Motors[2].set_requested_angle(r2);
if Code3=0 then Motors[3].set_requested_angle(r3);
if Code4=0 then Motors[4].set_requested_angle(r4);
if Code5=0 then Motors[5].set_requested_angle(r5);
end;
end;
procedure TForm1.UpDn_chan_id_1Click(Sender: TObject; Button: TUDBtnType);
begin
Edit_chan_id_1.text:=IntToStr(UpDn_chan_id_1.position);
end;
procedure TForm1.UpDn_chan_id_2Click(Sender: TObject; Button: TUDBtnType);
begin
Edit_chan_id_2.text:=IntToStr(UpDn_chan_id_2.position);
end;
procedure TForm1.UpDn_chan_id_3Click(Sender: TObject; Button: TUDBtnType);
begin
Edit_chan_id_3.text:=IntToStr(UpDn_chan_id_3.position);
end;
procedure TForm1.UpDn_chan_id_4Click(Sender: TObject; Button: TUDBtnType);
begin
Edit_chan_id_4.text:=IntToStr(UpDn_chan_id_4.position);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
UpdateStatus;
end;
procedure TForm1.Btn_prg_loadClick(Sender: TObject);
begin
// Задаем каталог файлов
OD_prg_file.InitialDir :='c:\work\mars';
//Запрашиваем имя файла для записи
If not OD_prg_file.Execute then Exit;
//Сохраняем в выбранный файл
LB1.Items.LoadFromFile(OD_prg_file.FileName);
//
Btn_prg_del.Enabled:=True;
Btn_prg_edit.Enabled:=True;
Btn_prg_save.Enabled:=True;
Btn_prg_clear.Enabled:=True;
end;
procedure TForm1.Btn_prg_saveClick(Sender: TObject);
begin
//Проверяем наличие текста программы
If LB1.items.Count<1 then Exit;
// Задаем каталог файлов
SD_prg_file.InitialDir :='c:\work\mars';
//Запрашиваем имя файла для записи
If not SD_prg_file.Execute then Exit;
//Сохраняем в выбранный файл
LB1.Items.SaveToFile(SD_prg_file.FileNAme);
end;
procedure TForm1.Btn_prg_clearClick(Sender: TObject);
begin
LB1.Clear;
Btn_prg_del.Enabled:=False;
Btn_prg_edit.Enabled:=False;
btn_prg_ins.Enabled:=False;
Btn_prg_save.Enabled:=False;
Btn_prg_start.Enabled:=False;
Btn_prg_clear.Enabled:=False;
Подобные документы
Особенности оценки надежности лидарного комплекса по результатам испытаний на этапе отработки опытного образца. Понятие и назначение лидарного комплекса: анализ принципиальной схемы функционирования. Характеристика биномиальной рекуррентной модели.
дипломная работа [2,4 M], добавлен 11.03.2013Методы проведения испытаний РЭСИ. Общий подход к планированию испытаний. Основные положения программы испытаний. Содержание основных разделов программы испытаний и рекомендации по их выполнению. Основные требования и содержания методики испытаний.
реферат [29,1 K], добавлен 14.01.2009Обоснование конструктивно-компоновочной схемы манипулятора и его модулей. Порядок и этапы проведения кинематического и динамического расчета манипулятора. Планирование траектории. Определение точности и повторяемости позиционирования манипулятора.
курсовая работа [331,2 K], добавлен 27.03.2011Климатические особенности региона эксплуатации и методология испытаний электронных средств. Виды и режимы испытаний на влагоустойчивость. Воздействие на изделие солнечного излучения. Испытания на воздействия биологических факторов и оценка роста плесени.
контрольная работа [22,4 K], добавлен 27.05.2012Виды испытаний на воздействие вибрации, методы измерения ее параметров. Принцип работы и устройство испытательного оборудования и контрольно-измерительной аппаратуры. Исследование виброустойчивости и собственных резонансных частот элементов и узлов РЭС.
лабораторная работа [690,7 K], добавлен 17.12.2014Характеристика и технические параметры приемника телевизионного, основные и дополнительные требования к его качеству. Определение состава видов испытаний по контролю качества на воздействие внешних факторов и контролируемые параметры, выбор средств.
курсовая работа [92,0 K], добавлен 14.09.2010Принцип построения центральной испытательной станции. Структура, состав и критерии оценки автоматизированных систем испытаний. Цели, принципы и этапы разработки АСИ. Техническое, информационное и организационное обеспечение испытательной станции.
реферат [21,2 K], добавлен 03.02.2009Цель испытаний при проектировании и производстве электронно-оптических систем. Порядок и программа испытаний образцов серийного производства. Климатические и механические испытания оборудования на воздействие климатических зон и механических воздействий.
реферат [834,4 K], добавлен 14.12.2008Характеристика, применение и назначение микроконтроллерных систем управления. Разработка контроллера инверторного сварочного аппарата, обеспечивающего работу манипулятора. Общий алгоритм работы, составление программного обеспечения для данного блока.
курсовая работа [1,6 M], добавлен 26.12.2012В методе непрерывных испытаний осуществляется непрерывный отбор и постановка изделий на испытания в течение контролируемого периода. В графическом методе планирования испытаний используется кривые распределения Пуассона. Испытания на ремонтопригодность.
реферат [145,6 K], добавлен 28.01.2009