Example #1
0
 public void CrcTest()
 {
     Assert.AreEqual(
         ModbusHelper.CRC16(new byte[] { 0, 0, 1, 1, 2, 3, 4, 5, 0, 0 }, 2, 6),
         ModbusHelper.CRC16(new byte[] { 1, 1, 2, 3, 4, 5, 0, 0 }, 0, 6)
         );
 }
Example #2
0
 public void DecodeBoolsTest()
 {
     Assert.AreEqual(bo(), ModbusHelper.DecodeBools(by(0x00), 1, 0));
     Assert.AreEqual(bo(true, false, true), ModbusHelper.DecodeBools(by(0x00, 0x05), 1, 3));
     Assert.AreEqual(bo(true, false, true, false, false, false, false, false, false, true),
                     ModbusHelper.DecodeBools(by(0x00, 0x05, 0x02), 1, 10));
 }
Example #3
0
        public static IModbusCommand Parse(byte[] request, int offset)
        {
            var slave   = request[offset + 0];
            var code    = request[offset + 1];
            var address = ModbusHelper.GetUShort(request, offset + 2);

            switch (code)
            {
            case 1:
                return(Parse01(slave, code, address, request, offset));

            case 2:
                return(Parse02(slave, code, address, request, offset));

            case 3:
                return(Parse03(slave, code, address, request, offset));

            case 4:
                return(Parse04(slave, code, address, request, offset));

            case 5:
                return(Parse05(slave, code, address, request, offset));

            case 6:
                return(Parse06(slave, code, address, request, offset));

            case 15:
                return(Parse15(slave, code, address, request, offset));

            case 16:
                return(Parse16(slave, code, address, request, offset));
            }

            throw Thrower.Make("Unsupported function code {0}", code);
        }
        /// <summary>
        /// 调用读写函数前的校验,此过程包含了解析地址并缓存
        /// </summary>
        /// <param name="equipmentProps"></param>
        /// <returns></returns>
        private BllResult <List <string> > Validation(List <EquipmentProp> equipmentProps)
        {
            if (equipmentProps == null || equipmentProps.Count() == 0)
            {
                return(BllResultFactory.Error <List <string> >($"未传递属性"));
            }
            //选取设备类
            var ips = equipmentProps.Select(t => t.Equipment).Select(t => t.IP).Distinct().ToList();
            //是否存在没有对应的Modbus
            var temp = ips.Where(t => !modbusTcpNets.Exists(a => a.IpAddress == t)).ToArray();

            if (temp.Length > 0)
            {
                return(BllResultFactory.Error <List <string> >($"存在IP为{string.Join(",", temp)}没有对应的Modbus实例,请检查Modbus的IP配置"));
            }

            //缓存中未存在的属性
            var tempProps = equipmentProps.Where(t => !_hslModbusDataEntities.Exists(a => a.AddressId == t.Id)).ToList();

            //解析属性并加入缓存
            foreach (var item in tempProps)
            {
                var result = ModbusHelper.ParseAddress(item);
                if (!result.Success)
                {
                    return(BllResultFactory.Error <List <string> >($"解析地址错误:{result.Msg}"));
                }
                _hslModbusDataEntities.Add(result.Data);
            }
            return(BllResultFactory.Sucess(ips));
        }
Example #5
0
 public void EncodeBoolsTest()
 {
     Assert.AreEqual(by(), ModbusHelper.EncodeBools(bo()));
     Assert.AreEqual(by(0x01), ModbusHelper.EncodeBools(bo(true)));
     Assert.AreEqual(by(0x03), ModbusHelper.EncodeBools(bo(true, true)));
     Assert.AreEqual(by(0x13), ModbusHelper.EncodeBools(bo(true, true, false, false, true)));
     Assert.AreEqual(by(0x13, 0x05), ModbusHelper.EncodeBools(bo(true, true, false, false, true, false, false, false, true, false, true)));
 }
        public void FillRequest(byte[] request, int offset)
        {
            FillResponse(request, offset, null);
            var bytes = ModbusHelper.EncodeBools(values);

            request[offset + 6] = (byte)bytes.Length;
            ModbusHelper.Copy(bytes, 0, request, offset + 7, bytes.Length);
        }
