desktop

Conversor Lazo Corriente a RS232 (Current loop to RS232) para surtidores.

Gracias por responder

Tengo 4 surtidores de la misma marca, conectados en serie te digo esto por-qUE es lo qUE sabemos de la empresa qUE instalo el sistema esto va conectado a una caja qUE tiene una tarjeta qUE tiene 4 entradas
 
Última edición por un moderador:
Gracias por responder

Tengo 4 surtidores de la misma marca, conectados en serie te digo esto porq es lo q sabemos de la empresa q instalo el sistema esto va conectado a una caja q tiene una tarjeta q tiene 4 entradas

Probá anulando 3 de los cuatros surtidores del lazo y del sistema, a ver si con un solo surtidor anda más rápido.
 
Ya hemos probado eso y no funciona sigue autorizando a los 10 segundos mas o menos y si alzo todas las mangueras de los 4 surtidores tarda hasta 30 segundos en autorizar y va en serie autorizando

Por eso quisiera saber como empezar a realizar un sistema para estos dispositivos como se lee las cadenas qUE envia pues no lo se en verdad pero me gustaria aprender , si me ayudan con consejos o qUE leer agradeceria su experiencia

Nota: tengo experiencia en delphi programando por varios años
 
Última edición por un moderador:
Ya hemos probado eso y no funciona sigue autorizando a los 10 segundos mas o menos y si alzo todas las mangueras de los 4 surtidores tarda hasta 30 segundos en autorizar y va en serie autorizando

Por eso quisiera saber como empezar a realizar un sistema para estos dispositivos como se lee las cadenas q envia pues no lo se en verdad pero me gustaria aprender , si me ayudan con consejos o q leer agradeceria su experiencia

Nota: tengo experiencia en delphi programando por varios años

Supongo que tenés que colgarte del lazo de corriente y "espiar" el protocolo...
Igualmente, creo que vas a necesitar algunos manuales....
Parece que somos varios los que trabajamos en Delphi.

Saludos
 
Gracias por tu tiempo

pero donde puedo conseguir esos manuales y cuales serian, me interesa este tema , si eres tan amable me podrias guiar un poco


Te quedo muy agradecido

Nota : utilizan un programa qUE lee lo que los puertos envian se llama comport o algo asi este envia unas tramas me imagino qUE eso es espiar el lazo de corriente qUE mencionas
 
Última edición por un moderador:
Gracias por tu tiempo

pero donde puedo conseguir esos manuales y cuales serian, me interesa este tema , si eres tan amable me podrias guiar un poco


Te quedo muy agradecido

Nota : utilizan un programa qUE lee lo que los puertos envian se llama comport o algo asi este envia unas tramas me imagino qUE eso es espiar el lazo de corriente qUE mencionas

Para espiar el lazo, tenés que colgarte en el cable, en el medio de el envio o de la recepción... y "escuchar", con un terminal de puerto serie solo te va a aparecer el tráfico en pantalla.... después está en tí el proceso de entenderlo...
Lamentablemente no tengo información del protocolo que te pueda compartir.
Saludos
 
Actualmente trabajo en una empresa que utiliza algunos protocolos de comunicación con dispensadores, por políticas de la compañía no podría compartir ésta información sin que exista un intercambio de información que sea útil para la empresa, sin embargo te cuento que he hecho yo para obtener algún dato de los protocolos de otros fabricantes, construye o utiliza un Loop de corriente con conexión a rs232 y utiliza un sniffer, podrías utilizar el FREE Serial Port Monitor RS232 Communication Software Data Sniffer Analyzer, conecta tu loop como otro equipo mas de la red y monitores todo el flujo de información, con algunos datos como byte de incio y de final podrías obtener los comando. no es fácil la tarea pero inicia con este método. atento a tus comentarios

Docklight | Information - Testing RS232, RS485, TCP, UDP, HID
una herramienta mas para utilizar los loop de corriente - rs232

Tengo el protocolo HongYang , pero no he podido obtener respuesta, ya realice la interfaces con un opto acoplador y 12 vol con Rx y TX al rs232, alguien tiene algún esquema de como es la conexión y como envíar los comando al surtidor. agradezco cualquier ayuda...

Comando de Estado : 0xF1 0x10 0xB0
 

Adjuntos

  • Interface.pdf
    1.5 MB · Visitas: 523
