%.........................................................................................
% Comunicação entre MatLab e PLC FX2N (utilizando o MelDDE)
%.........................................................................................

% M102-frente            M202-tras               M300-esquerda            M400-direita

clear all
clc


a='s';

ligado=0;
frente=0;tras=0;esquerda=0;direita=0;emergencia=0;
data=0;
while a=='s'
   clc
   
   channel=ddeinit('LabView','srv.vi');
   channel1=ddeinit('MelDDE','hexapode')

   if channel~=0;
   	data_aux=ddereq(channel,'srvclt',[1 1],500)
            %data=num2str(data);
      % se a mensagem for connect 
      if data_aux~=0;
          rc=ddepoke(channel,'srvclt','0');

         if length(data_aux)~=length(data)
            data=data_aux;
         end
         
         if length(data_aux)==length(data);
            if (data_aux~=data);
            data=data_aux;
         	end
      	end
   
    if length(data)==6;
         if channel1~=0
            M20=ddereq(channel1,'M20',[1 1],500)
            M20=str2num(M20);
      	end

      		if and(data=='100201',M20==1);
         	% escrita de connect acknowledge
         	rc=ddepoke(channel,'cltsrv','400102');
         	ligado=1
      		end
            end 
         end
	   
   	end
   
   	if ligado==1;
         %se estiver ligado e a mensagem for de disconnect
        
         
         if and(length(data)>10,ligado==1);
         	if data(1:10)=='2002019110';
               rc=ddepoke(channel,'cltsrv','5001021');
               pause(0.1)
              
            end
            if data(11:12)=='+1';frente=1;end
            if data(11:12)=='-1';tras=1;end
            if data(16:17)=='+1';esquerda=1;end
            if data(16:17)=='-1';direita=1;end
            if data(21:22)=='+1';emergencia=1;frente=0;tras=0;esquerda=0;direita=0;end
            if data(21:22)=='-1';emergencia=2;
         	end
         end
      
      end
   
      %Após a comunicação DDE com o servidor labview inicia a comunicação DDE
      % com o automato através do MelDDE
      emergencia
      data
      if channel1~=0;

      if frente==1;
      	rc=ddepoke(channel1,'M102',1);
   		pause(2)
   		rc=ddepoke(channel1,'M102',0);
      	frente=0;
      end
      if tras==1;
      	rc=ddepoke(channel1,'M202',1);
   		pause(2)
   		rc=ddepoke(channel1,'M202',0);
         tras=0;
      end
      if esquerda==1;
      	rc=ddepoke(channel1,'M302',1);
         esquerda=0;
      end
      if direita==1;
      	rc=ddepoke(channel1,'M402',1);
   		direita=0;
      end
      if emergencia==1;
         rc=ddepoke(channel1,'M502',1);
         emergencia=0;
   	end
      if emergencia==2;
         rc=ddepoke(channel1,'M502',0);
         emergencia=0;
      end
  
end
if ligado==1;
   
   if length(data)==25;
      M20=0;
      pause(0.2)
      			while M20==0;
       			
				      M20=ddereq(channel1,'M20',[1 1],500)
                  M20=str2num(M20);
               end
               if and(data(1:10)=='2002019110',M20==1);
                  rc=ddepoke(channel,'cltsrv','20010291111');
               end
            end
            
       if length(data)==6;
            if channel1~=0
			      M20=ddereq(channel1,'M20',[1 1],500);
               M20=str2num(M20);
            end
            if and(data=='300201',M20==1);
            % escreve disconnect acknowledge
	         rc=ddepoke(channel,'cltsrv','300102');
            ligado=0
         	end
         end
    
         
            rc=ddeterm(channel1);   
               rc=ddeterm(channel);
         end
end