Example #7
0
        public void FillResponse(byte[] response, int offset, object value)
        {
            Wrapped.FillResponse(response, offset, value);
            var crc = ModbusHelper.CRC16(response, offset, Wrapped.ResponseLength);

            response[offset + Wrapped.ResponseLength + 0] = ModbusHelper.Low(crc);
            response[offset + Wrapped.ResponseLength + 1] = ModbusHelper.High(crc);
        }
Example #8
0
        public void FillRequest(byte[] request, int offset)
        {
            Wrapped.FillRequest(request, offset);
            var crc = ModbusHelper.CRC16(request, offset, Wrapped.RequestLength);

            request[offset + Wrapped.RequestLength + 0] = ModbusHelper.Low(crc);
            request[offset + Wrapped.RequestLength + 1] = ModbusHelper.High(crc);
        }
Example #9
0
        private static IModbusCommand Parse05(byte slave, byte code, ushort address, byte[] request, int offset)
        {
            var value = ModbusHelper.DecodeBool(request[offset + 4]);
            var zero  = request[offset + 5];

            Assert.Equal(zero, 0, "Zero mismatch got {0} expected {1}");
            return(new ModbusF05WriteCoil(slave, address, value));
        }
Example #10
0
 public object ParseResponse(byte[] response, int offset)
 {
     Assert.Equal(ModbusHelper.GetUShort(response, offset + 0), TransactionId,
                  "TransactionId mismatch got {0} expected {1}");
     Assert.Equal(ModbusHelper.GetUShort(response, offset + 2), 0, "Zero mismatch got {0} expected {1}");
     Assert.Equal(ModbusHelper.GetUShort(response, offset + 4), Wrapped.ResponseLength,
                  "Length mismatch got {0} expected {1}");
     return(Wrapped.ParseResponse(response, offset + 6));
 }
 public void FillResponse(byte[] response, int offset, object value)
 {
     response[offset + 0] = Slave;
     response[offset + 1] = 15;
     response[offset + 2] = ModbusHelper.High(Address);
     response[offset + 3] = ModbusHelper.Low(Address);
     response[offset + 4] = ModbusHelper.High(values.Length);
     response[offset + 5] = ModbusHelper.Low(values.Length);
 }
Example #12
0
        public IModbusWrapper Parse(byte[] request, int offset)
        {
            var wrapped = ModbusParser.Parse(request, offset);
            var crc     = ModbusHelper.CRC16(request, offset, wrapped.RequestLength);

            Assert.Equal(crc, ModbusHelper.GetUShortLittleEndian(request, offset + wrapped.RequestLength),
                         "CRC mismatch {0:X4} expected {1:X4}");
            return(new ModbusRTUWrapper(wrapped));
        }
Example #13
0
        public object ParseResponse(byte[] response, int offset)
        {
            var crc1 = ModbusHelper.CRC16(response, offset, Wrapped.ResponseLength);
            //crc is little endian page 13 http://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
            var crc2 = ModbusHelper.GetUShortLittleEndian(response, offset + Wrapped.ResponseLength);

            Assert.Equal(crc2, crc1, "CRC mismatch got {0:X4} expected {1:X4}");
            return(Wrapped.ParseResponse(response, offset));
        }