hola danco me gustaria platicarte de un proyecto que desarollamos hace 1 año y que dejamos fuera ya que se cambiaron los dispensarios por otros de la marca sufra-max , anterior mente teniamos HongYang y desaroyamos un dispositivo que interactuaba entre el software de control gas y los dispensarios directamente se trataba de un dispositivo en el que se insertaba una targeta , se ponia el nip,dispensario, monto y este dispositivo checaba si el cliente tenia saldo o no y activava el dispensario con la cantidad que se le indicaba.

para lograr esto tuvimos que hacer el loop y decodificar la forma en la que se comunicaba el programa original con los dispensarios y desarroyar un programa que siempre estaba en comunicacion con todos los dispensarios de manera que les pedia las ventas a cada dispensario y estaba en contacto con nuestro dispositivo de control de clientes todo esto en rs485.

te anexo imagen del dispositivo de control y puedo pasarte el codigo del programa para que veas el ejemplo de como se le mandan los comandos al dispensario.

te comento personal que trabajaba antes en profeco nos indico que ese dispositivo no podiamos tenerlo asi y nos decian que para usarlo se tenia que registrar. te recomiendo que revises esta situacion ya que nosotros trabajamos mucho y al ultimo lo quitamos.

igual hoy revisando documentacion de la nom185 encuentro que un dispositivo de esta naturaleza solo es necesario declararlo o informar y puede ser operativo. creo.
 

Adjuntos

  • HongYang1.jpg
    HongYang1.jpg
    65.2 KB · Visitas: 155
  • HongYang2.jpg
    HongYang2.jpg
    59.9 KB · Visitas: 131
excelente, no se si viste la interface que realice, el documento PDF. cuando envías los comando, enviabas byte a byte cada periodo de tiempo o enviabas el paquete completo, para el ejemplo el comando de status 0xF1 0x10 0xB0,
o enviabas
0xF1
timeOut(5ms)
0x10
timeOut(5ms)
0xB0

cheque esta cadena Hex-- convertir a Ascii.
64 61 6E 63 6F 66 72 61 40 67 6D 61 69 6C 2E 63 6F 6D

agradezco tus comentarios.
 
te envio parte del codigo del programa monitor para que analices la sección de donde se envía el comando.

Código:
      bool activo;
        SerialPort sp = new SerialPort();
        string puerto="COM6";
        
        int maquina = 0;        
        int numero_maquinas = 6;
        string comando="";

private void cambiar_pariedad(System.IO.Ports.Parity p)
        {
            sp.Parity = p;
        }  
private bool abrir_puerto()
        {
            try
            {                               
                sp.BaudRate = 2400;
                sp.DataBits = 8;
                sp.Parity = System.IO.Ports.Parity.None;
                sp.StopBits = StopBits.One;
                sp.PortName = puerto;
                sp.WriteTimeout = 1000;
                sp.ReadTimeout = 1000;
                sp.Open();
                return true;

            }
            catch(Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message,"Error de conexion!",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return false;
            }
        }    
    private string enviar_comando(byte[] machine,byte[] lenght,byte[] gun,byte[]command,byte[] data3,byte[] data2,byte[] data1)
        {
            #region enviar comando--------------------------------------------
            int retardo = 0;
            string resultado = "";
            byte[] datos = new byte[8];

            retardo = clases.funciones.valInt(txt_timeout.Text);
            if (retardo <= 0) retardo = 50;

            datos[0] = machine[0];
            datos[1] = lenght[0];
            datos[2] = gun[0];
            datos[3] = command[0];            
            datos[4] = data1[0];
            datos[5] = data2[0];
            datos[6] = data3[0];
            datos[7] = calcular_checksum(datos);

            //-----------------
            sp.Write(datos, 0, 1);
            pausa(retardo);
            cambiar_pariedad(System.IO.Ports.Parity.Space);
                        
            sp.Write(datos, 1, 7);
            pausa(retardo);
            cambiar_pariedad(System.IO.Ports.Parity.None);
            pausa(retardo);
            #endregion
            #region esperar resultado--------------------------------------------

            //int delay = 20;
            int respuesta = 0;
            string datos_leidos = "";  
            int timeout = 0;
            bool esperar = true;

            while (esperar)
            {
                //pausa(delay);
                while (sp.BytesToRead > 0)
                {
                    respuesta = sp.ReadByte();
                    datos_leidos = datos_leidos + " " + respuesta.ToString("X2");
                }
                if (datos_leidos != "")
                {
                    esperar = false;
                    resultado = datos_leidos; ;
                    return resultado;
                }
                timeout++;
               // pausa(delay);
                if (timeout == 10)
                {
                    resultado = "TimeOut";
                    esperar = false;
                }
                Application.DoEvents();
            }
            sp.DiscardInBuffer();
            sp.DiscardOutBuffer();
            #endregion
            return resultado;
        }
