Страница 11 из 12
Re: Управление изображением на мониторе через COM порт
Добавлено: Пн янв 03, 2011 20:48:16
Murlock
img1.top это Y координата верхнего угла картинки относительно верхнего угла формы. ей можно писвоить новое значение. перемещает картинку.
img2.top.Draw(60,x,lift) : такого не бывает.
img2.canvas.Draw - метод(рисует картинку).
Re: Управление изображением на мониторе через COM порт
Добавлено: Пн янв 03, 2011 20:58:46
FRIM@N
img1.top это Y координата верхнего угла картинки относительно верхнего угла формы. ей можно писвоить новое значение.
а как это в программе сделать?И почему движения нет -все какбы запускается компилируется, отображается?
Re: Управление изображением на мониторе через COM порт
Добавлено: Пн янв 03, 2011 22:52:46
Murlock
шлите листинг с картинками. буду разбираться.
Re: Управление изображением на мониторе через COM порт
Добавлено: Вт янв 04, 2011 16:28:22
FRIM@N
может проще
исходник запилить? вот
картинки
ниже полный листинг,может все таки проще АVI применить или нет?
Код: Выделить всё
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TForm1 = class(TForm)
img1: TImage;
img2: TImage;
tmr1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Tmr1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//Описание типов переменных
var
Form1: TForm1;
Dom:tbitmap;//ГРАФИЧЕСКИЙ ОБРАЗ дома
lift:TBITMAP;//ГРАФИЧЕСКИЙ ОБРАЗ лифта
y:integer;//координаты y лифта
shx:integer;//Шаг движения лифта по y
implementation
{$R *.DFM}
//Старт главной формы
procedure TForm1.FormCreate(Sender: TObject);
begin
shx:=6;
//
Dom:=tbitmap.Create;//
lift:=tbitmap.Create;//
//
Dom.LoadFromFile('Dom.bmp');//Загрузить в переменную 'Dom' файл 'Dom.bmp'
//
lift.LoadFromFile('lift.bmp');//Загрузить в переменную 'lift' файл 'lift.bmp'
//
img1.canvas.Draw(0,0,Dom);//
img2.canvas.Draw(60,0,lift);//
end;
//Работа таймера движение лифта
procedure TForm1.tmr1Timer(Sender: TObject);
begin
y:=y+shx;//текущая координата + шаг
if y>500 then shx:=shx*-1;// ограничение справа
if y<0 then shx:=shx*-1;//ограничение слева
img1.canvas.Draw(0,0,Dom);//возобновление фона
img2.canvas.Draw(60,0,lift);//движение корабля
end;
end.
Re: Управление изображением на мониторе через COM порт
Добавлено: Вт янв 04, 2011 16:35:01
Murlock
у вас картинка не двигается, потому, что координата её не меняется при работе таймера
у вас:
img2.canvas.Draw(60,0,lift);//
а должно быть
img2.canvas.Draw(60,y,lift);//
Re: Управление изображением на мониторе через COM порт
Добавлено: Вт янв 04, 2011 21:13:13
FRIM@N
эффекта не произвело,там раньше стоял х потом я поставил 0,сейчас стоит y
Re: Управление изображением на мониторе через COM порт
Добавлено: Ср янв 05, 2011 11:27:13
Murlock
Ваш лифт должен быть меньше его рамки рисунка(т.е двигается он только в пределах рамки.) у меня двигается.
похоже, что его нельзя растягивать на всю рамку. поставив точку останова внутри события таймера можно пошагово посмотреть, что происходит.
Re: Управление изображением на мониторе через COM порт
Добавлено: Ср янв 05, 2011 23:49:02
FRIM@N
поставив точку останова внутри события таймера
я помню что вы говорили, а вот как уже забыл, и не смог найти в теме, и это же касамоемо пошагового воспроизведения программы,так все и стоит лифт я выставил по центру как опустить в нижнюю часть рамки незнаю.Попробовал AVI воспроизводится чудесно только есть задержка воспроизведения в несколько секунд после компиляции и не получилось растащить его по рамке ,свойства стрейтч там нет(( может какое другое есть?и с какой скоростью двигается? я поставил время таймера 1000 --это должна быть секунда т.е. незримо для глаза он не должен проскочить
Re: Управление изображением на мониторе через COM порт
Добавлено: Чт янв 06, 2011 11:11:50
Murlock
в окне программного кода скомпилированной и запущенной программы, слева, есть полоска с синими точками, если в точку кликнуть, точка станет большой и красной. это и есть точка останова. дальше - как в паскале: красная полоса, F7 -по шагам с заходом в процедуры -F8 - без, F9 - до следующей точки останова.
Re: Управление изображением на мониторе через COM порт
Добавлено: Чт янв 06, 2011 22:07:07
FRIM@N
прошел пошагово до таймера и погонял в таймере -- не было никаких изменений
Re: Управление изображением на мониторе через COM порт
Добавлено: Чт янв 06, 2011 22:45:46
Murlock
рамка картинки лифта должна быть как шахта, высокая и узкая. а как у Вас?
Re: Управление изображением на мониторе через COM порт
Добавлено: Чт янв 06, 2011 23:09:31
FRIM@N
Высокая и узкая,лифт висит посередине
\\и я кажется понял как вы предлагали управлять картинкой свойством top
Код: Выделить всё
вот так . только проблемма в чем он не плавно перемещается ,а с 1 го этажа скачком выше 3 го и потом до упора в границу окна программы ,время таймера влияет только на время между этими скачками, shx менял ставил вплоть до 1 --эффекта по моему вообще нет
procedure TForm1.tmr1Timer(Sender: TObject);
begin
img2.top:=y+shx;//òåêóùàÿ êîîðäèíàòà + øàã
if y>500 then shx:=shx*-1;// îãðàíè÷åíèå ñïðàâà
if y<0 then shx:=shx*-1;//îãðàíè÷åíèå ñëåâà
img1.canvas.Draw(0,0,Dom);//âîçîáíîâëåíèå ôîíà
img2.canvas.Draw(60,0,lift);//äâèæåíèå êîðàáëÿ
end;
выпилил почти все то что мне казалось ненужным
время таймера это время между скачками.пробовал поставить дробное значение щага , не прокатило
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TForm1 = class(TForm)
img1: TImage;
img2: TImage;
tmr1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Tmr1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//Îïèñàíèå òèïîâ ïåðåìåííûõ
var
Form1: TForm1;
Dom:tbitmap;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ äîìà
lift:TBITMAP;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ ëèôòà
implementation
{$R *.DFM}
//Ñòàðò ãëàâíîé ôîðìû
procedure TForm1.FormCreate(Sender: TObject);
begin
Dom:=tbitmap.Create;//
lift:=tbitmap.Create;//
//
Dom.LoadFromFile('Dom.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'Dom' ôàéë 'Dom.bmp'
//
lift.LoadFromFile('lift.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'lift' ôàéë 'lift.bmp'
end;
//Ðàáîòà òàéìåðà äâèæåíèå ëèôòà
procedure TForm1.tmr1Timer(Sender: TObject);
begin
img2.top:=+1;//òåêóùàÿ êîîðäèíàòà + øàã
end;
end.
Re: Управление изображением на мониторе через COM порт
Добавлено: Ср янв 26, 2011 17:18:22
FRIM@N
У нас с мурлоком встало дело,порт как будто не опрашивается, условие if b=32 then tmr2.Enabled:=True; не выполняется,да и остальные процедуры как -то не работают --например обнуление порта data:=0;
outport(port,data); даже после закрытия на RTS все равно 1 ,она там постоянно присутствует(
может быть кто узреет ошибку?
Код: Выделить всё
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, giveio;
type
TForm1 = class(TForm)
tmr1: TTimer;
img1: TImage;
img2: TImage;
tmr2: TTimer;
tmr3: TTimer;
tmr4: TTimer;
tmr5: TTimer;
procedure FormCreate(Sender: TObject);
procedure Tmr1Timer(Sender: TObject);
procedure tmr2Timer(Sender: TObject);
procedure tmr3Timer(Sender: TObject);
procedure tmr4Timer(Sender: TObject);
procedure tmr5Timer(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
a,b,c:word;
port,base,data:word;
Dom:tbitmap;//ГРАФИЧЕСКИЙ ОБРАЗ дома
lift:TBITMAP;//ГРАФИЧЕСКИЙ ОБРАЗ лифта
procedure TForm1.FormCreate(Sender: TObject);
Begin
base:=$3F8;
InitDriver;
Dom:=tbitmap.Create;//
lift:=tbitmap.Create;//
Dom.LoadFromFile('Dom.bmp');//Загрузить в переменную 'Dom' файл 'Dom.bmp'
//
lift.LoadFromFile('lift.bmp');//Загрузить в переменную 'lift' файл 'lift.bmp'
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
port:=base+4;
data:=2;
outport(port,data);
sleep(10);
port:=base+6;
a:=inport(port) and 128;// 3 этаж 1 вывод COM порта DCD
port:=base+6;
b:=inport(port) and 32; // 2 этаж 6 вывод порта DSR
port:=base+6;
c:=inport(port) and 16;//1этаж 8 вывод порта CTS
if b=32 then tmr2.Enabled:=True;
data:=0;
outport(port,data);{aio yoi eae iia ea?aony eeoiaa}
end;
//Работа таймера движение лифта
procedure TForm1.tmr2Timer(Sender: TObject);
begin
img2.top:=img2.top-13;//подъем на 2
if img2.top<442 then tmr2.Enabled:=False;
end;
Re: Управление изображением на мониторе через COM порт
Добавлено: Пн мар 14, 2011 11:50:55
FRIM@N
Лифт кстати все таки поехал,но не на дельфи ,а на визуал бейсике- у него еть компонент MSCOMM32.OCX который как раз позволяет рулить отдельными выводами порта.Если кому-то впоследствии понадобится то вот статья об этом
http://schemz.narod.ru/COMdevice.htm
Re: Управление изображением на мониторе через COM порт
Добавлено: Пн мар 14, 2011 13:19:15
Мурик
FRIM@N писал(а):ну дык может есть что-то попроще и посовременней? я упомянул VB как так считал всегда что он простой,а Com порты еще используются? и что было раньше COM или LPT ?
Есть по современней - PureBasic.
Он работает с COM портом без внешних компонентов.
Вот функции для доступа к COM порту
http://purebasic.ru/manual.php?id=1148&lng=rus
рулить отдельными выводами порта.
В PureBasic за это отвечаю функции
GetSerialPortStatus и
SetSerialPortStatus
PS.
Кстати, в отличие от VB, PureBasic позволяет работать с COM портом не только в Windows, но и в Linux и MacOS X.
Re: Управление изображением на мониторе через COM порт
Добавлено: Пн мар 14, 2011 16:14:43
Engineer_Keen
FRIM@N писал(а):рулить отдельными выводами порта
В дельфи можно воспользоваться стандартной функцией
EscapeCommFunction (управляет DTR и RTS)
Re: Управление изображением на мониторе через COM порт
Добавлено: Ср апр 06, 2011 21:45:21
FRIM@N
я спаял таки саму схему и возникли проблеммы полез поглядеть и чудо чудное - на выводах RTS и DTR по -12 вольт до запуска программы после запуска становится по +12 то есть по "0" хотя в прогрмме прописано что выводы выставляются в 1, если замкнуть (пинцетом так как кнопки не доступны,об этом ниже) нужный вывод то лифт движется несмотря на то что на выводе 0 а ехать он должен при 1,после выволнения цикла DTR выставляется в 0 в программе реально все наоборот на выводе -12 В.Грубо говоря получается инверсия 1 и 0 которую я не вызывал -- что это такое и как может быть?а кнопки не могут работать потому что я с платы подаю -12 вольт т.е. единицу на общий вывод кнопок.
исходник
Engineer_Keen и Мурик спасибо но вы немного подзапоздали
с симуляций слежения за лифтом я разобрался -худо-бедно,подключил вывод 5 МАХ 238 через 5кОм на землю,т.е. дал на кнопки "0" и он поехал но это все по меньшей мере странно т.к. ехать должен при присутствии 1 на входах.не получится так что на другой машине все будет так как должно и схема откажется работать?
Перейдем ко второму акту,а именно к регистру сдвига при отдаче команды с компьютера -- загораются все светодиоды разом независимо от того какие хотел зажечь я и впоследствии это не сбрасывается,наверное из-за странной инверсии.
И еще при включении устройства сразу загораются все светодиоды,я думал это дребезг контактов т.к. иногда загораются не все,и при запуске подпрограммы которая должна зажигать нужные светодиоды они зажигаются все я попробовол сбросить "вручную" подав +5 в на 10 вывод регистра -- он не сбросился,неисправен регистр? и пробовал посмотреть изменения выводов RTS и DTR при зажигании ни один не меняеется ,но светодиоды загораются в момент нажатия кнопки в программе т.е. как то управление идет, или просто я не успеваю заметить изменения с 0 на 1 и обратно?
Re: Управление изображением на мониторе через COM порт
Добавлено: Чт апр 07, 2011 22:38:58
Пухич
Эге, я все пропустил. А зачем сию схемку собрали? Какую функцию она выполняет?
Кстати, после КРЕНки хорошо бы кондей иметь, а то можно огрести генерацию регулятора.
Ишшо надо бы даташит на 238-й глянуть, я с ним никогда не работал.
Re: Управление изображением на мониторе через COM порт
Добавлено: Пт апр 08, 2011 11:46:33
FRIM@N
Эге, я все пропустил. А зачем сию схемку собрали? Какую функцию она выполняет?
Ничего не пропустили я,о ней в этой теме не говорил эта схема= позаимствована
здесь только чуть изменена,с ее помощью я хотел управлять реальным лифтом через якобы оптроны,на самом деле просто светодиоды для наглядности.
даташит на мах 238там вся линейка,238 находится на 25 странице
конденсатор поставлю сейчас
Re: Управление изображением на мониторе через COM порт
Добавлено: Пт апр 08, 2011 20:25:28
Пухич
Ага, с 238-м понятно - от старого доброго 211-го отличается мелочами, значит работать должен так же, то есть правильно должен работать.
Касательно порта. Вы учли, что биты RTS и DTR инвертируются в 550-м контроллере? Т.е. почти наверняка инвертируются и у вас в порту. Так что запись единицы в соответствующий бит приводит к появлению нуля на выходе порта, а ноль подается плюсом.
По поводу сброса шифтика - ну написано же в даташите, что он ресетится нулем. Зачем было 5В присовывать?
По поводу загорания светиков ("иногда не всех") - у вас разрешение буфера в шифтике сидит на нуле перманентно. Т.е. на выход сразу идет содержимое регистра хранения. А там после подачи питания теоретически может быть что угодно (там ведь триггеры), если только нет автоматического сброса. Но я уверен, что его нет.
Почему у вас загораются не те светодиоды - не представляю пока. Вы не могли бы как-то изложить суть алгоритма, чтобы мне не вникать в гнусный бейсик?