Example #14
0
 public object ParseResponse(byte[] response, int offset)
 {
     Assert.Equal(response[offset + 0], Slave, "Slave mismatch got {0} expected {1}");
     Assert.Equal(response[offset + 1], 6, "Function mismatch got {0} expected {1}");
     Assert.Equal(ModbusHelper.GetUShort(response, offset + 2), Address,
                  "Address mismatch got {0} expected {1}");
     Assert.Equal(ModbusHelper.GetUShort(response, offset + 4), Value, "Value mismatch got {0} expected {1}");
     return(null);
 }
        public object ParseResponse(byte[] response, int offset)
        {
            var bytes = ModbusHelper.BytesForBools(Count);

            Assert.Equal(response[offset + 0], Slave, "Slave mismatch got {0} expected {1}");
            Assert.Equal(response[offset + 1], 2, "Function mismatch got {0} expected {1}");
            Assert.Equal(response[offset + 2], bytes, "Bytes mismatch got {0} expected {1}");
            return(ModbusHelper.DecodeBools(response, offset + 3, Count));
        }
 public void FillRequest(byte[] request, int offset)
 {
     request[offset + 0] = Slave;
     request[offset + 1] = 5;
     request[offset + 2] = ModbusHelper.High(Address);
     request[offset + 3] = ModbusHelper.Low(Address);
     request[offset + 4] = ModbusHelper.EncodeBool(Value);
     request[offset + 5] = 0;
 }
Example #17
0
        private static IModbusCommand Parse16(byte slave, byte code, ushort address, byte[] request, int offset)
        {
            var count  = ModbusHelper.GetUShort(request, offset + 4);
            var values = ModbusHelper.DecodeWords(request, offset + 7, count);
            var bytes  = request[offset + 6];

            Assert.Equal(ModbusHelper.BytesForWords(count), bytes, "Byte count mismatch got {0} expected {1}");
            return(new ModbusF16WriteRegisters(slave, address, values));
        }
 public void FillRequest(byte[] request, int offset)
 {
     request[offset + 0] = Slave;
     request[offset + 1] = 2;
     request[offset + 2] = ModbusHelper.High(Address);
     request[offset + 3] = ModbusHelper.Low(Address);
     request[offset + 4] = ModbusHelper.High(Count);
     request[offset + 5] = ModbusHelper.Low(Count);
 }
Example #19
0
 public void FillResponse(byte[] response, int offset, object value)
 {
     response[offset + 0] = ModbusHelper.High(TransactionId);
     response[offset + 1] = ModbusHelper.Low(TransactionId);
     response[offset + 2] = 0;
     response[offset + 3] = 0;
     response[offset + 4] = ModbusHelper.High(Wrapped.ResponseLength);
     response[offset + 5] = ModbusHelper.Low(Wrapped.ResponseLength);
     Wrapped.FillResponse(response, offset + 6, value);
 }
Example #20
0
 public void FillRequest(byte[] request, int offset)
 {
     request[offset + 0] = ModbusHelper.High(TransactionId);
     request[offset + 1] = ModbusHelper.Low(TransactionId);
     request[offset + 2] = 0;
     request[offset + 3] = 0;
     request[offset + 4] = ModbusHelper.High(Wrapped.RequestLength);
     request[offset + 5] = ModbusHelper.Low(Wrapped.RequestLength);
     Wrapped.FillRequest(request, offset + 6);
 }
 public object ParseResponse(byte[] response, int offset)
 {
     Assert.Equal(response[offset + 0], Slave, "Slave mismatch got {0} expected {1}");
     Assert.Equal(response[offset + 1], 5, "Function mismatch got {0} expected {1}");
     Assert.Equal(ModbusHelper.GetUShort(response, offset + 2), Address,
                  "Address mismatch got {0} expected {1}");
     Assert.Equal(response[offset + 4], ModbusHelper.EncodeBool(Value), "Value mismatch got {0} expected {1}");
     Assert.Equal(response[offset + 5], 0, "Pad mismatch {0} expected:{1}");
     return(null);
 }
Example #22
0
        public IModbusWrapper Parse(byte[] request, int offset)
        {
            var wrapped = ModbusParser.Parse(request, offset + 6);

            Assert.Equal(wrapped.RequestLength, ModbusHelper.GetUShort(request, offset + 4),
                         "RequestLength mismatch got {0} expected {1}");
            var transaction = ModbusHelper.GetUShort(request, offset);

            return(new ModbusTCPWrapper(wrapped, transaction));
        }
        public void FillResponse(byte[] response, int offset, object value)
        {
            var bytes = ModbusHelper.BytesForBools(Count);

            response[offset + 0] = Slave;
            response[offset + 1] = 2;
            response[offset + 2] = bytes;
            var data = ModbusHelper.EncodeBools(value as bool[]);

            ModbusHelper.Copy(data, 0, response, offset + 3, bytes);
        }