private byte calcular_checksum(byte[] datos)
        {
            byte[] res=new byte[1] {0x00};
            long suma = Convert.ToInt16(datos[0].ToString(), 10) +
                                        Convert.ToInt16(datos[1].ToString(), 10) +
                                        Convert.ToInt16(datos[2].ToString(), 10) +
                                        Convert.ToInt16(datos[3].ToString(), 10) +
                                        Convert.ToInt16(datos[4].ToString(), 10) +
                                        Convert.ToInt16(datos[5].ToString(), 10) +
                                        Convert.ToInt16(datos[6].ToString(), 10);
            suma=256-suma;            
            res = BitConverter.GetBytes(suma);
            return res[0];
        }
 private byte[] seleccionar_comando(int maquina,string accion,int pesos)
        {
                        

            // inicializar datos para el comando
            byte[] datos =new byte[7] {0x00,0x00,0x00,0x00,0x00,0x00,0x00};
            byte[] dato = new byte[1] { 0x00 };
            byte[] machine = new byte[1] { 0x00 };
            byte[] lenght = new byte[1] { 0x00 };
            byte[] gun = new byte[1] { 0x00 };
            byte[] command = new byte[1] { 0x00 };
            byte[] data3 = new byte[1] { 0x00 };
            byte[] data2 = new byte[1] { 0x00 };
            byte[] data1 = new byte[1] { 0x00 };            


            if (maquina == 1) { machine = new byte[1] { 0x01 }; gun = new byte[1] { 0x01 }; }
            if (maquina == 2) { machine = new byte[1] { 0x01 }; gun = new byte[1] { 0x02 }; }
            if (maquina == 3) { machine = new byte[1] { 0x02 }; gun = new byte[1] { 0x01 }; }
            if (maquina == 4) { machine = new byte[1] { 0x02 }; gun = new byte[1] { 0x02 }; }
            if (maquina == 5) { machine = new byte[1] { 0x03 }; gun = new byte[1] { 0x01 }; }
            if (maquina == 6) { machine = new byte[1] { 0x03 }; gun = new byte[1] { 0x02 }; }
            
            if (accion == "PEDIR_ULTIMA_VENTA")
            {
                command[0] = 0x0F ;                
            }
            else if (accion == "ENVIAR_DESPACHO")
            {
                string t_precio = pesos.ToString().PadLeft(4, '0') ;
                command[0] =  0x09 ;
                data1[0] = 0x00;// BitConverter.GetBytes(Convert.ToInt16(t_precio.Substring(0, 2), 16))[0];
                data2[0] = BitConverter.GetBytes(Convert.ToInt16(t_precio.Substring(2, 2), 16))[0];
                data3[0] = BitConverter.GetBytes(Convert.ToInt16(t_precio.Substring(0, 2), 16))[0];
            }

            lenght = new byte[1] { 0x07 };

            datos[0] = machine[0];
            datos[1] = lenght[0];
            datos[2] = gun[0];
            datos[3] = command[0];
            datos[4] = data3[0];
            datos[5] = data2[0];
            datos[6] = data1[0];  

            return datos;
        }
 
Última edición por un moderador:
veo que el protocolo que me dio el distribuidor de los surtidores difiere al que tu estas usando , tiene un vector de 7 bytes, probare enviando la consulta de: PEDIR_ULTIMA_VENTA

datos[0] = 0x01;
datos[1] = 0x07;
datos[2] = 0x01;
datos[3] = 0x0F;
datos[4] = 0x00;
datos[5] = 0x00;
datos[6] = 0x00;

por favor ver el manual adjunto.

estaré colocando los avances.
 

Adjuntos

  • DeHongYang Group.pdf
    1.6 MB · Visitas: 376
Hola Danco Buenas Tardes, yo tuve un proyecto similar y desarrolle la interfaz loop current para siguiente surtidor, intentare ayudarte pero por favor le pido colaboracion con el esquematico plano o circuito de comunicacion con los surtidores Tokheim mas vendidos, la verdad no tengo informacion ni un surtidor disponible para trabajar.
 

Adjuntos

  • Fuel-Dispenser-K-Series-CMD168.jpg
    Fuel-Dispenser-K-Series-CMD168.jpg
    12.7 KB · Visitas: 127
