Beispiel #1
0
        public void ModbusAddressTest()
        {
            ModbusAddress a = new ModbusAddress(Space.AnalogInputs, 16000);
            ModbusAddress b = new ModbusAddress(Space.Holdings, 1000);

            //the objects are not equals
            Assert.IsFalse(a == b, "the objects must not be equals");
            Assert.IsTrue(a != b, "the objects must not be equals");
            Assert.IsFalse(a.Equals(b), "the objects must not be equals");
            Assert.IsFalse(b.Equals(a), "the objects must notbe equals");
            //the objects are equals
            b.space = Space.AnalogInputs;
            b.tag   = 16000;
            Assert.IsTrue(a == b, "the objects must be equals");
            Assert.IsFalse(a != b, "the objects must be equals");
            Assert.IsTrue(a.Equals(b), "the objects must be equals");
            Assert.IsTrue(b.Equals(a), "the objects must be equals");
            //links are equal
            b = a;
            Assert.IsTrue(a == b, "the objects must be equals");
            Assert.IsFalse(a != b, "the objects must be equals");
            Assert.IsTrue(a.Equals(b), "the objects must be equals");
            Assert.IsTrue(b.Equals(a), "the objects must be equals");

            Object c = new Object();

            Assert.IsFalse(a.Equals(c), "the objects must not be equals");
        }
Beispiel #2
0
        /// <summary>
        /// 生成一个读取寄存器的指令头
        /// </summary>
        /// <param name="address">地址</param>
        /// <param name="length">长度</param>
        /// <returns>包含结果对象的报文</returns>
        private OperateResult <byte[]> BuildReadRegisterCommand(ModbusAddress address, ushort length)
        {
            // 获取消息号
            ushort messageId = (ushort)softIncrementCount.GetCurrentValue( );

            // 生成最终tcp指令
            byte[] buffer = ModbusInfo.PackCommandToTcp(address.CreateReadRegister(station, length), messageId);
            return(OperateResult.CreateSuccessResult(buffer));
        }
 public void buildVarHashSet()
 {
     for (UInt16 i = startTag; i < startTag + tagNum; i++)
     {
         Space         space = ModbusProtocol.getSpace(function);
         ModbusAddress addr  = new ModbusAddress(space, i);
         if (globalObject.addrVarMap.ContainsKey(addr))
         {
             mVarSet.Add(globalObject.addrVarMap[addr]);
         }
     }
 }
        protected void setVarsState(VarState state)
        {
            if (mGlobalObject != null && mGlobalObject.addrVarMap != null)
            {
                Space space = ModbusProtocol.getSpace(mQuery.function);

                for (UInt16 i = mQuery.startTag; i < mQuery.startTag + mQuery.tagNum; i++)
                {
                    ModbusAddress currAddr = new ModbusAddress(space, i);
                    if (mGlobalObject.addrVarMap.ContainsKey(currAddr))
                    {
                        mGlobalObject.addrVarMap[currAddr].state = VarState.TimeOut;
                    }
                }
            }
        }
Beispiel #5
0
        public void updateVariables(Space space, UInt16 firslTag, UInt16 lastTag)
        {
            LinkedList <Var> varList = new LinkedList <Var>();

            for (UInt16 tag = firslTag; tag <= lastTag; tag++)
            {
                ModbusAddress addr = new ModbusAddress(space, tag);
                if (addrVarMap.ContainsKey(addr))
                {
                    Var v = addrVarMap[addr];
                    v.setTagValue(tag, tagStorage.getTag(space, tag));
                    varList.AddLast(v);
                }
            }
            foreach (Var v in varList)
            {
                v.varChanged();
            }
        }
Beispiel #6
0
        /// <summary>
        /// 读取服务器的数据,需要指定不同的功能码
        /// </summary>
        /// <param name="address">地址</param>
        /// <param name="length">长度</param>
        /// <returns>带是否成功的结果数据</returns>
        private OperateResult <byte[]> ReadModBusBase(ModbusAddress address, ushort length)
        {
            OperateResult <byte[]> command = BuildReadRegisterCommand(address, length);

            if (!command.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(command));
            }

            OperateResult <byte[]> resultBytes = CheckModbusTcpResponse(command.Content);

            if (resultBytes.IsSuccess)
            {
                // 二次数据处理
                if (resultBytes.Content?.Length >= 9)
                {
                    byte[] buffer = new byte[resultBytes.Content.Length - 9];
                    Array.Copy(resultBytes.Content, 9, buffer, 0, buffer.Length);
                    resultBytes.Content = buffer;
                }
            }
            return(resultBytes);
        }
 /// <summary>
 /// 分析Modbus协议的地址信息,该地址适应于tcp及rtu模式
 /// </summary>
 /// <param name="address">带格式的地址,比如"100","x=4;100","s=1;100","s=1;x=4;100"</param>
 /// <param name="isStartWithZero">起始地址是否从0开始</param>
 /// <returns>转换后的地址信息</returns>
 public static OperateResult <ModbusAddress> AnalysisReadAddress(string address, bool isStartWithZero)
 {
     try
     {
         ModbusAddress mAddress = new ModbusAddress(address);
         if (!isStartWithZero)
         {
             if (mAddress.Address < 1)
             {
                 throw new Exception(StringResources.Language.ModbusAddressMustMoreThanOne);
             }
             mAddress.Address = (ushort)(mAddress.Address - 1);
         }
         return(OperateResult.CreateSuccessResult(mAddress));
     }
     catch (Exception ex)
     {
         return(new OperateResult <ModbusAddress>( )
         {
             Message = ex.Message
         });
     }
 }
