С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/46: Рейтинг темы: голосов - 46, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 2
Delphi 6-7

Полноценное управление LPT портом в Delphi, как лучше реализовать?

11.11.2019, 19:49. Показов 10512. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Большая просьба помочь разобраться в вопросе, как лучше управлять из Delphi LPT портом, так чтобы программа была универсальна и работала под системами от Windows 98 до Windows 7. Очень давно интересуюсь этой темой, но однозначного решения так и не нашел. Есть вариант использовать драйвер inpout32.dll. Он вроде универсальный и работает под всеми вариантами Виндовс, даже 64-битными. Он только пишет в порты и читает из них, но не использует прерывания.
Как получить доступ к прерываниям LPT-порта? Можно это делать как-то через WinAPI? Если да, то как? Был такой компонент под Delphi, но он коммерческий и работает только под ХР. Может какой-то бесплатный драйвер прерываний есть с примерами под Delphi?
Можно ли через WinAPI полноценно работать с портом во всех режимах передачи данных: ECP, SPP, EPP? Я не силен в особенностях WinAPI, может есть готовые примеры, как это делать во всех режимах и как оно работает. Весь русскоязычный Интернет перерыл, нигде ничего нет, только краткие куски кода, но где-то встречал, что через API можно всё делать без сторонних драйверов и программа будет универсальной. Буду очень благодарен за любую помощь в этом вопросе.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2019, 19:49
Ответы с готовыми решениями:

Управление LPT портом
Хочу управлять портом LPT через уже установленный стандартный драйвер, отправляя ему управляющие IOCTRL. Как это сделать ? Где достать...

Управление Lpt портом
Подскажите, как управлять пинами lpt порта? Все, что нашел в интернете либо не работает, либо не компилится. Доп настроек на компьютере...

Управление LPT портом
Нужно управлять LPT портом в BORLAND C++ 3.1 Подскажите каким образом осуществлять ввод и запись в порт информации.

47
9 / 294 / 4
Регистрация: 02.04.2009
Сообщений: 803
06.02.2023, 18:31
Студворк — интернет-сервис помощи студентам
По ссылке
https://cnc-tehnologi.ru/chpu-... rekhodniki много контроллеров с LPT-интерфейсом.

Добавлено через 4 часа 14 минут
Цитата Сообщение от Rius Посмотреть сообщение
С тех пор используем USB-UART
Мы два месяца мучили плату USB_6560T4V3EN 4 осевой ШД, но она так и не заработала. Это контрафактная и морально устаревшая плата, содранная китайцами с европейского производителя Planet-CNC, который перестал поставлять оборудование в Россию. То есть с прикладным ПО, которое идет вместе с платой, она работает, но как программисту с ней невозможно работать.
0
Эксперт .NET
 Аватар для Rius
13052 / 7618 / 1664
Регистрация: 25.05.2015
Сообщений: 23,162
Записей в блоге: 14
06.02.2023, 18:37
Rasool,
Берём простой драйвер шаговика, типа приведённого мной выше. Устройство это очень тупое. Сколько импульсов подал, столько от прокрутился. Вместо него можно любой другой, что найдёте, лишь бы с подобным примитивным интерфейсом.
Берём микроконтроллер с aliexpress. Пишем для него простенькое встроенное ПО. Которое принимает по UART посылку с ПК и выдаёт импульсы на драйвер.
Берём мост USB-UART (Silabs CP210x, FTDI, Prolific PL2303, CH340), подключаем через него микроконтроллер к ПК.
На ПК пишем софтину, которая отправляет понятные встроенной в МК софтине команды.

Единственное стороннее ПО здесь будет - драйвера USB-UART адаптера. Ну и винда. Верхнего и нижнего уровня ПО - своё.
Программисту работать в радость.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 863
06.02.2023, 20:01
тут вообще из софта только само приложение. А оно хоть на Delphi хоть на чём.
всё остальное уже написано и лицензия позволяет использовать и продавать
0
9 / 294 / 4
Регистрация: 02.04.2009
Сообщений: 803
07.02.2023, 17:52
Цитата Сообщение от Rius Посмотреть сообщение
Плата расширения может пропасть из продажи. И не факт, что вы потом найдёте рабочую замену.
Что нам мешает заранее приобрести пару-тройку десятков таких плат, что закроет наши потребности на годы вперед? У нас очень маленькое штучное производство.

