| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программное обеспечение > Эмулятор вместор принтера |
| Автор: Gr_Dragon 2.9.2005, 14:52 |
| Подскажите, если кто-чего знает на эту тему. Задача следующая. Есть некое устройство, которое выводит данные распечаткой на EPSON - принтер (ТОЛЬКО ТЕКСТ). Необходимо вместо матричного принтера подключить компьютер и чтобы вся информация печаталась в файл. Существуют ли такие программы- эмуляторы. |
| Автор: Shlit 2.9.2005, 18:17 |
| Что за устройство? Какой интерфейс? |
| Автор: Romtek 6.9.2005, 00:14 |
| Это кажется называется "виртуальный принтер". |
| Автор: Shlit 6.9.2005, 16:39 | ||
Может, софт и существует, но я не пойму, как устройство, подключаемое к принтеру, можно подцепить к компу. Через параллельный порт? Это как вместо принтера я к своему компу прицепил бы второй и он посредством некого софта создал на винте файл. А не проще сразу скидывать инфу в виде текстового файла? А на втором можно, если уж очень надо, в опциях принтера (настоящего, или просто установленого драйвера поставить галочку "печать в файл"). |
| Автор: G_Dragon 7.9.2005, 11:53 |
| Это не компьютер, это прибор, который работает круглосуточно и жрёт столько бумаги, что наверное ни одна типография столькео не ест. Поэтому и появилась такая идея - использовать комп. Но пока безуспешно. Интерфейс вывода на принтер из прибора - Centronics. |
| Автор: Shlit 7.9.2005, 16:37 | ||
А как это подключается к принтеру? И какой порт на компьютере вы собираетесь использовать для его подключения? |
| Автор: LSD 7.9.2005, 21:33 |
| Может я ошибаюсь (никогда не пробовал такое), но нуль модемный LPT кабель должен подойти (тот которым можно соединить два компа). Проблема только в том, как перенаправить вывод с LPT порта в файл. Я бы написал прогу для этого |
| Автор: Гость_xgm 8.9.2005, 08:21 |
| В свойствах принтера указать, что вывод в файл ??? |
| Автор: Sardar 8.9.2005, 12:55 |
| Поставь http://sourceforge.net/projects/pdfcreator/, он встанет "вирутальным принтером", печатай "в него", на выходе получаешь PDF документ. |
| Автор: LSD 8.9.2005, 13:10 | ||
PDFCreator не поможет, т.к.:
Надо на той стороне эмулировать для этого девайса принтер. |
| Автор: Akella 12.9.2005, 10:22 |
| я уже давал ссылку на программу - виртуальный принтер, поищите что-то типа VirtualPrinter |
| Автор: Akella 12.9.2005, 10:35 |
| может не в этом разделе, а в разделе windows или Deplhi, поищите через поисковики, вот, нашёл http://forum.vingrad.ru/index.php?showtopic=46090&st=0entry357411 |
| Автор: LSD 12.9.2005, 10:48 |
| А куда эти программы ставить? |
| Автор: Akella 3.10.2005, 15:07 |
| В операционную систему, |
| Автор: LSD 3.10.2005, 17:15 | ||||
А она там есть?
|
| Автор: Retro 4.10.2005, 08:32 |
| Я для виртуальной печати пользуюсь программой VentaFax, никаких нареканий, несколько форматов и вообще очень удобно. |
| Автор: Romtek 4.10.2005, 15:18 |
| Есть какие-нубудь бесплатные аналоги VentaFax? |
| Автор: Zerstroer 17.7.2008, 08:24 |
| Столкнулся с аналогичной проблемой. К устройству (Терминал системы управления бетонным заводом SPECO) подключен принтер. Требуется вместо принтера подключить через com либо lpt порт компьютер, с возможностью отображения на нем того, что устройство отправило на печать. Если на приведенных выше ссылках имеется подобный эмулятор, прошу сообщить. |
| Автор: JusTalionis 19.7.2008, 09:15 |
| Прием данных через LPT на таких условиях по-видимому возможен, но ожидается весьма много заморочек, и наверное понадобится писать специальную утилиту. А вот с COM сложностей особенных нет. Запускаете на компе утилиту под названием "Терминал" и принимаете то, что на COM вам приходит. Различных терминалов в Сети можно немало найти. Вот, например http://forum.vingrad.ru/forum/topic-200028/kw-com-serial-rs--%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BF%D0%BE%D1%80%D1%82/30.html лежат исходники моей самописной утилитки на эту тему, которые можно подредактировать под ваши задачи, если надо. |
| Автор: skyboy 19.7.2008, 09:49 |
| вот насчет имеющегося решения(чтоб прнимала данные с порта и по ним восстанавливала рисунок) - должно быть сложновато. все известные мне "виртуальные принтеры" работают, получая данные на уровне драйвера принтера, а не перехватывая на уровне драйвера порта. скорее всего, придется такую программу заказывать. |
| Автор: JusTalionis 19.7.2008, 10:09 |
| Вообще-то не-процессорные устройства графику не передают - а чем они ее будут создавать? На микросхемах К155 формировать что ли? Но в случае, если передача в графическом формате - это конечно значительные заморочки. Данные на строку символов (24 иголки, если Epson) принимаем в буфер, а потом дешифруем. Теоретически возможно, но оооочень гиморно, конечно. Это своего рода будет драйвер принтера навыворот, "антидрайвер"))))) |
| Автор: Zerstroer 21.7.2008, 06:22 |
| Принтер подключенный к терминалу управления матричный и с LPT портом. "Терминал" - имеете ввиду считыватель с порта? А конкретное название какого-нибудь можно? |
| Автор: JusTalionis 21.7.2008, 19:13 |
| Про принтер я понял. Важно что ваше устройство способно передавать не только через LPT, но и через COM. Утилита связи через COM-порт тоже называется "терминал" (как и ваше устройство). Под DOS она вообще входит в состав 5-го Нортон-Коммандера. Но найти в Сети непросто, потому что на первые места лезут различные торговые терминалы, а у меня траффик платный. Так что ищите, плиз, самостоятельно. Здесь могу подарить только свою утилитку (на исходники которй давал ссылку). Скомпилировал ее в готовый файл и присоединяю его в этом сообщении для Вас. Чтобы прием был, настройка порта (скорость, четность, битность данных) должна быть одинаковая как на вашем устройстве, так и на компьютере. Порт компьютера настраивается утилитой, а как настраивается порт вашего устройства - смотрите документацию к нему. Может быть у него параметры даже жестко "зашитые" и не меняются. Тогда на такие же настраиваете компьютер - и должно приниматься. Если разъем на вашем устройстве стандартный, то соединить можно обычным кабелем "нуль-модем" для COM. |
| Автор: Zerstroer 23.7.2008, 06:22 |
| Очень Вас благодарю, JusTalionis. О результате решения сообщу. Спасибо. С настройкой порта предвещаю себе сложности, т.к. на машине отправителе (промышленном комьпютере) никаких настроек пользователем вообще не предусмотрено и документация на нее отстутствует. В итоге свою задачу распределил на 3 этапа: 1. Соединение к порту COM. 2. Прием данных с порта. 3. Дешифровка и вывод. |
| Автор: JusTalionis 23.7.2008, 10:05 |
| 1. Про соединения. Кроме общего провода ("земли") на COM есть две основных линии передачи: RxD и TxD (на прием и на передачу). Таким образом, для правильного обмена данными между устройством и компьютером TxD попарно соединяются с RxD (один принимает то, что другой передает). Во всех современных устройствах этих двух линий на практике достаточно. Если ваше устройство только передает, было бы достаточно даже одной. НО! Предусмотрено еще несколько линий для индикации состояния, типа "компьютер готов к приему" или к передаче. Сейчас прекрасно обходятся без них, а вот ваш промышленный компьютер (контроллер управления, как я понимаю) может эти сигналы затребовать. Обычно ставят просто две перемычки на разъеме, и этого бывает достаточно. В любом случае, рекомендовал бы Вам почитать подробнее про протоколы обмена по COM. 2. Настройки порта. В моей утилитке "по умолчанию" выставлена самая ходовая настройка: скрость 2400, без четности, 8 бит данных, 1 стоповый бит. Некоторые старые телетайпы передавали, как я знаю 5-битные данные (с иным на практике не встречался никогда). Скорость можно оценить осциллографом по частоте передаваемых импульсов в посылке, но надо иметь ввиду, что рядом стоящие импульсы могут сливаться, так что точной длительности здесь не увидишь. Но оценить порядок, то есть скорость 50 или 9600 вполне можно. Остальное подобрать перебором, благо вариантов не сильно много. (примечание. Существует еще режим "полтора" стоповых бита, но он настолько редок, что я не внес его в свою утилитку.) 3. Дешифровка. Если ваше устройство расчитано передавать на принтер - скорее всего, специальной дешифровки не понадобится, так как передаются обычные буквенные коды. В этом случае моя утилитка буквами их и покажет; никакой специальной дешифровки она не делает, показывает "как есть" (предназначена была для отладки связи с микроконтроллерами). Впрочем, если точно знать, какая именно дешифровка нужна, ее нетрудно приделать - исходники-то имеются. Также, при необходимости, можно приделать и вывод в файл. |
| Автор: Zerstroer 24.7.2008, 06:22 |
| Задача усложняется тем, что с устройства передача идет через LPT порт, а на компьютере принимать ее придется через COM. |
| Автор: JusTalionis 24.7.2008, 06:53 |
| Эту вашу фразу я так понял что на вашем устройстве два разъема: для принтера COM и для принтера LPT. А с LPT на COM принять невозможно - это различные форматы передачи. С LPT возможно принять на LPT, но для этого надо распаивать специальный кабель и писать совершенно другую утилиту для работы с LPT. Задача осложняется тем, что в ОС стандартых функций приема через LPT нет (только отправка), поэтому утилите придется обращаться непосредственно к "железу" порта, а в XP с этим большие заморочки. Но если Вас удовлетворит ДОС, то я могу попробовать написать Вам такую утилиту. Вероятно что под WIN9x она будет работать тоже. |
| Автор: Zerstroer 24.7.2008, 11:42 |
| Был бы очень рад такой, даже DOSовской утилите. Кое что, по работе с LPT нашел здесь: http://valery-us4leh.narod.ru/main.html А какая распайка LPT кабеля лучше всего для этого подойдет? В данный момент эксперементирую с нуль-модемным lpt соединением. Распайка такая: XI, разъем РС#1 Х2, разъем РС#2 Бит Контакт Контакт Бит DR.O 2 15 SR.3 DR.1 3 13 SR.4 DR.2 4 12 SR.5 DR.3 5 10 SR.6 DR.4 6 11 SR.7 SR.6 10 5 DR.3 SR.7 11 6 DR.4 SR.5 12 4 DR.2 SR.4 13 3 DR.1 SR.3 15 2 DR.O GND 18-25 18-25 GND Для имитации "передачи" использую печать из под DOS командой print и линуксовское перенаправление потока на lpt порт. На http://valery-us4leh.narod.ru/main.html имеются программы следящие за входящими сигналами по LPT. |
| Автор: JusTalionis 24.7.2008, 16:58 |
| Кабель нуль-модема LPT даже не пытайтесь, потому что он предназначен для двунаправленной передачи: половина жил - "туда", половина "обратно". Всего линий 8, так что на каждое направление остается по 4. Поэтому по такому кабелю данные передаются полубайтами: по 4 бита. А ваше устройство выдает на принтер - значит полными байтами по 8 бит. Если программная часть у меня получится, распайку кабеля я вам нарисую. Это, кстати, наиболее несложная часть дела. Сайт хороший. Там все правильно говорится, что для таких вещей под XP надо регистрировать драйвер (но об этом мы пока отложим). Разбирая протокол работы принтера, я увидел, что управляющее устройство выдает на принтер строб данных - импульс очень короткий. Принтер улавливает его аппаратно - перебрасывается триггер, и всё. А компьютер должен непрерывно опрашивать порт. Но он же это делает не мгновенно, и в промежутке между запросами такой короткий импульс может успеть проскочить незамеченным. В результате буква потеряется. Но я пытаюсь задействовать механизм прерываний, чтобы эту трудность решить. Соответственно, писать приходится на ассемблере, а на сайте Валерия материалы даны для Дельфи, так что не пойдут. |
| Автор: Zerstroer 25.7.2008, 06:10 |
| Что ж, мне остается только ждать Вашей помощи, JusTalionis... Мои знания Assemblerа не достаточны для решения подобной задачи. Продолжаю изучать теорию. |
| Автор: JusTalionis 25.7.2008, 08:29 |
| Предварительные результаты надеюсь получить где-то в течение недели. После чего можно будет говорить более предметно, как будет порт работать на выбранных режимах. Если что - пишите мне в личку. |
| Автор: JusTalionis 28.7.2008, 10:30 |
| Уважаемый Zerstroer, ситуация складывается так, что без Вашего непосредственного участия не обойтись. Посмотрите пожалуйста, какова РЕАЛЬНО длительность импульса строба, который выдает ваше устройство принтеру? Это можно посмотреть осциллографом на ножке 1 разъема LPT, который 25-контактный на компе (а не на принтере. На принтере другая нумерация). Общим проводом ("земля") являются все контакты с 18-го по 25-й. Желательно использовать при измерении именно один из них, а не шасси прибора. Интересует длительность пребывания сигнала на ножке 1 в состоянии "0" во время нормальной печати на принтер. Ожидается, что очень короткие "инверсные" (то есть от +5v до 0v) импульсы могут присутствовать периодическими пачками. Интересует именно длительность единичного импульса, насколько она мала. Если миллисекунды - это одно, а если микросекунды - сааааавсем другое... Ориентируясь на вашу информацию, я буду думать, как именно можно отловить приход такого импульса. Пожалуйста отпишите подробно, что Вы там увидели. |
| Автор: Zerstroer 29.7.2008, 06:16 |
| К сожалению, я не имею доступа к промышленному компьютеру, для которого, собственно говоря, все и делается. Импульс снять не смогу. Располагаю только http://kazus.ru/articles/226.html. Именно такой интерфейс (36 контактов) пром. компьютер и использует. Я так понял, что возникла проблема с интервалом отлова импульса строба? |
| Автор: JusTalionis 29.7.2008, 09:27 |
| Эти данные мне известны. Собственно, они-то и создают проблему, так как из них следует, что строб имеет длительность 500 наносекунд. Тут даже и прерывание не факт что поможет. Но это минимально дозволенная его длительность. Скорее всего, ваш технологический компьютер формирует гораздо более длинный (потому что такой короткий программно сформировать непросто). Поэтому я и запросил реальные данные с устройства. Если же ориентироваться именно на эту длительность строба и присутствия данных, то ловить такие придется только аппаратно, то есть ставить микросхему "регистр-защелка", которая будет хранить данные, пока компьютер их не прочитает из нее. Поэтому гораздо лучше все же реальную длительность измерить. Что, электронщиков там нет что ли, которые могли бы разобрать разъем и померить? Или орг проблемы с руководством? |
| Автор: Zerstroer 29.7.2008, 09:32 |
| Проблемы и в том и в другом. Электронщиков там нет, т.к. это бетонный завод. И операторам компьютера строго настрого запрещено, кого либо пускать ближе чем к принтеру. А какова минимальная длительность строба, которую можно отловить программно? От чего должна зависеть эта длительность? От машины с которой ведется печать? Из моего впечатления об этом компьютере я могу предположить, что длительность должна совпадать с длительностью печати с обычного PC на матричный принтер. |
| Автор: JusTalionis 29.7.2008, 16:52 |
| Длительность строба со скоростью печати не соотносится. Скорость печати зависит от частоты следования этих импульсов. Если эти импульсы повторяются редко, то скорость печати будет маленькой, но сами они могут оставаться очень короткими, тем не менее. Какой импульс можно надежно отловить? Это зависит от того какой компьютер и под какой системой. Виндовс - очень медленная, в этом смысле, система. Она производит много не относящихся к делу операций, и на них уходит время. Наибольшую скорость дает ДОС, потому что ничего не забирает для себя. Весь ресурс компьютера предоставляется программе. Если писать программу без изысков, просто проверкой состояния порта, то компьютер должен совершить следующее: прочитать данные с порта LPT Сравнить их с образцом Если не совпадает - строба нет, продолжать; прочитать порт клавиатуры сравнить с образцом Если ни одна клавиша не нажата, вернуться на начало (повторение цикла) (Опрос клавиатуры к LPT не относится, но это необходимо: а вдруг ваше устройство перестало передавать данные? - тогда комп, без обращения к клавиатуре, завис бы.) Я сделал практическую проверку, набросав такую программку на ассемблере. Оказалось, что вращение подобного цикла на машине 1 Ггц занимает примерно 8 мкс, на более медленной машине, соответственно, будет больше. Следовательно, чтобы строб надежно ловился этим методом, он не должен быть короче 10 мкс по крайней мере (иначе проскочит между проверками). Применив оптимизацию кода, скорость можно несколько увеличить, но не в 20 раз, это ясно. Добавлено через 10 минут и 43 секунды ЗЫ: если доступ хотя бы к принтеру есть, то нет проблемы померить ипульс на этом конце кабеля. На стороне принтера строб также приходит на 1-й контакт, "земля": 19..30. |
| Автор: JusTalionis 29.7.2008, 17:07 |
| но мерить надо во время работы принтера. На отключенном разъеме никаких импульсов не будет, потому что возникнет состояние ошибки, обрыва. |
| Автор: JusTalionis 29.7.2008, 23:09 |
| Распайка кабеля для нее (и для остальных, если она заработает) такова: ---> ------------- 1 - 10 2 - 15 3 - 13 4 - 12 5 - 11 6 - 1 7 - 14 8 - 16 9 - 17 10 - 2 11 - 3 12 - 4 13 - 5 15 - 6 18..25 - 18..25 --------------- эта распайка - для двух 25-контактных разъемов (как на компьютере, а не как на принтере) Слева порт-источник, справа - приемник. Выводы с 18 по 25 - "земля", могут быть соединены друг с другом. Неуказанные контакты оставить свободными; не подключены никуда. Утилита, приложенная к этому сообщению, предназначена только для проверки "механизма", она не имеет совершенно никакого сервиса. Принимаемые символы она просто кидает на экран без какой-либо обработки. Нажатие любой клавиши закрывает программу. Утилита- для работы под настоящей ДОС, а не в сеансе под Виндовс. Работает только с портом LPT1. Если компьютер современный, и периферия может настраиваться в BIOS, то порту должен быть установлен режим Bi-Dir и прерывание (irq) 7. С иными параметрами работать не будет. Пожалуйста проверьте; не факт, что заработает, потому что проверялась только на сигналах, задаваемых в ручную. Чтобы проверить с реальным источником-портом нужен второй компьютер, и это у меня будет не раньше, чем закончится мой отпуск ЗЫ Данная версия содержала ошибки, и за это удалена. См. пост ниже, к которому приложена исправленная версия, проверенная в реальных условиях. |
| Автор: Zerstroer 30.7.2008, 07:54 |
| Произведу проверку утилиты и кабеля в кратчайшие сроки! |
| Автор: Zerstroer 22.8.2008, 07:38 |
| Что ж кратчайшие сроки затянулись. Но скоро проверка будет произведена! С подключением новых ресурсов с моей стороны стало возможно использование варианта с микросхемой. |
| Автор: JusTalionis 22.8.2008, 08:18 |
| Хотелось бы конечно, чтоб заработало просто по кабелю. Микросхема - это какой ни есть, а все-таки "огород". Будем надеяться на лучшее. |
| Автор: mihanik 23.8.2008, 09:44 |
| Жаль, что невозможно использовать ставшую уже стандартной утилитку, которая перехватывает печать из программ DOS, запущенных в сеансе Windows XP... :-( Так многие старые программы научил работать на виндовых принтерах и получать текст в файле, вместо бумаги... |
| Автор: Zerstroer 27.8.2008, 10:21 |
| Произвел проверку первой версии утилиты. К сожалению результат отрицательный. Утилиту запустил из под живого и настоящего MS-DOS 6.22 + NortonCommander 5.0 На печать отправил из того же Norton Commandera 5.0 через встроенный редактор F4. Реагирования на принимающей стороне не было. Полученный результат тоже результат! Из за сомнений по поводу возможности собственной ошибки вопрос: каким образом можно проверить функциональность LPT порта на принимающей машине? Как задать сигналы вручную (как вы проделали без передающей машины)? Кабель я прозвоню. |
| Автор: JusTalionis 27.8.2008, 18:27 |
| Можно проверить следующим образом. 1. Контакт 10 порта LPT1 (принимающая машина, здесь и далее) через резистор 1 кОм соединить с +5v. +5 можно взять с контакта 5 того же порта. Я просто втыкал резистор длинными ножками в соответствующие дырочки разъема. 2. Контакты 1, 11, 12, 13, 14, 15, 16, 17 - соединить с "землей" выборочно - в произвольной комбинации (это имитация "данных") Но можно все оставить свободными. 3. Контакт 10, не отключая резистора, кратковременно соединять с "землей". В моменты соединения, на экране должны появляться знаки и группы знаков (так как контакт 10 - это строб прихода данных). Какие именно знаки - зависит от того, какие контакты из 1..17 соединены с "землей". Если все контакты 1..17 не подключены, будет выводиться символ 0FFh, отображаемый обычно пробелом. В этом случае будет видно, как курсор текста "бежит" по экрану. Могут также появляться какие-нибудь знаки от наводок на пустые входы. Если на экране ничего происходить не будет, значит принимающий порт не работает почему-то вообще. Проверьте настройку LPT в BIOS компьютера. Должен быть режим Bi-Dir, прерывание 7, базовый адрес 378h. (В некоторых БИОСах настраиваются не все эти параметры, тогда надо настроить те, которые есть). Если порт находится на вставной карточке - нужно проверить, стоит ли на нем перемычка (джампер), отвечающая за включение прерывания (IRQ). Если есть еще джамперы, переключающие номер порта, то должно быть LPT1, а не 2. Со своей стороны, я попробую соединение между компьютерами на работе (это может потребовать нескольких дней времени). Отпишите, пожалуйста, о результатах проверки "в ручную". |
| Автор: JusTalionis 28.8.2008, 13:42 |
| Запустил утилиту на двух машинах, как положено. Утилита криво, но работала. Выяснилась небольшая, но очень каверзная ошибка. В ассемблере много тонких нюансов... я потратил 7 часов, пока нашел, в чем дело)))) Сейчас ошибка исправлена. Выкладываю в этом посте исправленную версию утилиты. Эта версия у меня четко работала в реальных условиях на прием данных, передаваемых на печать другим компьютером. Обе машины - под "чистой" ДОС от WIN98, вывод на печать был сделан командой F9 в режиме просмотра текста нортоновским вьюером (wpview). Zerstroer, пожалуйста возьмите исправленную версию и проверьте у себя. |