Beispiel #8
0
        public void AddrVarMapTest()
        {
            AddrVarMap map = new AddrVarMap();

            ModbusAddress addr0 = new ModbusAddress(Space.Holdings, 0);
            ModbusAddress addr2 = new ModbusAddress(Space.Holdings, 2);
            ModbusAddress addr4 = new ModbusAddress(Space.Holdings, 4);
            ModbusAddress addr6 = new ModbusAddress(Space.Holdings, 6);

            Var var1 = new Var("var1", VarType.Float, addr0);
            Var var2 = new Var("var2", VarType.Float, addr2);
            Var var3 = new Var("var3", VarType.Float, addr4);

            map.AddVar(var1);
            map.AddVar(var2);
            //Keys are in the dictionary
            Assert.IsTrue(map.ContainsKey(addr0));
            Assert.IsTrue(map.ContainsKey(addr2));

            //There's not the key in the dictionary
            Assert.IsFalse(map.ContainsKey(addr4));

            //Try to add the same variable again
            map.AddVar(var2);
            Assert.IsTrue(map.ContainsKey(addr2));

            //Try to add new variable with address that already used
            Var var4 = new Var("var3", VarType.Float, addr2);

            map.AddVar(var4);
            Assert.IsTrue(map.ContainsKey(addr2));
            //Miscellaneous cases
            Assert.IsTrue(map.ContainsKey(new ModbusAddress(Space.Holdings, 2)));
            Assert.IsFalse(map.ContainsKey(new ModbusAddress(Space.Holdings, 4)));
            Assert.IsFalse(map.ContainsKey(new ModbusAddress(Space.Coils, 2)));
        }
 public static HistoryArchiveRecord ReadHistoryArchiveRecord(SqlString deviceName, ModbusAddress historyArchiveAddress, SqlInt32 index, SqlByte recordSize)
 {
     //var deviceNameValue = deviceName.Value;
     //var historyArchiveRecord = (DeviceSQL.Watchdog.Worker.Devices.First(device => (device.Name == deviceNameValue)) as Device.MODBUS.MODBUSMaster).ReadHistoryArchiveRecord(null, new Device.MODBUS.Data.MODBUSAddress(Convert.ToUInt16(historyArchiveAddress.RelativeAddress.Value), historyArchiveAddress.IsZeroBased.Value), Convert.ToUInt16(index.Value), recordSize.Value, null);
     return(HistoryArchiveRecord.Null); // new Types.MODBUSMaster.MODBUSMaster_HistoryArchiveRecord() { Index = historyArchiveRecord.Index, Data = historyArchiveRecord.Data };
 }
Beispiel #10
0
 public static EventArchiveRecordArray ReadEventArchiveRecords(SqlString deviceName, ModbusAddress eventArchiveAddress, SqlInt32 index)
 {
     //var deviceNameValue = deviceName.Value;
     //var eventArchiveRecords = (DeviceSQL.Watchdog.Worker.Devices.First(device => (device.Name == deviceNameValue)) as Device.MODBUS.MODBUSMaster).ReadEventArchiveRecord(null, new Device.MODBUS.Data.MODBUSAddress(Convert.ToUInt16(eventArchiveAddress.RelativeAddress.Value), eventArchiveAddress.IsZeroBased.Value), Convert.ToUInt16(index.Value), null);
     return(EventArchiveRecordArray.Null); // new Types.MODBUSMaster.MODBUSMaster_EventArchiveRecordArray() { eventArchiveRecords = eventArchiveRecords.Select(ear => new Types.MODBUSMaster.MODBUSMaster_EventArchiveRecord() { Index = ear.Index, Data = ear.Data }).ToList() };
 }
Beispiel #11
0
 /// <summary>
 /// 生成一个读取寄存器的指令头
 /// </summary>
 /// <param name="address">地址</param>
 /// <param name="length">长度</param>
 /// <returns>携带有命令字节</returns>
 private OperateResult <byte[]> BuildReadRegisterCommand(ModbusAddress address, ushort length)
 {
     // 生成最终rtu指令
     byte[] buffer = ModbusInfo.PackCommandToRtu(address.CreateReadRegister(station, length));
     return(OperateResult.CreateSuccessResult(buffer));
 }
Beispiel #12
0
 public UInt16 getTag(ModbusAddress addr)
 {
     return(getTag(addr.space, addr.tag));
 }
Beispiel #13
0
 public void setTag(ModbusAddress addr, UInt16 value)
 {
     setTag(addr.space, addr.tag, value);
 }