Пока что купили плату Контроллер шаговых двигателей 4х осевой TB6560HQ Blue и плату расширения DEXP 2COM LPT, которая подсоединяется к компьютеру через PCI-Express и для нее устанавливается свой драйвер. В диспетчере устройств плата видна как WCH PCI Express=>DUAL SERIAL&&PARALLEL.
Есть вариант использовать inpout32.dll, там есть такие функции
Delphi
1
2
function Inp32(PortAdr: Word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: Word; Data: byte): byte; stdcall; external 'inpout32.dll';
То есть для работы с LPT-портом нужно указывать адрес порта PortAdr. Где его можно посмотреть? Во вкладке "Ресурсы" свойств драйвера?
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 863
07.02.2023, 22:33
А вот тут начинается самое интересное )
Судя по комментариям - которые можно посмотреть под фотками к этой плате на сайте ДНС вам придётся самостоятельно преодолевать глюки. Ибо даже linuxcnc от этих плат отказались http://wiki.linuxcnc.org/cgi-bin/wiki.pl?WCH

Но даже если вы это преодолеете - то дальше веселее.
Для управления ШД через LPT нужно формировать очень стабильные по длительности и частоте следования импульсы.
Импульсы должны идти синхронно с поворотом вала двигателя иначе будет пропуск шагов.
На малых скоростях вращения вы может этого и не заметите, с повышением скорости - шаговик может начать заедать, останавливаться, появятся вибрации и пр. На винде принципиально не лечится (
2
9 / 294 / 4
Регистрация: 02.04.2009
Сообщений: 803
09.02.2023, 15:53
Цитата Сообщение от Rasool Посмотреть сообщение
Передо мной сейчас поставили задачу подавать сигналы на LPT-порт через плату Плата расширения DEXP 2COM LPT из программы, написанной на Delphi. В данной модели используется интерфейс PCI-E x1. Внутренний разъем PCI, через него контроллер присоединяется к плате.
Вчера заработал LPT-порт. Использовал драйвер inpout32.dll, в качестве адреса порта использовал адрес из "Диапазона ввода/вывода (I/O)" из вкладки "Ресурсы" драйвера параллельного порта в "Диспетчере устройств".
Delphi
1
2
function Inp32(PortAdr: Word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: Word; Data: byte): byte; stdcall; external 'inpout32.dll';
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
    PortAdr1 := $EEFC;
    PortAdr2 := $EEFF;
    Data := 255;
    for PortAdr := PortAdr1 to PortAdr2 do
        Out32(PortAdr, Data);
    Sleep (2000);
    Data := 0;
    for PortAdr := PortAdr1 to PortAdr2 do
        Out32(PortAdr, Data);
    Sleep (2000);
    Data := 255;
    for PortAdr := PortAdr1 to PortAdr2 do
        Out32(PortAdr, Data);
0
9 / 294 / 4
Регистрация: 02.04.2009
Сообщений: 803
13.02.2023, 18:15
Цитата Сообщение от Aledveu Посмотреть сообщение
На малых скоростях вращения вы может этого и не заметите, с повышением скорости - шаговик может начать заедать, останавливаться, появятся вибрации и пр. На винде принципиально не лечится
Состряпал простенькую программу. При частоте в 1 кГц шаговик чисто визуально стабильно крутится.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 if TryStrToFloat(ParallelPortPeriodEdit.Text, time_out) and
      TryStrToInt(ParallelPortCodeEdit1.Text, value1) and
      TryStrToInt(lblStepNumber.Text, StepNumber) then
    begin
        if (value1 = 0) or (value1 = 1) then
            for i := 1 to StepNumber do
            begin
                Data := value1 * 2;
                for PortAdr := PortAdr1 to PortAdr2 do
                    Out32(PortAdr, Data);
                Delay_mcs(time_out);
                Data := 1 + value1 * 2;
                for PortAdr := PortAdr1 to PortAdr2 do
                    Out32(PortAdr, Data);
                Delay_mcs(time_out);
            end;
    end
    else
        ShowMessage('Ошибка ввода');
0
9 / 294 / 4
Регистрация: 02.04.2009
Сообщений: 803
29.06.2023, 18:46
Данный код при установке переменной Vel больше нуля начинает вращение по часовой стрелке,
при установке переменной Vel меньше нуля начинает вращение против часовой стрелке,
при установке переменной Vel равной нулю останавливает двигатель.
Всего к плате подсоединено 4 шаговых двигателя, которые вращаются с одинаковой скоростью.
Но тут проблема в том, что может потребоваться вращение разных ШД с разной скоростью. Процедура Out32 выдает целый байт (все 8 битов одновременно) в разряды 2-9 LPT-порта.
Поэтому для программного изменения скорости вращения отдельных ШД может понадобиться организовывать дополнительные отдельные циклы в отдельных потоках, устанавливающие разные количества частот изменений RotateStep[i] для каждого двигателя. Тогда задержки для каждого отдельного ШД будут кратны величине time_out.
Существует ли процедура типа Out32, которая меняет только отдельные разряды на входе LPT-порта? Тогда в каждом отдельном для каждого ШД потоке можно будет записывать сигналы RotDir[i] и RotateStep[i] со своей задержкой time_out = K / Vel[i], где K - коэффициент умножения.
Вот описание платы CNC TB6560HQT 4V3: https://www.duxe.ru/load/red%20TB6560HQT%204V3.pdf

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
 
procedure ChangeRotateSD; // Вызывается при изменении величины SetVel
var
    i: Integer;
begin
    i := AxisNum;
    if Vel > 0 then // Направление вращения
    begin
        RotDir[i] := 0;
        RotateStep[i] := 1
    end
    else if Vel < 0 then // Другое направление вращения
    begin
        RotDir[i] := 1;
        RotateStep[i] := 1
    end
    else // Остановка
    begin
        RotDir[i] := 0;
        RotateStep[i] := 0
    end;
end;
 
function RotateThread(Parameter: pointer): Integer;
 
    procedure Delay_mcs(time_out: double); // Задержка в микросекундах
    var
        iCounterPerSec: TLargeInteger;
        T1, T2: TLargeInteger; // значение счётчика ДО и ПОСЛЕ операции
    begin
        QueryPerformanceFrequency(iCounterPerSec);
        // определили частоту счётчика
        QueryPerformanceCounter(T1); // засекли время начала операции
        T2 := T1;
 
        while (T2 - T1) * 1000000 / iCounterPerSec < time_out do
            QueryPerformanceCounter(T2); // засекли время окончания
    end;
 
var
    PortAdr: word;
    Data: byte; // То, что выдается в LPT-порт
    time_out: double;
begin
    PortAdr := $EEFC; // Адрес LPT-порта
    time_out := 500; // Задержка в микросекундах
    // Установка 0 возвращаемому значению
    Result := 0;
 
    while true do
    begin
        Data := RotDir[1] * 2 + RotDir[2] * 8 + RotDir[3] * 32 + RotDir[4] *
          128; 
        Out32(PortAdr, Data);
        Delay_mcs(time_out);
        Data := RotateStep[1] + RotateStep[2] * 4 + RotateStep[3] * 16 +
          RotateStep[4] * 64 +
      RotDir[1] * 2 + RotDir[2] * 8 + RotDir[3] * 32 + RotDir[4] * 128;
        Out32(PortAdr, Data);
        Delay_mcs(time_out);
    end;
 
    // Конец потока
    EndThread(0);
end;
 
procedure InitializeHardware;
var
    id1: LongWord;
    thread1: Integer;
    msg1: TMsgRecord;
begin
    IsSoftwareControlEngine := true;
 
    RotateStep[1] := 0; // Начальная скорость вращения ШД = 0
    RotateStep[2] := 0; // Начальная скорость вращения ШД = 0
    RotateStep[3] := 0; // Начальная скорость вращения ШД = 0
    RotateStep[4] := 0; // Начальная скорость вращения ШД = 0
    RotDir[1] := 0;
    RotDir[2] := 0;
    RotDir[3] := 0;
    RotDir[4] := 0;
    thread1 := BeginThread(nil, 0, Addr(RotateThread), Addr(msg1), 0, id1);
 
    CloseHandle(thread1);
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2023, 18:46
Помогаю со студенческими работами здесь

Управление LPT портом из Windows XP
Помогите решить проблему. Нужно чтобы например на рабочем столе было два значка один из которых включает 5 вольт на любом из выводов LPT, а...

Управление LPT портом под FreeBSD
Здравствуйте! Пытаюсь откомпилировать следующий код под FreeBSD: #include &lt;stdio.h&gt; #include &lt;fcntl.h&gt; #include...

Управление LPT портом, что нужно для работы
Как можно управлять LPT какие дрова нужны как ими пользоваться очень много перерыл ничего не работает хочу сделать программу которая будет...

Управление lpt портом, используя библиотеку inpout32.dll
Здравствуйте! Использую inpout32.dll Подскажите пожалуйста что писать в: PortAccess.Output(); что бы вывести в контакт 2-5 (выходы...

Как работать с портом LPT?
Народ подскажите как в VB .net работать с LPT plz...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru