Page 12 of 14

Re: KolibriOS на производстве

Posted: Thu Jun 06, 2013 4:42 pm
by VitZ
А как проверить ...

function chtenie_iz_porta(pdw:dword):byte;
var by:byte;
begin
pdw:=$80000000+pdw;
asm
mov eax,43
mov ecx,pdw
int $40
mov by,bl
end;
chtenie_iz_porta:=by;
end;

... наиболее простыми средствами, или
тут на 100% всё в порядке?

Re: KolibriOS на производстве

Posted: Thu Jun 06, 2013 5:08 pm
by Mario_r4
mov [by],bl

Re: KolibriOS на производстве

Posted: Thu Jun 06, 2013 5:14 pm
by VitZ
... thanks.

Re: KolibriOS на производстве

Posted: Fri Jun 07, 2013 11:07 am
by VitZ
procedure rc(var s:string);
Spoiler:

Code: Select all

procedure rc(var s:string);
var c:char; i,t:dword;
begin s:=''; i:=1; t:=0;
  repeat
    while (In1021 and 1)<>1 do begin
      t:=t+1;
      if (t>2000) then exit;
    end;
    c:=chr(In1016);
    if c=chr(13) then break;
    s[0]:=chr(i);
    s[i]:=c;
    i:=i+1;
    if (i>30) then break;
    t:=0;
  until false;
end;

Re: KolibriOS на производстве

Posted: Sat Jun 08, 2013 8:07 am
by VitZ
... А гадкий LPT при включении компьютера посылает включающий сигнал на все свои выходы ...

ТБ - вот с чего должна была начаться эта тема !!!
(как, кстати, суметь потушить огнетушителем с электропроводящим
содержимым неотключённую от электросети производственную
электроустановку?)

Re: KolibriOS на производстве

Posted: Sat Jun 08, 2013 12:27 pm
by art_zh
... А гадкий LPT при включении компьютера посылает включающий сигнал на все свои выходы ...
Ну а ты куда смотрел?
Да, некоторые BIOSы играют сигналами на LPT-шине, по стандарту IEEE1284.
А Винда в течение первой минуты после начала загрузки периодически опрашивает отклик ECP-устройств по древнему PnP протоколу.

Прежде чем подключать железяку - проверь дефолтные состояния и игру сигналов при включении/выключении, это же азы!

Re: KolibriOS на производстве

Posted: Sun Jun 09, 2013 8:15 am
by VitZ
function In1016:byte;
var by:byte;
begin
asm
mov dx,1016
in al,dx
mov [by],al
end;
In1016:=by;
end;

k.writeNumber(5,125,$33F1F1F1,0,5,In1016) в 3-ем пункте k.waitForEvent'a
- даёт устойчивый приём последовательности одинаковых байтов,
приходящих из второго компа (DOS'a):

DOScom -> comKOS
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ... или
15, 15, 15, 15, 15, 15, 15, 15, 15, 15 ... и т. пр.

Re: KolibriOS на производстве

Posted: Mon Jun 10, 2013 1:14 pm
by VitZ
function In1021:byte;
var by:byte;
begin
asm
mov dx,1021
in al,dx
mov [by],al
end;
In1021:=by;
end;

procedure open_com;
begin
{}
zapis_v_port(1019,$80);
zapis_v_port(1016, (1 and $FF) );
zapis_v_port(1017, ((1 and $FF00) shr 8 ) );
zapis_v_port(1019,3);
zapis_v_port(1017,0);
zapis_v_port(1018,7);
{}
zapis_v_port(1018,1);
end;

<< open_com; >> надо записать сразу после захвата портов
в основной части программы (между основными BEGIN и END)

Re: KolibriOS на производстве

Posted: Mon Jun 10, 2013 5:09 pm
by VitZ
Всё; работает;
посылаю из компа запрос '$01M' с конечным байтом 13,
а приходит ответ '!017042' с конечным байтом 13
(<<i7042>> - это и есть имя устройства, висящего на адресе 1 ПЛ).

Re: KolibriOS на производстве

Posted: Mon Jun 10, 2013 5:56 pm
by SoUrcerer
Поздравляю. Теперь можете писать любые драйвера для устройств на EIA485 и EIA232? Думали про USB<->EIA485 и EIA232<->USB?

Re: KolibriOS на производстве

Posted: Tue Jun 11, 2013 9:19 am
by VitZ
PPro - это минидельфи в RTOS (KOS).
Следующим шагом подключим устройство i7017
и построим график (напряжения на [Vin0+ __ Vin0-]
его входе).
Spoiler:

Code: Select all

program hello96;    uses kolibri;    var k:TKolibri;
const header:string='HelloWorld test'#0;

procedure zapis_v_port(pdw:dword; b:byte);
begin asm
  mov eax,43
  mov bl,b
  mov ecx,pdw
  int $40
end; end;

procedure draw_window;
begin	k.BeginDraw;
	k.DefineWindow(10,40,350,350,$33FFFFFF,0,integer(@header[1]));
	k.DefineButton(5,5,65,25,7,7);
	k.EndDraw; end;

procedure zachvat_portov;
begin asm
  mov eax,46
  mov ebx,0
  mov ecx,1016
  mov edx,1023
  int $40 
end; end;

procedure otdatj_porti;
begin asm
  mov eax,46
  mov ebx,1
  mov ecx,1016
  mov edx,1023
  int $40 
end; end;

procedure open_com;
begin
  zapis_v_port(1019,$80);
  zapis_v_port(   1016,(1 and $FF)   );
  zapis_v_port(   1017,((1 and $FF00) shr 8)   );
  zapis_v_port(1019,3);
  zapis_v_port(1017,0);
  zapis_v_port(1018,7);
  zapis_v_port(1018,1);
end;

function In1016:byte;
var by:byte;
begin
  asm    
    mov dx,1016
    in  al,dx
    mov [by],al
  end;
  In1016:=by;
end;

function In1021:byte;
var by:byte;
begin
  asm
    mov dx,1021
    in al,dx
    mov [by],al
  end;
  In1021:=by;
end;

procedure sc(s:string);
var i,t:dword;
begin     i:=1;    t:=0;
  if (   (length(s)<1)   or   (length(s)>30)   ) then exit;
  while (i<>length(s)+1) do begin
    while (In1021 and $20)=0 do begin
      {t:=t+1;
      if (t>200000000) then exit;}
    end;
    zapis_v_port(1016,ord(s[i]));
    i:=i+1;  t:=0;
  end;
  while (In1021 and $20)=0 do begin
    {t:=t+1;
    if (t>200000000) then exit;}
  end;
  zapis_v_port(1016,13);     
end;

procedure rc(var s:string);
var  c: char;   i,t:dword;
begin     s:='';  i:=1;  t:=0;
  repeat
    while (In1021 and 1)<>1 do begin
      {t:=t+1;
      if (t>200000000) then exit;}
    end;
    c:=chr(In1016);          
    if c=chr(13) then break;
    s[0]:=chr(i); 
    s[i]:=c;
    i:=i+1;
    if (i>30) then break;
    t:=0;
  until false;
end;

var  s1,s2:string;   key,j:dword;
BEGIN	draw_window;   j:=1;
  zachvat_portov; 
  open_com;
  s1:='$02M'; 
  while true do case k.waitforevent of
    1:draw_window;
    2:k.getkey(key);
    3:begin 
      if j=1 then begin
        j:=2;
        sc(s1); 
        rc(s2); 
        k.writeText(5,125,0,0,s2);
      end;		
    end;
  end;	 
  otdatj_porti;  
END.
При запуске этой программы и нажатии на кнопку в окне
должна появиться строка (чуть ниже в окне) -
!027017
- а это значит: устройство многоканального АЦП
подключено к ПЛ (115200) и имеет адрес 02.

Re: KolibriOS на производстве

Posted: Fri Jun 14, 2013 2:50 pm
by VitZ
График будем рисовать прямоугольничками (DrawBar(x,y,width,height,color)):
каждые 3 секунды надо
посылать строковый запрос устройству i7017: <<каково напряжение на твоём нулевом входе?>>,
принимать ответ (в строку s2),
вышифровывать из s2 пришедшее число вольтов (0 .. 10В) в переменную chislo_voltov_1 (integer),
масштабировать его по оси <<- y>> на наш график (chislo_voltov_2: integer)
(при повторении этого алгоритма через следующие 3 с - надо отступить вправо на 10 пикселей).
[Снаружи - необходим реостатик, задающий напряжение - по известной схеме].
Процесс этот желательно как-то закончить при <<дохождении>>
прямоугольничками самописца до правого края окна.

Re: KolibriOS на производстве

Posted: Sun Jun 16, 2013 10:25 am
by VitZ
function sch_vr:dword;
var t:dword;
begin
asm
mov eax,26
mov ebx,9
int $40
mov [t],eax
end;
sch_vr:=t;
end;

...
sch_vr_2:=sch_vr;
if (sch_vr_2 > (sch_vr_1+299)) then {прошло 3 секунды} begin sch_vr_1:=sch_vr_2; Alg1; end;
...

Re: KolibriOS на производстве

Posted: Sun Jun 16, 2013 2:48 pm
by art_zh
Кроме "прямоугольничков" график можно рисовать любыми ASCII-маркерами

Code: Select all

☼  ►  ¤  ◄  ▲  ▼ ♥ ♦ ♣ ♠ • ○ Ж W o 
с помощью 4-й функции (ecx=0x00RRGGBB, esi = 1)

Re: KolibriOS на производстве

Posted: Sun Jun 16, 2013 5:32 pm
by VitZ
... http://www.icpdas.com/download/7000/manual.htm - страница с документацией по i7, некоторые файлы перепутаны местами ...

(В случае управления мотором ПК лишь посылает <<число_угловых_градусов_в_секунду>>,
а одно из устройств серии i7000 (контроллер) выполняет <<шимовую>>
функцию - для пущей реальности времени.
Хотя, поначалу управление техпроцессом лучше осуществлять
контроллерами, и по месту, так, чтобы крах системы был невозможен
из-за отказа сервера сбора инфы (колибри) - при отказе сервера (колибри)
потеряется только инфа (при этом управление сохранится по месту)
).

На запрос '#020' устройство i7017 ответит '>+001.23'.
(То есть на нулевом входе устройства АЦП сейчас 1,23 В и
коль оно пришло в комп - его можно как-то визуализировать на экран.)
Chislo_voltov_1:=str5_to_num(s2[3]+s2[4]+s2[5]+s2[7]+s2[8]).