(*******************************************************************************************) (***************************** MODUL I/O - RS232-IO ************************************) (*******************************************************************************************) procedure MP(Submodul_Spec:Submodules);forward; procedure IO(Submodul_Spec: Submodules); Procedure RS232_IO; (*******************************************************************************************) const RS232_RBytes_Counter = $0500; RS232_Read_Status = $0300; RS232_Read = $0200; RS232_Write = $0100;Space = $20; Receive_done = $0100; Transmit_done = $2000; ETX =$03; var i,Sendbytes,Receivebytes,Receive,Command: integer; function Handle_RS232(Send: integer):integer; (*******************************************************************************************) var IntRegs: Registers; begin with IntRegs do begin ax:=Send; dx:= Com1oder2;intr($14,IntRegs); Handle_RS232:=ax; end; end; procedure Wait_SBuffer_empty; (*******************************************************************************************) var Counter, Hilf:integer; begin Counter:=0;Hilf:=0; While ((Hilf and Transmit_done) <> Transmit_done) and (Counter < 1000) do begin Hilf:=Handle_RS232(RS232_Read_Status); Counter:=Counter + 1; end; if Counter >= 1000 then begin {Alert to user, if RS232-failure} writeln('RS232-Fehler!');while not keypressed do; end; end; function Read_RS232:integer; (*******************************************************************************************) begin if (Handle_RS232(RS232_Read_Status) and Receive_done) = Receive_done then Read_RS232:=Handle_RS232(RS232_Read) else Read_RS232:= 0; end; procedure Empty_Receive_Buffer; (*******************************************************************************************) var Hilf,i:integer; begin for i:=0 to Handle_RS232(RS232_RBytes_Counter) -1 do Hilf:= read_RS232; end; PROCEDURE RS232_Init; (*******************************************************************************************) begin TA.Service_Spec.DISK:=ReadRS232;IO(DISK); Com1oder2:=TA.TRS232.Com1oder2; Receive:=Handle_RS232(TA.TRS232.Install_Wert); Empty_Receive_Buffer; Receive:=Handle_RS232(RS232_Write + Space); Delay(400); {Worktime for 8031 in ROB2} Wait_SBuffer_empty; if Read_RS232 = 0 then TA.done:=false else TA.done:=true; end; (******************************** Start of Procedure RS232-IO ******************************) Begin if TA.Service_Spec.ROB <> Init then begin Case TA.Service_Spec.ROB of New_1..New_6: begin Command:=$08 + ord(TA.Service_Spec.ROB) - 2; Sendbytes:=3; Receivebytes:=2; end; New_all: begin Command:=$0F; Sendbytes:=8; Receivebytes:=2; end; Is_1..Is_6: begin Command:=$40 + ord(TA.Service_Spec.ROB) - 9; Sendbytes:=2; Receivebytes:=3; end; Is_all: begin Command:=$47; Sendbytes:=2; Receivebytes:=8; end; Dout..Dxrl: begin Command:=$10 + ord(TA.Service_Spec.ROB) - 15; Sendbytes:=3; Receivebytes:=2; end; Analog1: begin Command:=$51; Sendbytes:=2; Receivebytes:=3; end; Analog2: begin Command:=$52; Sendbytes:=2; Receivebytes:=3; end; Din: begin Command:=$54; Sendbytes:=2; Receivebytes:=3; end; end; (********************************************) Receive:=Handle_RS232(RS232_Write + Command); {Send command to ROB2} if Sendbytes > 2 then {if #1, see below} begin For i:=1 to Sendbytes - 2 do {Send data, if there are} begin Wait_SBuffer_empty; Receive:=Handle_RS232(RS232_Write + Round(TA.TVektor[i])); end; end; Wait_SBuffer_empty; Receive:=Handle_RS232(RS232_Write + ETX); {ETX: End of transmit} (********************************************) Empty_Receive_Buffer; i:=0; while (i < 3000) and (Handle_RS232(RS232_Rbytes_Counter) < Receivebytes) do i:=i+1; if Read_RS232 = Command then begin {Read answer: Echo of command,} TA.done:=true; {if task performed} if Receivebytes > 2 then for i:=1 to Receivebytes - 2 do TA.TVektor[i]:=Read_RS232; end {Read data, if there are} else TA.done:= false; end { Endif #1 } else RS232_init; end; begin case Submodul_spec of RS232: RS232_IO; DISK: Disk_IO; end; end;