Example #24
0
        private void fmMain_Load(object sender, EventArgs e)
        {
            string[] p = new string[1];
            p[0] = "COM1";

            md = new ModbusHelper(p);
            md.Open();

            th = new TLoopThread(OnThread);
            th.Start();
        }
Example #25
0
        public void FillResponse(byte[] response, int offset, object value)
        {
            var bytes = ModbusHelper.BytesForWords(Count);

            response[offset + 0] = Slave;
            response[offset + 1] = 3;
            response[offset + 2] = bytes;
            var data = ModbusHelper.EncodeWords((ushort[])value);

            ModbusHelper.Copy(data, 0, response, offset + 3, bytes);
        }
Example #26
0
        public SEDevice()
        {
            packages            = new List <ModbusPackage>();
            lockerRequestes     = new object();
            data                = new List <byte>();
            requestes           = new List <ModbusRequest>();
            helper              = new ModbusHelper();
            dictCreateVariables = new Dictionary <ModbusDataTypes, Func <ModbusVariableParams, IVariable> >();
            variables           = new Dictionary <string, IVariable>();

            InitializationDictCreateVariables();
        }
Example #27
0
        public byte[] GetException(byte code)
        {
            var exception = new byte[5];

            exception[0] = Wrapped.Slave;
            exception[1] = (byte)(Wrapped.Code | 0x80);
            exception[2] = code;
            var crc = ModbusHelper.CRC16(exception, 0, 3);

            exception[3] = ModbusHelper.Low(crc);
            exception[4] = ModbusHelper.High(crc);
            return(exception);
        }
Example #28
0
        public void ModbusTest()
        {
            Random ran = new Random();
            int    val = ran.Next(3);

            byte[] res = ModbusHelper.SendTrainCyclostyle(number, ModbusHelper.MB_WRITE_MULTIPLE_REGS, 0, 1, new byte[] { (byte)(val >> 8), (byte)(val & 0xFF) });
            string str = string.Empty;

            for (int i = 0; i < res.Length; i++)
            {
                str += res[i].ToString("X2") + " ";
            }
            txt_send.Text = string.Format("Tx:{0}-{1}", number.ToString("D3"), str);
            number++;
        }
Example #29
0
        public byte[] GetException(byte code)
        {
            var exception = new byte[9];

            exception[0]     = ModbusHelper.High(TransactionId);
            exception[1]     = ModbusHelper.Low(TransactionId);
            exception[2]     = 0;
            exception[3]     = 0;
            exception[4]     = ModbusHelper.High(3);
            exception[5]     = ModbusHelper.Low(3);
            exception[6 + 0] = Wrapped.Slave;
            exception[6 + 1] = (byte)(Wrapped.Code | 0x80);
            exception[6 + 2] = code;
            return(exception);
        }
Example #30
0
        public void CheckException(byte[] response, int count)
        {
            if (count < 5)
            {
                Thrower.Throw("Partial exception packet got {0} expected >= {1}", count, 5);
            }
            var offset = 0;
            var code   = response[offset + 1];

            if ((code & 0x80) != 0)
            {
                Assert.Equal(response[offset + 0], Wrapped.Slave, "Slave mismatch got {0} expected {1}");
                Assert.Equal(code & 0x7F, Wrapped.Code, "Code mismatch got {0} expected {1}");
                var crc1 = ModbusHelper.CRC16(response, offset, 3);
                //crc is little endian page 13 http://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
                var crc2 = ModbusHelper.GetUShortLittleEndian(response, offset + 3);
                Assert.Equal(crc2, crc1, "CRC mismatch got {0:X4} expected {1:X4}");
                throw new ModbusException(response[offset + 2]);
            }
        }