Exemplo n.º 1
0
        private static void deal_com_cmd(modbus_rtu data)
        {
            byte[] buf = new byte[128];
            byte[] crc = new byte[2];
            switch (data.cmd)
            {
            case 0x03:
                if (data.data1 == 0x0004 && data.data2 == 0x0002)
                {
                    buf[0] = modbus_addr;
                    buf[1] = data.cmd;
                    buf[2] = 4;
                    buf[3] = (byte)(l_weight >> 24);
                    buf[4] = (byte)(l_weight >> 16);
                    buf[5] = (byte)(l_weight >> 8);
                    buf[6] = (byte)(l_weight >> 0);
                    crc    = CRC16(buf, 7);
                    buf[7] = crc[1];
                    buf[8] = crc[0];

                    Form1.com.Write(buf, 0, 9);
                }
                if (data.data1 == 0x0006 && data.data2 == 0x0002)
                {
                    buf[0] = modbus_addr;
                    buf[1] = data.cmd;
                    buf[2] = 4;
                    buf[3] = (byte)(short_w >> 8);
                    buf[4] = (byte)(short_w >> 0);
                    buf[5] = (byte)(short_point >> 8);
                    buf[6] = (byte)(short_point >> 0);
                    crc    = CRC16(buf, 7);
                    buf[7] = crc[1];
                    buf[8] = crc[0];

                    Form1.com.Write(buf, 0, 9);
                }
                break;

            case 0x06:
                byte[] read_w_cmd3 = new byte[8] {
                    0x01, 0x06, 0x00, 0x60, 0x00, 0x01, 0x48, 0x14
                };
                Form1.com.Write(read_w_cmd3, 0, 8);
                break;
            }
        }
Exemplo n.º 2
0
        public static bool parse_modbus_rtu(ref modbus_rtu mod, byte data)
        {
            bool ret = false;

            switch (mod.step)
            {
            case 0:
                if (data == modbus_addr)
                {
                    mod.step++;
                    mod.addr = data;
                }
                break;

            case 1:
                if (data == 0x03 || data == 0x06)
                {
                    mod.step++;
                    mod.cmd   = data;
                    mod.count = 0;
                }
                break;

            case 2:
                mod.count++;
                if (mod.count >= 2)
                {
                    mod.step++;
                    mod.data1 = (ushort)(0x100 * mod.data1 + data);
                    mod.count = 0;
                }
                else
                {
                    mod.data1 = data;
                }
                break;

            case 3:
                mod.count++;
                if (mod.count >= 2)
                {
                    mod.step++;
                    mod.data2 = (ushort)(0x100 * mod.data2 + data);
                    mod.count = 0;
                }
                else
                {
                    mod.data2 = data;
                }
                break;

            case 4:
                mod.count++;
                if (mod.count >= 2)
                {
                    mod.step++;
                    mod.crc = (ushort)(0x100 * mod.crc + data);
                    byte[] buf = new byte[6];
                    buf[0] = mod.addr;
                    buf[1] = mod.cmd;
                    buf[2] = (byte)(mod.data1 >> 8);
                    buf[3] = (byte)(mod.data1 & 0x00ff);
                    buf[4] = (byte)(mod.data2 >> 8);
                    buf[5] = (byte)(mod.data2 & 0x00ff);

                    byte[] crc_byte = new byte[2];
                    crc_byte = CRC16(buf, 6);
                    ushort crc_short = (ushort)(crc_byte[0] + 0x100 * crc_byte[1]);
                    if (mod.crc == crc_short)
                    {
                        ret = true;
                    }
                    mod.step = 0;
                }
                else
                {
                    mod.crc = data;
                }
                break;

            default:
                mod.step = 0;
                break;
            }
            return(ret);
        }