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"); }
/// <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; } } } }
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(); } }
/// <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 }); } }
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 }; }
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() }; }
/// <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)); }
public UInt16 getTag(ModbusAddress addr) { return(getTag(addr.space, addr.tag)); }
public void setTag(ModbusAddress addr, UInt16 value) { setTag(addr.space, addr.tag, value); }