Виртуальный принтер в системе
Материал из Info
Часто при использовании компьютерных систем необходимо проверять печать документов еще перед тем, как они будут отправлены к реальному принтеру. Поэтому создано множество различных виртуальных принтеров. Они выполняют задачи реального принтера, но отражают документ на экране без его дальнейшей печати на бумаге. Данная функция может быть очень удобной при некоторых операциях, особенно при тестировании и настройке системы. Они заменяют реальный принтер в части операций и позволяют ускорить анализ выводимых на печать данных.
Содержание
Основы виртуального принтера
Виртуальный принтер представляет собой отдельную программу, которая принимает заявки на печать, располагает их в памяти компьютера, превращает в графику и сохраняет в виде файла, но которая никаким образом не связана с аппаратной частью компьютера. В итоге всего этого процесса, клиенты могут видеть результат на экране еще до того, как документ будет распечатан. Таким образом, быстро и просто проверяются результаты действия одной или другой программы. Виртуальные принтеры инсталлируются в систему в виде стандартного принтера. Для прикладных программ нет разницы, будут ли происходить печать на стандартном или виртуальном принтере. Для них это стандартная коммуникация с системным принтером. Поэтому можно проверить результаты в реальных условиях, но без расходов бумаги или других принадлежностей.
Технология работы
Существует 2 вида виртуального принтера:
В отношении функций основной программы и использования, указанных выше технологий, оба вида принтера абсолютно аналогичны. Поэтому выбор является вопросом предпочтений.
Популярные виртуальные принтеры
Самые популярные виртуальные принтера это:
Каждый их перечисленных продуктов может устанавливаться в операционной системе и полностью работоспособен в ПО Microinvest. В зависимости от вида инсталлированного принтера, результат открывается моментально на экране или сохраняется в дополнительном файле, который впоследствии может быть прочтен.
Настройка виртуального принтера в Microinvest
В Microinvest Склад Pro достаточно, чтобы принтер был настроен в «Диспетчере печати» и чтобы было указано, какие документы будут отправляться к виртуальному принтеру. После чего настройка в программе закончена. Microinvest Склад Pro позволяет печатать все документы и отчеты на виртуальном принтере. В Microinvest Склад Pro Light существует несколько возможностей:
Программные продукты не ощущают разницу при работе с реальным или виртуальным принтером, поэтому при правильной установке и настройке виртуального принтера, работа программы не отличается от стандартной. Единственно, что вместо бумажного варианта, соответствующий документ появится на экране.
Эмулятор фискального устройства
Интересная возможность настройки и тестирования функций Microinvest Склад Pro Light заключается во включении виртуального принтера в качестве стандартного фискального устройства или кухонного принтера. В таком случае Microinvest Склад Pro Light печатает соответствующие фискальные или кухонные чеки с помощью виртуального принтера. Это дает возможность специалистам тестировать, модифицировать и настраивать документы без наличия реального устройства и без накопления оборотов в фискальной памяти. Настройка такой системы следующая:
Т.к. виртуальный принтер всего один, хорошей идеей будет поставить на каждый принтер определенный текст, например в Header1 «Кухонный-1» или «Фискальный-1», для того чтобы можно было отличить, какое устройство работает в данный момент.
Выводы
Использование виртуальных принтеров предоставляет огромные возможности для тестирования программы с различными комбинациями принтеров и периферийных устройств. Настройка метода печати, скриптовой системы, вида фискального и предварительного чека может быть сделана, протестирована и точно налажена даже и без существования физического устройства. Для специалистов это наилучший способ настройки системы без ограничения количества напечатанных документов, вида документов, распределения по группам, суммы операции или активности/неактивности фискальной памяти.
Автоматический выбор режима эмуляции, Автоматический выбор режима эмуляции 20 – Инструкция по эксплуатации Brother HL 2700CN
Страница 59
ДРАЙВЕР И ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ 2 20
2000 Advanced Server
Приложения Web BRAdmin и Internet Information Server 5,1 поддерживаются следующими
операционными системами:
Автоматический выбор режима эмуляции
В данном принтере реализована функция автоматического выбора режима эмуляции. Когда
принтер принимает данные, передаваемые из компьютера, он автоматически выбирает режим
эмуляции. На заводе изготовителе эта функция устанавливается в активное состояние (ON).
Существуют следующие комбинации, которые могут быть выбраны принтером:
Для обеспечения наилучших характеристик лазерного принтера рекомендуется использовать
режим эмуляции Brother BR Script3.
Принтер автоматически устанавливается в режим эмуляции цветного принтера HP (PCL 5C).
Поскольку режим PCL 5C имеет наивысший приоритет при автоматическом выборе режима
эмуляции, в большинстве случаев можно начинать работу с принтером с заводскими
установками этих параметров.
Режим эмуляции можно выбрать вручную, выбрав с панели управления опцию EMULATION
(ЭМУЛЯЦИЯ) в меню SETUP (НАСТРОЙКА). См. Меню SETUP (НАСТРОЙКА) на стр. 3 12.
EPSON (по умолчанию
Режимы эмуляции, отличные от PCL 6, PCL 5C и BR Script3, являются режимами эмуляции
для монохромной печати.
При использовании функции автоматического выбора режима эмуляции необходимо
учитывать следующие замечания:
Должен быть выбран приоритет режимов эмуляции EPSON или IBM, поскольку принтер
не различает эти режимы. Поскольку на заводе изготовителе устанавливается режим
эмуляции EPSON, то может потребоваться выбрать режим эмуляции IBM, установив с
панели управления соответствующее значение опции EMULATION (ЭМУЛЯЦИЯ) в
меню SETUP (НАСТРОЙКА).
Попытайтесь выполнить автоматический выбор режима эмуляции с помощью
программного приложения или сетевого сервера. Если этого сделать не удается,
выберите режим эмуляции вручную либо с использованием кнопок панели управления
принтера, либо с помощью команд выбора режима эмуляции, имеющихся в
программном приложении.
Приручаем динозавров, или как я писал свой собственный host controller для лаборатории 3D-печати
В этой статье я хочу рассказать о своем опыте разработки свободного ПО для управления 3D принтерами на Qt5, проблемах и особенностях общения с RepRap’ами и прочим радостям.
Результатом этого опыта стал RepRaptor — минималистичный свободный host-controller для 3D принтеров.
Всех интересующихся приглашаю под кат.
Немного предыстории
За последний год я сильно заинтересовался 3D печатью, и не просто 3D печатью, а ее свободной составляющей — проектом RepRap. Руководство ВУЗа поддержало начинания, и в течении этого года моими и единомышленников усилиями в МГТУ МИРЭА открылась лаборатория 3D печати.
Очень скоро возникла проблема — существующее в экосистеме ПО имело недостатки, которые сильно мешали работе. Поэтому было решено эти проблемы ликвидировать, создав свое ПО.
Почему Qt?
Как это все исправить? Довольно просто — написать хост на языке, который будет работать быстрее, и сделать его максимально простым. Сказано — сделано. Для разработки был выбран Qt, и не случайно. Этот замечательный фреймворк не только распространяется свободно, но и позволяет писать кроссплатформеные приложения без сопровождающей мультиплатформу в C++ боли, а так же не так давно периодически используемый мной QSerialPort стал официальной частью фреймворка.
Кроме того, я не знаю ни одной IDE, такой же быстрой и удобной для меня, как QtCreator.
С чего начать, или как разговаривают принтеры
Общаться необходимо работать с целым зоопарком разнообразных плат (Melzi, RAMPS 1.4, Teensylu, Gen7 1.5.1 и т.д.), благо сообщество проекта RepRap уже давно определилось с протоколом и списком команд. Для общения с любой платой используется серийный порт и протокол G-code.
В своей лаборатории 3D печати мы с товарищами используем прошивку Repetier, которая, на ряду с прошивками Marlin и Teacup поддерживает большинство стандартных кодов.
Первое разочарование — протокол
Спецификация серийных портов RS-232 обширна и интересна, но, к сожалению редко где используется на полную. При эмуляции серийного порта по USB, очень часто к микроконтроллеру подключаются только линии TX и RX, отвечающие за передачу данных. Линии, такие как DTR (сброс при подключении), обычно не используются, и это печально.
Выглядит это примерно так:
wait
G1 X10 Y10 Z10
ok 0
G1 X20 Y5 Z3
ok 0
N1 G1 X10 Y10 Z10 *cs
ok 1
N2 G1 X20 Y5 Z3 *cs
ok 2
Где cs — вычисленная контрольная для строки.
Как правило кодогенераторы, преобразующие 3D модели в G-Code для печати контрольных сумм не генерируют, а оставляют это на усмотрение хоста.
У принтера есть буффер, размер которого в большинстве случаев составляет 16 команд.
Реализация протокола
Qt имеет отличную функцию для облегчения жизни разработчику — сигналы и слоты.
Сигнал — это новое для C++ понятие. Сигнал объявляется в классе подобно слоту:
Сигнал не может ничего вернуть, поэтому всегда имеет тип void, а вместо аргумента указывается тип передаваемой сигналом переменной. Инициализировать его не требуется.
Вызывается сигнал из любого метода родительского класса, и очень просто:
После такого вызова все слоты, присоединённые к этому сигналу будут вызваны при первой возможности в порядке присоединения, и им передастся значение 100.
Что такое слот? Коротко — это самый обычный метод, объявленный слотом
Соединяются сигнал со слотом тоже очень просто:
Есть и ограничение — у сигнала и слота обязательно должен совпадать передаваемый тип.
Учитывая сигналы и слоты можно очень легко написать асинхронный приемник\передатчик для связи по серийному порту.
Самая простая часть — чтение.
Для реализации связи по серийному порту используется упомянутый выше QSerialPort (экземпляр которого назовем «printer»), имеющий сигнал readyRead(), вызывающийся каждый раз, когда на порт приходит информация. Все что от нас требуется — это создать в своем классе слот, который мы и будем вызывать при появлении этого сигнала, соединить их, и ждать. Что же мы будем читать? Как уже описано выше, в первую очередь нас интересуют ответы ok и wait. Так как наш код исполняется асинхронно, а у принтера есть буфер — нам надо где-то сохранить колличество строчек ок, которые мы приняли, чтобы при отправлении знать, сколько мы можем отправить. Хранить их будет в переменной «readyRecieve».
Отлично, с приемом разобрались. А что у нас с отправкой? Вот тут и видим дефект протокола. Никакой аппаратной команды для обозначения готовности к приему данных у нас нет, а значит нету и соответствующего сигнала у нашего QSerialPort. Значит отправлять будем по таймеру. Таймер в Qt работает до безобразия просто и удобно — мы создаем экземпляр класса QTimer, соединяем его сигнал timeout() с нашим слотом, который будет выполнятся по этому таймеру, а после этого запускаем его — timer.start(ms). В последствии было выяснено, что в зависимости от производительности ПК оптимальный промежуток находится от 1 до 5 мс. Кстати, если указать таймеру промежуток 0, то выполнятся он будет как только у Qt появится свободная минутка.
Еще стоит упомянуть, что отправляем мы либо команду от пользователя, либо файл. Так как разбор файла сводится к заурядной загрузки файла в массив, а так же фильтровании линий целиком из комментариев (чтобы не отправлять лишнее на принтер и не захламлять память), я решил опустить эту часть. Массив строк из файла называется gcode.
Ну вот, с серийным портом разобрались? Еще нет. Еще нам надо отловить ошибки. Для этого вновь прибегнем к сигналам и слотам, на этот раз будем слушать сигнал error(SerialPort::SerialPortError error) от нашего экземпляра QSerialPort:
Неаккуратное обращение с принтером расстраивает динозаврика, %username%.
Делаем наш хост умнее
Выносим кнопки команд
Мы научились отправлять файл в серийный порт и правильно держать протокол, но для полноценного хоста этого мало. Помимо возможности отправлять файл построчно, необходимо еще дать пользователю возможность отправлять команды самому. Как вбитые руками, так и выведенные на кнопки в интерфейсе.
Какие команды стоит вывести? Мнения авторов разных, уже имеющихся программ расходятся, но я постарался вывести максимум:
Иконок пока нет, но они обязательно появятся в последующих релизах. Реализация большинства этих кнопок весьма простая:
Метод injectCommand, способ работы которого мы уже узнали ранее, в реализации отправщика кода тоже весьма прост:
Получаем дополнительные данные
RepRap — это суровый DIY. Настолько суровый, что случается всякое:
Далеко не всегда во время настройки можно быть уверенным, что принтер поведет себя так, как надо. Одним из очень важных значений является температура, и следить за ней жизненно необходимо. У некоторых людей на принтере есть дисплеи, отображающие оперативную информацию, но далеко не у всех. К тому же, можно физически находится от принтера далеко, или под неверным углом, и читать дисплей уже не выйдет. Именно поэтому требуется отображать температуру, и чем оперативнее — тем лучше.
Под температуру определим отдельную группу элементов
Как же ее узнать? Во время нагрева, принтер перестает принимать команды, и вместо ok или wait начинает присылать температуру. Строка температуры выглядит так:
Читаемо для человека, но не очень удобно для разбора. В первых версиях я разбирал эту строку прямо в слоте, отвечающем за прием информации, но тесты показали, что разбор строки прямо в этом слоте слишком сильно замедляет работу программы. До последнего я пытался избежать работы с потоками, так как одна из главных причин, по которой RepRaptor был написан — быстродействие. Многопоточность отлично ускоряет работу софта на многоядерных системах, но у нас с железом было все не так радужно. Однако выбора не осталось — надо было перенести в отдельный поток либо разбор, либо само соединение. Было решено пойти на компромисс — перенести разбор в отдельный поток, и позволить пользователю отключить проверку температуры.
Как реализована многопоточность в Qt? Очень удобно. Есть несколько способов создать отдельный поток. Полноценный способ — создать поток с помощью QThread, но нам не нужен полноценный поток для простого разбора строки, так что будем использовать другой способ — передадим нашу функцию разбора вместе с аргументам объекту QFuture, и будем за ним следить. Делается это так — для начала нам необходимо создать экземпляр QFutureWatcher, класса, который следит за QFuture, и сообщает нам о его состоянии. Затем надо написать нашу функцию разбора. Так как функция может вернуть только одну переменную, я решил создать специальный тип для передачи температуры:
Теперь осталось только отдать эту функцию потоку при удобном случае (вставляем дополнительную проверку в автомат функции приема):
Осталось только создать слот, чтобы подключить к нему сигнал, передающий из QFutureWatcher результаты выполнения функции:
Вот и все, теперь каждый раз, когда принтер сообщает нам о температуре — мы разбираем эту строку и красиво отображаем ее в интерфейсе.
Проблема в том, что сам принтер ее присылает только во время нагрева, но мы можем его попросить прислать нам ее в любое другое время, отправив команду для проверки температуры M105. Отправлять ее будем по таймеру, при выполнении нескольких условий. Так же, как и ранее для функции отправки создаем новый таймер, и новый слот для подключения к его сигналу. На этот раз таймеру ставим значение побольше, например 1500мс:
Кто-то возможно скажет, что эти проверки излишние, но когда ты управляешь принтером с Asus EEEPC 900AX, и хочешь одновременно читать хабр — это необходимость.
Печать с SD карты
Очень многие типовые платы для 3D принтеров имеют встроенный слот для SD карты, или способ такой слот подключить. Такой метод печати является предпочтительным, так как в любой момент можно отключится от принтера и уйти, однако каждый раз вытаскивать SD карту зачастую лень, особенно если печатаешь много мелких деталей. Конечно, можно передать файл через серийный порт, но передача файла таким способом занимает едва ли меньше времени, чем сама печать.
Каждый раз когда на хост будет приходить строка, с которой начинается список файлов на SD — будем открывать диалог со списком файлов. Для этого еще раз изменим наш приемник:
Флаг нужен, так как наш метод чтения вызывается для каждой строки.
За одно для открытия диалога будем посылать сигнал. Самому же себе. Да, соединять можно даже сигналы со слотами одного и того же объекта.
Слот, который мы подключаем к этому сигналу:
После этого надо перевести интерфейс в режим печати. Я сделал это путем введения дополнительного флага sdprinting. Статус печати с SD карты проверяется в схожей манере с температурой.
Софт — в массы
Как бы сильно я не любил GitHub — далеко не все любят собирать софт сами. Не смотря на кроссплатформенность Qt — это фреймворк, а не среда для кросс-компиляции. А это значит, помимо бинариков под платформу Linux-amd64 нужны еще бинарики под Linux-i386, Windows 32 и OSX 64. Что ж, с первыми двумя все просто — достаточно добавить нужные наборы в QtCreator. А как быть с Windows 32 и OSX 64? С последней — никак. Я пытался, но я умываю руки. Единственный способ собрать что-то под OSX — делать это на OSX. К сожалению, легально это сделать не возможно.
Debian и его пакеты
Очень хотелось собрать пакет под любимый Linux Mint, на котором и ведется разработка. По началу я хотел собрать пакеты для PPA, но в итоге пришел к тому, что собирать надо со статическими библиотеками Qt, а потому пакеты на первое время собирать пришлось руками. Почему статическая линковка? Все очень просто — даже в Ubuntu 14.04, на которой основан Mint в источниках имеется только Qt 5.2.1. В ходе тестов первых двух релизов на разных системах выявились баги QSerialPort, исправленные в новых версиях, а потому было принято решение поставлять все с последними версиями. К тому же, вики Qt говорит, что статически линкованые библиотеки несколько быстрее работают.
Windows и MXE
Одно дело — собирать пакеты под свою ОС, другое дело — под чужую. Тут необходим тулчеин — набор инструментов для сборки. Благо под Windows есть отличный MinGW, а для Linux есть не менее отличный MXE — менеджер окружения для кросс-компиляции с использованием свободных библиотек.
Установка до смешного простая — клонируем MXE и говорим ему, какие нам библиотеки нужны:
После этого можно смело идти пить кофе — сборка всего этого добра занимает приличное время.
После того, как сборка окончена — можно написать скрипт сборки проекта под Windows автоматически:
Просто и сердито. Работоспособность легко проверяется в Wine:
Выводы
Когда я это начинал — я надеялся написать простую отправлялку G-code файлов, которая ничего больше бы не делала, а справится планировал за вечер. Но, как это часто бывает — проект вышел за рамки изначального плана, и теперь представляет из себя нечто большее. Впереди еще много чего предстоит сделать — хотя бы тот же графический редактор EEPROM, которого так не хватает, а так же поддержка контрольных сумм.
Однако уже сейчас RepRaptor позволяет мне спокойно использовать свой ASUS EEEPC как стабильный хост для принтера, чего не мог достичь ни один другой хост из тех, что я пробовал. Ну и знания Qt у меня определенно улучшились, и все равно еще есть место для оптимизаций.
Эта статья так же приурочена к выходу первой стабильной версии, которую я сам теперь использую каждый день — 0.2.
Всем спасибо за внимание! Надеюсь мой опыт был вам полезен.
Напоследок — вот армия объектов, напечатанных во время тестов:
Как имитировать параллельный принтер (LPT) с помощью USB-принтера?
У меня есть устаревшее программное обеспечение, которое печатает только на принтерах, подключенных через порт LPT. Машина мне нужна, однако, не имеют параллельного порта. Плюс мой принтер-это USB-устройство.
Как заставить компьютер думать, что USB-принтер подключен к порту lpt?
далее, это для офиса. У меня будут права администратора при реализации обхода, но я снимаю решение, которое работает, пока «обычный» пользователь регистрируется после всего настройка.
8 ответов
вы можете обмануть Windows, используя USB-принтер в качестве фиктивного» сетевого » принтера, подключенного к LPT1.
поделиться USB принтера
используйте имя общего ресурса, которое легко запомнить, например «принтер».
подключите общий принтер как LPT1
использование USB для параллельного адаптера не имеет никакого смысла. Здесь мы говорим об использовании очень старого устаревшего программного обеспечения на оборудовании с подключениями только USB. В моем случае, принтер этикеток ZEBRA.
решение в моем случае.
с несколькими строками кода Вы сможете отправьте коды ASCII на принтер, как это было раньше.
теперь вы можете легко печатать на VBA (проверено на 64-битном принтере Windows 7 и zm400 Zebra)
принимает стандартный вывод на принтер, созданный приложением DOS, и перенаправляет его на принтер Windows по умолчанию. Преобразует кодовую страницу, удаляет пустые страницы, поддерживает символы чертежей. Работает на всех платформах Windows.
используйте программу печати DOS, чтобы управлять доступными портами на нужные устройства. Вы можете скачать его по этой ссылке https://www.dropbox.com/s/gdx05sckmbqnast/dosprint.exe?dl=0 (dos Print)
сначала запустите dosprint и dosprintui от имени администратора, после чего дважды щелкните значок dosprintui в трее, вы можете получить список доступных портов на карте, а затем дважды щелкните на lpt1 или на кнопку SET и выберите нужный принтер на карте и нажмите на ОК. BINGO теперь вы можете печатать на порту LPT1, и ваш USB-принтер напечатает это для вас.
программы DOS все еще используются в мире бизнеса. Советы о том, как заставить их работать должным образом на современной вычислительной платформе, свирепствуют в Интернете. Вот что сработало для меня.
печать из программы представляет самую большую проблему. Две разные параллельные принтеры используются с этой программой, но программа печатает только на один порт и нет возможности изменить это поведение. Нужно напечатать проверить лазерный принтер? Он должен быть подключен к порту LPT1. Нужно напечатать сброс данных к принтеру матрицы многоточия? Он также должен быть подключен к порту LPT1. Два человека работают с этой программой ежедневно, поэтому мы будем использовать их компьютеры, по одному для каждого принтера. Давайте установим первый принтер:
Если компьютер имеет физический DB-25 (параллельный) порт, вы можете отключить его в BIOS. Windows 8.1 не будет поддерживать его, и он нам не нужен.
A Кабели-To-Go модель 16899 USB к db25 параллельный адаптер принтера используется для подключения принтера к компьютеру. Адаптер устанавливается автоматически и не распознается как параллельное устройство или порт LPT.
теперь откройте устройства и принтеры. Нажмите кнопку Добавить принтер и выберите нужный принтер отсутствует в списке. В следующем диалоговом окне выберите Добавить локальный принтер или сетевой принтер с ручными настройками и в следующем диалоговом окне используйте существующий порт. Выберите порт виртуального принтера для USB, USB001 или USB002, из списка, а не параметры порта LPT.
первый принтер многорежимный принтер матрицы многоточия Panasonic KX-P1191. Принтер не отображается в диалоговом окне с запросом драйвера и обновление списка, нажав кнопку Центр обновления Windows не помогает. Проверка сайта поддержки Panasonic указывает на то, что принтер полностью не поддерживается на данный момент, но специалист технической поддержки Panasonic помог разобраться в следе, который привел к драйвер Epson FX Series 1 (80) входит в состав Windows 8.1. Отлично работает.
теперь принтер установлен. Но он находится на порту USB001 и программа будет печатать только на порт LPT1. Решение относительно простое и может быть интегрировано прямо в пакетный файл, который используется для запуска программы. Давайте сделаем старую школу и подшутим над нашим принтером: мы поделимся им и напечатаем на LPT1 таким образом.
щелкните правой кнопкой мыши принтер и выбрать недвижимость. Предоставьте общий доступ к принтеру, не указывайте его в каталоге, создайте короткое имя общего ресурса для удобства, а затем убедитесь, что пользователь клиентского компьютера указан в области имя группы или пользователя на вкладке Безопасность.
два человека, которые будут печатать на этих принтерах, создают мою зарплату, поэтому я дал им права администратора домена. Возможно, в этом не было необходимости. Оба являются пользователями в основном домене, но не вторичными, и я не хотел тратить время на устранение неполадок.
теперь измените пакетный файл и используйте хорошо документированную команду net use для реализации решения печати:
где компьютер-имя компьютера, а принтер-имя общего ресурса принтера. Процедура работала одинаково хорошо на втором компьютере для принтера HP LaserJet 1100 с помощью драйвера» HP LaserJet 1100 (MS)», поставляемого с Windows 8.1.
Системная Ошибка 5:
убедитесь, что пользователь указан на вкладке Безопасность. «Каждый» может быть удаленный. Требуются ли пользователю права администратора домена? Наверное нет, если все выполняется из одного домена.
Системная Ошибка 66:
Проверьте синтаксис. Возможно, вы неправильно написали имя компьютера, принтер, или, может быть, пропустили двоеточие? Только одно двоеточие необходимо, в в документации Microsoft. Будет добавление ненужного двоеточия в порт lpt1[:] причиной неудачи?