Última edición por un moderador:
Hola Amigo, ya construí la interface HongYang, con esta me funciono, pero me conecte al puerto de programacion http://sodoityourself.com/max232-serial-level-converter/, para conectarme al puerto de comunicación utilice 1 opto- acoplado, luego monto el esquema. no tengo la interfaces de Tokheim pero lo que he visto que los Tokheim utilizan es una conexión 232, y le colocan un buffer para hacer las conexiones a barias tarjetas.
 
En la pagina 6 del archivo adjunto se encuentra el loop current que utiliza los Hong Yang a una velocidad de 2400Baudios.. Saludos.



Alguien me puede colaborar por favor con un esquematico completo de los Tokheim. Gracias.
 

Adjuntos

  • Comunicacion TTY.pdf
    148.8 KB · Visitas: 394
Última edición:
Amigos.

Luego de realizar varias tareas de decodificacion logre encontrar lo siguiente:

Los Dispensadores o Surtidores Marca Gilbarco se conectan a una velocidad de 5887 Baudios y logre sacar los siguientes tramas de comunicación, estoy seguro que los datos son correctos porque pude autorizar una venta es decir la velocidad es la correcta pero cuando se envían algunas tramas llegan datos que no se como decodificarlos para entenderlos.


Trama 1: FFh E9h FEh EEh E0h E0h FBh E1h F0h
Trama 2: FFh E9h FEh E0h E1h E0h FBh EEh F0h Autorizacion de Inicio de venta
Trama 3: __h E5h F4h F6h __h __h __h __h __h __h F0h esta ultima varia no lo e decodificado aun


Trama 4: FFh ECh F4h FBh E6h F0h
Trama 5: FFh E9h FEh EEh E0h FBh E1h F0h
Trama 6: FFh E4h F2h F4h F8h E0h E0h E0h E1h E0h E0h FBh E3h F0h No se saco combustible se espero hizo 88888 y luego se colgo

Espero que alguien pueda avanzar en algo con estos datos.
 
Que tal Gente.

Estoy desarrollando una interface para controlar un surtidor por medio del puerto Serial RS232, pero no logro entender como enviar los comandos para comunicar el surtidor (Veeder Root tls350).

Me pueden explicar como programo esto en C#??


Enquiry message format is as follows
<SOH><SECURE CODE><COMMAND NUMBER><MAIN ARGUMENT>
where:
<SOH> (0x01H) marks the end of the command.
<SECURE CODE> (exactly 6 ASCII characters) – optional field depended on Site Sentinel setting.
<COMMAND NUMBER> (three ASCII characters) number of command
<MAIN ARGUMNET> (two ASCII characters) contains various, usually decimal coded data, depend on command ...
 
Hola logré decifrar las tramas tengo el circuito y el programa funcionando en dos gasolineras, si me ayudas con las tramas de Gilbarco tengo el manual pero algo no va bien con ese manual. Saludos
 
Última edición por un moderador:
T -> 0000659AFF
R -> 0000659A718E50AF20DF27D8FF

T -> 00006D92FF
R -> 00006D926E9117E820DF27D8FF

T -> 0000758AFF
R -> 0000758A7E815AA520DF27D8FF

T -> 00007D82FF
R -> 00007D82DC2305FA20DF27D8FF

T -> 0000857AFF
R -> 0000857A18E733CC20DF27D8FF

T -> 00000DF2FF
R -> 00000DF26F9017E820DF27D8FF

T -> 000015EAFF
R -> 000015EA0EF10AF520DF27D8FF


Podrías decifrar estas tramas? o decir cuales son las partes de las tramas?
 
Última edición por un moderador:
T -> 0000659AFF
R -> 0000659A718E50AF20DF27D8FF

T -> 00006D92FF
R -> 00006D926E9117E820DF27D8FF

T -> 0000758AFF
R -> 0000758A7E815AA520DF27D8FF

T -> 00007D82FF
R -> 00007D82DC2305FA20DF27D8FF

T -> 0000857AFF
R -> 0000857A18E733CC20DF27D8FF

T -> 00000DF2FF
R -> 00000DF26F9017E820DF27D8FF

T -> 000015EAFF
R -> 000015EA0EF10AF520DF27D8FF


Podrías decifrar estas tramas? o decir cuales son las partes de las tramas?
Son tramas del surtidor wayne obviando los ceros del principio el primer byte es la direccion del surtidor el segundo es un bit verificador que es (255- bit anterior) asi sucesimante los dos siguientes bits son los datos, te cuento que esa parte si la vez bien es facil decifrar.
 
Atrás
Arriba